スポンサーリンク

ボタンを押したらそこに出るメニュー

右クリックメニューと同じ要領で、ボタンを押した場所にメニューを出すことを考える。

 

 

#include <windows.h>
#include <tchar.h>
#include "resource.h"
HMENU hmenu_dummy;
const UINT ID_MENU_1 = 100;
const UINT ID_MENU_2 = 101;


INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
  INT_PTR ret = FALSE;
  switch (msg)
  {
  case WM_DESTROY:
    DestroyMenu(hmenu_dummy);
    break;
  case WM_INITDIALOG://メニューの初期設定///////////////////////////
    hmenu_dummy = CreatePopupMenu(); //トップのダミーメニュー
    MENUITEMINFO mii;
    mii.cbSize     = sizeof(MENUITEMINFO);
    mii.fMask      = MIIM_ID | MIIM_TYPE;
    mii.fType      = MFT_STRING;
    mii.wID        = ID_MENU_1;
    mii.dwTypeData = _T("項目1");
    InsertMenuItem(hmenu_dummy, ID_MENU_1, FALSE, &mii);//メニューに項目追加
    mii.wID        = ID_MENU_2;
    mii.dwTypeData = _T("項目2");
    InsertMenuItem(hmenu_dummy, ID_MENU_2, FALSE, &mii);//メニューに項目追加

    break;
  case WM_COMMAND:
    switch(wp){
    case IDC_BUTTON_MENU://ボタンを押したとき//////////////////////
      {
        RECT brect;//ボタンの矩形を取得
        GetWindowRect(GetDlgItem(hWnd, IDC_BUTTON_MENU),&brect);
        TrackPopupMenu(//メニューを表示
          hmenu_dummy,
          TPM_LEFTALIGN, //↓に指定する座標はメニューの左上
          brect.left,brect.top + (brect.bottom-brect.top),
          0,
          hWnd,//親ウィンドウ
          nullptr
        );
      break;
      }
    case ID_MENU_1://メニュー1が押された////////////////////////
      MessageBox(hWnd,_T("メニュー1"),0,0);
      break;
    case ID_MENU_2://メニュー2が押された////////////////////////
      MessageBox(hWnd,_T("メニュー2"),0,0);
      break;
    }
    break;
  // ダイアログを閉じる
  case WM_CLOSE:
    EndDialog( hWnd , (INT_PTR)WM_CLOSE );
    ret =TRUE;
    break;
  }
  return ret;
}

///////////////////////////////////////////////
// エントリーポイント //////////////////////////
//////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow )
{

  INT_PTR d = DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),nullptr,(DLGPROC)DlgWndProc );
  PostQuitMessage(0);

  return 0;
}

 

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: