第九章 子窗口控件part1

hwndParent = GetParent(hwnd);子窗口消息处理程序能确定其父窗口的窗口句柄,hwnd是子窗口的窗口句柄.

如果想在您的电子表格程序的某个角落放置一个标有「Recalculate」的按钮,那么您可以通过呼叫CreateWindow来建立这个按钮。。要做的只是拦截WM_COMMAND消息-当按钮被按下时,它通过这一消息通知您的窗口消息处理程序。

9.1按钮类别

子窗口向父窗口发消息:

用鼠标单击按钮时,子窗口控件就向其父窗口发送一个WM_COMMAND消息,拦截WM_COMMAND消息并显示wParam(低位:子窗口ID)(高位:通知码)和(子窗口句柄:lParam的值)

父窗口向子窗口发送消息:

知道ID和父窗口句柄,您就能获得子窗口句柄:hwndChild = GetDlgItem(hwndParent, id);

按键:

用来设计对话框时,BS_PUSHBUTTON控件和BS_DEFPUSHBUTTON控件的作用不同。但是当用作子窗口控件时,两种型态的按钮作用相同,尽管BS_DEFPUSHBUTTON的边框要粗一些。

按下鼠标按键将使按钮用三维阴影重画自己,就好像真的被按下一样。放开鼠标按键时,就恢复按钮的原貌,并向父窗口发送一个WM_COMMAND消息和BN_CLICKED通知码。

SendMessage(hwndButton, BM_SETSTATE, 1, 0);//通过给窗口发送BM_SETSTATE消息来仿真按钮闪动。
SendMessage(hwndButton, BM_SETSTATE, 0, 0);//使按钮恢复正常,hwndButton窗口句柄是从CreateWindow呼叫传回的值。

也可以向按键发送BM_GETSTATE消息,子窗口控件传回按钮目前的状态:如果按钮被按下,则传回TRUE;如果按钮处于正常状态,则传回FALSE。

复选框:

复选框最常用的两种样式是BS_CHECKBOX和BS_AUTOCHECKBOX。

在使用BS_CHECKBOX时,您需要自己向该控件发送BM_SETCHECK消息来设定勾选标记。

SendMessage (hwndButton, BM_SETCHECK, 1, 0) ;

当需要按钮目前的状态时,可以向控件发送BM_GETCHECK消息:iCheck = (int)SendMessage(hwndButton, BM_GETCHECK, 0, 0);

其余两种复选框样式是BS_3STATE和BS_AUTO3STATE,正如它们名字所暗示的,这两种样式能显示第三种状态-复选框内是灰色-它出现在向控件发送wParam等于2的WM_SETCHECK消息时

单选按钮:

当收到来自单选按钮的WM_COMMAND消息时,应该向它发送wParam等于1的BM_SETCHECK消息来显示其选中状态:SendMessage(hwndButton, BM_SETCHECK, 1,  0);

分组方块:

组方块即样式为BS_GROUPBOX的选择框,它是按钮类中的特例,既不处理鼠标输入和键盘输入,也不向其父窗口发送WM_COMMAND消息。分组方块是一个矩形框,分组方块常用来包含其它的按钮控件。

改变按钮文字:

SetWindowText(hwnd, pszString) ;//hwnd是欲改变窗口的句柄,pszString是一个指向以null为终结的字符串指针。

取得窗口目前的文字:

iLength = GetWindowText(hwnd, pszBuffer, iMaxLength);

通过下面的呼叫来获得特定文字的长度:

iLength = GetWindowTextLength(hwnd);

可见的和启用的按钮:

如果在建立子窗口时,您没有将WS_VISIBLE包含在窗口类别中,那么直到呼叫ShowWindow时子窗口才会被显示出来ShowWindow(hwndChild,SW_SHOWNORMAL);如果将WS_VISIBLE包含在窗口类别中,就没有必要呼叫ShowWindow。可以通过下面的呼叫来确定子窗口是否可见:IsWindowVisible(hwndChild);

EnableWindow(hwndChild, FALSE);//使窗口不被启用
EnableWindow(hwndChild, TRUE);//使窗口被启用
IsWindowEnabled(hwndChild);//确定子窗口是否被启用

按钮和输入焦点:

Windows将输入焦点从一个窗口(例如一个父窗口)转换到另一个窗口(例如一个子窗口控件)时,它首先给正在失去输入焦点的窗口发送一个WM_KILLFOCUS消息,wParam参数是接收输入焦点的窗口的句柄。

 

 

9.2控件与颜色

系统颜色:
可以使用GetSysColor和SetSysColors来获得和设定这些系统颜色。

按钮颜色:
COLOR_BTNFACE被用于按键主要的表面颜色,以及其它按钮主要的背景颜色。

wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1) ;//加1目的是防止其值为NULL,而没有任何其它目的。

使用SetTextColor和SetBkColor将文字和文字背景的颜色改变为系统颜色
SetBkColor(hdc, GetSysColor(COLOR_BTNFACE)) ;  
SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)) ;

拥有者绘制按钮:

 

如果您只需要在按钮中显示图标或位图,您可以用BS_ICON或BS_BITMAP样式,并用BM_SETIMAGE消息设定位图。但是,对于BS_OWNERDRAW样式的按钮,它允许完全自由地绘制按钮。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值