第9章 子窗口控件

本文介绍如何在Windows应用程序中创建多种类型的控件,包括按钮、静态文本、滚动条、编辑框及列表框等,并详细说明了这些控件的创建方法及特性,特别是自绘按钮的过程原则。


1、创建按钮控件

::CreateWindow(TEXT("button"),
    TEXT("button 1"),
    WS_CHILD|WS_VISIBLE|(BS_PUSHBUTTON +i),
    20,20+i*20,100,20,
    hWnd,
    NULL,
    ((LPCREATESTRUCT)lParam)->hInstance,
    NULL);

响应过程

		case WM_COMMAND:
		wmId    = LOWORD(wParam); //子窗口ID
		wmEvent = HIWORD(wParam); //通知吗:BN_CLICK|BN_PAINT|BN_SETFOCUS|BN_KILLFOCUS....
 

如果响应BN_DBCLIK,需在样式中加入BS_NOTIFY ---本人验证失败

2、对于自绘按钮的自绘过程原则

1~Windows会为你获得设备环境,并保存在DRAWITEMSTRUCT结构的一个字段中,必须原样保持这个设备环境的状态。

2~任何被选入该设备环境的GDI对象,必须设置回原来不被选中状态。

3~在自绘的窗口过程中,不能再按钮的区域以外绘制任何图形

3、静态类

::CreateWindow(TEXT("static"), 
			TEXT("SS_GRAYRECT "), 
			WS_CHILD|WS_VISIBLE,
			350,40,100,20,
			hWnd,
			NULL,
			((LPCREATESTRUCT)lParam)->hInstance,
			NULL);


静态类非常良好,不接受鼠标或键盘的输入,液不会向其父窗口发送WM_COMMAND消息。当你在一个静态自控上移动或者单击鼠标时,子窗口会俘获WM_NCHITTST消息,并向窗口返回HTTRANSPARENT值。这导致Windows向其底层窗口(通常是父窗口)发送相同的WM_NCHITTST消息。父窗口通常将该消息传给DefWindowProc,在哪里它会被转换成客户区鼠标消息。

4、滚动条类

::CreateWindow(TEXT("scrollbar"), 
			TEXT("SS_GRAYRECT "), 
			WS_CHILD|WS_VISIBLE|WS_TABSTOP | SBS_VERT,
			350,40,20,300,
			hWnd,
			NULL,
			((LPCREATESTRUCT)lParam)->hInstance,
			NULL);


它与带滚动条的窗口(其样式WS_VSCROLL WS_HSCROLL)不一样,它是窗口的一个子控件;但是他们有相同之处,都是发送WM_VSCROLL、WM_HSCROLL消息,使用lParam参数区别窗口滚动条和滚动条控件。

它是一个系统已经注册的窗口类,所以它的窗口过程是Windows默认窗口过程,所以必须使用SetWindowLong(hScrollWnd, GWL_WNDPROC,(long)ScrollProc);

5、编辑类

::CreateWindow(TEXT("edit"), 
			TEXT("edit1 "), 
			WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_BORDER|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,
			350,40,200,300,
			hWnd,
			NULL,
			((LPCREATESTRUCT)lParam)->hInstance,
			NULL);


对于单行编辑控件,如果设置了边框,那么它的高度按照一个字的1.5倍进行计算。

***复制文本到缓存区iLength = SendMessage(hEdit,EM_GETLINE, iLine, (LPARAM) szBuffer)

***替换默认的换行功能:SendMessage(hEdit,EM_SETWORDBREAKPROC,0, (LPARAM)EditWordBreakkProc);

6、列表框类

hListBox = ::CreateWindow(TEXT("listbox"), 
			TEXT("listbox1 "), 
			WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER|LBS_NOTIFY|LBS_SORT|WS_SIZEBOX|WS_CAPTION,
			350,40,200,300,
			hWnd,
			NULL,
			((LPCREATESTRUCT)lParam)->hInstance,
			NULL);

 

其中:WS_SIZE允许用户调整尺寸,WS_CAPTION允许用户在父窗口客户区移动它。

使用LBS_SORT的列表控件,插入LB_INSERTSTRING,但是列表的内容不会重新排序。

如果有大量的字符串需要插入和删除,那么必须在操作前抑制重绘,结束后再打开

SendMessage(hListBox,WM_SETREDRAW,FALSE,0);
SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)TEXT("1..............."));
SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)TEXT("2..............."));
//....add lines code
SendMessage(hListBox,WM_SETREDRAW,TRUE,0);


 

 

 


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值