トップページ > 記事閲覧
メニューバーの使い方
名前:木口小平 日時: 2019/12/08 01:35

enum { MenuID_File = 1000, MenuID_NewFile, MenuID_Open, MenuID_Exit, MenuID_Help, MenuID_About }; AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ファイル(&F)", MenuID_File); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "新規作成(&N)", MenuID_NewFile); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "開く(&O)", MenuID_Open); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, TRUE, NULL, 0); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "終了(&X)", MenuID_Exit); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ヘルプ(&H)", MenuID_Help); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_Help, FALSE, "About...(&A)", MenuID_About); 様々なサイトを検索して、上記のようにすれば、メニューバーを表示できるようにはなったのですが、使い方がわかりません。 例えば『終了(&X)』を選んで、ゲームを終了させるためにはどうすればよいのでしょうか?
メンテ

Page: 1 |

Re: メニューバーの使い方 ( No.1 )
名前:kanamaru 日時:2019/12/08 13:03

以下のようにしてできました。 参考:h ttp://nut-softwaredevelopper.hatenablog.com/entry/2016/02/26/010543 (スペースを抜いてください) #include "Dxlib.h" WNDPROC dxWndProc; //メインウィンドウのハンドル HWND hMainWnd; LRESULT CALLBACK MyProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); enum { MenuID_File = 1000, MenuID_NewFile, MenuID_Open, MenuID_Exit, MenuID_Help, MenuID_About }; int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) { ChangeWindowMode(true); if (DxLib_Init() == -1) return -1; SetDrawScreen(DX_SCREEN_BACK); hMainWnd = GetMainWindowHandle(); dxWndProc = (WNDPROC)GetWindowLong(hMainWnd, GWL_WNDPROC); SetWindowLong(hMainWnd, GWL_WNDPROC, (LONG)MyProc); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ファイル(&F)", MenuID_File); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "新規作成(&N)", MenuID_NewFile); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "開く(&O)", MenuID_Open); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, TRUE, NULL, 0); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "終了(&X)", MenuID_Exit); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ヘルプ(&H)", MenuID_Help); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_Help, FALSE, "About...(&A)", MenuID_About); printfDx("test"); WaitKey(); DxLib_End(); return 0; } LRESULT CALLBACK MyProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_COMMAND: switch (LOWORD(wp)) { case MenuID_Exit: SendMessage(hWnd, WM_CLOSE, NULL, NULL); break; } break; } return CallWindowProc(dxWndProc, hWnd, msg, wp, lp); }
メンテ
Re: メニューバーの使い方 ( No.2 )
名前:B.E 日時:2019/12/08 14:20

もう別の方法書かれちゃってますけど、メニュー選択された時に呼ぶ関数を指定する、 SetMenuItemSelectCallBackFunction()関数もあるみたいです。 あとCheckMenuItemSelectAll()やCheckMenuItemSelect_ID()で選択されたかチェックする事もできます。 選択されたメニューを表示するサンプル(1) SetMenuItemSelectCallBackFunction()を使用した場合。 #include "DxLib.h" char Txt[256] = "まだ無い"; enum { MenuID_File = 1000, MenuID_NewFile, MenuID_Open, MenuID_Exit, MenuID_Help, MenuID_About }; //メニューが選択されたら呼ばれる関数を宣言定義 void MenuItemSelectCallBack(const TCHAR *ItemName, int ItemID) { //ここで各メニュー項目名やIDに応じて処理を書く sprintf(Txt, "『%s,ID=%d』",ItemName, ItemID); } int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hP, LPSTR lp, int nC) { AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ファイル(&F)", MenuID_File); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "新規作成(&N)", MenuID_NewFile); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "開く(&O)", MenuID_Open); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, TRUE, NULL, 0); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "終了(&X)", MenuID_Exit); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ヘルプ(&H)", MenuID_Help); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_Help, FALSE, "About...(&A)", MenuID_About); //メニューが選択されたら呼ばれる関数を指定 SetMenuItemSelectCallBackFunction(MenuItemSelectCallBack); ChangeWindowMode(TRUE); if (DxLib_Init() < 0) return -1; SetDrawScreen(DX_SCREEN_BACK); while (ProcessMessage() == 0) { ClearDrawScreen(); DrawFormatString(0, 0, 0xffffff, "メニューテスト\n選択された項目は%sです。",Txt); ScreenFlip(); } DxLib_End(); return 0; } 選択されたメニューを表示するサンプル(2) CheckMenuItemSelectAll()とCheckMenuItemSelect_ID()を使用した場合。 (コールバック関数がよくわからないとか使いたくない場合はこちらで) #include "DxLib.h" enum { MenuID_File = 1000, MenuID_NewFile, MenuID_Open, MenuID_Exit, MenuID_Help, MenuID_About }; int WINAPI WinMain(HINSTANCE hIns, HINSTANCE hP, LPSTR lp, int nC) { AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ファイル(&F)", MenuID_File); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "新規作成(&N)", MenuID_NewFile); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "開く(&O)", MenuID_Open); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, TRUE, NULL, 0); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_File, FALSE, "終了(&X)", MenuID_Exit); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MENUITEM_IDTOP, FALSE, "ヘルプ(&H)", MenuID_Help); AddMenuItem(MENUITEM_ADD_CHILD, NULL, MenuID_Help, FALSE, "About...(&A)", MenuID_About); ChangeWindowMode(TRUE); if (DxLib_Init() < 0) return -1; SetDrawScreen(DX_SCREEN_BACK); char Txt[256] = "まだ無い"; while (ProcessMessage() == 0) { //メニューが選択されたかチェック if (CheckMenuItemSelectAll()) { //どのメニューが選択されてるかチェック。 if (CheckMenuItemSelect_ID(MenuID_NewFile))strcpy(Txt, "『新規作成』"); if (CheckMenuItemSelect_ID(MenuID_Open))strcpy(Txt, "『開く』"); if (CheckMenuItemSelect_ID(MenuID_Exit))strcpy(Txt, "『終了』"); if (CheckMenuItemSelect_ID(MenuID_About))strcpy(Txt, "『About...』"); } ClearDrawScreen(); DrawFormatString(0, 0, 0xffffff, "メニューテスト\n選択された項目は%sです。",Txt); ScreenFlip(); } DxLib_End(); return 0; } 一応こんな感じでも出来ます。
メンテ
Re: メニューバーの使い方 ( No.3 )
名前:木口小平 日時:2019/12/08 16:55

>kanamaruさん、B.Eさん、丁寧な解説ありがとうございました。 う〜ん、難しそうだな・・・。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存