wtl

WTL学习记(二):WTL的消息处理链

ε祈祈猫儿з 提交于 2020-02-05 16:03:18
前小节简单介绍了WTL安装注意的一点小的细节并举例简述如何对自己的窗口类添加对消息的响应,这一节主要就WTL如何实现对windows窗口过程函数的封装陈述些自己的理解。 一、ATL对Windows窗口的封装 WTL的基础是ATL。WTL的框架窗口是ATL窗口类的继承。因此,先介绍一下ATL对Windows窗口的封装。 由win32 API 中创建Windows应用程序可以知道创建窗口和窗口工作的逻辑是: 1 定义一个窗口类 2 注册窗口类 3 创建该类窗口并显示和激活该窗口 4 窗口的消息处理逻辑在窗口函数中。(该函数在注册窗口类时指定) 可以得知,对于窗口的封装关键在于怎样封装窗口消息处理机制。怎样将消息传递给相应的类的实例。通常的办法是采用虚函数:将每个消息对应生成一个虚函数,这样,在窗口处理函数中,对于每个消息,都调用其对应的虚函数即可。但带来的问题是类的虚函数表过于庞大。ATL的处理机制是只定义了一个虚函数(ProcessWindowMessage())。 图示ATL封装的类的继承关系图。从图中可以看到有两个最基本的类。一个是CWindow,另一个是CMessageMap。 在ATL类中对窗口过程的实现是CWindowImpl。它派生自CWindow、CMessageMap,CWindows是对Windows的窗口API的一个封装。它把一个Windows句柄封装了起来

WTL 核心机制

