青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-250  評論-20  文章-55  trackbacks-0
被包含的窗口:
一個被包含的窗口是一個不響應任何消息的窗口,它將收到的所有消息重新發送到另外一個窗口的消息映射,這個另外的窗口就是它的容器窗口。通常情況下,被包含的窗口是它的容器窗口的子窗口,但情況并不是總是這樣。容器窗口并不是必須等同于父窗口,包含與被包含的關系取決于C++類,被包含的窗口是容器窗口類的一個數據成員,而父窗口和子窗口的關系體現在屏幕上,它們的關系是創建窗口時確定的。

一個被包含的窗口建立在已注冊的窗口類的基礎之上,比如編輯框控件。如果一個編輯框被包含,那么發送到它的消息實際上被它的容器窗口的消息映射處理。使用這種方法,可以改變編輯框控件的標準行為。這有點類似于子類化但是不需要定義新類來子類化控件。和前面那個定義CnoNumEdit類響應WM_CHAR消息的例子相比,處理WM_CHAR消息的容器窗口類看起來如下:
class CMyWindow: public CWindowImpl
{
   CContainedWindow m_contained;
public:
   CMyWindow(): m_contained( _T("edit"), this, 99 )
   {
   }
   ...
CmyWindow是一個容器窗口類,它的構造函數對CcontainedWindow類型的成員做這樣的初始化:被包含的窗口是編輯框,發送它的消息到“this”(它的父窗口),使用可選消息映射表99。
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()
當父窗口被創建的時候,被包含的窗口也被創建(在WM_CREATE消息的響應函數中)。因為被包含的控件是以編輯框為基礎的,所以它在屏幕上看起來象一個編輯框:
LRESULT OnCreate( UINT, WPARAM, LPARAM, BOOL& )
{
   RECT rc = { 10, 10, 200, 35 };
   m_contained.Create( *this, rc, _T("non-numeric edit"),
      WS_CHILD|WS_VISIBLE|WS_BORDER, 0, 666 );
   return 0;
}
在這個例子中,容器窗口同時也是被包含窗口的父窗口。

當被包含的窗口收到WM_CHAR消息時,容器窗口的OnChar成員函數被調用。這個函數和前面的CnoNumEdit例子中的相同,但是在這個例子中,它時容器類的成員函數。
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;
   }
};
我們同樣也可以用被包含的窗口來子類化對話框中已經存在的控件,和正規的子類化不同,被子類化的窗口的消息時被容器窗口捕獲的。在下面的例子中,一個對話框子類化了一個編輯框控件,把它轉化成了被包含的窗口;那個對話框(容器)捕獲WM_CHAR消息并忽略掉數字字符,然后在發送到編輯框控件。(CdialogImpl在ATL中的對話框類一節講述。)
class CMyDialog: public CDialogImpl<CMyDialog>
{
public:
   enum { IDD = IDD_DIALOG1 };
// contained window is an edit control:
   CMyDialog(): m_contained( "edit", this, 123 )
   {
   }

   BEGIN_MSG_MAP( CMyDialog )
      MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
   ALT_MSG_MAP( 123 ) // contained window''s messages come here...
      MESSAGE_HANDLER( WM_CHAR, OnChar )
   END_MSG_MAP()

   LRESULT OnInitDialog( UINT, WPARAM, LPARAM, BOOL& bHandled )
   {
   // when the dialog box is created, subclass its edit control:
      m_contained.SubclassWindow( GetDlgItem(IDC_EDIT1) );
      bHandled = FALSE;
      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;
   }

   CContainedWindow m_contained;
};
消息反射:
前面講述了一些擴展窗口功能的方法,這些方法是通過使窗口響應發往窗口的消息實現的。和前面的方法相反,消息反射是使窗口能夠響應從它們自己發出的消息。

