WTL起步-玩转图形界面

上传人:豆*** 文档编号:202093694 上传时间:2023-04-21 格式:DOCX 页数:77 大小:837.04KB
收藏 版权申诉 举报 下载
WTL起步-玩转图形界面_第1页
第1页 / 共77页
WTL起步-玩转图形界面_第2页
第2页 / 共77页
WTL起步-玩转图形界面_第3页
第3页 / 共77页
资源描述:

《WTL起步-玩转图形界面》由会员分享,可在线阅读,更多相关《WTL起步-玩转图形界面(77页珍藏版)》请在装配图网上搜索。

1、 20082022年WTL起步-玩转图形界面2022年WTL起步-玩转图形界面王鑫目录前言3第一部分 基本篇5第一章 WTL的基本-AT5第二章 WTL之路11第三章命令条14第四章 带视图的框架窗口1第五章 使用U17第六章 创立多线程I应用程序19第七章 创立M应用程序23第八章 分隔窗口26第九章 GDI的封装31第十章 Cti及其他34第十一章 动态数据互换(X)的WT支持35第十二章 WL向导37第十三章 WTL例程3第二部分 提高篇0第一章 位图视图的例程4第二章 上下文菜单41第三章 滚动视图43第四章 通用对话框45第五章 控件封装7第六章打印与打印预览52第七章 属性页5第八

2、章 消息过滤9第九章 空闲解决62第十章 U更新第十一章 消息分解65第十二章 WTL的将来6前言WL是1月随Wdows的平台SDK始发的。起初是T项目组写的一种基于AT的,封装了有关in32窗口API的例程。自TL2.0开始,AL就已有某些简朴的有关窗口函数的封装类,例如:Cindow,CWiwImp和CDialogImpl。然而,当我们比较MFC的界面有关部分的功能时,ATL对界面编程的支持简直就是一种玩笑。甚至到了TL.,ATL仍然没有对诸如MDI,命令条,DDX,打印,GI等流行功能的支持。最被人爱慕的MFC的Srig也没被支持进来。没有对这些功能的支持,TL很难满足拥有压倒性数量的使

3、用的编程人员的需求。TL就是L项目组觉得AT风格的窗口编程模型应当有的样子。表1列出了WTL与MFC在界面编程有关功能方面的比较。特性MFWTL依赖库支持不支持 (构建AT之上)应用向导支持支持支持类向导支持支持不支持(第三方插件VislFC支持)微软的公开支持支持不支持(微软内部的志愿者支持)支持OLE文档支持不支持支持视图支持支持支持文档支持不支持基本in3/通用控件封装支持支持高档通用控件封装(平坦滚动条、IP地址控件、页面控件等)不支持支持命令条支持(涉及bitmpped ontxt s)不支持(M提供对话条)支持Srin支持支持I封装支持支持辅助类(CRec, CPoin,等)支持支

4、持Wizr属性页/向导支持支持SDI, DI支持支持支持多线程SDI支持不支持支持RU支持支持支持可停靠窗口/条支持不支持分隔窗口支持支持DDX支持支持 (不是MFC的扩展)打印/打印预览支持支持滚动视图支持支持客户自画封装不支持支持消息/命令路由支持支持通用对话框支持支持HL视图支持支持简朴实例应用不支持不支持I更新支持支持基于模板不支持支持带工具条,状态条和菜单的不做任何情事的DI应用静态链接时大小超过28B(+MSVCRT.DL (288))24k (带 /OT:NOWIN98)(+ MCRT.LL如果使用 Cting)带工具条,状态条和菜单的不做任何情事的SI应用动态链接时大小4K +