空扰寡人 提交于 2020-02-05 15:08:03
最近闲了一段时间,学了学WIN32的界面编程,由于对API有那么一点基础,所以想挑个轻量级的界面库学习,以便在较短时间内学得深入些,so,就选择了WTL。并在此记录自己的学习成果。 WTL背景介绍 WTL是微软ATL开发组成员Nenad Stefanovic先生在ATL Windowing机制上发展起来的一整套GUI框架,运用template技术组织和创建GUI对象,构筑了精致的面向对象框架(在这里object oriented与template达成了精致的融合)。虽然没有获得微软的官方支持,虽然其使用者人数很少,但是确实是“用过的都说好”,有位微软MVP人士甚至说,这是微软有史以来推出的最优秀的一个framework。真是一个有趣的讽刺,最好的东西居然不被官方支持。有关于WTL的流言不少,比如这东西原本是微软内部专用,只是因为不小心才被泄漏出来等等,这更加剧它的神秘色彩 WTL 安装 从WTL主页( http://wtl.sourceforge.net/ )上可以下载到最新的WTL,解压缩之后运行根据你当前安装的VC版本选择不同的setup.js安装即可。注意,最新的WTL安装程序已经没有VC6的安装向导了,用VC6的童鞋们可以下载WTL7.1或者尝试使用这种方法( http://hi.baidu.com/yykbrother/blog/item

WTL学习(一)窗口框架

流过昼夜 提交于 2020-02-05 14:54:43
wtl这个开发框架在开发win32程序方面有很多应用 ,现在chrome和金山等都是用的这个库,所以我要好好学习一下,故写此博客,以推动自己学习。 开始 我从都开始建立一个win32的窗口程序,然后一步一步的添加wtl中的模块,以求达到熟悉win32中的各个api和wtl中类的目的。 首先,包含一下atlapp.h这个头文件。这个头文件中包 含了 CMessageLoop,这个类主要是用来管理win32的消息循环的(具体的以后再仔细分析吧);CAppModule这个类封装了一个程序中的所有的线程消息循环 。 class CAppModule : public ATL::CComModule{public: DWORD m_dwMainThreadID; ATL::CSimpleMap<DWORD, CMessageLoop*>* m_pMsgLoopMap; ATL::CSimpleArray<HWND>* m_pSettingChangeNotify;。。。。。。。。。。。} 其中,m_ dwMainThreadID是程序主线程的线程ID, m_pMsgLoopMap中维护着所有线程, m_pSettingChangeNotify我还不清楚,在看吧。 在项目中添加一个类 CmfMainFrame ,然后继承自 CWindowImpl<CmfMainFrame>,

WTL学习记(一):初识WTL

我们两清 提交于 2020-02-05 14:53:44
最近尝试了解WTL在UI上的应用,实属彻彻底底的初学者,所以只是在此写上一些纯属个人认识。 (若是能抛个砖头引玉最好!) 一、WTL的安装 WTL的最新版本8.1,但WTL8.1不支持在VC6上直接安装,建议你安装WTL7.0版本。也有称可手动安装,我也在网上搜索到了些方法,但是没有去尝试(我不敢保证之后会不会出现让VC大惊小怪的问题,若你对其感兴趣,我只能保证一定能搜索的到方法)。 其实关于WTL的安装本无可说,只是或许如我一样的初学者会有一些疑惑。因为WTL中setupXX.js安装文件只是为你的VC安装了WTL的AppWiz,安装后VC的New->Project中会添加选项ATL/WTL AppWizard,但并没有自动将WTL工程所需的atl类.h文件(这些文件都在WTL安装文件的Include目录中)导入到你的VC安装路径中。若你和我一开始一样,以为双击了安装文件就可以将安装包删除了,那么你就和我一般犯了个低级错误。建议的安装方法是:1.首先在你的VC安装目录下新建目录WTL(可以是其他自定任意合法目录名称),然后将安装包(自解压文件)解压到此目录中,双击目录AppWiz\setupXX.js安装;2.打开VC6.0,Tools->Options->Directory->Include files中将WTL中的include目录路径添加进去。如果你用的是VS2008

将WTL应用向导添加到VS2019

a 夏天 提交于 2020-01-30 11:51:23
WTL 简介 WTL 全称是 Windows Template Library,像 MFC 一样使用 C++ 的面向对象技术对 Win32 接口进行了封装,使之便于开发 Windows 程序。相对于 MFC 这个庞然大物,WTL 保持了小而美,只包含了界面开发相关的特性。 下载 WTL 首先下载最新版本的 WTL, 下载地址 (https://sourceforge.net/projects/wtl/files/WTL%2010/)。下载后将其解压,包含文件如下: AppWizard:包含了应用向导相关的文件,通过该文件夹里面的 Setup.js 进行安装; Include:WTL 库实现文件; Samples:提供了多个示例程序。 修改 Setup.js 双击 AppWizard 目录下的 Setup.js,该文件会搜索电脑上安装的 VStudio,然后提示是否安装 WTL 应用向导,但是该文件目前暂不支持 VS2019,需要对其进行部分修改。从第 86 行开始修改,具体修改项如下所示: 修改注册表 经过以上修改,再次双击 Setup.js 发现并没有搜到 VS2019。在修改 Setup.js 过程中引用了一个注册表项,打开注册表(使用快捷键 Win+R 弹出运行窗口,输入 regedit )发现并不存在这一项。参照下图进行添加: 再次双击 Setup.js 进行安装

WTL multithreading, multiple interfaces & libraries

本小妞迷上赌 提交于 2020-01-22 02:44:09
问题 I have a Main Thread that displays an interface, within another thread created from the main thread before the Main interface is shown, I create tow other windows sequentially: I create the first window: CWarningDlg warnDlg; warnDlg.Create(NULL); warnDlg.ShowWindow(SW_SHOW); warnDlg.BringWindowToTop(); CMessageLoop _Loop ; if(_MyAppModule.AddMessageLoop(&_Loop)) { nRet = _Loop.Run(); _MyAppModule.RemoveMessageLoop(); } warnDlg.DestroyWindow(); if (nRet == SOME_VALUE) { doSomethingElse(); } Do

How can I install WTL 8.0 Project Wizards in VS 2010?

末鹿安然 提交于 2020-01-13 02:13:10
问题 I've downloaded the WTL 8.0 package and come to find the scripts to install App Wizards don't support VS 2010. Does anyone know of updates scripts to support installation in VS 2010? Thank you! 回答1: WTL 8.0 was released in june 2007 so couldn't possibly support VS 2010. You may download the current work in progress WTL 8.1 AppWizard from http://wtl.svn.sourceforge.net/viewvc/wtl/trunk/wtl/Wizards/AppWiz.tar.gz?view=tar and the matching library files from /include.tar.gz?view=tar. 回答2: The

[学院]_[WTL运行Setup.js安装项目向导找不到VisualStudio的解决办法]

和自甴很熟 提交于 2020-01-07 20:22:04
场景 1.在 使用WTL进行Windows桌面应用开发 搭建 WTL 环境时我们介绍了双击 WTL 目录下的 AppWizard\Setup.js 会自动搜索已安装的 Visual Studio 并安装 WTL 的项目向导到 Visual Studio 里.但是也有搜索不到 Visual Studio 的情况,这时候我们就需要手动进行复制文件安装. 图1: 说明 1. Setup.js 搜索不到 Visual Studio 的可能情况有, Visual Studio 安装位置不在系统目录; Visual Studio 安装目录路径里有中文; WTL 的库路径里有中文; Win10 出现这种情况; 2.解决办法就是. 把 WTL 的库目录路径改为英文. 先记录 Visual Studio 的版本号:如2017的版本号是 15.9.18 ,只需要主版本号 15.0 .图示2: 修改 WTL10_9163\AppWizard\Files 目录下的 WTL10AppWiz.vsz 文本文件为以下,注意 VsWizard.VsWizardEngine. 这里添加上边记录的 Visual Studio 版本号 15.0 , WIZARD_VERSION 也是填该版本号. ABSOLUTE_PATH 里填 WTL 的绝对路径到 WTL10AppWiz.vsz 的所在目录 E:\software

GetModuleHandleEx usage example. WTL internationalisation

本秂侑毒 提交于 2020-01-05 04:29:07
问题 I am trying to do internationalization in a WTL GUI application .. in my drop down selection change handler (which is used for language selection I do something like this): int selected = (int)::SendMessage(m_cbLang, CB_GETCURSEL,0,0); HMODULE hmod; int retCode = 0; switch(selected) { case 0: retCode =::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, NULL, &hmod); ATL::_AtlBaseModule.SetResourceInstance(hmod); break; case 1: retCode =:

Does ATL/WTL still require the use of a global _Module variable?

自闭症网瘾萝莉.ら 提交于 2020-01-02 05:33:06
问题 I'm just starting up a new ATL/WTL project and I was wondering if the global _Module variable is still required? Back a few years when I started working with WTL it was required (at least for ATL 3.0) that you define a global variable such as: CAppModule _Module; To get ATL to work correctly. But recently I've read somewhere that this may not be required anymore (yet the wizard generated code still uses it). Also I did a search through the Visual C++ include directories and it only picked up