Win32——edit控件的简单使用

Win32编程:Edit控件操作指南
本文记录了作者初次尝试Win32编程时,使用Edit控件进行操作系统实验的经验。通过全局变量声明Edit窗口句柄,并利用SendMessage函数进行事件处理,如WM_SETFOCUS、EM_SETSEL等。在InitInstance函数中设置初始提示文字,通过SetWindowText和SendMessage函数添加和修改Edit内容。详细介绍了各种参数和函数的用法,提供了多个参考资料链接。

虽然标题是Win32 edit 控件的简单使用,不过最主要的还是记录第一次做操作系统实验中遇到的问题。由于是第一次做Win32 的编程,如果在解释上有错误,欢迎指正!

在创建一个Win32 应用工程后,先在.cpp文件头部声明edit的窗口句柄作为全局变量

HWND editWindow;		//编辑窗口
接着在BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数中创建edit窗口,

 //获取客户区窗口大小参数
   LPRECT rect = (RECT*)malloc(sizeof(RECT));
   GetClientRect(hWnd,rect);
   //创建edit编辑窗口,子窗口,可视,有边框,多行,识别enter为回车,失去焦点后光标不消失
   editWindow = CreateWindow(L"EDIT", nullptr,WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_WANTRETURN | ES_NOHIDESEL
	   , rect->left, rect->top, rect->right, rect->bottom, hWnd, nullptr, nullptr, nullptr);
其中GetClientRech()是用于获取客户区的大小,就是整个窗口除了菜单以上部分的区域(不过使用的时候有一些问题,就是如果最大化主窗口,edit窗口的大小不改变)。关于CreateWindow的参数,依次为窗口的类别、标题、风格(可以参照https://msdn.microsoft.com/en-us/library/aa931018.aspx),窗口左上角的坐标(x,y)、宽度、长度,最后三个参数不知道是什么意思。




接下来就是对edit控件的操作了。Window 编程是“事件驱动,消息控制”,所以对edit窗口的操作必然少不了SendMessage函数,关于SendMessage的参数,首先是窗口句柄,对于edit的操作来说就是传进去上面获取的editWindow,第二个参数是消息,我在使用的时候主要用到了WM_SETFOCUS(窗口取得焦点),EM_SETSEL(设置光标位置,可以用于选择文字)、 WM_GETTEXT(获取edit中的所有文字)、EN_SETFOCUS(具体这个和WM_SETFOCUS有什么区别还不清楚)、EM_REPLACESEL(这个很有用,用于替换光标选择的区域,如果选择末尾位置,可以实现append的效果)。其它参数可以参照https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx#system_defined


在正式的程序执行前,我想要在edit上显示一些提示性的文字,所以在BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数的最后添加了如下代码:

   SendMessage(editWindow, WM_SETFOCUS, 0, 0);		//edit取得焦点
	SetWindowText
(editWindow, L"请先点击创建,创建新的文件,程序会自动执行。执行后请点击保存。 (请删除此行文字!)");
	SendMessage(editWindow, EM_SETSEL, 0, -1);	//选择edit中所有的文字内容
	SetFocus(editWindow);	//edit 获取焦点,可编辑
效果如下:



可以点击delete键删除。

接下来就是正式向edit窗口中写入内容了:

使用SetWindowText可以设置edit中的内容,不过会覆盖掉原有的内容

				SetWindowText(editWindow, L"id\tname\tinputTime\tns\truntimes\r\n");
接下来就是设置光标的位置:

				SendMessage(editWindow, EN_SETFOCUS, 0, 0);	//移动光标位置
				SendMessage(editWindow, EM_SETSEL, -2, -1);	//选择末尾,以共以后替换光标内容
首先将光标移动至末尾(0,0 就是上一次的位置),-2,-1 有点像python数组切片的那种表示位置的方法。

如果向edit文本最后添加文字还是要使用SendMessage,使用LPARAM中附加的消息替换掉光标选择的部分。注意传入的参数需要是宽字符型(因为VS2017使用的是Unicode),可以使用LPWSTR 指向一个字符串,传参数的时候强制转换一下;如果传入的是数值型的,可以使用wsprintf,先将数值格式化输出到一个字符指针或字符数组,之后再使用SendMessage。使用方法如下:

					LPWSTR id_str = (WCHAR*)malloc(sizeof(WCHAR) * 5);
					wsprintf(id_str, L"%d\t", count + 1);	//写入id值
					SendMessage(editWindow, EM_REPLACESEL, true, (LPARAM)id_str);	//向edit 窗口发送消息,
//替换当前光标选中的内容

参考:

https://baike.baidu.com/item/GetClientRect/5130998?fr=aladdin

http://winapi.freetechsecrets.com/win32/WIN32SetWindowText.htm

http://www.cppblog.com/yishanhante/articles/19545.html

http://www.cnblogs.com/KeenLeung/archive/2012/04/13/2445054.html

http://blog.youkuaiyun.com/dailongjian2008/article/details/50548303





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值