5、MF4.DLL (972KB) +MSVRT.DL (2KB)/A对运营时库的依赖 CRT (+ F2LL, 如果动态链接)None (如果使用需要CStrngRT)表1 WTL与FC的比较固然,WT不也许(也不乐意)做所有FC都能做的事儿。MFC支持典型的OLE,文档/视图框架和可停靠窗口,而WTL没有。并且还缺少微软的“官方”支持。然而,来自于前A项目构成员,以及活跃在ATL开发社区的“非官方”支持,可以减轻您对支持方面的紧张。为什么ATL开发社区喜欢W?由于这四点:1 是基于C+模板技术的;2 应用程序的最小编译代码不不小于24K;3 没有任何多如的动态链接库依赖(如果您用Stng,会链

6、接CRT);4 拥有ATL同样的灵活和小巧。此外,WL和MC的界面编程模型非常接近,还涉及了从它移植过来的CStrig。在我们这本分两部分的书里,我将揭开TL神秘的面纱。在第一部分里,我们讨论WTL框架窗口的实现构造。我们将解释如何编写基于WT的SDI,DI和多线程SD,以及E浏览器样式的应用程序。进而,我们讨论WTL的辅助类,涉及对DDX的封装。最后,我们看一下TL的AppWizard和本书附带的例程。在本书的第二部分,我们讨论WTL命令条的实现构造,以及对Windows通用控件的封装和某些自定义的顾客界面小部件。我们还将进一步讨论TL的Winows消息路由构造,涉及消息分解,过滤和空闲解决

7、。我们的TL之旅没有结束,直到我们讨论完通用对话框,属性页/属性表,打印支持,以及滚动窗口。所有的这一切我们筹划放在第二部分。在我们告诉你如何用WTL开发程序之前,让我们先复习一下如何用纯AL(即不涉及L)来开发应用程序。第一部分 基本篇第一章L的基本-ATATL提供了一套编写Wdows顾客界面的C+模板类。AL本来的目的是用来支持CO组件和OLE属性页框架的。这套C+模板类固然成为TL的基本。这套类提供了对所有基本的Windws窗口函数的封装,涉及窗口/对话框的创立和管理,窗口函数,消息路由,窗口子类化,超类化和消息链。图1展示了TL这套C+模板类的层次。图1:AT界面有关类的层次如果想直接

8、用AT来创立一种窗口或者对话框,你需要从ndoImpl或者DalogImpl派生类。给你一种具体的例子。图2提供了一种简朴的用前面讲到的这套C+类来开发SI程序的示意图。图2 简朴SDI应用程序这个例子的应用程序有一种SDI的框架窗口,这个窗口有一种菜单条,状态条和客户区。它也提供了一种对话框用来演示在ATL里如何使用对话框。我们就从vc6创立一种简朴i32工程以及添加某些必要的启动TL的代码来开始这个例子。图展示了这个例子的重要源文献的源代码。sdafx :#if!defined(AFX_TDFX_D0DA22B64A_0A1732C3C8C_INCLUDED_)#den AF_TDFX_D

9、06DA2F_25B_41BA_9B20_A1736238C8C_CDD_#if _CVER 100pragmaonce#enif/ _MC_VER 100in SRIT#ifnde WI2_WITdefne_WIN32_WINNT x000#endfdee _ATLARTMEN_THREADE#ice / 如果想重载某些措施,你可以从ComModu类派生一种类/ 但是不得变化_oule的名字etrnCCmMle _Moule;#inclde atlwinh/AFX_ISRT_LOCATIN/icofiual C将即时从此行之前插入附加声明。endif/ !dfied(AF_SDAF_E6A2

10、_25_1B_9B20_A173C38C8C_INCLUDED)MainFae.ama onceinf_AINFRAME_H_#efie _MAIFRAME_incude cmctl.Has MainFrme :ublic WindoIplCMainFme,Wndow,WiTrisublc:CMainrame():mWndStatusBar(NL),_Bmp(NUL) m_hBmp=LoaBitmap(_ulGetesourIntance(), AKEINTREOE(DB_ATLWINDOWNG);ainFrae() i(_hBp)::Delebjec(mhm); m_hmUL;BGI_MS_

11、MA(CMinFame)SSAGE_HANDLER(WMPNT, Oint)ESSAGEHANDER(WMREATE, Oreate)MESSG_HADLER(M_SIZE,nSize)SAG_HANDLER(WCLS,nClse)CMMAND_D_HADL(IDFILE_EXIT, OnFlxi)COMMANDI_HALR(IDAPAUT,Onu)ENMG_MAP()void OnFiaMessage(HWD *hWnd)LRSUL OCreate(UINT,WARAM wPara, LPARAM aram, BOOL& bHndld)DeioPoc();m_hWdStatBa= :Ceat

