2013-04-04 61 views
-1

在我的基於MFC對話框的應用程序中,有一個CListCtrl。當用戶點擊列表控件中的空項時,我需要禁用按鈕。我使用了NM_CLICK消息並實現了此功能。但是,如果用戶將鼠標拖出列表控制區域並釋放鼠標,則不起作用。我發現只有在接收到按鈕啓動消息時纔會調用NM_CLICK的原因。是否有其他解決方案。檢測單擊列表控件中的空白項目

回答

0

我找到了問題的解決方案。如果用戶使用鼠標左鍵拖拽鼠標,即LVN_BEGINDRAG,則會出現一條消息。通過在OnBeginDrag函數中處理此消息,我更新按鈕狀態。只要用戶嘗試拖動鼠標,該按鈕就會更新。該代碼是如下: 在頭部添加

afx_msg void OnBeginDrag(NMHDR* pNMHDR, LRESULT *pResult);

在實施添加消息映射和相應的功能:

BEGIN_MESSAGE_MAP(..)

ON_NOTIFY(LVN_BEGINDRAG,IDC_LIST1,OnBeginDrag)

END_MESSAGE_MAP

OnBeginDrag(....)

{

Updatebutton();

}

它解決了問題。謝謝大家的支持。

0

有一些可行的選擇。 在父對話框中,MouseUp Handler函數可以用於此。

afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 

通過使用點,您可以檢查鼠標釋放是否發生CListCtrl。 如果是,您只需禁用該按鈕。

此外,WindowFromPoint可以是另一種選擇。

static CWnd* PASCAL WindowFromPoint(POINT point); 

在諸如OnMouseMove中,如果使用此函數,則可以檢查窗口是否被鼠標指向。

0

實現一個LVN_ITEMCHANGED處理程序,並在該處理程序中一旦selected item count爲零就禁用該按鈕。

1

但是,如果用戶將鼠標拖出列表控制區域並釋放鼠標,這不起作用。

這完全是由設計,你不應該想要這些點擊「計數」。這是用戶在點擊過程中改變主意的唯一方式。它的工作原理是這樣的:

  • 開始到列表框控件對象(或空白區域)上單擊
  • 改變主意
  • 儘管仍然按住鼠標按鈕(即提交之前你單擊),將鼠標指針拖到控件邊界之外
  • Think:Whew!這是一個密切的呼叫!

你會發現,在Windows中,動作永遠不會發生,直到鼠標按鈕發佈(通常被稱爲「的MouseUp」)。如果這不被支持,那麼用戶就無法在任何用戶界面的關鍵功能之前提前撤出操作。

+0

我同意你的看法,但我們正在談論編程,當然程序員不能完全預測用戶的想法。但需要一個解決方案。 – CodeRider 2013-04-05 09:24:55

+0

這是一個標準的Windows設計實踐。您將在整個操作系統和其他兼容程序中看到它。它不需要任何介意。試圖繞過這個重要的用戶界面特性只會讓你很多憤怒的客戶,並導致很多不可維護的代碼。 – 2013-04-05 23:07:20