基础控件
在进一步使用WTL封装控件之前,需要先了解和使用一些基本控件,它们是通用MFC的。
通常给自定义控件添加子控件的过程放置在生命周期方法中的创建消息中。对于CWinodwImpl就是MSG_WM_CREATE
CButton
为FirstWindow创建一个CButton
注意对于一个子控件,需要为其指定父控件的句柄以确定坐标系位置。同时需要设置样式为WS_CHILD或者WS_CHILDWINDOW(二者等价)。
int OnCreate(LPCREATESTRUCT lpCreateStruct) {
//TODO:添加控件
CButton btn;
CRect btnRect;
btnRect.left = 50;
btnRect.right = 150;
btnRect.top = 50;
btnRect.bottom = 100;
btn.Create(m_hWnd, btnRect, "ClickBtnHere", WS_VISIBLE | WS_CHILD, NULL, 0U, NULL);
return 0;
}
添加响应事件
按钮响应事件通过消息机制传递
通过COMMAND_HANDLER宏命令添加
注意红色箭头标注的参数,标志着消息对应的控件ID,匹配一致才会调用。
通常为了防止重复ID和增强代码的可读性,控件的ID通过资源文件添加。
在菜单中打开资源窗口
找到你的项目.rc条目右键菜单点击资源符号
选择新建并输入一个名称
由于是宏命令一般用全大写下划线分割的命名风格
资源符号的主要功能是让你的控件在消息机制中通过ID匹配到对应的句柄。动态创建的控件同样能直接通过句柄寻找。所以资源主要是为了通过XML静态创建的视图使用。这一部分会在后面讲控件布局的时候在做解释。
COMMAND_HANDLER会固定的调用一个带有四个参数和一个返回值的方法
为其添加对应形式的响应方法
在响应中我通过系统调用方法传递而来的句柄找到了按钮并改变了按钮的标题,并通过ID匹配对应按钮改变整个窗口的背景
同时也可以通过GetDlgItem方法获取控件的句柄
注意只可获取调用该方法的控件的子控件的句柄,也就是创建时 hWndParent 参数指定为该控件的控件。
CEdit
输入框控件,同样通过Create方法创建
CEdit textField;
CRect tfRect;
tfRect.left = 200;
tfRect.right = 300;
tfRect.top = 50;
tfRect.bottom = 100;
textField.Create(m_hWnd, tfRect, nullptr, WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOVSCROLL, 0UL, 0U, NULL);
通过Style参数设置属性。默认状态下为单行 ES_MULTILINE 设置为多行,ES_AUTOVSCROLL设置为垂直自动滚动,默认状态下为单行,如果不设置滚动,在字符填满控件时不再接受输入字符。
获取输入框文字内容
SetWindowText方法和GetWindowText分别可以设置/获取Cedit中的字符内容。
CScrollBar
CScrollerBar 本身是作为独立控件使用的 但是CWindow是有默认的滚动条可以使用的 只需要在Style中设置WS_VSCROLL/WS_HSCROLL。
CScrollBar scroller;
CRect scrRect;
scrRect.left = 20;
scrRect.right = 40;
scrRect.top = 20;
scrRect.bottom = 200;
scroller.Create(m_hWnd, scrRect, "", SBS_VERT | WS_VISIBLE |WS_CHILD, NULL, 0U, NULL);
this->ShowScrollBar(0, 1);//显示水平滚动条
this->ShowScrollBar(1, 1);//显示垂直滚动条
SBS_VERT设置了滚动条的方向为垂直。默认为水平
给滚动条设置属性
SCROLLINFO info;
scroller.GetScrollInfo(&info);
scroller.SetScrollInfo(&info, false);
scroller.SetScrollRange(0, 100);
scroller.SetScrollPos(20, TRUE);
通过SCROLLINFO给滚动栏设置两侧代表的值
滚动条自身是不会随着滚动而停在对应的位置的,只能通过SetScrollPos方法令其停在对应的位置。
因此需要在滚动事件中记录并设置滚动条停留在对应的位置
添加滚动条滚动事件
先添加消息 MSG_WM_VSCROLL(OnVScroll)
然后添加响应方法
void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) {
int curPos = pScrollBar.GetScrollPos();
int destPos = curPos;
switch (nSBCode)
{
case SB_THUMBPOSITION:
destPos = nPos;
break;
}
pScrollBar.SetScrollPos(destPos);
}
nSBCode是滚动条事件的类型标志,包含各个方向的滚动,鼠标拖动开始,停止等。先添加一个最简单的事件
SB_THUMBPOSITION就是鼠标拖着滑块到达某个位置抬起后触发
而对于其他事件则 nPos参数为0 需要自己在响应中添加对应的变更操作
注意不要让目标位置超出你设置的范围
CComboBox
CComboBox box;
CRect lstRect;
lstRect.left = 50;
lstRect.right = 150;
lstRect.top = 120;
lstRect.bottom = 200;
box.Create(m_hWnd, lstRect, "listCtrl", WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, 0UL, 0U, NULL);
box.AddString("item1");
box.AddString("item2");
box.AddString("item3");
设置不同的Style会有不同的样式 可以自己试试
关于常用的控件的例子就讲这些 复杂的如树形控件,文件选择,菜单之类的特殊控件可以搜到其他更详细的资料。