|
|
||||||||||||||||
|
2-2-4. ウィンドウの作成ここでは、CreateWindow,CreateWindowEx 関数でウィンドウを作成することについて詳しく説明します。CreateWindowEx の第一パラメータ(dwExStyle)を0とすると、CreateWindow のAPIとまったく同一なので、CreateWindowEx だけを説明します。WIN32では通常はこれを使用します。CreateWindowEx のAPI HWND CreateWindowEx(
DWORD dwExStyle; 拡張ウィンドウスタイル(WS_EX_XXのスタイル)
LPCSTR lpszClassName; 登録されたクラス名の文字列(WS_XXのスタイル)
LPCSTR lpszWindowName; ウィンドウのタイトルの文字列
DWORD dwStyle; ウィンドウスタイル
int x,y; ウィンドウの水平と垂直座標の位置
int nWidth; ウィンドウの幅
int nHeight; ウィンドウの高さ
HWND hwndParent; 親ウィンドウのハンドル
HMENU hmenu; メニューのハンドルか子ウィンドウのID
HINSTANCE hinst; アプリケーションインスタンスのハンドル
LPVOID lpvCreateParams; ウィンドウ作成データのアドレス
);
CreateWindowEx のパラメータ dwExStyleとdwStyleは前項で説明しました。また、lpszClassNameは、RegisterClassExでクラスの登録を行ないますが、その時の名前を設定します。他のパラメータは下記に記します。
オーバーラップウィンドウの作成 アプリケーションのメインウィンドウとして動作する、オーバーラップウィンドウの作成例を以下に示します。普通は、WinMain関数内に記述します。 HWND hWndMain;
WNDCLASSEX wc;
static LPSTR pClassName = "ApHelloClass";
static LPSTR pAppName = "ApHello";
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ApHelloProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance,pAppName);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = pAppName;
wc.lpszClassName = pClassName;
wc.hIconSm = LoadImage(hInstance,pAppName,IMAGE_ICON
,16,16,LR_DEFAULTCOLOR);
if (!RegisterClassEx(&wc)) return FALSE;
hWndMain = CreateWindow(pClassName,pAppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,
NULL,NULL,hInstance,NULL);
if (!hWndMain) return FALSE;
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
子ウィンドウの作成 メインウィンドウのクライアント上に、ツールバーとリストボックスコントロールを子ウィンドウとして作成する例を以下に示します。普通は、ウィンドウプロシージャの、WM_CREATEメッセージに記述します。ツールバーのサイズは、ツールバーコントロールに,WM_SIZEメッセージを送信することで自動的に決定します。リストボックスコントロールも作成時は、0,0,0,0の位置とサイズで、WM_SIZEメッセージ内で、ツールバーの残りのクライアント領域全体の大きさに設定します。 LRESULT CALLBACK ApMakeProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
static HWND hWndTb = NULL; // Toolbar Control
static HWND hWndLi = NULL; // LISTBOX Control
switch (uMsg)
{
case WM_CREATE: // メインウィンドウの新規作成
{
InitCommonControls();
hWndTb = CreateWindowEx(WS_EX_TOOLWINDOW,
TOOLBARCLASSNAME,NULL,
WS_CHILD|WS_VISIBLE|TBSTYLE_TOOLTIPS,
0,0,0,0,
hWnd,(HMENU)ID_TOOLBAR,hInstance,NULL);
if (hWndTb)
{
: (ツールバーの初期化)
}
hWndLi = CreateWindow("LISTBOX", NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER|
LBS_NOINTEGRALHEIGHT|LBS_NOTIFY,
0,0,0,0,
hWnd,(HMENU)ID_KIND,hInstance,NULL);
break;
}
case WM_SIZE: // ウィンドウのサイズを変更した
{
RECT rc,rc2;
INT h = 0;
if (hWndTb) // ツールバーのサイズを自動設定
SendMessage(hWndTb,WM_SIZE,wParam,lParam);
if (hWndLi) // リストボックスのサイズを設定
{
GetClientRect(hWnd,&rc);
if (hWndTb) // ツールバーの高さをhにする
{
GetClientRect(hWndTb,&rc2); h = rc2.bottom;
}
MoveWindow(hWndLi,0,h+2,rc.right,rc.bottom-h-2,TRUE);
}
break;
}
: (他のメッセージ)
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
|