0から始めるVisualStudio2022:ソフト開発塾

ダイアログ、入力・チェックボックス・ラジオボタンを貼り付け
前に作った、テンプレートを利用して
ダイアログに、ラジオボタン、チェックボックス、グループボックス、
エディットコントロール、スタティックテキストを配置。
ビルドして、実行してみる。
チェックボックスは、問題ないが、ラジオボタンが、1から9の内1つだけしかONにならない。
ダイアログ部のリソースは
DIALOGBOX DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,198,155,50,14
    PUSHBUTTON      "キャンセル",IDCANCEL,252,155,50,14
    CONTROL         "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,15,15,40,16
    CONTROL         "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,15,35,40,16
    CONTROL         "Radio3",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,15,55,40,16
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,15,51,16
    CONTROL         "Check2",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,35,72,16
    GROUPBOX        "スタティック",IDC_STATIC,60,55,230,30
    CONTROL         "Radio4",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,70,64,40,16
    CONTROL         "Radio5",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,115,64,40,16
    CONTROL         "Radio6",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON,160,64,40,16
    CONTROL         "Radio7",IDC_RADIO7,"Button",BS_AUTORADIOBUTTON,15,90,40,16
    CONTROL         "Radio8",IDC_RADIO8,"Button",BS_AUTORADIOBUTTON,75,90,40,16
    CONTROL         "Radio9",IDC_RADIO9,"Button",BS_AUTORADIOBUTTON,130,90,40,16
    LTEXT           "スタティック",IDC_STATIC,15,110,270,16
    EDITTEXT        IDC_EDIT1,15,130,170,16,ES_AUTOHSCROLL
    LTEXT           "スタティック",IDC_STATIC,15,150,120,16
END
Radio4のプロパティを変更(グループをTrueに)
ビルドして、実行してみる。
結果は、1から3で1つだけONに。
4から9の内1つだけしかONにならない。
グループボックスは単なる表示枠なのかなぁ?
Radio7のプロパティを変更(グループをTrueに)
ダイアログ部のリソースは
DIALOGBOX DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,198,155,50,14
    PUSHBUTTON      "キャンセル",IDCANCEL,252,155,50,14
    CONTROL         "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,15,15,40,16
    CONTROL         "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,15,35,40,16
    CONTROL         "Radio3",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,15,55,40,16
    CONTROL         "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,15,51,16
    CONTROL         "Check2",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,35,72,16
    GROUPBOX        "スタティック",IDC_STATIC,60,55,230,30
    CONTROL         "Radio4",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON | WS_GROUP,70,64,40,16
    CONTROL         "Radio5",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,115,64,40,16
    CONTROL         "Radio6",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON,160,64,40,16
    CONTROL         "Radio7",IDC_RADIO7,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,90,40,16
    CONTROL         "Radio8",IDC_RADIO8,"Button",BS_AUTORADIOBUTTON,75,90,40,16
    CONTROL         "Radio9",IDC_RADIO9,"Button",BS_AUTORADIOBUTTON,130,90,40,16
    LTEXT           "スタティック",IDC_STATIC,15,110,270,16
    EDITTEXT        IDC_EDIT1,15,130,170,16,ES_AUTOHSCROLL
    LTEXT           "スタティック",IDC_STATIC,15,150,120,16
END
と、WS_GROUPが追加になっている。
ビルドして、実行してみる。
結果は、1から3で1つだけONに。
4から6で1つだけONに。
7から9の内1だけONになる。
操作的には問題ない。
次、スタティックテキストの文字をプログラムで変える。
まずは、
IDを、IDC_STATICからIDC_TEXT1に変えてみる。
ソース(dialog.cpp)MyDlgProcにコードを追加
    case WM_INITDIALOG:
        SetDlgItemTextA(hDlg, IDC_TEXT1, "TEST OUTPUT");
        break;
変更(設定)できている。
では、もう一つのスタティックテキストのIDを、
IDC_STATICからIDC_TEXT2に変える。
マウスの右ボタンが押されたら、エディットコントロールの内容を
このスタティックテキストに入れるように
ソース(dialog.cpp)MyDlgProcにコードを追加
    case WM_RBUTTONDOWN:{
        char mm_buff[300];
        GetDlgItemTextA(hDlg, IDC_EDIT1,(LPSTR)mm_buff,sizeof(mm_buff));
        SetDlgItemTextA(hDlg, IDC_TEXT2, mm_buff);
        break;
    }
ビルド、実行。
さて、ラジオボタン、チェックボックスの状態取得は、非常にややこしい。
もうこれは、まじないの様だ。
        //                                          1         2         3         4
        //                                01234567890123456789012345678901234567890123456789
	strcpy_s(mm_buff,sizeof(mm_buff),"1:xxx 2:xxx radio1-3:  radio4-6:   radio7-9:  ");
