環境はvisualC++2003、
WindowsAPIで作成しています。
ラジオボタンをダイアログ上に配置し、そのチェックがあるかないかを
確かめたいと思っているのですが、
このようにしてみましたが上手く行きません。
以下、ダイアログのコールバック関数内の処理です。
//初期化時にチェックするよう指示
case WM_INITDIALOG:
SendMessage( GetDlgItem( hDlgWnd, IDC_RADIO1 ), BM_SETCHECK,(WPARAM)check1, 0L );
return TRUE;
case WM_COMMAND:
switch( LOWORD( wp ) ){
// okボタンを押されたときにチェックがあるかないかを調べる
case IDOK:
if( IsDlgButtonChecked( hDlgWnd, IDC_RADIO1) ==BST_UNCHECKED
{
}
if( IsDlgButtonChecked( hDlgWnd, IDC_RADIO1 ) ==BST_CHECKED ) {
}
ここでなぜか、IsDlgButtonCheckedの戻り値がチェックをしている状態でも
BST_UNCHECKEDが返ってきてしまいます。
よろしくお願い致します。
とりあえず、そのラジオボタンのスタイルを確認してみるとか。
WinUser.h(9068): #define BST_UNCHECKED 0x0000
ということで0です。
MSDNで、IsDlgButtonChecked()を確認すると…
>The return value from a button created with the BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON, BS_AUTO3STATE, BS_CHECKBOX, BS_RADIOBUTTON, or BS_3STATE styles can be one of the values in the following table. If the button has any other style, the return value is zero.
ということで、記述されたスタイルが無い場合でも0が返されます。
/*
RadioButtonCheck.cpp
XP sp3 , VC2005
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE"
/Gm /EHsc /RTC1 /MDd /Fo"Debug\\"
/Fd"Debug\vc80.pdb" /W4 /nologo /c /Wp64 /ZI /TP /errorReport:prompt
*/
#include <windows.h>
#include "resource.h"
INT_PTR CALLBACK DialogProc( HWND, UINT, WPARAM, LPARAM ) ;
INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, PSTR, INT )
{
DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc ) ;
return 0 ;
}
INT_PTR CALLBACK DialogProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM /*lParam*/ )
{
switch( msg )
{
case WM_INITDIALOG :
SendDlgItemMessage( hDlg, IDC_RADIO1,BM_SETCHECK, BST_CHECKED, 0 ) ;
return TRUE ;
case WM_COMMAND :
switch( LOWORD( wParam ) )
{
case IDOK :
if( IsDlgButtonChecked( hDlg, IDC_RADIO1 ) == BST_UNCHECKED )
{
MessageBox( NULL, TEXT("UnChecked"), TEXT("Info"), MB_OK ) ;
return TRUE ;
} else {
MessageBox( NULL, TEXT("Checked"), TEXT("Info"), MB_OK) ;
}
return TRUE ;
}
case WM_CLOSE :
EndDialog( hDlg, 0 ) ;
return TRUE ;
}
return FALSE ;
}
// こういうことですか?
瀬戸っぷさん、かもねぎさんありがとうございます。
瀬戸っぷさん>確認しましたが特に間違いはなさそうです。。
かもねぎさん>やりたいことはそういうことです。
プログラムをもう一度チェックしてみたところ、ダイアログのリソースを追加すると自動的に"resource.h"が追加され、そこにリソースのコントロール類のdefineが記述があるのですが、私の場合、自前のヘッダを用意しそちらにコントロール類のdefineをし、インクルードし、"resource.h"をインクルードせずに動かしていました。そのためチェックのあるかないかを取得できなかったようです。
自前のヘッダでなく、"resource.h"をインクルードしたら取得ができました。
一応解決とさせていただきます。
ヒントをくださった瀬戸っぷさん、かもねぎさんありがとうございます
ツイート | ![]() |