Для того, чтобы окно у нас было, нам нужно сделать несколько вещей:
Нам нужна функция инициализации приложения. В приложении всегда будет главное окно. Это окно мы и будет регистрировать при запуске приложения. Если ошибка в регистрации то приложение должно завершиться.
class CWinApp { ....... CWnd* m_pMainWnd; // ссылка на окно BOOL AfxWinInit(); // настрока и инициализация приложения private: ....... };
Реализация.
int PASCAL WinMain (HINSTANCE hInst,HINSTANCE hPrev, LPSTR pszCmdLine, int nCmdShow) { if (!AfxGetApp()->AfxWinInit()) return 1; // если окно не инициализировано выйти return AfxGetApp()->Run(); } BOOL CWinApp::AfxWinInit() { WNDCLASS wndcls; // структура окна memset(&wndcls, 0, sizeof(WNDCLASS)); // обнулить wndcls.lpfnWndProc = AfxWndProc; // процедура окна wndcls.hInstance = hInstance; // кто создает wndcls.hCursor = ::LoadCursor(NULL, IDC_ARROW); // курсор wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; // стиль wndcls.lpszClassName = _afxWnd; // имя класса wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // цвет if (!::RegisterClass(&wndcls)) return FALSE; // если ошибка регистрации выйти return TRUE; // зарегистрировались }
Обратите внимание, что у нас есть куча пока неизвестный вещей. Первое это указатель на процесс который создает окно. Второе это имя класса окна. И наконец самой функции окна. С указателем на процесс просто мы его передадим из WinMain.
class CWinApp { ..... BOOL AfxWinInit(HINSTANCE hInst); // настрока и инициализация приложения ..... }; int PASCAL WinMain (HINSTANCE hInst,HINSTANCE hPrev, LPSTR pszCmdLine, int nCmdShow) { if (!AfxGetApp()->AfxWinInit(hInst)) return 1; // если окно не инициализированно выйти ........ } BOOL CWinApp::AfxWinInit(HINSTANCE hInst) { ........... wndcls.hInstance = hInst; // кто создает ........ }
Имя дадим сами.
BOOL CWinApp::AfxWinInit(HINSTANCE hInst) { ........... wndcls.lpszClassName = "AfxWin"; // имя класса .......... }
Нам осталась только функция окна. Опишем ее.
........ CWinApp* AfxGetApp(); LONG FAR PASCAL AfxWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam); ........
Реализуем.
LONG FAR PASCAL AfxWndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) { if (message == WM_DESTROY ) // если сообщение закрытия { PostQuitMessage(0); return 0; // выйти } return DefWindowProc(hWnd,message,wParam,lParam); }