2017-06-13 31 views
-2

我是WinAPI的初學者,並試圖修改其他人的代碼,製作了一對獨立的非獨佔複選框。如何使複選框獨佔?

我最初的嘗試是取消其他立即如果一個被檢查,但這顯然只在一個方向工作。如果選中IDC_2並嘗試檢查IDC_1,它會再次觸發第一個「if」語句並且失敗。

這是我的代碼:

static WDL_DLGRET dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    if (IsDlgButtonChecked(hwndDlg, IDC_1)) { 

     // do something 

     // try to make exclusive 
     CheckDlgButton(hwndDlg, IDC_2, BST_UNCHECKED); 
    } 

    if (IsDlgButtonChecked(hwndDlg, IDC_2)) { 

     // do something 

     // try to make exclusive 
     CheckDlgButton(hwndDlg, IDC_1, BST_UNCHECKED); 
    } 
} 

我知道單選按鈕,但在這種情況下,選擇也可以是非相互排斥的。有可能沒有檢查兩個盒子(但不是同時存在),所以我認爲單選按鈕在這裏不是正確的選擇,或者?

+6

單選按鈕是相互排斥的選項。如果你想要一個「以上都不是」的選擇,那麼也應該選擇這個選項。恕我直言,使用不符合預期行爲的組件是不好的用戶體驗。 –

+0

獲取兩種狀態;計算出所需的狀態(在代碼中);設置兩種狀態。這將導致用戶意外的行爲,但會做你所問。嘗試找到類似的控件(例如在MS Office中),看看它們是如何實現這種狀態變化的(從用戶角度來看)。 –

+1

不要。複選框並不意味着排他性。這是單選按鈕。爲作業使用正確的控制。當用戶看到複選框時,用戶知道他們是獨立的。當用戶看到單選按鈕時,他們知道他們是排他性的。 –

回答

1

你有兩個解決方案,立即提出自己

  1. 單選按鈕,但添加第三個「無」選項
  2. 反應複選框激活(被選中),並清除出你的其他的複選框。

採取選項1.原則的最小驚喜。顛覆常見的(衆所周知的和功能上被接受的)用戶界面是一個壞主意。

如果這是一個稍後驗證輸入的設置,例如,您可以保留複選框。在對話框或表單,您然後提交,但你需要沿線的增加說明:

最多選擇以下 一個選項,然後執行驗證,拒絕接受,直到最多一個是選擇。

就拿選項1.

+0

選項2對我有效,至少如果只有兩個複選框。當我有兩個互斥的選項時,我經常使用它。換句話說,選項1和選項2都可以不選中,但如果選項2被選中,選項1不能被選中,選項2不能選中選項1被選中 –

+0

@MichaelWalz是的,這是一個有效的方法,因此它在答案中,但對於OP,我建議他採用更簡單的路線,至少現在是這樣。 – Baldrickk

+0

這個答案解決了我關於單選按鈕(和UI設計原理)問題的部分內容,我很欣賞,但並沒有真正回答標題中的問題(「How ...」),即編碼相關的詳細信息imo(也許我避難所儘管這已經足夠清楚了)。但是因爲我在閱讀了所有的評論/回覆之後,現在已經用單選按鈕去了,我會接受它。謝謝。 – nofish