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

笑看風(fēng)云淡

寵辱不驚,看庭前花開(kāi)花落;去留無(wú)意,望天空云卷云舒
posts - 96, comments - 48, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 ::  :: 聚合  :: 管理

第二章 一個(gè)最簡(jiǎn)單窗口程序的轉(zhuǎn)型

我知道,可能會(huì)有很多朋友對(duì)上一章的“Hello, World!”ATL版不以為然,因?yàn)樗⒉荒芩闶鞘裁碅TL程序——畢竟它只不過(guò)是有了個(gè)CComModule而已。不過(guò)不管怎樣我還是要說(shuō),它幾乎仍然擁有了一個(gè)ATL GUI程序的所有組成部分:入口、初始化、程序體、卸載……

“等等!”也許你會(huì)突然打斷我,“——還有注冊(cè)窗口類(lèi)、消息循環(huán)呢?”

當(dāng)然,對(duì)于一個(gè)完整的GUI程序來(lái)講,這也是必要的。

貌似廢話(huà)

不清楚你是否已經(jīng)為本章的內(nèi)容做好了準(zhǔn)備,因?yàn)橄旅嫖覀兙鸵獎(jiǎng)诱娓竦牧恕2贿^(guò)考慮到本書(shū)的讀者群中可能會(huì)存在著相當(dāng)一部分了解MFC卻對(duì)Win32 GUI的基本原理和流程不甚熟悉的朋友,所以李馬特別為你們準(zhǔn)備了這一節(jié)的內(nèi)容。SDK的粉絲們可以跳過(guò)這一節(jié),如果你們覺(jué)得李馬講的有些拖沓冗長(zhǎng)的話(huà)。

那么,我還是先以一個(gè)標(biāo)準(zhǔn)的Win32 SDK程序開(kāi)始:

//////////////////////////////////////////////////////////////////////////
// ATL的GUI程序設(shè)計(jì)配套源代碼
// 第二章 一個(gè)最簡(jiǎn)單窗口程序的轉(zhuǎn)型
// 工程名稱(chēng):HelloSDK
// 作者:李馬
// http://www.titilima.cn
//////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK HelloWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch ( uMsg )
    {
    case WM_DESTROY:
        
        break;
    case WM_PAINT:
        
        break;
    default:
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    return 0;
}

BOOL InitApplication( HINSTANCE hInstance )
{
    WNDCLASS wc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
    wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
    wc.hIcon         = LoadIcon( NULL, IDI_APPLICATION );
    wc.hInstance     = hInstance;
    wc.lpfnWndProc   = HelloWndProc;
    wc.lpszClassName = _T("HelloSDK");
    wc.lpszMenuName  = NULL;
    wc.style         = CS_HREDRAW | CS_VREDRAW;

    return RegisterClass( &wc );
}

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    // 注冊(cè)窗口類(lèi)
    InitApplication( hInstance );

    // 創(chuàng)建窗口
    HWND hWnd = CreateWindow( _T("HelloSDK"), _T("Hello SDK"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL );
    ShowWindow( hWnd, nShowCmd );
    UpdateWindow( hWnd );

    // 消息循環(huán)
    MSG msg;
    while ( GetMessage( &msg, NULL, 0, 0 ) )
    

    return msg.wParam;
}

