MFC中CheckBox在做互斥操作時遇到的隱形問題

首先,對這個checkbox進行操作時,用的不是系統的CheckBox控件,而是自己重繪的CMyCheckBox。

在當前自繪類中,是用OnLbuttonUp消息做的狀態轉換

void CMyCheckBox::OnLButtonUp(UINT nFlags, CPoint point)
{
 	m_bState = !m_bState;
	CButton::OnLButtonUp(nFlags , point);
}

解釋:當用戶點擊控件區域時,進行狀態轉換。

外部對話框調用時,使用虛函數OnCommand消息觸發

switch(wParam)
	{
	case  IDC_CHECK1:
		{
			m_check1.SetCheck(1);
			m_check2.SetCheck(0);
			m_check3.SetCheck(0);
			m_check4.SetCheck(0);
		}
		break;
	case IDC_CHECK2:
		{
			m_check1.SetCheck(0);
			m_check2.SetCheck(1);
			m_check3.SetCheck(0);
			m_check4.SetCheck(0);
		}
		break;
	case IDC_CHECK3:
		{
			m_check1.SetCheck(0);
			m_check2.SetCheck(0);
			m_check3.SetCheck(1);
			m_check4.SetCheck(0);
		}
		break;
	case IDC_CHECK4:
		{
			m_check1.SetCheck(0);
			m_check2.SetCheck(0);
			m_check3.SetCheck(0);
			m_check4.SetCheck(1);
		}
		break;
	}

這裏,我只是簡單的寫了多個check只有一個處於被觸發狀態。也就是互斥。

如果只是爲了實現效果,在OnLbuttonUp中也是可以實現這種操作的,但是,點擊快速的時候就會出現些問題。

比如:當點擊一個控件並未彈起又點擊其他控件時,出現了兩個check控件同時處於選中狀態。這就和剛開始定義的需求有些不符了。

思路:

我以爲是OnCommand消息自己並沒有即使觸發消息,後來經過打Log發現了問題(在此,我是用OutputDebugString這個函數進行日誌調試輸出的)。當快速點擊Check控件時,發現,走到就不會走OnCommand消息了,就好像阻塞住一樣。

後來,我就換了Check自己的BN_CLICK消息,發現也存在這個問題。說明是當快速點擊後,消息就被OnLbuttonUp消息阻塞住了,肯定是在自繪過程中沒有重寫BN_CLICK消息的原因。應該在Check控件本身的點擊響應消息中做處理

所以,我在自繪Check控件類中使用了BN_CLICK消息響應。

頭文件添加消息函數:

afx_msg BOOL OnBnClickedCheck();

cpp文件實現

BOOL CMyCheckBox::OnBnClickedCheck()
{
	//OutputDebugString(L"check控件中\n");
	m_bState = !m_bState;
	return FALSE;
}

消息處理

ON_CONTROL_REFLECT_EX(BN_CLICKED,&CMyCheckBox::OnBnClickedCheck)

特別聲明一點,當重寫系統消息時,一定要將void返回值改成BOOL類型,否則消息無法被髮送出去,當返回return TRUE時,也無法將消息發送出去

好啦,大家可以試試我說的方法,如果不行可以小窗口微我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章