2014-11-25 33 views
0

我想從工作線程訪問我的對話框的拖動滑塊控件。我讀了很多關於從工作線程訪問主窗口控件的警告。因爲他們很有可能導致死鎖。在這種情況下,如何使用消息訪問控件?我知道如何創建用戶定義的消息(WM_USER)並編寫我們自己的處理程序。它想知道的是,每個控件是否有系統定義的消息,並且如果存在,如何發佈這些消息以訪問控件?如何使用消息訪問mfc控件?

回答

1

您可以使用PostMessage向控件發送消息,並且主UI線程將實際將消息分派給控件,即該工作將在UI線程上發生(假設UI線程正在泵送消息)。看着afxcmn.inl你可以看到什麼SetPos是這樣做的:

_AFXCMN_INLINE void CSliderCtrl::SetPos(_In_ int nPos) 
{ ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); } 

改變,對於PostMessage的:

::PostMessage(hSlider, TBM_SETPOS, TRUE, nPos); 

如果你想要的東西更復雜的後一個WM_USER消息給父窗口和處理您的控制管理功能,因爲WM_USER消息將再次由UI線程分派,因此您可以安全地使用控件。

+0

你能解釋下面的例子嗎?我有一個CSliderCtrl命名滑塊。如果我想改變滑塊控件的位置,我怎樣才能不使用slider.setpos()?我如何才能通過發佈消息來做到這一點? – Kumar 2014-11-25 09:32:48

+0

在您發佈的WM_USER消息中,您可以直接調用slider.setpos,因爲您將在UI線程中。我也更新了答案。 – snowdude 2014-11-25 11:57:23