• <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>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            1、消息映射的鏈接

            如果這個類是ATL窗口類,我們可以從這個窗口類派生自己的類,就象Base Class Chaining中描述的一樣。
            class CBase : public CWindowImpl<CBase> 
            {
            public:
             BEGIN_MSG_MAP(CBase)
              MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
              MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
              ALT_MSG_MAP(100)
              MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
              MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown2)
             END_MSG_MAP()
            public:
             CBase();
             virtual ~CBase();
             
             LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
             {
              PostQuitMessage(0);
              return 0;
             }
             LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL&)
             {
              MessageBox("baseclass : button down\n");
              return 0;
             }
             LRESULT OnButtonDown2(UINT, WPARAM, LPARAM, BOOL&)
             {
              MessageBox("baseclass : button down2\n");
              return 0;
             }
            };

            class CDerived: public CBase
            {
             BEGIN_MSG_MAP(CDerived)
              MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
              CHAIN_MSG_MAP_ALT(CBase, 100) //鏈接到基類
             END_MSG_MAP()
             
             LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL& bHandle)
             {
              MessageBox("derivedclass : button down\n");
              bHandle = FALSE; //決定是否繼續(xù)傳消息
              return 0;
             }
            };

            2、超類化

            如果我們想擴展一個預定義的窗口類(如按紐類或列表框類)的功能,我們可以超類化它。就是創(chuàng)建一個基于這個預定義類的新類,并在消息映射表中添加消息映射以增強它的功能。這個在使用MFC開發(fā)使用最多。
            class CBeepButton : public CWindowImpl<CBeepButton> 
            {
            public:
             CBeepButton();
             virtual ~CBeepButton();
             
             DECLARE_WND_SUPERCLASS(_T("BeepButton"), _T("Button"))
              BEGIN_MSG_MAP(CBeepButton)
              MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
             END_MSG_MAP()


             LRESULT OnLButtonDown(UINT, WPARAM, LPARAM, BOOL& bHandled)
             {
              MessageBeep(MB_ICONASTERISK);
              bHandled = FALSE; //繼續(xù)調(diào)用基類的函數(shù)
              return 0;
               }
            };

            3、子類化

            有些時候,我們需要改變一個已經(jīng)存在的窗口實例的行為,而不是一個窗口類——或許我們要讓一個對話框上的編輯框做點什么特別的事情。在這種情況下,我們可以寫一個新的ATL窗口類,并子類化這個已經(jīng)存在的編輯框。任何本該發(fā)送到這個編輯框的消息都會先被發(fā)送到這個子類的對象。

            class CNoNumEdit : public CWindowImpl<CNoNumEdit>
            {
            public:
             CNoNumEdit();
             virtual ~CNoNumEdit();
             
             BEGIN_MSG_MAP(CNoNumEdit)
              MESSAGE_HANDLER(WM_CHAR, OnChar)
             END_MSG_MAP()

             LRESULT OnChar(UINT, WPARAM wParam, LPARAM, BOOL& bHandled)
             {
              TCHAR ch = wParam;
              if(_T('0')<=ch && ch<=_T('9'))
               MessageBeep(0);
              else
               bHandled = FALSE;   //不處理,交給編輯框自己處理
              return 0;
               }
            };
            4、容器窗口

            另外一種可選的方法:我們也可以讓這個編輯框成為一個被包含的窗口,所有發(fā)送到這個編輯框的消息都會經(jīng)過它的容器窗口;我們可以在這個容器窗口中為這個被包含的窗口實現(xiàn)特殊的消息處理。

            class CMyWindow : public CWindowImpl<CMyWindow>
            {
            public:
             CMyWindow();
             virtual ~CMyWindow();

             BEGIN_MSG_MAP( CMyWindow )
              MESSAGE_HANDLER(WM_CREATE, OnCreate)
              MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
              ALT_MSG_MAP(99) //contained window's messages come here...
              MESSAGE_HANDLER(WM_CHAR, OnChar)
             END_MSG_MAP()

             LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&)
             {
              RECT rc = { 10, 10, 200, 35 };
              m_wndContained.Create(m_hWnd, rc, _T("non-numeric edit"),
               WS_CHILD|WS_VISIBLE|WS_BORDER, 0, 666);
              return 0;
             }

             LRESULT OnChar(UINT, WPARAM wParam, LPARAM, BOOL& bHandled)
             {
              TCHAR ch = wParam;
              if(_T('0')<=ch && ch<=_T('9'))
               MessageBeep( 0 );
              else
               bHandled = FALSE;   //不處理,交給編輯框自己處理
              return 0;
             }
             
             LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
             {
              PostQuitMessage( 0 );
              return 0;
             }

            private:
             CContainedWindow m_wndContained;
            };

            CMyWindow::CMyWindow() : m_wndContained(_T("edit"), this, 99)
            {

            }

            5、消息反射

            最后的一種方法就是消息反射,當一個窗口收到一個消息后不處理它,而是反射給發(fā)送這個消息的窗口自己處理,這種技術(shù)可以用來創(chuàng)建自包含的控件。

            class CStaticLink : public CWindowImpl<CStaticLink> 
            {
            public:
             DECLARE_WND_SUPERCLASS(_T("StaticLink"), _T("Static"))

             CStaticLink();
             virtual ~CStaticLink();

             void SetLinkText(LPCTSTR szLink)
             {
              USES_CONVERSION;
              m_bstrLink = T2OLE(szLink);
             }

             BEGIN_MSG_MAP(CStaticLink)
              //uses message reflection: WM_* comes back as OCM_*
              MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
              MESSAGE_HANDLER(OCM_CTLCOLORSTATIC, OnCtlColor)
              MESSAGE_HANDLER(WM_DESTROY, OnDestroy) //not a reflected message
              DEFAULT_REFLECTION_HANDLER()
             END_MSG_MAP()

             LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&)
             {
              if(m_hFont)
              {
               DeleteObject(m_hFont);
               m_hFont = NULL;
              }
              return 0;
             }

               LRESULT OnCommand(UINT, WPARAM wParam, LPARAM, BOOL&)
               {
                USES_CONVERSION;
                int code = HIWORD(wParam);
                if(code==STN_CLICKED || code==STN_DBLCLK)
                {
                 if(m_bstrLink.Length() == 0)
                 {
                  GetWindowText(&m_bstrLink);
                 }
                 if((int)ShellExecute(m_hWnd, _T("open"),
                  OLE2T(m_bstrLink), NULL, NULL, SW_SHOWNORMAL) > 32)
                 {
                  m_bVisited = TRUE;   //return codes>32 => success
                  Invalidate();
                 }
                 else
                 {
                  MessageBeep(0);
                  ATLTRACE(_T("Error: CStaticLink couldn't open file"));
                 }
                }
                return 0;
               }

               LRESULT OnCtlColor(UINT, WPARAM wParam, LPARAM, BOOL&)
               {
                // notify bit must be set to get STN_* notifications
                ModifyStyle(0, SS_NOTIFY);
                HBRUSH hBr = NULL;
                if((GetStyle()&0xff) <= SS_RIGHT)
                {
                 // it's a text control: set up font and colors
                 if(!m_hFont)
                 {
                  LOGFONT lf;
                  GetObject(GetFont(), sizeof(lf), &lf);
                  lf.lfUnderline = TRUE;
                  m_hFont = CreateFontIndirect(&lf);
                 }
                 HDC hDC = (HDC)wParam;
                 SelectObject(hDC, m_hFont);
                 SetTextColor(hDC, m_bVisited?m_clrVisited:m_clrUnvisited);
                 SetBkMode(hDC, TRANSPARENT);
                 hBr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
                }
                return (LRESULT)hBr;
               }

            private:
             COLORREF m_clrUnvisited;
             COLORREF m_clrVisited;
             BOOL  m_bVisited;
             HFONT  m_hFont;
             CComBSTR m_bstrLink;
            };

             

            class CReflectDlg : public CDialogImpl<CReflectDlg>
            {
            public:
             enum { IDD = IDD_DIALOG1 };

             BEGIN_MSG_MAP(CReflectDlg)
              COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnClose)
              MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
              REFLECT_NOTIFICATIONS()  //reflect messages back to static links
             END_MSG_MAP()

             LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
             {
              CenterWindow( GetParent() );
              //a textual static control:
              s1.SubclassWindow(GetDlgItem(IDS_TEST1));
              //a static control displaying an icon
              s2.SubclassWindow(GetDlgItem(IDS_TEST2));
              //set the icon's link
              s2.SetLinkText(_T("  return 0;
             }

             LRESULT OnClose(UINT, WPARAM wID, HWND, BOOL&)
             {
              EndDialog(wID);
              return 0;
             }

            private:
             CStaticLink s1, s2;
            };

            以上便是這5種方法,在軟件設計時有時候達到一個目的的方法很多,這時候最重要的就是選擇最適合的方法,使項目改動更小,擴展最好。

            下載所有演示例子

            posted on 2006-01-02 15:29 萬連文 閱讀(4159) 評論(0)  編輯 收藏 引用 所屬分類: ATL
            簡歷下載
            聯(lián)系我

            <2006年1月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            香蕉久久影院| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久综合亚洲色HEZYO国产| 亚洲欧美精品一区久久中文字幕| 亚洲精品国产自在久久| 亚洲va久久久噜噜噜久久天堂| 精品国产91久久久久久久a| 无码超乳爆乳中文字幕久久 | 99久久精品影院老鸭窝| 久久精品国产清自在天天线| 精品久久久噜噜噜久久久| 中文国产成人精品久久不卡| 久久国产乱子伦精品免费午夜| 亚洲国产成人精品无码久久久久久综合 | 国产69精品久久久久99尤物| 午夜天堂av天堂久久久| 精品久久久久久中文字幕| 久久大香香蕉国产| 亚洲AV乱码久久精品蜜桃| 精品久久久久久亚洲| 久久精品国产色蜜蜜麻豆| 久久99热这里只有精品66| 久久伊人影视| 久久九九有精品国产23百花影院| 国产精品美女久久久m| 亚洲国产成人久久综合区| 99久久久精品免费观看国产| 久久无码高潮喷水| 久久午夜综合久久| 久久精品国产精品亜洲毛片| 国产精品美女久久久m| 久久综合精品国产二区无码| 欧美牲交A欧牲交aⅴ久久| 欧美激情精品久久久久久| 9999国产精品欧美久久久久久 | 国产精品成人久久久| 国产精品九九久久免费视频 | 久久精品国产亚洲AV无码麻豆| 久久精品国产亚洲av麻豆蜜芽 | 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久综合九色综合欧美狠狠|