• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            子類化窗口如何才能接收到WM_CREATE、WM_NCCREATE等消息

            主  題:
            子類化窗口如何才能接收到WM_CREATE、WM_NCCREATE等消息
            作  者:
            mopyman (only you c plus plus)
            等  級:
            信 譽 值:
            98
            所屬論壇:
            VC/MFC 基礎類
            問題點數:
            100
            回復次數:
            18
            發表時間:
            2007-3-12 20:57:07








            一般子類化窗口的時候是無法接收到WM_CREATE,WM_NCCREATE消息的,因為子類化的時候,已經錯過了處理這些消息的時機,有什么方法可以接收到這些消息呢?


            回復人:chehw(chehw) ( 兩星(中級)) 信譽:110 2007-3-12 21:03:06 得分:0


            ?

            可以使用超類化(supper class)方法。
            注冊一個新窗口類,新窗口的回調函數默認返回原始窗口的處理過程。

            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-12 21:17:28 得分:0


            ?

            不想超類化也不想全局子類化,有其他方法嗎?
            Top


            回復人:bucherren() ( 一級(初級)) 信譽:99 2007-3-12 21:20:39 得分:0


            ?

            關注,只知道超類化方法
            Top


            回復人:chehw(chehw) ( 兩星(中級)) 信譽:110 2007-3-12 21:38:20 得分:0


            ?

            在PreTranslateMessage或GetMessage消息循環中可以截獲,但這是以犧牲性能為代價的。
            超類化是最簡單易行的方法。
            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-13 8:37:02 得分:0


            ?

            超類化有個缺點,必須要先建立一個窗口才可以超類化,
            也就是對應每個窗口類要維護一個額外的窗口,其余的窗口才能從超類化中受益
            Top


            回復人:chehw(chehw) ( 兩星(中級)) 信譽:110 2007-3-13 9:47:57 得分:0


            ?


            如果直接用API, 只要得到窗口回調函數地址的函數指針就可以了,沒有必要新建一個窗口。
            如果是自定義的窗口類, 那么你已知這個函數的地址, 在超類的回調函數中返回就可以了.
            如果是系統內置的窗口控件, 可通過GetClassInfoEx獲取函數的地址。

            MFC下的方法類似,
            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-13 10:03:29 得分:0


            ?

            記錯了,全局子類化需要一個窗口句柄,超類化不需要
            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-13 10:18:52 得分:0


            ?

            超類化也有一個問題,當使用對話框的時候,dialog里的子窗口控制如何超類化掉?
            就算在dialog創建之前,把所有用到的子窗口類型都超類化掉,dialog也不會給我們傳遞
            每個子窗口控制的相關信息,也就無法對每個子窗口進行特化。
            而如果由我們自己創建子窗口的話,可以在createwindowex中的lparam里傳遞一些子窗口
            控制相關的數據,比如一個窗口對象this指針。
            Top


            回復人:chehw(chehw) ( 兩星(中級)) 信譽:110 2007-3-13 10:29:33 得分:0


            ?

            對于在資源文件中加入的控件, 只能在對話框的WM_INITDIALOG中通過
            hChildWnd=GetDlgItem(hDlg, ID_xxx);
            SetWindowLong(hChildWnd, GWL_USERDATA, (LONG)pData);
            加入額外的數據。

            如果是自己手工創建的控件,創建時就可傳入必要的數據,通過超類化在WM_CREATE中將數據保存。

            Top


            回復人:gofqjyie(誓將天下了然于胸) ( 四級(中級)) 信譽:100 2007-3-13 10:32:53 得分:0


            ?

            虛擬繼承它,可以嗎?
            Top


            回復人:tszzp(神奇) ( 三級(初級)) 信譽:98 2007-3-13 10:34:06 得分:0


            ?

            你可以使用WH_CBT鉤子,這樣的話,你就可以收到那些消息了。
            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-13 10:39:36 得分:0


            ?

            WH_CBT鉤子有一個問題,我一直不明白,就是當有窗口創建的時候,
            你怎么知道就是你想要的窗口呢,也就是如果對應windows窗口句柄和c++窗口對象,
            好像所有的窗口創建的時候都會被WH_CBT截獲
            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-13 10:45:36 得分:0


            ?

            對于在資源文件中加入的控件, 只能在對話框的WM_INITDIALOG中通過
            hChildWnd=GetDlgItem(hDlg, ID_xxx);
            SetWindowLong(hChildWnd, GWL_USERDATA, (LONG)pData);
            加入額外的數據。

            如果是自己手工創建的控件,創建時就可傳入必要的數據,通過超類化在WM_CREATE中將數據保存。
            =====================================
            這樣一來,對話框里的子窗口控制將仍然無法獲得WM_CREATE消息,
            因為我想要的超類的窗口過程是個通用的,通過額外的參數來辨識是哪個窗口對象,
            從而把消息先交該窗口對象處理,再調用原系統窗口過程,這樣就更
            hChildWnd=GetDlgItem(hDlg, ID_xxx);
            SetWindowLong(hChildWnd, GWL_USERDATA, (LONG)pData);的時候已經錯過了WM_CREATE消息
            Top


            回復人:chehw(chehw) ( 兩星(中級)) 信譽:110 2007-3-13 10:51:11 得分:0


            ?

            你需要知道父窗口的句柄和子窗口的id
            LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam );
            {
            CBT_CREATEWND *pcc=(CBT_CREATEWND *)lParam;
            if(pcc->lpcs->hwndParent==hParent && pcc->lpcs->hMenu==(HMENU)id)
            {
            ...
            }
            return 0L;
            }
            Top


            回復人:chehw(chehw) ( 兩星(中級)) 信譽:110 2007-3-13 11:08:09 得分:0


            ?

            有一個方法,但必額外創建一個窗口。如:
            HWND hEdit=CreateWindowEx(0, TEXT("EDIT"), ...);
            //強行將以后創建的所有edit處理過程均改為超類的窗口過程。
            SetClassLong(hEdit, GCL_WNDPROC, (LONG)CMyEdit::MyEditProc);
            DestroyWindow(hEdit);


            Top


            回復人:mopyman(only you c plus plus) ( 三級(初級)) 信譽:98 2007-3-13 12:22:21 得分:0


            ?

            你說的這個就是全局子類化
            Top


            回復人:Kerrie() ( 五級(中級)) 信譽:100 2007-3-13 12:45:09 得分:0


            ?

            這個問題是有點疙疙瘩瘩的,看你的用途了,如果僅僅是做一些初始化的處理(繪制處理如皮膚等除外),以對話框為例,可以用一些變通的方法:
            1。子窗口初始化無法create消息,不過可以觸發PreSubClassWnd虛函數。
            2。自己創建需要截獲消息的子窗口。終究不是所有的子窗口你都需要create消息的:)
            3。如樓上各位所說的超類或者鉤子處理了,不過個人建議如果不是皮膚等工作,還是避免處理大范圍的消息為好

            Top


            回復人:mynamelj(風動,帆動,仁者心動) ( 兩星(中級)) 信譽:105 2007-3-14 8:40:17 得分:0


            ?

            還可以用Hook WndProc來截獲
            Top





            管理 | 關閉窗口




            網站簡介 - 廣告服務 - 網站地圖 - 幫助信息 - 聯系方式
            百聯美達美公司 版權所有 京ICP證020026號
            Copyright ? CSDN.net, Inc. All rights reserved

            posted on 2007-07-18 00:37 旅途 閱讀(1451) 評論(0)  編輯 收藏 引用 所屬分類: 深入windows

            国产精品岛国久久久久| 日韩精品久久久肉伦网站| 国产高潮国产高潮久久久91| 国产精品免费久久久久久久久| 青青国产成人久久91网| 少妇被又大又粗又爽毛片久久黑人 | 99久久精品免费观看国产| 深夜久久AAAAA级毛片免费看| 久久九九兔免费精品6| 久久久久免费精品国产| 热99RE久久精品这里都是精品免费| 人妻无码久久一区二区三区免费 | 国产精品99久久精品爆乳| 久久精品极品盛宴观看| 久久综合久久综合九色| 亚洲精品国精品久久99热一| 久久亚洲中文字幕精品一区| 久久精品一区二区| 久久精品www人人爽人人| 国内精品伊人久久久影院| 狠狠人妻久久久久久综合蜜桃 | 91麻豆精品国产91久久久久久| 中文字幕无码久久久| 色噜噜狠狠先锋影音久久| 久久精品天天中文字幕人妻| 一级做a爰片久久毛片毛片| 久久AⅤ人妻少妇嫩草影院| 亚洲成人精品久久| 亚洲国产成人久久精品动漫| AV无码久久久久不卡网站下载| 亚洲人成精品久久久久| 婷婷久久五月天| 久久天天躁狠狠躁夜夜躁2014| 欧美一级久久久久久久大| 久久久久99精品成人片| 国产免费久久精品99久久| 国产福利电影一区二区三区久久久久成人精品综合 | 久久99精品国产| 1000部精品久久久久久久久| 好久久免费视频高清| 欧美亚洲国产精品久久蜜芽|