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 次