不知道你是否會(huì)覺(jué)得這段代碼有些冗長(zhǎng)?事實(shí)上,這個(gè)程序已經(jīng)體現(xiàn)了Win32 GUI程序運(yùn)行的所有流程(請(qǐng)注意,我并不會(huì)對(duì)這些代碼進(jìn)行詳細(xì)的解釋?zhuān)驗(yàn)槲乙呀?jīng)假設(shè)你已經(jīng)了解了這些代碼具體行為的必要細(xì)節(jié)。如果不是這樣的話(huà),請(qǐng)參考相關(guān)的書(shū)籍或者M(jìn)SDN):

  1. 注冊(cè)窗口類(lèi)的部分。在這個(gè)程序中,InitApplication函數(shù)完成了這一工作。窗口類(lèi)的概念類(lèi)似于OO(面向?qū)ο螅┲械念?lèi),所有你在Windows中能看到的窗口都是某個(gè)特定窗口類(lèi)的一份實(shí)例。但是,窗口類(lèi)并非任何一種OOP語(yǔ)言中的類(lèi)——它所包括的并不是通稱(chēng)的屬性和方法(在C++中稱(chēng)作成員變量和成員函數(shù)),而是屬性和響應(yīng)。這個(gè)區(qū)別可能會(huì)使你感到費(fèi)解,我會(huì)在下一章中為你詳細(xì)介紹——因?yàn)锳TL中對(duì)窗口的封裝類(lèi)將這一點(diǎn)體現(xiàn)得十分淋漓盡致。
  2. 創(chuàng)建窗口的部分。在通常的SDK代碼里,這些代碼被封裝在一個(gè)名為InitInstance的函數(shù)中。這段代碼所做的工作一般是創(chuàng)建窗口并將其顯示出來(lái)。
  3. 消息循環(huán)。Windows是一個(gè)基于消息機(jī)制的操作系統(tǒng),各個(gè)窗口之間的通信也主要是靠Windows消息來(lái)完成的。而程序中的消息循環(huán)也就是將本程序UI線(xiàn)程中的消息隊(duì)列中提取各種消息,進(jìn)行處理(如果有必要的話(huà))之后分發(fā)給各個(gè)消息的屬主窗口(或者說(shuō)是目標(biāo)窗口)。

在這里需要指出的是,HelloWndProc是我們自己定義的一個(gè)函數(shù),我們需要用它來(lái)控制我們對(duì)特定窗口消息的特定響應(yīng)。我們只需要在注冊(cè)窗口類(lèi)之前,將這個(gè)函數(shù)的地址(也就是函數(shù)名)賦值給WNDCLASS::lpfnWndProc成員就可以了。這個(gè)函數(shù)我們自己不需要進(jìn)行調(diào)用,它的調(diào)用是當(dāng)我們的窗口收到窗口消息后,由Windows完成的。在這個(gè)回調(diào)函數(shù)中,我們的處理是這樣的:

  • WM_DESTROY。在窗口被銷(xiāo)毀的時(shí)候,窗口會(huì)收到此消息。在這里,我們會(huì)調(diào)用PostQuitMessage,用以向當(dāng)前UI線(xiàn)程的消息隊(duì)列之中發(fā)送一條WM_QUIT消息,GetMessage在收到這條消息后,會(huì)返回FALSE,也就結(jié)束了消息循環(huán),WinMain也就結(jié)束了。
  • WM_PAINT。在窗口需要繪制的時(shí)候,窗口會(huì)收到此消息。在這里我們只是簡(jiǎn)單的在窗口的中間繪制了一行文字“Hello, SDK!”。
  • 其它消息。這些消息都是我們不關(guān)心的,所以我們將其交由系統(tǒng)默認(rèn)的窗口過(guò)程DefWindowProc來(lái)處理。

這段代碼貌似冗長(zhǎng),但實(shí)際上還是很有條理的,你可以根據(jù)它以及我以上的解說(shuō)來(lái)對(duì)照這個(gè)程序的ATL版本。


ATL等同品

在寫(xiě)作這本書(shū)的時(shí)候,我總是希望我每次都能夠能使用讓你不太陌生的代碼來(lái)循序漸進(jìn)地引導(dǎo)你。考慮再三,對(duì)于“Hello, ATL!”的這個(gè)程序,我決定先把它的WinMain展現(xiàn)給你:

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
    _Module.Init( NULL, hInstance );

    // 創(chuàng)建窗口
    CHelloATLWnd wnd;
    wnd.Create( NULL, CHelloATLWnd::rcDefault, _T("Hello ATL") );
    wnd.ShowWindow( nShowCmd );
    wnd.UpdateWindow();

    // 消息循環(huán)
    MSG msg;
    while ( GetMessage( &msg, NULL, 0, 0 ) )
    

    _Module.Term();
    return msg.wParam;
}

