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さん、丁寧な解説ありがとうございました。
う〜ん、難しそうだな・・・。
|
|