ラジオボタンのチェックのありなしを確認したい

解決


ななし  2008-07-03 05:08:16  No: 68648

環境は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が返ってきてしまいます。

よろしくお願い致します。


瀬戸っぷ  2008-07-03 08:07:50  No: 68649

とりあえず、そのラジオボタンのスタイルを確認してみるとか。

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が返されます。


かもねぎ  2008-07-03 16:01:32  No: 68650

/*
    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 ;
}
// こういうことですか?


ななし  2008-07-03 20:08:07  No: 68651

瀬戸っぷさん、かもねぎさんありがとうございます。
瀬戸っぷさん>確認しましたが特に間違いはなさそうです。。
かもねぎさん>やりたいことはそういうことです。

プログラムをもう一度チェックしてみたところ、ダイアログのリソースを追加すると自動的に"resource.h"が追加され、そこにリソースのコントロール類のdefineが記述があるのですが、私の場合、自前のヘッダを用意しそちらにコントロール類のdefineをし、インクルードし、"resource.h"をインクルードせずに動かしていました。そのためチェックのあるかないかを取得できなかったようです。
自前のヘッダでなく、"resource.h"をインクルードしたら取得ができました。

一応解決とさせていただきます。
ヒントをくださった瀬戸っぷさん、かもねぎさんありがとうございます


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加