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

            1、消息映射的鏈接

            如果這個(gè)類是ATL窗口類,我們可以從這個(gè)窗口類派生自己的類,就象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、超類化

            如果我們想擴(kuò)展一個(gè)預(yù)定義的窗口類(如按紐類或列表框類)的功能,我們可以超類化它。就是創(chuàng)建一個(gè)基于這個(gè)預(yù)定義類的新類,并在消息映射表中添加消息映射以增強(qiáng)它的功能。這個(gè)在使用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、子類化

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

            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、容器窗口

            另外一種可選的方法:我們也可以讓這個(gè)編輯框成為一個(gè)被包含的窗口,所有發(fā)送到這個(gè)編輯框的消息都會(huì)經(jīng)過它的容器窗口;我們可以在這個(gè)容器窗口中為這個(gè)被包含的窗口實(shí)現(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、消息反射

            最后的一種方法就是消息反射,當(dāng)一個(gè)窗口收到一個(gè)消息后不處理它,而是反射給發(fā)送這個(gè)消息的窗口自己處理,這種技術(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種方法,在軟件設(shè)計(jì)時(shí)有時(shí)候達(dá)到一個(gè)目的的方法很多,這時(shí)候最重要的就是選擇最適合的方法,使項(xiàng)目改動(dòng)更小,擴(kuò)展最好。

            下載所有演示例子

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

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

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久精品久久久久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 精品国产热久久久福利| 偷窥少妇久久久久久久久| AV狠狠色丁香婷婷综合久久 | 中文字幕人妻色偷偷久久| 国产真实乱对白精彩久久| 中文国产成人精品久久亚洲精品AⅤ无码精品| 亚洲国产天堂久久综合| 99久久99久久久精品齐齐| 久久国语露脸国产精品电影| 久久九九免费高清视频| 亚洲va久久久噜噜噜久久男同| 久久无码精品一区二区三区| 久久精品成人免费看| 国产精品久久波多野结衣| 日韩中文久久| 深夜久久AAAAA级毛片免费看 | 一97日本道伊人久久综合影院| 久久99国产综合精品| 亚洲国产精品狼友中文久久久| 狠色狠色狠狠色综合久久| 午夜人妻久久久久久久久| 亚洲精品tv久久久久| 久久综合狠狠综合久久激情 | 国产成人无码精品久久久性色| 精品一久久香蕉国产线看播放 | 精品久久久久久无码中文野结衣| 午夜精品久久久久久99热| 久久久久高潮综合影院| 亚洲国产天堂久久综合| 久久久久国产成人精品亚洲午夜| 精品一区二区久久| 久久精品国产亚洲一区二区| 潮喷大喷水系列无码久久精品| 麻豆AV一区二区三区久久| 91久久精品91久久性色| 久久精品国产亚洲av麻豆色欲| 一本大道久久a久久精品综合| 国产精品一久久香蕉国产线看| 精品人妻久久久久久888|