2013-04-03 66 views
3

我用的mingw32编译器。 我创建了两个单选按钮:检查单选按钮状态WINAPI

radio1 = CreateWindowExW(WS_EX_TRANSPARENT , L"BUTTON", L"RadioButton1", 
    WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON , 
    0, 0, 0, 0, 
    hwnd, (HMENU)ID_RADIOBTN1, 
    GetModuleHandle(NULL), 0); 
SendMessage(radioBtnDaily, WM_SETFONT, (WPARAM) font, TRUE); 

radio2 = CreateWindowExW(WS_EX_TRANSPARENT , L"BUTTON", L"RadioButton2", 
    WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON , 
    0, 0, 0, 0, 
    hwnd, (HMENU)ID_RADIOBTN2, 
    GetModuleHandle(NULL), 0); 

SendMessage(radio1, BM_SETCHECK , (WPARAM) font, TRUE); 
SendMessage(radio2, WM_SETFONT, (WPARAM) font, TRUE); 

我办理支票状态,这样的事情:

case WM_COMMAND: 
    switch(LOWORD(wParam)) 
    { 
     case ID_RADIOBTN1: 
     { 
      MessageBoxW(NULL, "radio1 is checked", L"radio", MB_OK | MB_ICONERROR); 
     } 
     break; 

     case ID_RADIOBTN2: 
     { 
     MessageBoxW(NULL, "radio2 is checked", L"radio", MB_OK | MB_ICONERROR); 
     } 
     break; 
     .... 

但是当我点击单选按钮所以它不检查这个状态始终运行。 如何在不使用点击事件的情况下检查状态?

回答

0

嗯,这取决于你要检查按钮的状态,所以你需要某种形式的交互什么事件(这可以像最小化的窗口另一个事件,调整大小等,或另一个线程检查,但不修改控件的状态)

+0

我试过但我还没找到解决方案,有没有你的想法? –

3

使用IsDlgButtonChecked

if(IsDlgButtonChecked(hwnd, ID_RADIOBTN1)) 
    MessageBox(NULL, "radio1 is checked") 
else 
    MessageBox(NULL, "radio1 is not checked") 
+0

它不工作,因为它总是让我看到“radio1 is checked”。因为如果我把这个的if-else到'情况ID_RADIOBTN1:'运行它我单击该按钮后,以及全自动设置checkstate之前运行'情况ID_RADIOBTN1:'所以它总是显示选中状态。 –

+0

我想我应该处理两个单选按钮中的一个,但如何.. –

+0

'IsDlgButtonChecked()'返回的实际状态 - 检查,不确定,或听之任之。你正在检查'!= 0'的返回值,对于一个单选按钮来说这总是正确的。你要测试的各个状态返回值来代替,例如:如果'(IsDlgButtonChecked(HWND,ID_RADIOBTN1)== BST_CHECKED)' –

2

使用BM_GETCHECK消息,或Button_GetCheck()宏,得到单选按钮的实际状态,例如:

radio1 = CreateWindowExW(WS_EX_TRANSPARENT , L"BUTTON", L"RadioButton1", 
    WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON , 
    0, 0, 0, 0, 
    hwnd, (HMENU)ID_RADIOBTN1, 
    GetModuleHandle(NULL), 0); 
SendMessage(radio1, WM_SETFONT, (WPARAM) font, TRUE); 

radio2 = CreateWindowExW(WS_EX_TRANSPARENT , L"BUTTON", L"RadioButton2", 
    WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON , 
    0, 0, 0, 0, 
    hwnd, (HMENU)ID_RADIOBTN2, 
    GetModuleHandle(NULL), 0); 
SendMessage(radio2, WM_SETFONT, (WPARAM) font, TRUE); 

case WM_COMMAND: 
    if ((HIWORD(wParam) == BN_CLICKED) 
    { 
     switch(LOWORD(wParam)) 
     { 
      case ID_RADIOBTN1: 
      { 
       switch (Button_GetCheck(radio1)) 
       { 
        case BST_CHECKED: 
         MessageBoxW(NULL, L"radio1 is checked", L"radio", MB_OK); 
         break; 

        case BST_INDETERMINATE: 
         MessageBoxW(NULL, L"radio1 is indeterminate", L"radio", MB_OK); 
         break; 

        case BST_UNCHECKED: 
         MessageBoxW(NULL, L"radio1 is unchecked", L"radio", MB_OK); 
         break; 
       } 
      } 
      break; 

      case ID_RADIOBTN2: 
      { 
       switch (Button_GetCheck(radio2)) 
       { 
        case BST_CHECKED: 
         MessageBoxW(NULL, L"radio2 is checked", L"radio", MB_OK); 
         break; 

        case BST_INDETERMINATE: 
         MessageBoxW(NULL, L"radio2 is indeterminate", L"radio", MB_OK); 
         break; 

        case BST_UNCHECKED: 
         MessageBoxW(NULL, L"radio2 is unchecked", L"radio", MB_OK); 
         break; 
       } 
      } 
      break; 
     } 
    } 
    break; 
+0

这正是IsDlgButtonChecked()所做的。 – Luke

+0

所有'IsDlgButtonChecked()'都会向按钮发送一个'BM_GETCHECK'消息,所以最好直接或者至少使用'Button_GetCheck()'宏来做到这一点。 –