总介绍
UI库是基于WTL ,WTL是基于ATL UI库可以自己制作
MFC 兼容性导致其性能下降 对大型项目影响很大 影响架构设计
有一定的基础封装不是mfc的框架,可以自己定制一些窗口行为(WTL)
WTL对模板编程有要求
WTL介绍
WTL Windows Template Library
WTL类的类型:
- 主框架窗口 CFrameWindowImpl CMDIFrameWindowImpl
- 控件 CButton,CListViewCtrl等等
- GDI对象 CDC、CMenu等等
- 特殊界面特性 CSplitterWindow, CUpdateUI, CDialogResize, CCustomDraw
- 实用的工具类和宏 CString, CRect, BEGIN_MSG_MAP_EX 等等
ATL介绍
ATL Activity Template Library .NET编程
ATL使用demo
代码 内存少
#include <iostream>
#include <atlbase.h>
#include <atlwin.h>
#include "resource.h"
using namespace std;
//在WinUser.h里面 或者 查询微软文档 F1
//代表窗口风格
typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN , WS_EX_APPWINDOW>TianchenTraits;
class TianchenWin
:public CWindowImpl<TianchenWin,CWindow,TianchenTraits>//可以通过句柄对CWindow进制操作
{
public:
DECLARE_WND_CLASS(_T("Tianchen Window Class"));//窗口类定义
BEGIN_MSG_MAP(TianchenWin);//消息映射表
MESSAGE_HANDLER(WM_CLOSE,OnClose)
MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
COMMAND_ID_HANDLER(IDR_ABOUT,OnAbout)
END_MSG_MAP()
LRESULT OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{//bHandled TRUE 则不会调用WindoProc FALSE 会调用WindowProc来继续处理
DestroyWindow();
return 0;
}
LRESULT OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PostQuitMessage(0);
return 0;
}
LRESULT OnAbout(UINT wNotifyCode,WORD wID, HWND hWndCtrl, BOOL& bHandled)
{
OutputDebugString(_T("OnAbout called\r\n"));
return 0;
}
};
CComModule gModule;
int main()
{
HRESULT hRes=gModule.Init(NULL, GetModuleHandle(NULL));//因为是命令行没有句柄
if (hRes != 0)
{
cout << hRes << endl;
}
TianchenWin win;
HWND hwnd=win.Create(NULL, TianchenWin::rcDefault, _T("Tian Chen Window"));
if (hwnd == NULL)
{
cout << "create window failed\r\n";
}
win.ShowWindow(SW_SHOW);
win.UpdateWindow();
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
gModule.Term();
return 0;
}
添加资源
运行效果
WTL使用demo
首先改造项目 是基于ATL进行的更改
1 链接器从控制台改为窗口
2 将预定义的_CONSOLE改为_WINDOWS
代码
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdSHow)
{
HRESULT hRes = gModule.Init(NULL, GetModuleHandle(NULL));//因为是命令行没有句柄
if (hRes != 0)
{
cout << hRes << endl;
}
TianchenWin win;
HWND hwnd = win.Create(NULL, TianchenWin::rcDefault, _T("Tian Chen Window"));
if (hwnd == NULL)
{
cout << "create window failed\r\n";
}
win.ShowWindow(nCmdSHow);
win.UpdateWindow();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
gModule.Term();
return 0;
}
效果