VCをはじめ、ウインドウの表示程度まで理解できました。
そこで、そのウインドウへコマンドボタンを配置し、
そのボタンが押されたイベントでメッセージボックス
を表示するにはどのようにすれば良いでしょうか?
宜しくお願いします。
> そこで、そのウインドウへコマンドボタンを配置し、
CreateWindowでBUTTONクラスのウィンドウを作成する
> そのボタンが押されたイベントでメッセージボックス
> を表示するにはどのようにすれば良いでしょうか?
WM_COMMANDメッセージへの応答でMessageBoxを使う
#define ID_BUTTON 100
#define ID_EDIT 101
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
char szClassName[] = "M&K"; //ウィンドウクラスの定義 どんな名前でも良い
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, //エントリーポイント
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
if (!InitApp(hCurInst)) //ウィンドウ・クラスの登録
return FALSE;
if (!InitInstance(hCurInst, nCmdShow)) //親ウィンドウの生成
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {//メッセージを取得し、MSG構造体に格納
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウ・クラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);//構造体サイズ
wc.style = CS_HREDRAW | CS_VREDRAW;//クラスのスタイル
wc.lpfnWndProc = WndProc; //プロシージャ名
wc.cbClsExtra = 0;//補助メモリ
wc.cbWndExtra = 0;//補助メモリ
wc.hInstance = hInst;//インスタンスハンドル
wc.hIcon = (HICON)LoadImage//アイコン
(NULL,//インスタンスのハンドル
MAKEINTRESOURCE(IDI_APPLICATION),//イメージの名前または識別子
IMAGE_ICON,//イメージのタイプ
0,//希望する幅
0,//希望する高さ
LR_DEFAULTSIZE | LR_SHARED);//ロードのオプション
wc.hCursor = (HCURSOR)LoadImage(NULL,//カーソル
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景ブラシ
wc.lpszMenuName = NULL; //メニュー名
wc.lpszClassName = (LPCSTR)szClassName;//クラス名
wc.hIconSm = (HICON)LoadImage(NULL,//小さいアイコン
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//親ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(szClassName,
"Windows", //タイトルバーにこの名前が表示されます
WS_OVERLAPPEDWINDOW, //ウィンドウの種類
//WS_POPUP,
CW_USEDEFAULT, //X座標
CW_USEDEFAULT, //Y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウィンドウのハンドル、親を作るときはNULL
NULL, //メニューハンドル、クラスメニューを使うときはNULL
hInst, //インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);//ウインドウの表示状態を設定。ウインドウハンドル、表示状態
UpdateWindow(hWnd);//ウインドウを更新。更新するウインドウのハンドル
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
static HWND hBtn, hEdit;
char szBuf[64];
switch (msg) {
case WM_CREATE:
hBtn = CreateWindow("BUTTON",
"押す",
WS_CHILD | WS_VISIBLE,
85, 45, 50, 30,
hWnd,
(HMENU)ID_BUTTON,
hInst,
NULL);
SendMessage(hEdit, EM_SETLIMITTEXT, (WPARAM)63, 0);//入力文字数の制限
break;
case WM_COMMAND:
switch (LOWORD(wp)) {
case ID_BUTTON:
GetWindowText(hEdit, szBuf, 64);
MessageBox(hWnd, szBuf, "コントロール", MB_OK);
SetWindowText(hEdit, "");
break;
}
break;
case WM_CLOSE:
id = MessageBox(hWnd,
"終了してもよろしいですか",
"確認",
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES) {
DestroyWindow(hEdit);//子ウインドウの破棄
DestroyWindow(hBtn);
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
> wc.hIcon = (HICON)LoadImage//アイコン
> (NULL,//インスタンスのハンドル
> MAKEINTRESOURCE(IDI_APPLICATION),//イメージの名前または識別子
> IMAGE_ICON,//イメージのタイプ
> 0,//希望する幅
> 0,//希望する高さ
> LR_DEFAULTSIZE | LR_SHARED);//ロードのオプション
> wc.hCursor = (HCURSOR)LoadImage(NULL,//カーソル
> MAKEINTRESOURCE(IDC_ARROW),
> IMAGE_CURSOR,
> 0,
> 0,
> LR_DEFAULTSIZE | LR_SHARED);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
// MAKEINTRESOURCEは不要:IDI_APPLICATION/IDC_ARROWの定義参照(winuser.h)
こっちが普通だと思いますが……。
> wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景ブラシ
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
ユーザー設定の背景色は白とは限りませんから,こちらを使うべきです。
まわりから浮きたいなら別ですが。
って,MSDNもGetStockObject使っているのね……。
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/WindowClasses/UsingWindow.asp
#このサンプル,どこまで本気なんだか……。メッセージループ,めちゃくちゃです。
> wc.lpszClassName = (LPCSTR)szClassName;//クラス名
wc.lpszClassName = szClassName;
不要なキャスト。
> wc.hIconSm = (HICON)LoadImage(NULL,//小さいアイコン
> MAKEINTRESOURCE(IDI_APPLICATION),
> IMAGE_ICON,
> 0,
> 0,
> LR_DEFAULTSIZE | LR_SHARED);
wc.hIconSm = (HICON)LoadIamge(NULL,
IDI_APPLICATION,
IMAGE_ICON,
GetSystemMetrics(SM_CXICONSM), // 小さいアイコンを指定
GetSystemMetrics(SM_CYICONSM), // 小さいアイコンを指定
LR_DEFAULTCOLOR);
最初のものでは,標準の大きさのアイコンをWindowsが機械的に小さくしたアイコンが使われます。
> hBtn = CreateWindow("BUTTON",
> "押す",
> WS_CHILD | WS_VISIBLE,
> 85, 45, 50, 30,
> hWnd,
> (HMENU)ID_BUTTON,
> hInst,
> NULL);
この時点でhInstは0。
どっかでhInstの初期設定をするか,
(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE)
で取得する必要あり。
#NT系ではこのパラメータは無視されるのでどうでもいいことですが。
> DestroyWindow(hEdit);//子ウインドウの破棄
> DestroyWindow(hBtn);
子ウィンドウは親ウィンドウが破棄されると同時に破棄されます。