OK,上一章介紹過(guò)的_Module又出現(xiàn)在你的眼前了——不過(guò)還是沒(méi)有什么特別的變化,仍然是那熟悉的Init和Term。而且,正如“山喲還是那座山”一樣,消息循環(huán)喲也仍然是那個(gè)消息循環(huán)。當(dāng)然,你肯定也發(fā)現(xiàn)了那寥寥的變化:CHelloATLWnd是什么?在我將它的代碼展現(xiàn)給你之前,你可能會(huì)做出這樣的猜想:

  • 這是一個(gè)C++類(lèi),它對(duì)Win32窗口類(lèi)進(jìn)行了封裝。
  • 這個(gè)類(lèi)封裝了大多數(shù)窗口操作的API函數(shù),諸如CreateWindow、ShowWindow、UpdateWindow。
  • 窗口類(lèi)的注冊(cè)可能也是在這個(gè)C++類(lèi)中完成的。

好,打住,這就夠了。讓我們來(lái)撩開(kāi)CHelloATLWnd那貌似神秘的面紗吧,趕緊著。

class CHelloATLWnd : public CWindowImpl< CHelloATLWnd, CWindow, CWinTraits< WS_OVERLAPPEDWINDOW > >
{
public:
    CHelloATLWnd()
    
public:
    DECLARE_WND_CLASS( _T("HelloATL") )
public:
    BEGIN_MSG_MAP( CHelloATLWnd )
        MESSAGE_HANDLER( WM_DESTROY, OnDestroy )
        MESSAGE_HANDLER( WM_PAINT, OnPaint )
    END_MSG_MAP()
public:
    LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& hHandled )
    {
        ::PostQuitMessage( 0 );
        return 0;
    }
    LRESULT OnPaint( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& hHandled )
    {
        HDC hdc;
        PAINTSTRUCT ps;

        hdc = BeginPaint( &ps );
        DrawText( hdc, _T("Hello, ATL!"), -1, &ps.rcPaint, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
        EndPaint( &ps );
        return 0;
    }
};

猜想,還是猜想!

請(qǐng)?jiān)试S我在本章中不為你解釋這個(gè)類(lèi)的任何具體細(xì)節(jié),取而代之的是繼續(xù)的猜想。因?yàn)椋@個(gè)類(lèi)中需要解釋的東西太多了,以至于我必須為它單獨(dú)開(kāi)辟一章。

  • 窗口類(lèi)的注冊(cè)是由這個(gè)C++類(lèi)的構(gòu)造函數(shù)與DECLARE_WND_CLASS宏一起完成的。
  • 對(duì)于BEGIN_MSG_MAP與END_MSG_MAP這一部分,想必使用過(guò)MFC的朋友們應(yīng)該更容易理解。是的,這一對(duì)宏可以算作ATL的消息映射,在其中由MESSAGE_HANDLER作為消息分流器,將各種窗口消息分配給各個(gè)處理函數(shù)。
  • 創(chuàng)建窗口時(shí)指定的樣式貌似和模板參數(shù)CWinTraits有關(guān)。

當(dāng)然,除了這些猜想之外,你可能還會(huì)同時(shí)存在以下疑問(wèn):

  • CWindowImpl、CWindow、CWinTraits究竟是什么?
  • 窗口類(lèi)是在何時(shí)注冊(cè)的?
  • 消息分流器是如何實(shí)現(xiàn)的?

也許你還會(huì)有更多的疑問(wèn),那么就讓我一并將它們留到下一章再解決吧。如果你實(shí)在等不及的話(huà),atlwin.h的代碼也會(huì)告訴你一切的。

補(bǔ)敘CComModule

由于這本書(shū)主要針對(duì)的是ATL 3.0/Visual C++ 6.0,所以我疏忽了對(duì)CComModule的研究。在此感謝老李老刀兄提出的一點(diǎn),就是CComModule在ATL 7.0中已經(jīng)不建議使用了。于是我將MSDN中的相關(guān)章節(jié)摘抄下來(lái),權(quán)作借花獻(xiàn)佛之用。

CComModule 替換類(lèi)

