先介绍一个WTL增强数据交换工具 DDX
DDX是一套类似于MSG_MAP的宏命令,其实质就是简化和统一窗口与数据之间相互传值的调用代码。
使用起来比较简单,举个例子。
首先在需要使用DDX的类中继承CWinDataExchange父类
然后使用DDX命令 将要绑定的控件ID和对应类型的变量进行绑定
当然,要创建ID_TF_FIRST这个资源ID并赋值给之前创建的CEdit;
之后在需要交换数据的地方使用
DoDataExchange(FALSE) 方法就可以将数据从变量传递到控件,或 DoDataExchange(TRUE) 从控件传递到变量了
在自定义控件中可以定义自己的DDX宏,这样可以方便的统一输入和输出,便于代码阅读。
使用资源文件设置自定义视图
使用纯代码创建自定义视图很简单,继承就行了。
如果希望不需要通过代码创建只要拖控件的话,则要使用Custom Control控件,并在使用前注册,并使用自定义的窗口类关联。
首先拖一个 Custom Control 类型的资源到对应的视图中 ,然后指定一个资源ID和自定义一个Class名称。
然后回到Main函数中注册这个Class
创建一个自定义窗口类并关联资源
这样,该资源代表的控件就是你自定义的类对应的控件了,如果需要移动到其他窗口,可以直接在资源文件中操作,只要在使用时将对象与资源做关联就行了。
给自定义的资源视图添加控件
使用资源自定义视图则不需要调用Create方法,也就无法在这里创建子控件了,但是类与资源绑定时会调用SubclassWindow。就可以在这里重写该方法添加创建子控件的操作。
class FirstCustomItem :public CWindowImpl<FirstCustomItem,CWindow>
...
...
CButton btnL;
CButton btnR;
BOOL SubclassWindow(_In_ HWND hWnd) {
//先调用父类的SubclassWindow
BOOL result = CWindowImpl::SubclassWindow(hWnd);
if (result)
{
CRect lRect;
GetClientRect(&lRect);
lRect.right = lRect.right / 2;
CRect rRect;
GetClientRect(&rRect);
rRect.left = rRect.right / 2;
btnL.Create(m_hWnd, lRect, "0", WS_VISIBLE | WS_CHILD, 0UL