//      mm_check1 = SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0);
//      mm_check2 = SendMessage(GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0);
//      mm_radio1 = SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0);
//      mm_radio2 = SendMessage(GetDlgItem(hDlg, IDC_RADIO2), BM_GETCHECK, 0, 0);
//      mm_radio3 = SendMessage(GetDlgItem(hDlg, IDC_RADIO3), BM_GETCHECK, 0, 0);
//      mm_radio4 = SendMessage(GetDlgItem(hDlg, IDC_RADIO4), BM_GETCHECK, 0, 0);
//      mm_radio5 = SendMessage(GetDlgItem(hDlg, IDC_RADIO5), BM_GETCHECK, 0, 0);
//      mm_radio6 = SendMessage(GetDlgItem(hDlg, IDC_RADIO6), BM_GETCHECK, 0, 0);
	if(SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0)){
            mm_buff[2]='O'; mm_buff[3]='n'; mm_buff[4]=' ';
	}else{
            mm_buff[2]='O'; mm_buff[3]='f'; mm_buff[4]='f';
	}
	if(SendMessage(GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0)){
            mm_buff[8]='O'; mm_buff[9]='n'; mm_buff[10]=' ';
	}else{
            mm_buff[8]='O'; mm_buff[9]='f'; mm_buff[10]='f';
	}
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0)){
            mm_buff[21]='1';
	}else
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO2), BM_GETCHECK, 0, 0)){
            mm_buff[21]='2';
	}else
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO3), BM_GETCHECK, 0, 0)){
            mm_buff[21]='3';
	}
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO4), BM_GETCHECK, 0, 0)){
            mm_buff[32]='4';
	}else
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO5), BM_GETCHECK, 0, 0)){
            mm_buff[32]='5';
	}else
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO6), BM_GETCHECK, 0, 0)){
            mm_buff[32]='6';
	}
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO7), BM_GETCHECK, 0, 0)){
            mm_buff[44]='7';
	}else
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO8), BM_GETCHECK, 0, 0)){
            mm_buff[44]='8';
	}else
	if(SendMessage(GetDlgItem(hDlg, IDC_RADIO9), BM_GETCHECK, 0, 0)){
            mm_buff[44]='9';
	}
実行結果
実行結果
実行結果
以上。
最終的なソース(dialog.cpp)は
#include <Windows.h>
#include "resource.h"

HINSTANCE g_hInst;

BOOL CALLBACK MyDlgProc(
    HWND hDlg,
    UINT msg,
    WPARAM wPara,
    LPARAM lPara
) {
    switch (msg) {
    case WM_INITDIALOG:
        SetDlgItemTextA(hDlg, IDC_TEXT1, "TEST OUTPUT");
        break;
    case WM_RBUTTONDOWN: {
        char mm_buff[300];
        GetDlgItemTextA(hDlg, IDC_EDIT1, (LPSTR)mm_buff, sizeof(mm_buff));
        SetDlgItemTextA(hDlg, IDC_TEXT2, mm_buff);
        //                                            1         2         3         4
        //                                  01234567890123456789012345678901234567890123456789
        strcpy_s(mm_buff, sizeof(mm_buff), "1:xxx 2:xxx radio1-3:  radio4-6:   radio7-9:  ");
        //      mm_check1 = SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0);
        //      mm_check2 = SendMessage(GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0);
        //      mm_radio1 = SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0);
        //      mm_radio2 = SendMessage(GetDlgItem(hDlg, IDC_RADIO2), BM_GETCHECK, 0, 0);
        //      mm_radio3 = SendMessage(GetDlgItem(hDlg, IDC_RADIO3), BM_GETCHECK, 0, 0);
        //      mm_radio4 = SendMessage(GetDlgItem(hDlg, IDC_RADIO4), BM_GETCHECK, 0, 0);
        //      mm_radio5 = SendMessage(GetDlgItem(hDlg, IDC_RADIO5), BM_GETCHECK, 0, 0);
        //      mm_radio6 = SendMessage(GetDlgItem(hDlg, IDC_RADIO6), BM_GETCHECK, 0, 0);
        if (SendMessage(GetDlgItem(hDlg, IDC_CHECK1), BM_GETCHECK, 0, 0)) {
            mm_buff[2] = 'O'; mm_buff[3] = 'n'; mm_buff[4] = ' ';
        } else {
            mm_buff[2] = 'O'; mm_buff[3] = 'f'; mm_buff[4] = 'f';
        }
        if (SendMessage(GetDlgItem(hDlg, IDC_CHECK2), BM_GETCHECK, 0, 0)) {
            mm_buff[8] = 'O'; mm_buff[9] = 'n'; mm_buff[10] = ' ';
        } else {
            mm_buff[8] = 'O'; mm_buff[9] = 'f'; mm_buff[10] = 'f';
        }
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO1), BM_GETCHECK, 0, 0)) {
            mm_buff[21] = '1';
        }else
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO2), BM_GETCHECK, 0, 0)) {
            mm_buff[21] = '2';
        }else
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO3), BM_GETCHECK, 0, 0)) {
            mm_buff[21] = '3';
        }
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO4), BM_GETCHECK, 0, 0)) {
            mm_buff[32] = '4';
        }else
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO5), BM_GETCHECK, 0, 0)) {
            mm_buff[32] = '5';
        }else
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO6), BM_GETCHECK, 0, 0)) {
            mm_buff[32] = '6';
        }
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO7), BM_GETCHECK, 0, 0)) {
            mm_buff[44] = '7';
        }else
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO8), BM_GETCHECK, 0, 0)) {
            mm_buff[44] = '8';
        }else
        if (SendMessage(GetDlgItem(hDlg, IDC_RADIO9), BM_GETCHECK, 0, 0)) {
            mm_buff[44] = '9';
        }
        SetDlgItemTextA(hDlg, IDC_TEXT1, mm_buff);
        break;
    }
    case WM_COMMAND:
        switch (LOWORD(wPara)) {
        case IDOK:
            EndDialog(hDlg, IDOK);
            return TRUE;
        case IDCANCEL:
            EndDialog(hDlg, IDCANCEL);
            return TRUE;
        }
        return FALSE;
    }
    return FALSE;
}
int WINAPI WinMain(
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow) {

    g_hInst = hInstance;
    DialogBoxA(hInstance, "DIALOGBOX", NULL, (DLGPROC)MyDlgProc);

    return 0;
}
と、なりました。







Top