當用戶和控件交互的時候,控件通常使發送一個WM_COMMAND或者WM_NOTIFY消息給它的父窗口;然后父窗口做出響應,比如:
class CParentWindow: CWindowImpl<CParentWindow>
{
   // 假設這個窗口有一個按鈕型的子窗口,
   // 并且其 ID 為 ID_BUTTON
   BEGIN_MSG_MAP( CParentWindow )
      COMMAND_ID_HANDLER( ID_BUTTON, OnButton )
      MESSAGE_HANDLER( WM_CTLCOLORBUTTON, OnColorButton )
      ...
當按鈕被按下的時候,它發送一個命令消息給父窗口,然后CParentWindow::OnButton被調用。同理,當按鈕需要被繪制的時候,它發送WM_CTLCOLORBUTTON消息給父窗口,CParentWindow::OnColorButton響應這個消息,它使用特定的畫刷繪制控件。

某些情況下,讓控件自己響應它發送出去的消息比讓父窗口響應要好得多。ATL提供了消息反射的機制:當控件向父窗口發送消息的時候,父窗口能夠將消息反射給控件。
class CParentWindow: CWindowImpl
{
   BEGIN_MSG_MAP( CParentWindow )
      MESSAGE_HANDLER( WM_CREATE, OnCreate )
      MESSAGE_HANDLER( WM_DESTROY, OnDestroy )
      ...other messages that CParentWindow will handle...
      REFLECT_NOTIFICATIONS()
   END_MSG_MAP()
   ...
當父窗口收到一個消息,先查找它的消息映射表,如果沒有和這個消息相匹配的入口,則REFLECT_NOTIFICATIONS宏使得該消息被反射給發送這個消息的控件。控件可以提供響應反射消息的處理函數,如下:
class CHandlesItsOwnMessages: CWindowImpl<CHandlesItsOwnMessage>
{
public:
   DECLARE_WND_SUPERCLASS( _T("Superbutton"), _T("button") )
   BEGIN_MSG_MAP( CHandlesItsOwnMessage )
      MESSAGE_HANDLER( OCM_COMMAND, OnCommand )
      MESSAGE_HANDLER( OCM_CTLCOLORBUTTON, OnColorButton )
      DEFAULT_REFLECTION_HANDLER()
   END_MSG_MAP()
   ...
注意,反射消息的消息標志以OCM_開頭,而不是WM_。這可以讓你區分這個消息究竟是否是被反射回來的。

這個控件要么是這個類的實例,要么是一個被子類化的按鈕控件。例如:
// in CParentWindow:
   CHandlesItsOwnMessages m_button;
   LRESULT OnCreate( UINT, WPARAM, LPARAM, BOOL& )
   {
      RECT rc; // initialize appropriately
      m_button.Create( *this, rc, _T("click me"), WS_CHILD|WS_VISIBLE );
      ...
或者,如果這個按鈕控件是已存在的(例如,父窗口是一個對話框):
m_button.SubclassWindow( GetDlgItem(ID_BUTTON) );
下面的例子定義了一個CstaticLink類,它是一個Static控件,當點擊它的時候,將打開一個指定的網頁。所有從CstaticLink發送出去的消息都被它的父窗口反射回來(在這個例子中,用到對話框,請看ATL中的對話框類這一節)。除了響應反射回的命令消息,CstaticLink還處理反射回的WM_CTLCOLORSTATIC消息以便它能夠讓自己在點擊前和點擊后顯示不同的顏色。
#include "stdafx.h"
#include "resource.h"

CComModule _Module;

class CStaticLink : public CWindowImpl<CStaticLink> {
/*
   Based on CStaticLink by Paul DiLascia, C++ Q&A, Microsoft Systems
   Journal 12/1997.
   Turns static controls into clickable "links" -- when the control is
   clicked, the file/program/webpage named in the control''s text (or
   set by SetLinkText()) is opened via ShellExecute().  Static control
   can be either text or graphic (bitmap, icon, etc.).
*/
public:
   DECLARE_WND_SUPERCLASS( _T("StaticLink"), _T("Static") )

   CStaticLink() :
      m_colorUnvisited( RGB(0,0,255) ),
      m_colorVisited( RGB(128,0,128) ),
      m_bVisited( FALSE ),
      m_hFont( NULL )
   {
   }

   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 );
      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( *this, _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_colorVisited
                                       : m_colorUnvisited );
         SetBkMode( hDC, TRANSPARENT );
         hBr = (HBRUSH)GetStockObject( HOLLOW_BRUSH );
      }
      return (LRESULT)hBr;
   }

private:
   COLORREF m_colorUnvisited;
   COLORREF m_colorVisited;
   BOOL m_bVisited;
   HFONT m_hFont;
   CComBSTR m_bstrLink;
}; // CStaticLink

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("http://www.microsoft.com") );
      return 1;
   }
   
   LRESULT OnClose(UINT, WPARAM wID, HWND, BOOL& )
   {
      ::EndDialog( m_hWnd, wID );
      return 0;
   }
