• <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>
            隨筆 - 64, 文章 - 11, 評(píng)論 - 12, 引用 - 0
            數(shù)據(jù)加載中……

            develop cusom control

             

                    不久前,因?yàn)樾枰冶仨氶_發(fā)一個(gè)繼承MFCCWnd類別的控件。這個(gè)控件將會(huì)放在一個(gè)DLL中來讓使用者來調(diào)用,這樣就可以在每次的復(fù)用時(shí)不要停留在批量的拷文件的過程。我不是說批量拷文件到新的工程中的做法不好,但是經(jīng)過幾個(gè)項(xiàng)目的批量拷文件的做法很有可能會(huì)讓原來簡(jiǎn)單的幾個(gè)文件變成一大堆耦合很強(qiáng)的文件,這將給再次復(fù)用帶來不便。但是文件直接包含在使用者處也會(huì)帶來些好處,如調(diào)試要來得方便一些,要修改一些特性也是很容易。所以有人說做事是一個(gè)決策的過程,我認(rèn)為不假。如果其中沒有決策,那只能說明一件事,我們忽略了某些東西。這往往也是很危險(xiǎn)的。

             

                    在這個(gè)開發(fā)的過程中,我自認(rèn)為對(duì)整個(gè)過程是清晰的,明了的。但是在開發(fā)的過程中卻因一個(gè)細(xì)節(jié)問題而迫使我花了整整一個(gè)上午的時(shí)間來調(diào)試,最后得以發(fā)現(xiàn)這個(gè)問題。這里我就簡(jiǎn)單地回顧這個(gè)開發(fā)過程。

               1:利用向?qū)Мa(chǎn)生MFC Regular DLL 框架。

               2:在app文件中加入一個(gè)導(dǎo)出的啞函數(shù)(就是什么事也不做的函數(shù))來讓這個(gè)DLL支持隱式的加載.

                                extern “C” __declspec(dllimport) DummyExport() {}

               3: 添加一個(gè)自CWnd派生的類,就叫MyCWnd好了。

               4:為這個(gè)MyApp映射消息。如映射一個(gè)OnLButtonDown。并在這個(gè)消息中向父控件發(fā)
                           出自己的消息(當(dāng)然實(shí)際項(xiàng)目中可不會(huì)是這樣簡(jiǎn)單,這里只是讓控件的框架
                           先能跑起來證明與外界的消息是暢通的)

                          GetParent()->SendMessage(WM_COMMAND, GetCtrlID(), GetSafeHwnd());

               5: 自定義一個(gè)消息   #define WM_MYWNDLAUGH (WM_USER + 106)并完成相應(yīng)的映射。

               6:為了注冊(cè)這自己的這個(gè)窗體類別,我們必須有一個(gè)靜態(tài)的注冊(cè)函數(shù),
                           以便在
            CWinApp::InitInstance時(shí)注冊(cè)窗體類。

                            這里就是關(guān)鍵了
                           

             1 WNDCLASS wc;
             2 wc.style = CS_GLOBALCLASS ;//這里曾讓我花了數(shù)小時(shí)來找這個(gè)bug.
             3 wc.lpfnWndProc = myFunc;
             4 
             5 
             6 LRESULT CALLBACK AFX_EXPORT myFunc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
             7 {
             8     AFX_MANAGE_STATE(AfxGetStaticModuleState());
             9     CWnd *pWnd;
            10     pWnd =CWnd::FromHandlePermanent(hWnd);
            11     if(pWnd == NULL)
            12     { pWnd = new MyWnd(); pWnd->attach(hwnd); }
            13     return AfxCallWndProc(pWnd, hWnd, message, wParam, lParam);
            14 }
            15 


                  
               7: CWinApp::InitInstance中調(diào)用注冊(cè)函數(shù)。

               8: 在使用者界面中添加自定義控件,控件的類別就是上面的wc.lpszClassName對(duì)應(yīng)的名稱。

               9: 在使用者類中映射子控件消息

               10:在早期就調(diào)用上述的啞函數(shù)。

               11:向自定義控件發(fā)送消息。這樣就搭起了一個(gè)自定義控件的框架,在上面的這些步聚中就是
                           第6步要細(xì)心。余下的就是加特性的工作了。上述參考了
            MFC技術(shù)內(nèi)幕等有關(guān)資料。

             

            posted on 2008-09-27 15:42 Robertxiao 閱讀(410) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows/MFC探索

            久久久久久久久久久久中文字幕| 国产福利电影一区二区三区久久久久成人精品综合| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 亚洲伊人久久大香线蕉苏妲己| 久久毛片一区二区| 狠狠色丁香久久婷婷综合_中 | 一本一道久久精品综合| 国产一区二区精品久久岳| 色播久久人人爽人人爽人人片AV| 亚洲伊人久久精品影院| 99久久超碰中文字幕伊人| 久久最新免费视频| 久久久久久无码Av成人影院| 成人精品一区二区久久| 久久精品国产亚洲av麻豆图片 | 久久久久久国产精品无码超碰| 99热精品久久只有精品| 久久精品成人影院| 97精品国产91久久久久久| 少妇无套内谢久久久久| 91精品国产91久久久久久| 久久精品国产99国产精品导航 | 一级做a爰片久久毛片免费陪| 久久精品中文字幕无码绿巨人| 久久精品夜色噜噜亚洲A∨| 久久精品人人做人人爽97| 国产农村妇女毛片精品久久| 99久久精品国内| 精品久久久久久亚洲精品 | 九九热久久免费视频| 色欲久久久天天天综合网| 国内精品伊人久久久久妇| 国产精品久久久久一区二区三区| 久久精品国产亚洲77777| 97精品伊人久久大香线蕉| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久人人爽人人爽人人片AV东京热| 亚洲va中文字幕无码久久| 国产亚洲精午夜久久久久久| 色综合久久88色综合天天| 久久国产热这里只有精品|