扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在WinX目录下tutorials\winx中,共有18套WinX使用实例,我们先从第1套——step001“战”起。由于WinX每套实例中会有多个项目,所以这里我强烈建议将Workspace中的活动项目(Active Project)的字体改为Fixedsys,以加重区别。具体方法是:Tools->Options->Format,选择Category->Workspace Window,将右边Font改为Fixedsys,这样在Workspace Window中标示我们当前活动项目成了对比强烈的黑色。
OK,言归正传,打开step001中的hello.dsw工作区文件。我们可以看到这里共有8个例子:2个是MFC的,2个是SDK的,2个是WINX的,2个是WTL的。
按:我不得不假定你所具有的开发知识背景和我类似,即了解SDK开发,熟悉MFC开发,没有接触过WTL和WinX。当然和我背景不一样也没关系,:)
四类例子中都分别演示了如何创建对话框窗口和普通窗口。
l MFC
MFC的两个例子,HelloMfc演示了普通利用资源文件创建窗口(对话框),HelloMFC2演示了程序动态创建窗口。利用了CDialog和CMainFrame类,代码都很简单。
l SDK
基于SDK的程序需要重头做起,注册窗口类、创建窗口、显示窗口,在窗口函数中拦截消息……。当然,对于对话框这一特殊窗口,系统已经代替我们注册了窗口类,我们只要提供我们的窗口函数就可以。但你需要多提供一个参数,那就是对话框资源ID。
l WTL
WTL程序和MFC很类似的一点,都是通过在对话框类中定义枚举变量标明对话框资源ID。
enum { IDD = IDD_HELLO };
MFC中全局的theApp也成了_Module。
l WinX
WinX与WTL相似的一点就是这种写法:
class CDerivedClass : public CBaseClass< CDerivedClass >
派生时,派生类类型同时也作为模版参数。这种写法贯穿WinX。
在对话框程序中,WinX和MFC非常相似,唯一不同就是对话框资源ID在MFC程序中被作为一个枚举常量定义,而在WinX程序中它作为一个模版参数传入:
class CHelloDlg : public winx::ModalDialog<CHelloDlg, IDD_HELLO>
在普通窗口程序中,WinX倒是和WTL比较类似,它也会要求我们在全局域中定义_Module变量。但WinX同样也在WinMain内定义了一个module变量:
CAppModuleInit module;
在以后的程序中你还会碰到别的类似的变量,当你不知道到底该定义哪个变量时,开始的准则是:添加变量直至程序编译通过。
需要注意的是以下几段代码:
1. WINX_CLASS("CHelloMainFrame");
WINX_CLASS注册窗口类,一个参数是窗口类的类名。
2. CHelloMainFrame::RegisterClass();
在这里注册窗口类。相比MFC和WTL,WinX比它们多了注册窗口类这一步,但以后你会发现多做了这一步给我们带来了多大的灵活性。
3. void OnPaint(HWND hWnd)
没有任何拦截消息的代码,我们只要按照规范定义相应消息处理函数就可以。对于WM_PAINT消息,它的处理函数就是OnPaint,我们只要按照我们的用途编写OnPaint代码就可以了。系统消息的处理函数一般都是按照OnXXXX这种样式定义的。有人会说,万一我并不知道某一系统消息的存在,而定义了我自己的OnYYYY函数,就有可能和系统冲突。你的担心是必要的,一个简单而有效的解决方法就是,自己的函数以ZZZZ_OnYYYY,“ZZZZ”可以代表用途的名字后者你想要的,如“WebBrowser_OnYYYY”。
综上,WinX在某种程度上,好像是结合了MFC和WTL,用起来不会生手。WinX是基于模板的,但对于没有接触过模板的人,也不要紧,只要记住特定的写法(派生类型作为模板参数),使用WinX也不成问题。
查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者