Мы сделаем свою простую функцию создания окна.
class CWnd { public: CWnd(); virtual ~CWnd(); HWND m_hWnd; // это окно в стиле С BOOL Create(LPCTSTR lpClassName /*имя класса*/, LPCTSTR lpWindowName /*заголовок окна*/); };
И реализация.
BOOL CWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName) { m_hWnd = CreateWindow(lpClassName,lpWindowName, WS_OVERLAPPEDWINDOW, 10,10,600,480,NULL,NULL,hInstance,NULL); if (m_hWnd==NULL) return FALSE; // окно не создано вернуть ошибку ShowWindow(m_hWnd,SW_SHOW); UpdateWindow(m_hWnd); return TRUE; // все нормально }
Все это хорошо только нам нужно передать hInstance процесса а его нет. Но он же был в WinMain. Был. Но мы его не сохранили, а должны были. Будем сохранять. Заводим переменную.
class CWinApp { ...... BOOL AfxWinInit(HINSTANCE hInst); // настрока и инициализация приложения HINSTANCE m_hInstance; // наш экзепляр private: ...... };
Реализация.
CWinApp::CWinApp() { afxCurrentWinApp = this; m_pMainWnd = NULL; // пока окна нет m_hInstance=NULL; // мы еще не запущены }
Пора его сохранить при запуске программы.
BOOL CWinApp::AfxWinInit(HINSTANCE hInst) { m_hInstance=hInst; // сохраним WNDCLASS wndcls; // структура окна ...... }
Ну и естественно передать в функцию Create.
#include "stdafx.h" #include "Wnd.h" #include "WinApp.h" ...... BOOL CWnd::Create(LPCTSTR lpClassName,LPCTSTR lpWindowName) { m_hWnd = CreateWindow(lpClassName,lpWindowName, WS_OVERLAPPEDWINDOW, 10,10,600,480,NULL,NULL,AfxGetApp()->m_hInstance,NULL); if (m_hWnd==NULL) return FALSE; // окно не создано вернуть ошибку ShowWindow(m_hWnd,SW_SHOW); UpdateWindow(m_hWnd); return TRUE; // все нормально }