12、etausWindow(S_CHILD WS_VSIBL |WSLPCLDREN | WS_CLSIBLGS SR_ZEGR, _T(), mhWn, 1);rtur 0L;LSUTOnS(UINT, WPARAM wParam, PAMaram, L bHad) DefWindowroc();:SendMssage(m_hWdStatuBa,WM_SIZE, 0, 0);rrn ;LRESUT nit(UIN,PAM, LPARA, BO&) PAINTSTRUCT ; HD hdc BegPai(p); CT rect; GeClienRct(rect); / 位图 DCMem = ::r

13、eeCompaibleC(hd);HBITMAPhBmpO =(HITM):SelecObec(hCMm,m_hBm);BTMP bp;::GetOject(m_hB, sizof(ITMAP),&bp);SZ ie =bmp.mWidt,p.bmHeght ;:BitBlt(hd, rt.lt, ret.top, (size.cx), (siz.cy),hDCem, 0,0,SRCOY);/ 清除::SeleObjct(hDCMem,hBmpl);::DleteC(hDMem);hCMe ULL; EndPan(&s); etun 0;LRESULT OnClo(UIN,WARAM,LPAM

14、, BOOL&) DstryWinw();PostuitMesae(0);rtur 0L;LRSUL OnFileExi(WORD,WORD ID, HWND,OL&) Sendesage(M_SE);rtun 0;LREL Abu(WORD,OD wID, HWND, BOL&) CAboutialog dlg;dl.oMda();reurn ;privte:srct Cbotalog : pbc Calogmp enum IDD = IDD_ABUT;BEGN_MS_P(Aouialog)COMAD_D_HANDLER(IDOK, nClos)N_M_MP()LRELTOnCe(ORD,

15、WORD wI, ND, BOL&)EnDialog(wD);rtrn L;WNmhWndSttusB;HITMAPm_mp;#endfAlHloWndowng.C#nclude dfx.incluersure.h#icude MainFrame.HCoMod _Mdle;exrnint WINPI _tWinMin(INSTNCE Instan,HINSTANCE, LPTSTR mdLe,int nSowCd)lpmne GetCommandLine(); / 该行A_INCRT 所必要的_Module.nit(0, hIsance,LL);/加载通用控件INITOMONTOLSX icc

