消息的產生(針對mfc)

這是09年寫的文章,07年畢的業,我也沒有系統的看過mfc的書,看了也沒仔細看,囫圇吞棗,自得奇異,若有不對,還望你海涵。後面看到寫的垃圾稍加整理

題外話:王選先生曾說:當一個人出現在媒體的面前,說明這個人已經不再搞研發了,只好賣狗皮膏月一樣在觀衆面前叫賣。我沒資格被王選先生罵,因此繼續。消息的產生很少講,但我一直很想搞明白怎麼回事。鼠標和鍵盤都可產生消息中斷。只研究鼠標,比如它的左擊事件。呵呵,下面看有趣的代碼。
class CCustListCtrl : public CListCtrl{}//CListCtrl標準控件
void CCustListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("list down");
CListCtrl::OnLButtonDown(nFlags, point);
}//下面爲dlg
void CC321Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("dlg down");
CDialog::OnLButtonDown(nFlags, point);
}
CC321Dlg dlg;CCustListCtrl listctrl ;listctrl是dlg的一個變量;那麼在"listctrl的區域"單擊鼠標左鍵,上面的兩個消息誰先處理,是否都能被激發。CCustListCtrl::OnLButtonDown先被處理,並且 CC321Dlg::OnLButtonDown是不會被處理的。說明在哪個子控件上方單擊鼠標,事件僅僅被送往此子控件處理,即使此子控件不處理,消息不會往下傳遞給父窗體,"因爲並且"子控件的父類可以處理完畢。要是把上面"CListCtrl::OnLButtonDown(nFlags, point);"這句話屏蔽掉,那麼listctrl是不會被重繪製的。說明CListCtrl::OnLButtonDown觸發了Invalidate函數,造成基類的OnPaint事件被處理,控件重繪。
下個問題,假若有dlg上有成千個子控件,消息如何被送往對應的子控件。呵呵,你創建窗體的時候每個控件的位置都已經按一定的規律排列好的,用鼠標的點位置匹配控件的範圍要不了幾次判斷。對?我個人的理解。比如windows界面這個大窗體上有兩個對話框,其一對話框a上有成千個控件。鼠標左鍵單擊對話框a上任控件,這時windows界面大線程會用鼠標座標匹配是否在兩個對話框其中一個內,判斷後,把消息傳給a;不在,就傳給windows窗體的客戶區域。接着再用鼠標座標匹配對話框a中子控件的位置,很快的找到對應的控件,因爲是排列有序的。
下面我整體上講windows操作系統的整個界面消息處理流程。鼠標和鍵盤都是消息觸發機,你看到的windows界面看做是個大MFC 對話框(說的有點倉促呀,應該是多文檔容器或者更復雜的東西吧)。每個MFC有個主線程,接收消息,peek消息,分發消息,鼠標的消息傳給windows界面,windows界面這個主線程的while函數peek到消息之後,開始分發,判斷當前處於激活對話框是a,就發給a對話框;a對話框同理也有主線程,主線程也有個while,peek到消息,判斷怎麼分發呀,判斷當前鼠標在哪個控件位置呀,就交給哪個控件對象處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章