windows程序设计笔记(8)
子窗口
使用GetParent()可以获得父窗口的窗口句柄.然后SendMessage与父窗口通信,自定义窗口消息>=WM_USER
Windows系统预定义了一系列控件(子窗口),在CreateWindow时指定WS_CHILD的window style,及设置父窗口句柄.指定子窗口ID时应强制转换为HMENU类型
1.按钮控件 (10个按钮风格) button
WM_COMMAND消息由父窗口捕获,wParam低字为子窗口ID,高字为通知码,lParam子窗口句柄
具有BS_GROUPBOX的按钮,既不处理鼠标输入也不处理键盘输入也不向父窗口发送WM_COMMAND消息
其中BS_OWNERDRAW风格是需要程序来绘制.父窗口需要响应WM_DRAWITEM消息,从lParam参数(一个指向DRAWITEMSTRCUT结构的指针)中获取绘制信息进行处理,是在父窗口的窗口过程处理.
该消息的wParam参数为需要绘制的子窗口ID
按钮外观设计最佳方案:
1.按钮的高度:文本字符高度的7/4倍
2.按钮的宽度:文本字符总宽度再加上至少2个字符的宽度
子窗口显示的文本SetWindowText, GetWindowText,可以通过GetWindowTextLength(hwnd)获得窗口的文本长度
窗口可见ShowWindow IsWindowVisible 窗口启用EnableWindow IsWindowEnabled
WM_CTLCOLORBTN wParam按钮的设备描述表句柄 lParam按钮的窗口句柄, 按钮在即将绘制客户区时,会向父窗口发送该消息.父窗口可以捕获该消息并设置按钮颜色
(1).SetTextColor为按钮文本设置颜色
(2).SetBkColor为文本背景设置颜色
(3).将一个画刷句柄返回给子窗口* //子窗口会使用该画刷进行着色背景.在不需要使用时应清除该画刷
2.静态文本控件 static
既不接收鼠标或键盘的输入也不向父窗口发送WM_COMMAND消息,在捕获WM_CTLCOLORSTATIC消息时,可以通过SetTextColor改变文本颜色,SetBkColor改变背景颜色
文本对齐风格SS_LEFT SS_CENTER SS_RIGHT
3.滚动条控件 scrollbar
风格SB_HORZ,SB_VERT
其不向父窗口发送WM_COMMAND消息,发送WM_VSCROLL和WM_HSCROLL.在处理滚动条消息时区分窗口滚动条与滚动条控件的方法:lParam==0为窗口滚动条,非0为滚动条控件的窗口句柄
窗口风格标识符SBS_LEFTALIGN SBS_RIGHTALIGN SBS_TOPALIGN SBS_BOTTOMALIGN给出滚动条的标准尺寸,但是这些风格只在对话框中对滚动条有效
4.编辑文本控件 edit
窗口风格ES_xxxxx,控件通知WM_COMMAND消息的参数与按钮控件的含义相同(wParam低字为子窗口ID,高字为通知码,lParam子窗口句柄) 通知码格式EN_xxxx
5.列表框控件 listbox
创建时,默认不向父窗口发送WM_COMMAND消息,所以通常包含LBS_NOTIFY. Windows头文件定义了一个LBS_STANDARD的风格, (LBS_NOTIFY|LBS_SORT|WS_VSCROLL|WS_BORDER)
相关的消息LB_xxxxx,常用LB_ADDSTRING, LB_INSERTSTRING, LB_DELETESTRING, LB_RESETCONTENT, LB_GETCOUNT, LB_SETCURSEL/LB_GETCURSEL, LB_SELECTSTRING,LB_GETTEXTLEN,
LB_GETTEXT
控件通知WM_COMMAND消息的参数与按钮控件的含义相同(wParam低字为子窗口ID,高字为通知码,lParam子窗口句柄)通知码格式LBN_xxxx
窗口子类化:调用SetWindowLong(hwnd,GWL_WNDPROC,WNDPROC)给窗口设置一个新的窗口过程,可以给现存的窗口过程设置"钩子",以便在自己的程序中处理一些消息,同时将其他消息传给旧的窗口过程CallWindowProc