16、x;ccx.dwize=izeo(iccx);iccx.dCC I_W95_CLSS |IC_AR_CLASSES ;:IiCommoCnolsEx(&icx);MEU hMenu=LodMen(oul.GeResourcensance(),MAEIRSOURCE(IDR_ANFR);MainFrmewndame;wnFrae.GetnClasso()m_wcIcon :LoadIcn(Module.ResuceIsance(),MAKEITREOURCE(I_FM));wndFrme.GetnlassInfo()m_wcstye = 0;/C_HREDRAW|CS_VREDRAW;wnae.

17、Cet(GetDekpWindow(), CWidw:rDefaul,_T(ATL Winon is cl), 0, 0, (UNT)hMenu);wndFe.Showidow(ShowCd);wnFmpdateWindw();M mg;whle (Getessa(msg,0,, ))TranslateMessae(&msg); DisatchMessage(&g);_MdulTer();retn 0;在Mainrm.h里,MaFrae有两个数据成员:状态条的HW和HBITMA。CainFrm通过通过调用omctl32dll的CateStausWindow()函数,在WM_CREATE消息解决

18、函数里把状态条创立成一种子窗口,并且通过发送M_SIZ消息,调节状态条的大小。M_PAINT消息的解决函数使用上述的HBITP演示了一点AL里的 GDI编程。由于ATL对I没有提供包装类,因此这里的G编程是直接调用Wi32的PI来完毕的。然而 ESSGE_ANDLER宏需要你做你自己的消息分解,通过一系列的宏为你分解了M_ COMAN和WM_NOTFY消息。inra.展示了如何使用CMMAN_I_HANDER宏,CMaiFame用这个宏来解决它的菜单命令。最后,CAoutDialg是一种对话框类,继承自DiagImp类。Obut命令解决函数调用了DoMol用来显示这个对话框。eoAlWindo

19、in.p里有个tWnMain,这是AL程序的入口函数,它创立了一种CMainFram的实例,而后调用该实例的Crte()函数,以及howWidow()和UpteWindow()这些成员函数,这些成员函数很明显是与她们名字相似的i32 I的封装。最后,由于这个程序从主线上来说,是一种Wi3窗口程序,我们必须从窗口的消息队列里通过GetMesae、isptchMesae循环来抽出消息。如果你熟悉wi32 AP编程的话,你会注意到这个程序缺少ReisteCss()的调用和解决窗口消息的窗口过程,其她的部分你都能理解。如果你熟悉MFC,你也许奇怪T 没有提供那些最基本的支持,例如创立状态条和菜单。好吧

20、,程序既然能运营,事实证明TL肯定支持了。但是TL并没有做足这方面的支持。我们不要忘掉ATL的重要目的(ATL重要目的是支持COM编程)。A容许你,但是并没有直接支持DI,多线程SDI,或浏览器样式的应用程序,也没有封装通用控件,DDX,和GDI有关函数。如果你对这些感爱好,那么我们就进入WTL的世界。第二章 L之路 WTL类使得我们更加容易地创立SDI框架窗口成为也许,这个类就是CFramWindowImp。图 WTL的DI窗口层次关系 类CFrameWidowmpl从类CFrameWinowIpBase派生,因此继承了原则应用程序框架窗口的所有功能。下面列出了一种T创立的框架窗口提供和支持

21、的特性:1) 集合了工具条,菜单条,状态条和br条;2) 基本视图解决,涉及视图与框架同步大小,Rar带维护(涉及添加或调节带的大小);3) 命令条菜单;4) 键盘快捷键;5) 工具条按钮的工具提示;6) 在状态条显示协助字符串;7) 显示框架图标。为了创立一种D应用,环节如下:)从类CFrmendowImpl派生你的框架类;2) 添加WTL的宏DELARRMWN_CASS,指定工具条和菜单的资源I;) 添加消息映射和消息响应解决,需要涉及链入框架基类的链路。例子:clss CanFrme : picCFrameWnowImp ublic: EARE_ME_W_LASS(NUL, IDR_MA

22、INRAM) EGN_MGA(CMainFrae) MESAGE_HNDE(WM_PAINT, Onait) ESEHANDLE(W_REAE, OCreate) COMAND_DHANDLE(IDFILE_EIT, FileEit) COMMA_IHALER(IDHL_OUT, bout) CHAIN_MG_MAP(rmeindowIml) N_S_MAP() LRESULTOeae(UINT, WPARAM,LPAA, BOOL) CreateSmleTolr(); / 创立工具条并设立为CFrameWdowImp:m_hndoolBa成员 CaeSipStatusBa(); / 并创立状

23、态条 eturn; REU OnFlexit(WD,WORDwI, HND,BOO&) SndMessag(WM_LOS); / 框架懂得PostQuitMessge retur 0L; ;宏DECARE_FRM_WDCLAS为框架设立通用资源I。相似资源I可以用在字符串表中用来作为框架标题,菜单资源,快捷键表,图标和工具条资源等。如果WTL在创立框架窗口时,用通用资源ID找到了资源,就自动加载。唯一的例外是工具条资源,你需要使用成员函数Crae Simpleoolr()来手工加载。状态条不需要通用资源。在消息映射中,使用宏CHIN_MSG_M来路由消息给类CFraeWindowImpl,小心

24、解决像_SIZE(重置工具条和状态条的大小)和WM_DESTRO(调用 PotutMeage)之类的消息。为了支持TL的功能,你需要在sdafxh中涉及tlapp.h和lframe.h:#dneWIN32_LEAN_N_MEAN#ilud#ncue tlap.hxten CApodul_Module;#ncld inclde 头文献atap定义了CAppModul构造,它是从原则ATL的CCoModule类派生,并添加有消息循环的变量。头文献atlrameh定义CFrmeWndowImp类。为了在我们WL世界中创立SDI窗口,你需要实例化CMainFram对象,并在wiMain()调用基类的成

