実現したいこと
Win32APIでラジオボタンを作成し、どのラジオボタンが押されたかを取得したいです。そこでまず、ラジオボタンが押されたことが正しく取得できているかを確認するためにメッセージボックスを表示させるようにしました。
発生している問題
ラジオボタンを押しても、ラジオボタンを押したことを通知するメッセージボックスが表示されません。
以下のコードで表示されない原因を知りたいです。
ソースコード
c++
1#include<windows.h> 2#include<tchar.h> 3 4 5#define STRLEN 256 6#define ID_Men 11 7#define ID_Lady 12 8 9LRESULT CALLBACK windowfunc(HWND, UINT, WPARAM, LPARAM); 10 11HWND CreateParentWindow(HWND, HINSTANCE, int, const TCHAR szWinName[], const int, const int); 12 13static const TCHAR szWinName[] = _T("key"); 14HINSTANCE hInst; 15HFONT hFont, hFont1; 16 17HWND hGroupX, radioMen, radioLady; 18 19BOOL RadioFunc(HWND, LPARAM); 20 21const HBRUSH BackGround_clear = CreateSolidBrush(RGB(242, 252, 245)); 22const COLORREF TextBackground = RGB(242, 252, 245); 23 24RECT Winsize = { 0,0,1000,750 }; 25 26long i; 27 28//WinMain関数 29int WINAPI WinMain(_In_ HINSTANCE hThisInst, _In_opt_ HINSTANCE hPrevInst, _In_ LPSTR lpszArgs, _In_ int nWinMode) 30{ 31 HWND hwnd=NULL; 32 MSG msg; 33 34 // メインウィンドウの作成 35 CreateParentWindow(hwnd, hThisInst, nWinMode, szWinName, Winsize.right - Winsize.left, Winsize.bottom - Winsize.top); 36 37 38 //インスタンスハンドルの保存 39 hInst = hThisInst; 40 41 //キーボードアクセラレータのロード 42 //haccel = LoadAccelerators(hThisInst, MAKEINTRESOURCE(IDR_ACCELERATOR1)); 43 44 //メッセージループの生成 45 while (GetMessage(&msg, NULL, 0, 0)) { 46 TranslateMessage(&msg); 47 DispatchMessage(&msg); 48 } 49 50 return((int)msg.wParam); 51} 52 53LRESULT CALLBACK windowfunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 54{ 55 56 switch (msg){ 57 case WM_CREATE: 58 RadioFunc(hwnd, lparam); 59 break; 60 61 case WM_COMMAND: 62 switch (LOWORD(wparam)){ 63 case ID_Men: 64 if (BST_CHECKED == SendMessage(radioMen, BM_GETCHECK, 0, 0)) { 65 MessageBox(hwnd, _T("男が押されました。"), _T("Message Box"), MB_OK); 66 } 67 break; 68 case ID_Lady: 69 if (BST_CHECKED == SendMessage(radioLady, BM_GETCHECK, 0, 0)) { 70 MessageBox(hwnd, _T("女が押されました。"), _T("Message Box"), MB_OK); 71 } 72 break; 73 default: 74 break; 75 } 76 break; 77 case WM_DESTROY: 78 PostQuitMessage(0); 79 break; 80 81 default: 82 return (DefWindowProc(hwnd, msg, wparam, lparam)); 83 84 } 85 86} 87// 親ウィンドウ作成 88HWND CreateParentWindow(HWND hwnd, HINSTANCE hThisInst, int nWinMode, const TCHAR szWinName[], const int nWidth, const int nHeight) 89{ 90 WNDCLASSEX wcl; 91 92 //ウィンドウクラスの定義 93 wcl.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX構造体のサイズ 94 wcl.style = 0; //ウィンドウクラススタイル 95 wcl.lpfnWndProc = windowfunc; //ウィンドウ関数 96 wcl.cbClsExtra = 0; //ウィンドウクラスのエキストラ 97 wcl.cbWndExtra = 0; //ウィンドウインスタンスのエキストラ 98 wcl.hInstance = hThisInst; //このプログラムのインスタンスへのハンドル 99 wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); //アイコンへのハンドル 100 wcl.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソルへのハンドル 101 wcl.hbrBackground = BackGround_clear; //(HBRUSH)COLOR_WINDOW背景ブラシへのハンドル 102 wcl.lpszMenuName = NULL; //メニュー 103 wcl.lpszClassName = szWinName; //ウィンドウクラス名 104 wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); //スモールアイコンへのハンドル 105 106 //ウィンドウクラスの登録 107 if (!RegisterClassEx(&wcl)) { 108 return(0); 109 } 110 111 //ウィンドウの生成 112 hwnd = CreateWindow( 113 szWinName, //ウィンドウクラス名 114 szWinName, //ウィンドウ名 115 WS_OVERLAPPEDWINDOW, //ウィンドウスタイル 116 CW_USEDEFAULT, //x座標 117 CW_USEDEFAULT, //y座標 118 nWidth, //幅 119 nHeight, //高さ 120 HWND_DESKTOP, //親ウィンドウへのハンドル 121 NULL, //メニューへのハンドル 122 hThisInst, //このプログラムのインスタンスへのハンドル 123 NULL //追加引数 124 ); 125 126 //ウィンドウの表示 127 ShowWindow(hwnd, nWinMode); 128 UpdateWindow(hwnd); 129 130 return hwnd; 131} 132 133BOOL RadioFunc(HWND hwnd, LPARAM lparam) { 134 135 hGroupX = CreateWindow( 136 _T("BUTTON"), 137 _T("性別"), 138 WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 139 0, 0, 200, 100, 140 hwnd, 141 NULL, 142 ((LPCREATESTRUCT)(lparam))->hInstance, 143 NULL 144 ); 145 146 radioMen = CreateWindow( 147 _T("BUTTON"), 148 _T("男性"), 149 WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 150 10, 30, 150, 30, 151 hGroupX, 152 (HMENU)ID_Men, 153 ((LPCREATESTRUCT)(lparam))->hInstance, 154 NULL 155 ); 156 157 radioLady = CreateWindow( 158 _T("BUTTON"), 159 _T("女性"), 160 WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 161 10, 60, 150, 30, 162 hGroupX, 163 (HMENU)ID_Lady, 164 ((LPCREATESTRUCT)(lparam))->hInstance, 165 NULL 166 ); 167 168 //フォントの作成 169 hFont = CreateFont( 170 25, 0, 0, 0, 171 FW_MEDIUM, 172 FALSE, FALSE, FALSE, 173 SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, 174 CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 175 (VARIABLE_PITCH | FF_DONTCARE), _T("メイリオ")); 176 177 178 hFont1 = CreateFont( 179 30, 0, 0, 0, 180 FW_MEDIUM, 181 FALSE, FALSE, FALSE, 182 SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, 183 CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 184 (VARIABLE_PITCH | FF_DONTCARE), _T("メイリオ")); 185 186 SendMessage(radioMen, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE, 0)); 187 SendMessage(radioLady, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE, 0)); 188 SendMessage(hGroupX, WM_SETFONT, (WPARAM)hFont1, MAKELPARAM(FALSE, 0)); 189 190 return true; 191} 192
試したこと
ネットでラジオボタンのチェック状態の取得方法について調べて自分のソースコードと比較していましたが、このコードのどこに原因があるのか分かりませんでした。
補足情報(FW/ツールのバージョンなど)
Visual Studio 2019
c++

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/01/07 14:29