以下サンプルコード
#include <windows.h>
#include "DxLib.h"
#pragma warning(disable : 4996)
HMENU hSubmenu;
HMENU hSub1;
HMENU hSub2;
int CreateMenuDX();
int DestoryMenuDX();
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char Buf[256];//キーボード入力状態保持用
char buf[20];
BOOL cb_MouseRFlg = FALSE;
int count = 0;
// ウインドウモードに変更
ChangeWindowMode( TRUE );
//プロシージャをフック
SetHookWinProc(WndProc);
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
//ウインドウがアクティブではない状態でも処理を続行する
SetAlwaysRunFlag(TRUE);
//メニュー作成
CreateMenuDX();
while(1)
{
if(count > 1000000)
{
count = 0;
}
else
{
count++;
}
// メッセージループに代わる処理をする
if( ProcessMessage() == -1 )
{
break ; // エラーが起きたらループを抜ける
}
//キーボード入力があれば処理する
if(CheckHitKeyAll(DX_CHECKINPUT_KEY) != 0)
{
//キーボード入力状態を取得
GetHitKeyStateAll(&Buf[0]);
//ESCチェック
if(Buf[KEY_INPUT_ESCAPE])
{
break;
}
}
//左マウス押下処理
if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0)
{
//LBUTTONDOWN時の場合のみ処理する
if(cb_MouseRFlg == FALSE)
{
::MessageBoxA(NULL,"左マウス押下","Sample",MB_OK);
}
}
else
{
//マウスクリック判定(LBUTTON押下検知後、押し続け処理させない)
if(cb_MouseRFlg == TRUE)
{
cb_MouseRFlg = FALSE;
}
}
sprintf(buf,"count:%d",count);
DrawBox( 0 , 0 , 640 , 480 , GetColor(0,0,200) , TRUE) ;
DrawString(100,300,buf,GetColor(200,0,0),GetColor(0,200,0));
ScreenFlip();
}
//メニュー破棄
DestoryMenuDX();
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
int CreateMenuDX()
{
//サブメニュー作成
//HMENU hmenu = ::CreateMenu();
hSubmenu = ::CreatePopupMenu();
hSub1 = ::CreatePopupMenu();
hSub2 = ::CreatePopupMenu();
MENUITEMINFO mii;
mii.cbSize = sizeof(MENUITEMINFO);
/*
//ショートカットメニュー作成
mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
mii.fType = MFT_STRING;
mii.hSubMenu = hSubmenu;
mii.dwTypeData = TEXT("未表示");
::InsertMenuItem(hmenu,0,TRUE,&mii);
*/
//ショートカット登録
mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
mii.fType = MFT_STRING;
mii.hSubMenu = hSub1;
mii.dwTypeData = TEXT("ショートカット1");
::InsertMenuItem(hSubmenu,0,TRUE,&mii);
mii.hSubMenu = hSub2;
mii.dwTypeData = TEXT("ショートカット2");
::InsertMenuItem(hSubmenu,1,TRUE,&mii);
//サブメニュー登録(識別子付き)
mii.fMask = MIIM_ID | MIIM_TYPE;
mii.fType = MFT_STRING;
mii.wID = 100;
mii.dwTypeData = TEXT("サブメニュー1-1");
::InsertMenuItem(hSub1,100,FALSE,&mii);
mii.wID = 110;
mii.dwTypeData = TEXT("サブメニュー1-2");
::InsertMenuItem(hSub1,110,FALSE,&mii);
mii.wID = 200;
mii.dwTypeData = TEXT("サブメニュー2-1");
::InsertMenuItem(hSub2,200,FALSE,&mii);
mii.wID = 210;
mii.dwTypeData = TEXT("サブメニュー2-1");
::InsertMenuItem(hSub2,210,FALSE,&mii);
return 0;
}
int DestoryMenuDX()
{
::DestroyMenu(hSub2);
::DestroyMenu(hSub1);
::DestroyMenu(hSubmenu);
//::DestroyMenu(hmenu);
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static HMENU hMenu, hSubMenu;
POINT pos;
switch( msg )
{
case WM_COMMAND: // 項目が選択されたとき
switch( LOWORD( wp ) )
{
case 100:
::MessageBoxA(NULL,"サブメニュー1-1","Sample",MB_OK);
break;
case 110:
::MessageBoxA(NULL,"サブメニュー1-2","Sample",MB_OK);
break;
case 200:
::MessageBoxA(NULL,"サブメニュー2-1","Sample",MB_OK);
break;
case 210:
::MessageBoxA(NULL,"サブメニュー2-2","Sample",MB_OK);
break;
}
return 0;
case WM_RBUTTONDOWN: // マウスの右ボタンが離されたとき
// カーソルの位置を取得する
pos.x = LOWORD( lp );
pos.y = HIWORD( lp );
// 取得したカーソル位置を、スクリーン座標に変換する
ClientToScreen( GetMainWindowHandle(), &pos );
// ポップアップメニューを表示する
//TrackPopupMenu( hSubMenu, TPM_LEFTALIGN, pos.x, pos.y, 0, hWnd, NULL );
::TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, pos.x, pos.y, 0, GetMainWindowHandle(), NULL);
::DrawMenuBar(GetMainWindowHandle());
break;
//これで返すと、DXライブラリで情報取得できない
return 0;
case WM_CLOSE: // ウィンドウが閉じられるとき
// メニューリソースを破棄する
//DestroyMenu( hMenu );
//hMenu = NULL;
break; // ウィンドウを閉じる処理はDefWindowProc()に任せる
case WM_DESTROY: // ウィンドウが破棄されるとき
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wp, lp );
}