private:
   CStaticLink s1, s2;
}; // CReflectDlg

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
   _Module.Init( NULL, hInstance );

   CReflectDlg dlg;
   dlg.DoModal();

   _Module.Term();
   return 0;
}
posted on 2007-03-13 10:07 jay 閱讀(908) 評論(0)  編輯 收藏 引用 所屬分類: ATL
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产在线精品自拍| 亚洲男人av电影| 亚洲国产一区在线| 国产精品免费一区豆花| 日韩亚洲精品视频| 亚洲大片在线| 久久久精品2019中文字幕神马| 国产亚洲一区精品| 国产精品一区二区三区观看| 国产精品美女诱惑| 亚洲国产成人av在线| 一本一道久久综合狠狠老精东影业| 国产欧美69| 国产区精品视频| 国产欧美一区二区精品婷婷 | 欧美精品国产| 免费久久久一本精品久久区| 猫咪成人在线观看| 亚洲综合第一页| 亚洲在线中文字幕| 午夜日韩在线观看| 久久久www| 久久综合免费视频影院| 久久亚洲影音av资源网| 老司机凹凸av亚洲导航| 欧美成人午夜剧场免费观看| 欧美成人精品| 欧美视频在线播放| 国产欧美欧美| 在线成人h网| 亚洲精品国产精品乱码不99按摩| 99视频日韩| 香蕉久久国产| 亚洲欧美日韩一区在线| 久久偷看各类wc女厕嘘嘘偷窃| 欧美 亚欧 日韩视频在线| 亚洲人成高清| 亚洲欧美日韩第一区| 久久青草久久| 国产精品xxxxx| 国产亚洲精品bv在线观看| 亚洲激情女人| 亚洲欧洲av一区二区| 美脚丝袜一区二区三区在线观看 | 在线看视频不卡| 亚洲欧美成aⅴ人在线观看| 久久成人国产精品| 亚洲国产精品久久久久婷婷884| 一区二区三区欧美成人| 久久视频这里只有精品| 国产精品国码视频| 亚洲国产精品久久久久| 性久久久久久久久| 久久精品综合网| 日韩视频一区二区三区在线播放| 欧美一区视频| 欧美日韩亚洲一区三区| 在线播放豆国产99亚洲| 欧美成人资源| 一区二区激情视频| 欧美一区二区视频在线观看2020| 久久亚洲综合色| 中文在线资源观看网站视频免费不卡| 久久久精品性| 国产日韩高清一区二区三区在线| 国产一区二区三区网站| 亚洲综合国产| 9l视频自拍蝌蚪9l视频成人| 蜜桃av一区| 在线免费观看视频一区| 久久精品一级爱片| 亚洲欧美另类中文字幕| 国产精品国产三级国产a| 亚洲欧洲日产国产网站| 久久婷婷久久一区二区三区| 亚洲影院污污.| 欧美日韩一区在线观看| 国产欧美视频一区二区| 久久精品亚洲精品| 国产欧美韩日| 狂野欧美一区| 欧美国产一区视频在线观看| 亚洲香蕉网站| 午夜久久久久久| 亚洲第一毛片| 夜色激情一区二区| 国产亚洲一本大道中文在线| 欧美成人午夜免费视在线看片| 每日更新成人在线视频| 一区二区三区 在线观看视| 中文网丁香综合网| 一区二区三区在线观看国产| 亚洲日本精品国产第一区| 欧美小视频在线| 久久综合网色—综合色88| 欧美精品一区二区三区视频| 久久www成人_看片免费不卡| 欧美**字幕| 性欧美18~19sex高清播放| 裸体一区二区三区| 午夜宅男久久久| 欧美a级在线| 欧美一区二区三区在线免费观看| 欧美aa国产视频| 久久综合九色综合欧美就去吻 | 国产精品国产亚洲精品看不卡15| 久久青草久久| 国产精品白丝av嫩草影院| 美女视频网站黄色亚洲| 国产精品v欧美精品v日韩| 美女视频一区免费观看| 国产噜噜噜噜噜久久久久久久久| 欧美激情一区二区久久久| 国产精品一区视频| 亚洲每日在线| 亚洲日本欧美天堂| 久久久精品国产免费观看同学| 亚洲欧美日韩第一区| 欧美日本精品| 欧美一区二区在线免费观看| 好看的亚洲午夜视频在线| 欧美**人妖| 国产视频一区欧美| 亚洲视频在线观看网站| 亚洲免费久久| 久久午夜视频| 久久影视三级福利片| 国产精品一级二级三级| 日韩亚洲精品在线| 99国产精品视频免费观看| 美日韩精品视频| 久热精品在线视频| 韩国av一区二区三区四区| 先锋亚洲精品| 久久gogo国模裸体人体| 国产日韩欧美一区二区三区四区 | 久久久水蜜桃| 国产在线不卡视频| 久久精品2019中文字幕| 久久久免费av| 在线观看国产欧美| 欧美寡妇偷汉性猛交| 亚洲免费av电影| 亚洲综合首页| 国产女人水真多18毛片18精品视频| 亚洲欧美日韩天堂一区二区| 久久精品在线播放| 亚洲高清在线观看| 欧美激情一区二区三区在线视频| 亚洲欧洲日本mm| 亚洲影院在线| 国模精品一区二区三区| 美女精品在线| 最新国产精品拍自在线播放| 一本一本久久| 国产欧美一区二区精品仙草咪| 欧美一区二区性| 欧美国产日韩一区二区在线观看| 99精品视频免费观看视频| 国产精品九九| 久久激情视频久久| 亚洲高清123| 亚洲一区二区三区四区在线观看 | 亚洲福利视频一区| 欧美日韩在线视频一区| 亚洲一区二区三区影院| 久久永久免费| 在线亚洲国产精品网站| 国产日韩欧美亚洲| 欧美jizzhd精品欧美喷水| 夜夜爽夜夜爽精品视频| 久久久久久9| 亚洲美女少妇无套啪啪呻吟| 国产精品视频专区| 久久综合中文字幕| 亚洲视频在线观看视频| 欧美成人a∨高清免费观看| 亚洲图片欧美日产| 亚洲电影一级黄| 国产精品一卡| 欧美日韩一区精品| 欧美寡妇偷汉性猛交| 亚洲免费在线精品一区| 亚洲风情亚aⅴ在线发布| 亚洲欧美激情诱惑| 亚洲高清自拍| 久久久久久亚洲精品杨幂换脸| 这里只有视频精品| 亚洲第一页自拍| 国产日韩一区欧美| 欧美日韩精品在线视频| 久久久久久亚洲综合影院红桃| 夜夜狂射影院欧美极品| 亚洲成色999久久网站| 久久精品日产第一区二区三区| 在线一区日本视频| 亚洲精品中文字幕有码专区| 好吊色欧美一区二区三区四区| 国产精品久久久久久久午夜| 欧美日韩国产亚洲一区|