2014-12-02 2 views
2

В настоящее время у меня есть флажок, созданный в WM_CREATE:Использование WINAPI, как мне изменить значение кнопки?

hwndButtonPollFlag = 
CreateWindow(
    TEXT("BUTTON"), 
    TEXT(sA.getMonitor(monitorSelected)->szDevice), 
    WS_CHILD | WS_VISIBLE | SS_WHITERECT | BS_CHECKBOX, 
    0, 
    0, 
    0, 
    0, 
    hwnd, 
    (HMENU)IDB_PollFlag, 
    hInstance, 
    NULL); 

Я пытаюсь изменить это значение, когда другая кнопка нажата с:

if (sA.getScreenArray(monitorSelected)->getPollFlag()) 
    { 
     SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_CHECKED); 
    } 
    else 
    { 
     SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_UNCHECKED); 
    } 
    SetWindowText(hwndButtonPollFlag, TEXT(sA.getMonitor(monitorSelected)->szDevice)); 

Это действительно изменяет текст, отображаемый рядом с флажком, но а не фактическое состояние кнопки. Кроме того, я хотел бы флажок, чтобы иметь только два состояния (зарегистрированный или незарегистрированный) есть ли другой способ создания этого эффекта, чем в обратном кнопки имеют что-то вдоль линий:

switch (HIWORD(wParam)) 
    { 
    case BST_CHECKED: 
     sA.getScreenArray(monitorSelected)->setPollFlag(true); 
     return 0; 
    case BST_INDETERMINATE: 
     if (sA.getScreenArray(monitorSelected)->getPollFlag()) 
     { 
      SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_UNCHECKED); 
     } 
     else 
     { 
      SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_CHECKED); 
     } 
     return 0; 
    case BST_UNCHECKED: 
     sA.getScreenArray(monitorSelected)->setPollFlag(false); 
     return 0; 
    } 

EDIT: Как Марк Ransom сказал я сообщение с флагом BM_GETCHECK и BM_SETCHECK, как так:

case IDB_MONITOR: 
    monitorSelected = LOWORD(lParam); 
    if (sA.getScreenArray(monitorSelected)->getPollFlag()) 
    { 
     SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, NULL); 
    } 
    else 
    { 
     SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_UNCHECKED, NULL); 
    } 
    SetWindowText(hwndButtonPollFlag, TEXT(sA.getMonitor(monitorSelected)->szDevice)); 
    return 0; 
case WM_COMMAND: 
    //sA.getScreenArray(monitorSelected)->setPollFlag(LOWORD(lParam)); 
    switch (LOWORD(wParam)) 
    { 
    case IDB_PollFlag: 
     if (SendMessage(GetDlgItem(hwnd, IDB_PollFlag), BM_GETCHECK, 0, 0) == BST_CHECKED) 
     { 
      SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, NULL); 
      sA.getScreenArray(monitorSelected)->setPollFlag(true); 
     } 
     else { 
      SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_UNCHECKED, NULL); 
      sA.getScreenArray(monitorSelected)->setPollFlag(false); 
     } 
     break; 
    } 
    return 0; 

ответ

5

Необходимо отправить сообщение BM_SETCHECK.

SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, 0); 
+0

Работал с этим, только после того, как вы отредактировали его в BST_CHECKED, он, наконец, все сработал, спасибо большое! –

+0

@JackHammered жаль, что это было неосторожно с моей стороны. Рад, что вы его работали. –

3

BST_CHECKED и BST_UNCHECKED не являются стилями окна, они просто флаг значения, используемых функциями API CheckDlgButton и IsDlgButtonChecked. CheckDlgButton - это функция вызова для изменения своего состояния.

(Или вы можете отправить BM_SETCHECK и BM_GETCHECK сообщениям непосредственно на кнопку с тем же эффектом).

Смежные вопросы