Для того, чтобы окно у нас было, нам нужно сделать несколько вещей:
Нам нужна функция инициализации приложения. В приложении всегда будет главное окно. Это окно мы и будет регистрировать при запуске приложения. Если ошибка в регистрации то приложение должно завершиться.
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);
}