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

            天下

            記錄修行的印記

            wtl學(xué)習(xí)筆記(1),窗口類(lèi)的注冊(cè)

             

            任何非對(duì)話框窗口都是來(lái)自CWindowImpl派生
            對(duì)話框窗口都是來(lái)自CDialogImpl派生    
            定義一個(gè)窗口的實(shí)現(xiàn)
            你的新窗口類(lèi)需要包含三件事情:
            一、一個(gè)窗口類(lèi)的定義,如:
                默認(rèn)由父類(lèi)CWindowImpl的DECLARE_WND_CLASS(NULL) 完成窗口WNDCLASS結(jié)構(gòu)體的定義.
                也可以自己通過(guò)DECLARE_WND_CLASS(_T(
            "My Window Class")) 完成窗口WNDCLASS結(jié)構(gòu)體的定義.
                
            二、添加消息映射鏈
                其中祖先類(lèi)CWindowImplRoot繼承自CMessageMap
            三、窗口使用的默認(rèn)窗口類(lèi)型,稱(chēng)為稱(chēng)為window traits
            預(yù)定義的window traits:
            typedef CWinTraits
            <WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0> CControlWinTraits;
            typedef CWinTraits
            <WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE> CFrameWinTraits;
            typedef CWinTraits
            <WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_MDICHILD>    CMDIChildWinTraits;
            typedef CWinTraits
            <00> CNullTraits;


            類(lèi)繼承關(guān)系:
            template 
            <class T, class TBase /* = CWindow */class TWinTraits /* = CControlWinTraits */>
            class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >
            {
            };

            template 
            <class TBase = CWindow, class TWinTraits = CControlWinTraits>
            class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >
            {
            public:
                WNDPROC m_pfnSuperWindowProc;

                CWindowImplBaseT() : m_pfnSuperWindowProc(::DefWindowProc)
                {}    
            };

            template 
            <class TBase /* = CWindow */>
            class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap 
            {
            };


            //窗口類(lèi)的注冊(cè),宏:DECLARE_WND_CLASS
            #define DECLARE_WND_CLASS(WndClassName) \
            static ATL::CWndClassInfo& GetWndClassInfo() \
            { \
                
            static ATL::CWndClassInfo wc = \
                { \
                    { 
            sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc, \
                      
            00, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \
                    NULL, NULL, IDC_ARROW, TRUE, 
            0, _T("") \
                }; \
                
            return wc; \
            }




            全局變量:_AtlWinModule,_AtlBaseModule
            extern CAtlWinModule _AtlWinModule;
            extern CAtlBaseModule _AtlBaseModule;

            //窗口類(lèi)WNDCLASS結(jié)構(gòu)體的填充
            struct _ATL_WNDCLASSINFOA
            {
                WNDCLASSEXA m_wc;
                LPCSTR m_lpszOrigName;
                WNDPROC pWndProc;
                LPCSTR m_lpszCursorID;
                BOOL m_bSystemCursor;
                ATOM m_atom;
                CHAR m_szAutoName[
            5+sizeof(void*)*CHAR_BIT];
                ATOM Register(WNDPROC
            * p)
                {
                    
            return AtlWinModuleRegisterWndClassInfoA(&_AtlWinModule, &_AtlBaseModule, this, p);
                }
            };    
            typedef _ATL_WNDCLASSINFOA CWndClassInfoA;

            窗口注冊(cè)過(guò)程
            CMainFrame wndMain;
            CFrameWindowImpl::Create()
            ATOM atom 
            = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
            //模板展開(kāi)后
            //ATOM atom = CMainFrame::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
            //這里的T就是類(lèi) CMainFrame
            //然后通過(guò)如下代碼,返回一個(gè)靜態(tài)變量 static WTL::CFrameWndClassInfo wc;

            CFrameWndClassInfo::Register(
            &m_pfnSuperWindowProc);
            //CWindowImplBaseT::m_pfnSuperWindowProc
            //CWindowImplBaseT() : m_pfnSuperWindowProc(::DefWindowProc){}





             

            #include <atlbase.h>
            #include 
            <atlwin.h>


            //可選的消息處理類(lèi)
            template <typename T>
            class CPaintBkgnd : public CMessageMap
            {
            public:
                BEGIN_MSG_MAP(CPaintBkgnd)
                    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
                END_MSG_MAP()

                LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
            & bHandled)
                {
                    T
            *   pT = static_cast<T*>(this);
                    HDC  dc 
            = (HDC)wParam;
                    RECT rcClient;
                    pT
            ->GetClientRect ( &rcClient );
                    ::FillRect(dc, 
            &rcClient, CreateSolidBrush(RGB(0xff,0x66,0x99)) );
                    
            return 1
                }
            };

            class CMyWindow : 
                
            public CWindowImpl<CMyWindow, CWindow,CFrameWinTraits>,
                
            public CPaintBkgnd<CMyWindow>
                                
            {
            public:
                
            //DECLARE_WND_CLASS(_T("abc"))
                BEGIN_MSG_MAP(CMyWindow)
                    MESSAGE_HANDLER(WM_CREATE, OnCreate)
                    MESSAGE_HANDLER(WM_CLOSE, OnClose)
                    
            //CHAIN_MSG_MAP(CPaintBkgnd)
                    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
                END_MSG_MAP()

                LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
            & bHandled)
                {
                    ATLTRACE(
            "WM_CREATE==0x0001,MSG ID:0x%u\n",uMsg);
                    
            return 0;
                }
                LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
            & bHandled)
                {
                    DestroyWindow();
                    PostQuitMessage(
            0);
                    
            return 0;
                }
                LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
            & bHandled)
                {
                    HDC  dc 
            = (HDC) wParam;
                    RECT rcClient;
                    
            this->GetClientRect ( &rcClient );
                    ::FillRect(dc, 
            &rcClient, CreateSolidBrush(RGB(0xff,0x66,0x00)) );
                    
            return 1
                }
            };


            int _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
            {
                CMyWindow wndMain;
                HWND hWnd 
            = wndMain.Create(NULL,NULL,"good luck Aaron");
                
            if (hWnd==NULL)
                {
                    ::MessageBox(NULL,
            "創(chuàng)建窗口失敗","提示",MB_OK);
                }
                wndMain.ShowWindow(nCmdShow);
                wndMain.UpdateWindow();

                MSG msg;
                
            while ( GetMessage ( &msg, NULL, 00 ) > 0 )
                {
                    TranslateMessage ( 
            &msg );
                    DispatchMessage ( 
            &msg );
                }
                
            return 0;
            }

             

            posted on 2011-12-03 11:54 天下 閱讀(1037) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C/C++Win32WTL

            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(lèi)(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評(píng)論

            久久精品女人天堂AV麻| 久久亚洲AV无码精品色午夜| 久久久国产乱子伦精品作者| 精品久久久久久国产| 人妻少妇久久中文字幕一区二区 | 色狠狠久久综合网| 色欲综合久久躁天天躁蜜桃| 久久精品国产91久久综合麻豆自制 | 欧美久久精品一级c片片| 日本久久久久久中文字幕| 亚洲国产精品综合久久一线| 久久精品国产亚洲AV无码麻豆| 国产精品久久久久天天影视| 久久青青草原亚洲av无码| 久久精品国产亚洲av日韩| 亚洲欧美日韩精品久久亚洲区 | 久久国产乱子伦免费精品| 久久精品成人一区二区三区| 天堂久久天堂AV色综合| 久久久久亚洲av成人无码电影| 三上悠亚久久精品| 漂亮人妻被中出中文字幕久久| 亚洲狠狠久久综合一区77777| 色诱久久av| 久久人人爽人人澡人人高潮AV | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久综合九色综合网站| 亚洲午夜福利精品久久| 2021国内久久精品| 免费一级做a爰片久久毛片潮| a高清免费毛片久久| 日产精品久久久久久久| 亚洲中文久久精品无码| 久久99精品久久久久久秒播| 国产亚洲欧美成人久久片| 亚洲精品无码久久久久sm| 亚洲天堂久久久| 久久人人爽人人爽人人av东京热| 欧美亚洲另类久久综合婷婷| 久久国产视屏| 亚洲AV伊人久久青青草原|