• <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

            久久婷婷五月综合色99啪ak| 久久中文精品无码中文字幕| 久久天天躁狠狠躁夜夜网站| 狠狠色婷婷久久一区二区三区 | 久久天天日天天操综合伊人av| 久久e热在这里只有国产中文精品99| 国产伊人久久| 精品久久久中文字幕人妻| 久久久久久亚洲AV无码专区| 欧美综合天天夜夜久久| 久久婷婷五月综合成人D啪| www久久久天天com| 亚洲国产成人久久精品99| 久久久久成人精品无码中文字幕| 天天久久狠狠色综合| 亚洲伊人久久大香线蕉综合图片 | 久久妇女高潮几次MBA| 久久久一本精品99久久精品88| 精品无码久久久久久久久久| 日产精品久久久一区二区| 久久久无码精品亚洲日韩软件| 久久精品水蜜桃av综合天堂| 99久久国产亚洲综合精品| 国产A级毛片久久久精品毛片| 久久久精品久久久久影院| 九九久久99综合一区二区| 久久亚洲中文字幕精品一区四 | 亚洲精品无码久久久久| 精品国产福利久久久| 性做久久久久久久久老女人| 日韩精品久久无码中文字幕| 九九热久久免费视频| 久久久噜噜噜久久中文福利| 国产V亚洲V天堂无码久久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲精品乱码久久久久久按摩 | 精品国产乱码久久久久久1区2区 | 国内精品久久久久久久久电影网| 亚洲国产精品成人AV无码久久综合影院| 一本一道久久综合狠狠老| 久久久精品人妻无码专区不卡|