• <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; //決定是否繼續傳消息
              return 0;
             }
            };

            2、超類化

            如果我們想擴展一個預定義的窗口類(如按紐類或列表框類)的功能,我們可以超類化它。就是創建一個基于這個預定義類的新類,并在消息映射表中添加消息映射以增強它的功能。這個在使用MFC開發使用最多。
            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; //繼續調用基類的函數
              return 0;
               }
            };

            3、子類化

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

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

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

            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、消息反射

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

            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
            簡歷下載
            聯系我

            <2007年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品久久久无码中文字幕天天| 久久久久久亚洲精品无码| 久久精品综合网| 亚洲国产精品久久久天堂| 精品久久久久久国产| 国产毛片久久久久久国产毛片| 青青热久久国产久精品| 精品久久人人爽天天玩人人妻| 成人久久综合网| 久久99国产精品久久99小说| 久久久久亚洲av无码专区导航| 国产亚州精品女人久久久久久 | 欧美777精品久久久久网| 精品一久久香蕉国产线看播放 | 狠狠综合久久综合88亚洲| 久久r热这里有精品视频| 亚洲精品无码久久毛片| 久久91综合国产91久久精品| 久久午夜福利无码1000合集| 中文字幕亚洲综合久久2| 99精品久久精品一区二区| 国内精品伊人久久久久影院对白 | 狠狠色婷婷久久一区二区| 大香网伊人久久综合网2020| 99精品久久精品| 色婷婷综合久久久久中文 | 国内精品久久久人妻中文字幕| 久久久久亚洲?V成人无码| 久久免费小视频| 无码人妻久久一区二区三区 | 99久久国产主播综合精品| 久久久久久久女国产乱让韩| 色综合久久久久综合99| 久久久久国产| 久久五月精品中文字幕| 精品久久久久久国产三级| 久久精品国产福利国产琪琪| 久久精品无码一区二区三区免费| 日本久久久精品中文字幕| 老司机国内精品久久久久| 欧美综合天天夜夜久久|