25、员函数Crate Ex()。CppMuleModul;nt AENTRY WinMan() ::IitomControls(); _dule.nit(NULL,hnstanc); CMinFrame wndMan; wndai.CeateEx(); wMai.ShoWidow(nCmShow); wdMnUpatw(); Cessaeoop thep; _Modl.ddMessageLoo(&heLoo); int Re theoop.Run(); _odule.ReoveMesaeLoo(); _odue.em(); retun nRet; Createx()成员函数调用基类的dImp:Ct

26、e()成员函数,并使用通用资源ID来加载资源。MssgeLoo对象替代我们需要的手工消息队列。AT容许每个线程有一种消息队列,这就是多线程SDI的实现。当我们学习WT的消息路由框架时,我们将第二部分分析CMese Loop类和CAppModule类的细节。 就这样,我们的SD应用看起来就如图所示:图4 使用WTL创立的S应用我们设法简化了我们的代码,并添加了一种新的特性:工具条。固然,工具条和菜单条是老的风格。顾客更喜欢命令条,就像她们在IE和S Office中所看到的那样。第三章命令条 命令条是一种看起来像Winws菜单的工具条,并拥有位图的菜单项。从无到有写命令条是很痛苦的。如果你是一员F

27、C程序员,Paul DiLascia在99年1月就已经那么做了,S(给你应用程序添加看起来像酷菜单按钮的新的接口)。同样,如果你是一员TL程序员,仅限于在你的M_ CRAT解决函数中使用T的CComdBrCtl类。LREULTCManFrame::OnCreate(U,ARA, LPR, BOO&) / mmBar是ComadBarCtrl类型,在Atltrlw.中定义 HWN WndCmdBar = mCmdBr.reate(m_Wn,rcDefal, 0,AL_IMPLE_CMDBR_PAE_TYLE); m_Cmar.AtthMe(GetMnu()); / 当命令条替代目前的菜单 Bar

28、.LoadImag(IDR_IRAE); SetMnu(N); / 一方面创立简朴工具条,设立mhnToolBar成员变量 HWDhWdToolB =CreteimlToolBCtrl(mhnd, IDR_MANFRAME,FASE,AT_SIMPL_TOOBARNE_ST); eatpleear(LMLE_EA_NOOR_STLE); ddSplReBrBad(WnmdBar); / 添加_hWndBar作为Rebr条的一条带 ddSimleReBarBad(hWnooBar, NULL, TRUE); /添加mhWnTooBar作为Rebar条的另一条带 CeatSpleSausr();

29、/ 创立状态条 eturn 0; 类madBarCl是L封装命令条功能和特性的类,类MainFrame中涉及了该类的成员。在上述WM_EATE解决函数的程序片段中,我们一方面通过调用ComandBCtrl: Create()创立命令条,把主框架作为父窗口参数传递。然后,我们通过调用CCmmanBarCtrl:: Aachenu()来attch我们的菜单资源,再调用CommandBartl:dIags()来传递工具条资源。命令条使用工具条位图,并把她们映射到菜单项的命令ID响应中。由于命令条管理酷菜单,我们需要通过调用SetMenu(NL)来剔除本来缺省的应用程序菜单。然后,我们分别地通过调用C

30、reateSimleToolatl()和CeateiRar()来创立工具条控件和一种Rear控件,传递工具条资源作为参数。最后,我们通过调用CFrmeWinomplBase: SimlebarBand()添加命令条和工具条作为ebar控件的2条带。图4显示带命令条的SDI的应用程序。同步也显示了程序片段中U元素的映射关系。图4带命令条的DI应用程序第四章带视图的框架窗口就MFC程序员的一般习惯而言,框架窗口的客户区是作为独立的子窗口而存在的,被称为视图。框架窗口负责窗口的修饰,例如菜单条和工具条;而视图仅仅被用来呈现信息,而这些信息是运营应用程序的重要地方。当涉及分隔窗口或DI时,这一点特别重

