|
ウィンドウクラスを構築する Part.1 |
| ダウンロード : ウィンドウクラス構築サンプル(2005/05/12) |
|
RegisterClassEx(RegisterClass)によるウィンドウクラスの登録 CreateWindowEx(CreateWindow)によるウィンドウの作成 |
|
HINSTANCE クラス名 ウィンドウスタイル |
|
// ------------------------------------------------------------------- // 定数定義 // ------------------------------------------------------------------- #define STYLE_WINDOW (WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_BORDER) #define EX_STYLE_WINDOW (NULL) #define DEFAULT_CLASS "CBaseWindow" // ------------------------------------------------------------------- // メンバ変数 // ------------------------------------------------------------------- private: HWND m_hWnd; // ウィンドウハンドル ATOM m_Atom; // ウィンドウクラス登録時のATOM TCHAR* m_pszClassName; // クラス名 // ------------------------------------------------------------------- // メンバ関数定義 // ------------------------------------------------------------------- // ウィンドウプロシージャ static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); // ------------------------------------------------------------------- // コンストラクタ // ------------------------------------------------------------------- CBaseWindow::CBaseWindow( TCHAR* strClass = NULL, // クラス名 DWORD dwStyle = STYLE_WINDOW, // ウィンドウスタイル DWORD dwExStyle = EX_STYLE_WINDOW, // 拡張ウィンドウスタイル DWORD dwIcon = NULL // アイコン ) : m_hWnd(NULL) , m_Atom(NULL) , m_pszClassName(NULL) { WNDCLASSEX wc; // ウィンドウクラスの作成(起動時間を元にユニークな名称とする) if (!strClass) strClass = DEFAULT_CLASS; m_pszClassName = new TCHAR[strlen(strClass) + 8 + 1]; if (!m_pszClassName) return; wsprintf(m_pszClassName, "%s%08X", strClass, timeGetTime()); // クラスの登録 wc.cbSize = sizeof(WNDCLASSEX); wc.lpszClassName = m_pszClassName; // クラス名 wc.lpfnWndProc = (WNDPROC)WndProc; // ウィンドウプロシージャ wc.style = CS_VREDRAW | CS_HREDRAW; // 占有指定 wc.hInstance = (HINSTANCE)::GetModuleHandle(NULL); // インスタンスハンドル wc.hIcon = dwIcon ? LoadIcon(wc.hInstance, MAKEINTRESOURCE(dwIcon)) : LoadIcon(NULL, IDI_APPLICATION); // デフォルトアイコン wc.hIconSm = wc.hIcon; // ** 手抜き wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソル形状 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 背景色 wc.lpszMenuName = NULL; // メニュー無し wc.cbClsExtra = 0; wc.cbWndExtra = 0; if (m_Atom = RegisterClassEx(&wc)){ // ウィンドウの作成 m_hWnd = CreateWindowEx( dwExStyle, // 拡張ウィンドウスタイル m_pszClassName, // ウィンドウ名 NULL, // キャプション dwStyle, // ウィンドウスタイル CW_USEDEFAULT, CW_USEDEFAULT, // 好きな位置に表示 CW_USEDEFAULT, CW_USEDEFAULT, // サイズ NULL, NULL, wc.hInstance, NULL // インスタンス指定 ); if (!m_hWnd) return; ::ShowWindow(m_hWnd, SW_SHOWDEFAULT); ::UpdateWindow(m_hWnd); } } |
|
// ------------------------------------------------------------------- // デストラクタ // ------------------------------------------------------------------- CWindow::~CWindow() { if (m_hWnd) DestroyWindow(m_hWnd); if (m_Atom) UnregisterClass( (LPCTSTR)m_Atom, (HINSTANCE)::GetModuleHandle(NULL) ); if (m_pszClassName) delete[] m_pszClassName; } |
|
// ------------------------------------------------------------------- // ウィンドウプロシージャ // ------------------------------------------------------------------- LRESULT CALLBACK CBaseWindow::WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch (msg){ case WM_CLOSE: ::DestroyWindow(hWnd); m_hWnd = NULL; return 0; case WM_DESTROY: ::PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); } |
| > Part.2に進む |