从零开始的WTL入门教程(4) 基础控件CButton,CEdit,CScrollBar,CComboBox的简介和基本使用

基础控件

在进一步使用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会固定的调用一个带有四个参数和一个返回值的方法
COMMAND_HANDLER定义
为其添加对应形式的响应方法
按钮点击响应
在响应中我通过系统调用方法传递而来的句柄找到了按钮并改变了按钮的标题,并通过ID匹配对应按钮改变整个窗口的背景
点击事件
同时也可以通过GetDlgItem方法获取控件的句柄
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会有不同的样式 可以自己试试
CComboBox
关于常用的控件的例子就讲这些 复杂的如树形控件,文件选择,菜单之类的特殊控件可以搜到其他更详细的资料。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WTL 具有两面性,确实是这样的。它没有MFC的界面(GUI)类库那样功能强大,但是能够生成很小的可执行文件。如果你象我一样使用MFC进行界面编程,你会觉得MFC提供的界面控件封装使用起来非常舒服,更不用说MFC内置的消息处理机制。当然,如果你也象我一样不希望自己的程序仅仅因为使用了MFC的框架就增加几百K的大小的话,WTL就是你的选择。当然,我们还要克服一些障碍: ATL样式的模板类初看起来有点怪异 没有类向导的支持,所以要手工处理所有的消息映射。 MSDN没有正式的文档支持,你需要到处去收集有关的文档,甚至是查看WTL的源代码。 买不到参考书籍 没有微软的官方支持 ATL/WTL的窗口与MFC的窗口有很大的不同,你所了解的有关MFC的知识并不全部适用与WTL。 从另一方面讲,WTL也有它自身的优势: 不需要学习或掌握复杂的文档/视图框架。 具有MFC的基本的界面特色,比如DDX/DDV和命令状态的自动更新功能(译者加:比如菜单的Check标记和Enable标记)。 增强了一些MFC的特性(比如更加易用的分隔窗口)。 可生成比静态链接的MFC程序更小的可执行文件(译者加:WTL的所有源代码都是静态链接到你的程序中的)。 你可以修正自己使用WTL中的错误(BUG)而不会影响其他的应用程序(相比之下,如果你修正了有BUG的MFC/CRT动态库就可能会引起其它应用程序的崩溃。 如果你仍然需要使用MFC,MFC的窗口和ATL/WTL的窗口可以“和平共处”。(例如我工作中的一个原型就使用了了MFC的 CFrameWnd,并在其内包含了WTL的CSplitterWindow,在CSplitterWindow中又使用了MFC的CDialogs -- 我并不是为了炫耀什么,只是修改了MFC的代码使之能够使用WTL的分割窗口,它比MFC的分割窗口好的多)。 在这一系列文章中,我将首先介绍ATL的窗口类,毕竟WTL是构建与ATL之上的一系列附加类,所以需要很好的了解ATL的窗口类。介绍完ATL之后我将介绍WTL的特性以并展示它是如何使界面编程变得轻而易举。 对第一章的简单介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值