ATL 的早期版本使用 CComModule。在 ATL 7.0 中,CComModule 功能被若干個(gè)類(lèi)所取代:

  • CAtlBaseModule 包含大多數(shù)使用 ATL 的應(yīng)用程序所需的信息。包含模塊和資源實(shí)例的 HINSTANCE。
  • CAtlComModule 包含 ATL 中的 COM 類(lèi)所需的信息。
  • CAtlWinModule 包含 ATL 中的窗口化類(lèi)所需的信息。
  • CAtlDebugInterfacesModule 包含接口調(diào)試支持。
  • CAtlModule 下列 CAtlModule 派生的類(lèi)被自定義為包含特定應(yīng)用程序類(lèi)型中所需的信息。這些類(lèi)中的大部分成員都可以被重寫(xiě):
    CAtlDllModuleT 在 DLL 應(yīng)用程序中使用。為標(biāo)準(zhǔn)導(dǎo)出提供代碼。
    CAtlExeModuleT 在 EXE 應(yīng)用程序中使用。提供 EXE 中所需的代碼。
    CAtlServiceModuleT 為創(chuàng)建 Windows NT 和 Windows 2000 服務(wù)提供支持。
    CComModule 仍然可用以便向后兼容。

分布 CComModule 功能的原因

由于以下原因,CComModule 的功能分布到了幾個(gè)新類(lèi)中:

  • 使 CComModule 中的功能呈粒狀分割。
    對(duì) COM、窗口化、接口調(diào)試和應(yīng)用程序特定的(DLL 或 EXE)功能的支持現(xiàn)在在不同的類(lèi)中。
  • 自動(dòng)為這些模塊的每一個(gè)聲明全局實(shí)例。
    所需模塊類(lèi)的全局實(shí)例鏈接到項(xiàng)目中。
  • 消除了調(diào)用 Init 和 Term 方法的必要性。
    Init 和 Term 方法已移動(dòng)到模塊類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)中;不再需要調(diào)用 Init 和 Term。

