• <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 旅途 閱讀(1447) 評論(0)  編輯 收藏 引用 所屬分類: 深入windows

            久久91精品久久91综合| 亚洲国产成人久久综合野外| 久久久国产视频| 日韩人妻无码精品久久久不卡 | 久久久久久午夜成人影院| 嫩草伊人久久精品少妇AV| 伊人久久综合热线大杳蕉下载| 精品久久久久久无码国产| 亚洲精品NV久久久久久久久久| 亚洲午夜无码久久久久| 久久777国产线看观看精品| 久久精品18| 久久婷婷国产综合精品| 久久国产视屏| 久久精品aⅴ无码中文字字幕重口| 亚洲国产天堂久久综合网站 | 91精品国产综合久久婷婷| 久久99精品久久久久久9蜜桃| 久久人人爽人人爽人人片AV高清 | 26uuu久久五月天| 久久久久久精品成人免费图片| 久久精品嫩草影院| 久久精品国产精品亚洲精品| 国产国产成人久久精品 | 国产精品久久久天天影视香蕉 | 国产精品久久成人影院| 亚洲欧美另类日本久久国产真实乱对白 | 久久香蕉国产线看观看精品yw| 久久午夜福利电影| Xx性欧美肥妇精品久久久久久 | 欧洲精品久久久av无码电影| 久久久噜噜噜久久| 久久青草国产精品一区| 久久国产色AV免费看| 国产99久久久国产精品小说| 久久精品女人天堂AV麻| 嫩草影院久久99| 九九久久精品国产| 久久有码中文字幕| 伊人久久国产免费观看视频| 99久久做夜夜爱天天做精品|