DialogBox でメニューを使う



DialogBox にボタンとメニューを設定します。
DialogBox にはメニューバーが無いので、代わりに右クリックメニューを使います。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. このプログラムは「抽出したレコードを List View に表示」の続きです。
    クエリの作成と List View の表示は 抽出したレコードを List View に表示 を参照して下さい。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    DialogBox に List View とボタンを配置して下さい。
    ボタンのIDはメニューに合わせます。
  3. ページ先頭の右側の画像を参考にメニューを作成して下さい。
    普通のウインドウプログラムと同じように作成します。
    キャプション ID
    編集(&E)
    項目の削除(&D) IDM_DEL
    処理の取り消し(&C) IDOK
    プログラムの終了(&X)IDCANCEL
  4. g_hInst には、インスタンスを保存します。
    g_hList は ListView のハンドルです。
        /*********************************************/
        /*★ DialogBox でメニューを使う    前田 稔 ★*/
        /*********************************************/
        #include    <windows.h>
        #include    <commctrl.h>
        #include    <mysql.h>
        #include    "resource.h"
        #pragma     comment(lib,"comctl32.lib")
        #pragma     comment(lib,"libmysql.lib")
    
        HINSTANCE   g_hInst;
        HWND        g_hList;
    
        // 使用するデータベース
        #define     szDB    "mark"
        // 発行するクエリ
        #define     szSQL   "SELECT * FROM mark_table WHERE v1>49 AND v2>49 AND v3>49"
    
        // MYSQLの定義
        MYSQL       *myData= NULL;      // MySQL の Object
        MYSQL_RES   *res= NULL;         // クエリの Object
        UINT        Count;              // Record 件数
        MYSQL_ROW   row;                // ITEM の領域
    
        //List View Test Data
        char    HEAD[][8]= {  "番号", "名前", "数学", "英語", "C言語"  };
        int     CX[]=      {  70, 120, 60, 60, 60  };
        
  5. WinMain() では MySQL を初期化してサーバーに接続します。
    詳細は DialogBox で表示 を参照して下さい。
    インスタンスを g_hInst に保存して下さい。
  6. DialogBox の CALLBACK 関数です。
    WM_INITDIALOG: で List View を初期化を行います。
    WM_RBUTTONDOWN は DialogBox でマウスが右クリックされた時です。
    DialogBox の List View 上で右クリックすると WM_CONTEXTMENU がポストされてきます。
    LoadMenu() でメニューロードして、右クリックメニューを表示します。
    詳細は 右クリックメニューを設定する を参照して下さい。
    WM_COMMAND でボタンがクリックされたときの処理と右クリックメニューの処理を記述します。
    IDM_DEL は削除ボタンのクリックまたは、項目の削除が選択されたときです。
    ListView から選択状態になっている複数のアイテムを削除します。
    データベースから削除するときは SQL を実行して下さい。
    IDCANCEL は終了ボタンのクリックまたは、プログラムの終了が選択されたときです。
    IDOK は取り消しボタンのクリックまたは、処理の取り消しが選択されたときです。
        //★ Dialog Box の CALLBACK 関数
        LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
        {   POINT       pt;
            HMENU       hMenu,hSubmenu;
            int         nItem,id;
    
            switch (msg)
            {   case WM_INITDIALOG:
                    InitCommonControls();
                    g_hList= GetDlgItem(hDlg,IDC_LIST1);
                    SetInitialData(g_hList);
                    break;
                case WM_RBUTTONDOWN:
                case WM_CONTEXTMENU:
                    pt.x= LOWORD(lp);
                    pt.y= HIWORD(lp);
                    hMenu= LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_MENU1));
                    hSubmenu= GetSubMenu(hMenu,0);
                    ClientToScreen(hDlg,&pt);
                    TrackPopupMenu(hSubmenu,TPM_LEFTALIGN,pt.x,pt.y,0,hDlg,NULL);
                    DestroyMenu(hMenu);
                    break;
                case WM_COMMAND:
                    switch(LOWORD(wp))
                    {   case IDM_DEL:
                            while(1)
                            {   nItem = ListView_GetNextItem(g_hList,-1,LVNI_ALL | LVNI_SELECTED);
                                if (nItem == -1)    break;
                                ListView_DeleteItem(g_hList, nItem);
                            }
                            break;
                        case IDCANCEL:
                            PostMessage(hDlg,WM_CLOSE,0,0);
                            return TRUE;
                        case IDOK:
                            return TRUE;
                    }
                    break;
                case WM_CLOSE:
                    id = MessageBox(NULL,"終了してもよいですか","終了確認",
                         MB_YESNO | MB_ICONQUESTION);
                    if (id==IDYES)  EndDialog(hDlg,TRUE);
                    return  TRUE;
                default:
                    return  FALSE;
            }
            return TRUE;
        }
        
  7. ListView を初期化する SetInitialData() 関数は前回と同じです。

超初心者のプログラム入門(Win32API C++)