不過(guò),出于代碼的兼容性以及WTL的內(nèi)容考慮,本系列后續(xù)文章仍然將使用ATL 3.0中的CComModule。


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲女同同性videoxma| 一区二区三区导航| 亚洲福利视频二区| 欧美日韩国产美| 久久亚洲一区| 国产精品私人影院| 日韩一级裸体免费视频| 亚洲精品国精品久久99热| 久久精品夜色噜噜亚洲a∨| 午夜综合激情| 欧美性天天影院| 99re这里只有精品6| 亚洲美女av黄| 欧美激情亚洲一区| 91久久久一线二线三线品牌| 亚洲高清在线观看| 久久综合国产精品| 欧美高清视频| 亚洲精品日韩一| 欧美电影在线观看完整版| 欧美激情视频一区二区三区免费 | 麻豆freexxxx性91精品| 国内揄拍国内精品久久| 久久精品卡一| 男女精品网站| 亚洲国产精品久久人人爱蜜臀 | 日韩一级视频免费观看在线| 久久久五月天| 久久香蕉国产线看观看av| 国产性做久久久久久| 欧美中文字幕在线播放| 久久久久成人网| 韩国一区二区三区在线观看| 久久这里只有| 亚洲精品国产精品国自产在线 | 亚洲精品一区二区三| 欧美国产另类| 亚洲最新色图| 久久精品国产69国产精品亚洲| 国产欧美日韩视频一区二区三区| 久久精品1区| 欧美黄色精品| 亚洲视频一二三| 国产欧美日本在线| 久久综合九色99| 亚洲乱码国产乱码精品精天堂| 亚洲欧美日韩久久精品| 韩日欧美一区二区| 蜜桃av综合| 一本色道久久综合亚洲精品婷婷 | 亚洲精品综合久久中文字幕| 欧美日本久久| 在线视频你懂得一区| 久久国产精品久久久久久| 在线观看欧美日本| 欧美日韩亚洲国产一区| 欧美在线日韩精品| 亚洲日本在线观看| 性欧美18~19sex高清播放| 一区二区在线观看视频在线观看| 欧美激情综合色| 亚洲欧美综合国产精品一区| 亚洲大片精品永久免费| 性欧美1819sex性高清| 亚洲欧洲日产国产综合网| 国产精品免费一区二区三区观看| 久久蜜桃av一区精品变态类天堂| 亚洲免费成人| 免费成人毛片| 欧美亚洲系列| 一区二区三区av| 樱桃国产成人精品视频| 国产精品久久久99| 欧美国产精品va在线观看| 欧美亚洲综合网| 99精品热6080yy久久| 欧美韩国日本一区| 欧美影院久久久| 亚洲视频免费在线| 亚洲国产视频一区二区| 国产一级一区二区| 欧美视频中文一区二区三区在线观看| 久久综合久久88| 欧美一区二区私人影院日本| 一区二区三区回区在观看免费视频| 欧美成人免费va影院高清| 久久国内精品视频| 亚洲免费在线精品一区| 99国产精品99久久久久久| 1024成人网色www| 国产主播精品在线| 国产精品视频免费在线观看| 欧美日韩国产精品专区| 欧美黄色日本| 奶水喷射视频一区| 久久久精品一品道一区| 欧美一级久久| 欧美一级淫片播放口| 一道本一区二区| 亚洲美女精品一区| 亚洲伦理在线| 亚洲精品久久久久久下一站 | 免费观看成人| 久久亚洲捆绑美女| 久久天天躁狠狠躁夜夜爽蜜月| 欧美在线1区| 久久精品二区亚洲w码| 欧美综合国产| 久久精品国产999大香线蕉| 欧美在线91| 久久久久久高潮国产精品视| 久久精品色图| 久久久水蜜桃| 久久这里有精品15一区二区三区| 久久婷婷亚洲| 女人天堂亚洲aⅴ在线观看| 免费影视亚洲| 欧美日韩1区| 国产精品大片免费观看| 国产精品日日做人人爱| 国产亚洲福利一区| 红桃视频欧美| 亚洲人成网站在线观看播放| 亚洲美女在线国产| 亚洲一级片在线观看| 亚洲激情中文1区| 欧美二区在线| 欧美日韩国语| 欧美日韩日本视频| 国产精品久久毛片a| 国产美女精品免费电影| 国产日韩欧美一区在线| 激情六月婷婷久久| 亚洲欧洲日本mm| 中文亚洲字幕| 亚洲综合国产精品| 久久久久久尹人网香蕉| 欧美成熟视频| 一区二区三区不卡视频在线观看 | 亚洲免费观看在线视频| 一区二区三区精品国产| 欧美一级成年大片在线观看| 久久在线精品| 亚洲日本va午夜在线影院| 一区二区三区国产在线| 欧美在线日韩| 欧美日韩精品不卡| 国产在线麻豆精品观看| 亚洲另类黄色| 新片速递亚洲合集欧美合集| 亚洲第一福利社区| 亚洲欧洲99久久| 欧美激情免费观看| 国产美女一区| 夜夜嗨av色综合久久久综合网| 性欧美18~19sex高清播放| 欧美成人免费网站| 亚洲欧美日韩精品久久亚洲区 | 一本色道久久88综合日韩精品| 欧美伊人久久大香线蕉综合69| 欧美高清在线视频观看不卡| 国产三区二区一区久久| 日韩亚洲视频| 久久综合五月| 亚洲一区999| 欧美电影免费观看网站| 国产曰批免费观看久久久| 一本色道久久综合亚洲精品高清| 久久免费视频网| 一区二区三区日韩| 女女同性精品视频| 激情久久婷婷| 亚洲欧美一区二区在线观看| 亚洲婷婷在线| 欧美福利一区| 亚洲一二三区精品| 欧美日韩国产小视频在线观看| 国产一区二区三区免费在线观看| 日韩亚洲精品电影| 欧美大片免费观看| 亚洲欧美另类在线观看| 欧美激情网友自拍| 韩国三级在线一区| 欧美影院一区| 99精品国产一区二区青青牛奶| 久久婷婷影院| 国产女同一区二区| 亚洲欧美日韩国产一区二区| 欧美好骚综合网| 久久国产欧美日韩精品| 麻豆亚洲精品| 亚洲国产精品久久久| 久久精品免费观看| 中文国产一区| 国产精品乱码一区二三区小蝌蚪| 亚洲精品久久视频| 蜜臀a∨国产成人精品| 午夜亚洲福利| 国产日韩av一区二区| 亚洲欧美成人一区二区在线电影|