31、要,这将在背面讲到。视图可以是涉及任何窗口句柄HWND的窗口。在解决WMAT消息期间,把视图的ND赋给框架窗口的成员变量hdClient。例如,给我们D应用添加位图绘制功能,你可以如下所示那样定义一种视图类:class CitmapVw: ublic CWidowIplpulc: BimpView(); CitmapView(); BGI_MSMA(CBitaVw) MSAGE_ANDLR(WPINT, OnPant) ND_S_MA() LRES nPaint(UINT,WARAM, LARAM, BO);pivate: HIP m_hmp;为了使用该视图,如下所示操作:LESULT OnC

32、rea(NT, WPRM, LAAM,OOL&) / 创立视图iew(m_viw是Bitmapiew类型) mhWndClient = m_view.Create(mWd, refault, NUL, WS_CHILD | WVISBE,WSEX_CLETDE); ern 0; 目前,框架窗口无论何时调节大小,这个视图都会被工具条,命令条和状态条所包围。TLWT提供大量窗口类可以作为视图。你可以使用所有的窗口控件和通用控件封装类作为视图。例如,通过把_iew类的类型从CBimapiew变为CEdi(在tlctrl.h中定义),你就有简朴的文本编辑器(见图5)。图5 简朴的文本编辑器 如果你想从

33、ATL的窗口封装类中选一种类派生出来作为视图,你可以有2个方面的继承:C措施与窗口措施。这就是超类化,这样你可以添加功能和解决消息。例如,通过从CAxWndo继承,我们可以有一种支持HTL的客户视图。/ 继承C+措施为来继承CxWindow功能lass HlVew :publi WindoImpubl: / 继承indows措施来预解决Wndows消息 DECLARE_WND_SPRCLA(L,Cxinow:GetndlassNe()) BEGIN_MSG_AP(CHtmlVi) END_MG_MP()CtmlVew() AtAxWinInit(); 初始化控件宿主(在tlhosh定义) ;

34、我们可以使用新的视图来打开一种we页面(图6显示这个成果)LRSLT MainFrame::OnCreae(UIN, WPAAM, PARM,OL) / 创立该视图(m_vie 的类型是CHmlVw) m_hCien =mie.Create(m_hWnd, rcDeflt, :/ww, WS_CHLD | WS_VISIBLE,WSECLINTEGE); return0;图6 使用新的视图来打开网页第五章 使用MRU尽管WT提供支持视图,但跟MFC不同样,它没有文档的概念。如果你想在WTL应用程序中支持文档/视图模型,你是很自由的。作为开始,我们已经写了一系列提供非常基本文档功能的类,你可以用

35、在你应用程序中。这一章的WLocView例子就可见到这些类。如果你做过文档工作,你几乎可以肯定会在文献菜单中支持MRU(Most Recent Use)文献列表。具有挖苦意味的是,尽管T不支持文档,它通过CReentDocumentList类(在atlmsch中定义)提供全功能MR支持。主框架窗口一般管理CRecentoumntLis类的一种实例。在主框架窗口的WM_RAT消息解决中,主框架窗口用一种文献菜单句柄来初始化Recet Docmetist对象,这样它就可以管理了。为了拥有MRU功能,框架窗口调用Reenoument ist::dFmRgs()成员函数来从指定的注册表键查找1个入口。

