• <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)
            等  級(jí):
            信 譽(yù) 值:
            98
            所屬論壇:
            VC/MFC 基礎(chǔ)類
            問(wèn)題點(diǎn)數(shù):
            100
            回復(fù)次數(shù):
            18
            發(fā)表時(shí)間:
            2007-3-12 20:57:07








            一般子類化窗口的時(shí)候是無(wú)法接收到WM_CREATE,WM_NCCREATE消息的,因?yàn)樽宇惢臅r(shí)候,已經(jīng)錯(cuò)過(guò)了處理這些消息的時(shí)機(jī),有什么方法可以接收到這些消息呢?


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


            ?

            可以使用超類化(supper class)方法。
            注冊(cè)一個(gè)新窗口類,新窗口的回調(diào)函數(shù)默認(rèn)返回原始窗口的處理過(guò)程。

            Top


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


            ?

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


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


            ?

            關(guān)注,只知道超類化方法
            Top


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


            ?

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


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


            ?

            超類化有個(gè)缺點(diǎn),必須要先建立一個(gè)窗口才可以超類化,
            也就是對(duì)應(yīng)每個(gè)窗口類要維護(hù)一個(gè)額外的窗口,其余的窗口才能從超類化中受益
            Top


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


            ?


            如果直接用API, 只要得到窗口回調(diào)函數(shù)地址的函數(shù)指針就可以了,沒(méi)有必要新建一個(gè)窗口。
            如果是自定義的窗口類, 那么你已知這個(gè)函數(shù)的地址, 在超類的回調(diào)函數(shù)中返回就可以了.
            如果是系統(tǒng)內(nèi)置的窗口控件, 可通過(guò)GetClassInfoEx獲取函數(shù)的地址。

            MFC下的方法類似,
            Top


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


            ?

            記錯(cuò)了,全局子類化需要一個(gè)窗口句柄,超類化不需要
            Top


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


            ?

            超類化也有一個(gè)問(wèn)題,當(dāng)使用對(duì)話框的時(shí)候,dialog里的子窗口控制如何超類化掉?
            就算在dialog創(chuàng)建之前,把所有用到的子窗口類型都超類化掉,dialog也不會(huì)給我們傳遞
            每個(gè)子窗口控制的相關(guān)信息,也就無(wú)法對(duì)每個(gè)子窗口進(jìn)行特化。
            而如果由我們自己創(chuàng)建子窗口的話,可以在createwindowex中的lparam里傳遞一些子窗口
            控制相關(guān)的數(shù)據(jù),比如一個(gè)窗口對(duì)象this指針。
            Top


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


            ?

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

            如果是自己手工創(chuàng)建的控件,創(chuàng)建時(shí)就可傳入必要的數(shù)據(jù),通過(guò)超類化在WM_CREATE中將數(shù)據(jù)保存。

            Top


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


            ?

            虛擬繼承它,可以嗎?
            Top


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


            ?

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


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


            ?

            WH_CBT鉤子有一個(gè)問(wèn)題,我一直不明白,就是當(dāng)有窗口創(chuàng)建的時(shí)候,
            你怎么知道就是你想要的窗口呢,也就是如果對(duì)應(yīng)windows窗口句柄和c++窗口對(duì)象,
            好像所有的窗口創(chuàng)建的時(shí)候都會(huì)被WH_CBT截獲
            Top


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


            ?

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

            如果是自己手工創(chuàng)建的控件,創(chuàng)建時(shí)就可傳入必要的數(shù)據(jù),通過(guò)超類化在WM_CREATE中將數(shù)據(jù)保存。
            =====================================
            這樣一來(lái),對(duì)話框里的子窗口控制將仍然無(wú)法獲得WM_CREATE消息,
            因?yàn)槲蚁胍某惖拇翱谶^(guò)程是個(gè)通用的,通過(guò)額外的參數(shù)來(lái)辨識(shí)是哪個(gè)窗口對(duì)象,
            從而把消息先交該窗口對(duì)象處理,再調(diào)用原系統(tǒng)窗口過(guò)程,這樣就更
            hChildWnd=GetDlgItem(hDlg, ID_xxx);
            SetWindowLong(hChildWnd, GWL_USERDATA, (LONG)pData);的時(shí)候已經(jīng)錯(cuò)過(guò)了WM_CREATE消息
            Top


            回復(fù)人:chehw(chehw) ( 兩星(中級(jí))) 信譽(yù):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


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


            ?

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


            Top


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


            ?

            你說(shuō)的這個(gè)就是全局子類化
            Top


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


            ?

            這個(gè)問(wèn)題是有點(diǎn)疙疙瘩瘩的,看你的用途了,如果僅僅是做一些初始化的處理(繪制處理如皮膚等除外),以對(duì)話框?yàn)槔梢杂靡恍┳兺ǖ姆椒ǎ?br>1。子窗口初始化無(wú)法create消息,不過(guò)可以觸發(fā)PreSubClassWnd虛函數(shù)。
            2。自己創(chuàng)建需要截獲消息的子窗口。終究不是所有的子窗口你都需要create消息的:)
            3。如樓上各位所說(shuō)的超類或者鉤子處理了,不過(guò)個(gè)人建議如果不是皮膚等工作,還是避免處理大范圍的消息為好

            Top


            回復(fù)人:mynamelj(風(fēng)動(dòng),帆動(dòng),仁者心動(dòng)) ( 兩星(中級(jí))) 信譽(yù):105 2007-3-14 8:40:17 得分:0


            ?

            還可以用Hook WndProc來(lái)截獲
            Top





            管理 | 關(guān)閉窗口




            網(wǎng)站簡(jiǎn)介 - 廣告服務(wù) - 網(wǎng)站地圖 - 幫助信息 - 聯(lián)系方式
            百聯(lián)美達(dá)美公司 版權(quán)所有 京ICP證020026號(hào)
            Copyright ? CSDN.net, Inc. All rights reserved

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

            亚洲AV无码久久精品蜜桃| 久久嫩草影院免费看夜色| 精品久久无码中文字幕| 久久国产热这里只有精品| 久久精品一本到99热免费| 国产午夜福利精品久久| 亚洲精品无码久久久久| 久久本道综合久久伊人| 久久久久人妻一区二区三区vr| 伊人久久免费视频| 国产成年无码久久久久毛片| 国内精品人妻无码久久久影院导航| 精品久久久久久综合日本| 久久亚洲私人国产精品| 一本一本久久a久久综合精品蜜桃| 精品久久久久久亚洲| 嫩草影院久久国产精品| 狼狼综合久久久久综合网| 免费精品久久天干天干| 久久人与动人物a级毛片| 18禁黄久久久AAA片| 99久久国产宗和精品1上映| 性高湖久久久久久久久| 久久99国产综合精品免费| 72种姿势欧美久久久久大黄蕉| 国产精品一久久香蕉国产线看| 久久婷婷五月综合色高清| 99久久精品免费看国产| 亚洲人成无码久久电影网站| 精品久久久噜噜噜久久久| 国产91久久精品一区二区| 亚洲天堂久久精品| 一本色综合网久久| 青青热久久国产久精品| 久久久精品国产sm调教网站| 国产国产成人久久精品| 99久久99久久| 久久99精品久久久久子伦| 久久亚洲日韩看片无码| 精品久久久无码中文字幕| 国产精品99久久久久久人|