VCでイベント処理をするには?


太陽猫  2003-04-26 07:30:18  No: 51344  IP: [192.*.*.*]

VCをはじめ、ウインドウの表示程度まで理解できました。

そこで、そのウインドウへコマンドボタンを配置し、
そのボタンが押されたイベントでメッセージボックス
を表示するにはどのようにすれば良いでしょうか?

宜しくお願いします。

編集 削除
YuO  2003-04-26 10:04:21  No: 51345  IP: [192.*.*.*]

> そこで、そのウインドウへコマンドボタンを配置し、

CreateWindowでBUTTONクラスのウィンドウを作成する

> そのボタンが押されたイベントでメッセージボックス
> を表示するにはどのようにすれば良いでしょうか?

WM_COMMANDメッセージへの応答でMessageBoxを使う

編集 削除
M&K  2003-04-26 20:33:14  No: 51346  IP: [192.*.*.*]

#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;
}

編集 削除
YuO  2003-04-26 21:57:24  No: 51347  IP: [192.*.*.*]

> 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);

子ウィンドウは親ウィンドウが破棄されると同時に破棄されます。

編集 削除