メニュー

概要

1.リソースを用意

2.ヘッダーを用意

3.処理へ組み込む


設定

1.リソースを用意

  1. // win_mnu_sample01.rc
  2. #include <windows.h>
  3. #include "win_mnu_sample01.h" //IDM_ENDの値を定義する
  4. // メニュー
  5. MNU_SAMPLE01 MENU PRELOAD FIXED
  6. BEGIN
  7. MENUITEM "終了", IDM_END
  8. END
  9.  
書式
メニュー名 MENU メモリオプション
BEGIN
    MENUITEM  "メニュー名称", シンポルコード
    POPUP     "メニュー名称"
    BEGIN
        MENUITEM  "メニュー項目", シンボルコード
    END
END
※シンボルコードはユニークなコードを指定
※MENUITEM/POPUPを指定して項目を設定

メモリオプション
オプション 説明
PRELOAD プログラム起動時にメモリにロードされる
DISCARDABLE 不要になったらメモリから廃棄される
FIXED メモリ上で固定
MOVEABLE メモリ上で移動可能


2.ヘッダーを用意

  1. // win_mnu_sample01.h
  2. #define IDM_END 100
  3.  

3.処理を組み込む

  1. #include <windows.h>
  2. #include <tchar.h>
  3. #include "win_mnu_sample01.h"
  4.  
  5. // プロトタイプ宣言
  6. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
  7.  
  8.  
  9. // 開始位置
  10. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
  11. {
  12. WNDCLASSEX wc;
  13. HWND hWnd;
  14. MSG msg;
  15.  
  16. // ウィンドウクラスの情報を設定
  17. wc.cbSize = sizeof(wc); // 構造体サイズ
  18. wc.style = CS_HREDRAW | CS_VREDRAW; // スタイル
  19. wc.lpfnWndProc = WndProc; // ウィンドウプロシージャ
  20. wc.cbClsExtra = 0; // 拡張情報1
  21. wc.cbWndExtra = 0; // 拡張情報2
  22. wc.hInstance = hInst; // インスタンスハンドル
  23. wc.hIcon = (HICON)LoadImage( // アイコン
  24. NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON,
  25. 0, 0, LR_DEFAULTSIZE | LR_SHARED
  26. );
  27. wc.hIconSm = wc.hIcon; // 子アイコン
  28. wc.hCursor = (HCURSOR)LoadImage( // マウスカーソル
  29. NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
  30. 0, 0, LR_DEFAULTSIZE | LR_SHARED
  31. );
  32. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景
  33. wc.lpszMenuName = "MNU_SAMPLE01"; // メニュー名
  34. wc.lpszClassName = _T("Default Class Name");// ウィンドウクラス名
  35.  
  36. // ウィンドウクラスを登録する
  37. if( RegisterClassEx( &wc ) == 0 ){ return 1; }
  38.  
  39. // ウィンドウを作成する
  40. hWnd = CreateWindow(
  41. wc.lpszClassName, // ウィンドウクラス名
  42. _T("Sample Program"), // タイトルバーに表示する文字列
  43. WS_OVERLAPPEDWINDOW, // ウィンドウの種類
  44. CW_USEDEFAULT, // ウィンドウを表示する位置(X座標)
  45. CW_USEDEFAULT, // ウィンドウを表示する位置(Y座標)
  46. CW_USEDEFAULT, // ウィンドウの幅
  47. CW_USEDEFAULT, // ウィンドウの高さ
  48. NULL, // 親ウィンドウのウィンドウハンドル
  49. NULL, // メニューハンドル
  50. hInst, // インスタンスハンドル
  51. NULL // その他の作成データ
  52. );
  53. if( hWnd == NULL ){ return 1; }
  54.  
  55. // ウィンドウを表示する
  56. ShowWindow( hWnd, SW_SHOW );
  57. UpdateWindow( hWnd );
  58.  
  59. // メッセージループ
  60. while( 1 )
  61. {
  62. BOOL ret = GetMessage( &msg, NULL, 0, 0 ); // メッセージを取得する
  63. if( ret == 0 || ret == -1 )
  64. {
  65. // アプリケーションを終了させるメッセージが来ていたら、
  66. // あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける
  67. break;
  68. }
  69. else
  70. {
  71. // メッセージを処理する
  72. TranslateMessage( &msg );
  73. DispatchMessage( &msg );
  74. }
  75. }
  76.  
  77. return 0;
  78. }
  79.  
  80. // ウィンドウプロシージャ
  81. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
  82. {
  83. switch( msg ) {
  84. case WM_COMMAND:
  85. switch(LOWORD(wp)) {
  86. case IDM_END:
  87. SendMessage(hWnd, WM_CLOSE, 0, 0L);
  88. break;
  89. }
  90. break;
  91.  
  92. case WM_DESTROY: // ウィンドウを破棄するとき
  93. PostQuitMessage( 0 );
  94. break;
  95.  
  96. default:
  97. return DefWindowProc( hWnd, msg, wp, lp );
  98. }
  99.  
  100. return 0;
  101. }
  102.  

コンパイル・実行

C:\MinGW>windres win_mnu_sample01.rc win_mnu_sample_res_01.o
 
C:\MinGW>gcc win_mnu_sample01.c win_mnu_sample_res_01.o -o win_mnu_sample01.exe -mwindows
 
C:\MinGW>
 
※「windres」でリソースを作成
 「-mwindows」でGUIアプリケーションを作成する必要がある

結果






ダウンロードソース


最終更新:2010年06月28日 15:46