36、缺省状况下,限制的RU文档是4个,但你也可以通过调用CecentDocuentLst::SetMaxEnris()来变化这个值。LRLTMainFrame:OnCret(UIN,PARM, LR,OO&) _mr.etenuHadle(tMnu().GetSubMeu(0); mmu.eadrRegisry(T(SfteMyCompanyMyColApp)); m_mu.SEtis(1); 为了初次添加一种文档到MRU列表,你可以调用CentDcumetList:doLi():LRESULT Minram::OnFieOpn(WRD, WOR,HND, BOO&)if(m_dlpn.DoMod

37、al(m_hn) = DO) / 试着打开文献f (bFiOpened) _mru.AddToit(m_dlgpen.m_bstrName);return ; 你添加MRU的菜单项介于D_FL_MRUFIR和D_FILE_MRU_LAST(在atlres.h定义)之间。你可以宏COMMAND_RN_ANDLER来解决这个范畴。当顾客点击MU菜单项时,解决函数可以调用CRcentDoumntL:GetFromLis()返回文档名。在文档打开后,解决函数应当调用CRcntDocuent Lis:oveoop()或ReentocmentList:Reov FromList()来批示文档打开与否。LR

38、EUTCMirame:OnpensingMRU(WORD,WR wID, HND, OL) TCH soumentMAPATH;mmr.etromLs(ID,szDocuent);/Try to open te fiepecifiebyte menu ite f (bFilepened)m_mru.MovToop(wI);elem_ru.ReoveFrmLst(w);return 0; 最后,当你的应用程序关闭时,你需要调用CecnDoumentit::WrtReist()来把文献名列表写入注册表。vo ina::naMessage(WD /*hWnd)m_mru.WriteToRegistr

39、y(_T(SoftwaryCompanyyCoApp);:PostQuiMessage(0);第六章 创立多线程SI应用程序与多种I应用程序不同,浏览器使用一种应用程序来管理多种顶级S窗口。如果你想在应用程序使用这个特性,你可以就使用WL提供的多线程SDI支持。多线程DI应用程序的设计原理是很简朴的:1 每个顶级窗口(涉及它们的子窗口)运营在一种独立的线程;2 每个线程均有一种独立的消息队列,都是UI线程,具有消息解决和分派窗口消息的能力。这意味着不仅所有的线程共享进程数据,并且当一种线程忙于解决某些事情的同步,其他线程仍可以作出及时的响应;3 这样,每个顶级框架窗口对于顾客来说,就像一种独立

40、的应用。创立这样一种应用程序的技巧在于设计一种线程管理类,它拥有:1 为每个线程创立一种新的框架窗口;2 管理线程类保存活动线程的数量;3 保持命令行参数和初始化窗口大小。 WTL没有为多线程SD应用提供任何基类。然而,它的应用程序向导可以创立这种类型的应用程序(本章节背面有充足的阐明)。TL向导产生如下的线程管理器类:as CThreaMaager pbli:struct unDta /线程初始化参数LPTSTR lstrCmdLine;int nCdSow;D _Cont;/ 线程数HANDLE m_arTrdHandsAMUMWAIT_OECTS1;Chredne() : m_dCoun

41、t() WORDAddread(LTSRsrCmdin, innmShow);vo Reehread(DWRD dwIndx);int Run(TTR lpstrCdi, int CSow);WnMain将实例化线程管理类。 intINAPI WinMin()hRe = _Mdul.Int(NULL,hInstace);CreadMaaemg;intnt= mgr.Run(lpstrCmdLne, Cmhow);_Module.Trm();return nRe; hradMangr::Ru()措施创立一种新的UI线程,并使用MgWatFMultileObject()等待所有U线程。当MsgWa

42、torultiplObjects()指出有一种线程已经终结,它减少线程数,并继续等待。一旦所有线程结束,Run()措施返回,我们应用程序也就结束。另一方面,如果sgWatForMltipleObjects()指出有一种窗口消息,而这个消息是W_ USE,则线程管理类创立一种新的I线程。i CTreaanager:Ru(LPTST lsrmLine, int nCmdSo)Mg;:PeMsag(&mg, NULL, WMSE, WMUSER, PM_NORME); / 逼迫创立消息队列AddThread(lstrCdLine, nCmdShow);it Rt =m_wount;DWRdwe;il

43、e(mwont 0)wRet= :MsgaiFrMltpleObjects(m_out,m_arThredndes, ASE, FINIE, QSALNPUT);if(Rt =0xFFFFFF) :ssageBx(NULL, _T(ERROR:Wait or ultiple objects fied!), T(MultS_HMVew),_OK);elsif(dwRe = WAITOBJEC_0 & dwRet ubi:DELARE_RAME_WN_CLS(NLL,D_MDICHILD)CHtmlView m_iew;lvi FialMesage(HWND /*hWnd*/) elete this;BEGIN_MSG_AP(idFrm)MESSAGE_HNDLER(WM_RATE, Creae)CHN_MSGAP(CDIhildWidoImp)END_SG_MP()LRESLT OnCrete(UNT,WPARA,LPARAM,B&) m_hWnClen = m_view.Create(mWnd, rDefault, _(http:/wwmirsotco),S_CHID |

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!