子窗口控件 复习

1.建立子视窗:

for (i = 0 ; i < NUM ; i++)

               hwndButton[i] = CreateWindow ( TEXT("button"), 

                                   button[i].szText,

                                   WS_CHILD | WS_VISIBLE | button[i].iStyle,

                                   cxChar, cyChar * (1 + 2 * i),

                                   20 * cxChar, 7 * cyChar / 4,

                                   hwnd, (HMENU) i,

                                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;

代码中指明了建立的按键窗口(按钮)的文字,风格,大小,位置,ID  hInstance 等信息,

并返回了NUM个窗口相对应的按钮句柄,建立窗口后,子窗口的所有信息都由window来维护,完成重绘工作等,当父视窗被销毁时,子视窗随着消失。

2.子视窗向父视窗发送消息:

子视窗向父视窗发送WM_COMMAND消息,

LRESULT CALLBACK WindowProc(

  HWND hwnd,       // handle to window

  WM_COMMAND,      // the message to send

  WPARAM wParam,   // notification code and identifierID

  LPARAM lParam    // handle to control (HWND)  From Function CreateWindow 

)

notification code:

BN_CLICKED

BN_DOUBLECLICKED 

BN_DBLCLK

……

当子视窗(按钮)获得焦点时,所有键盘消息都会被屏蔽,除了sPaseBar 键,

3. 父视窗向子视窗发送消息

BM_GETCHECK 和 BM_SETCHECK 讯息由父视窗发送给子视窗控制项, 以取得或

者设定核取方块和单选按钮的选中标记。

按钮讯息   值

BM_GETCHECK  0x00F0 

BM_SETCHECK  0x00F1 

BM_GETSTATE  0x00F2 

BM_SETSTATE  0x00F3 

BM_SETSTYLE  0x00F4 

BM_CLICK   0x00F5 

BM_GETIMAGE  0x00F6 

BM_SETIMAGE  0x00F7

4.每个子视窗控制项都由唯一的窗口句柄,和ID,知道二者之中的一个便可知道另一个的值。

id = GetWindowLong (hwndChild, GWL_ID) ;

hwndChild = GetDlgItem (hwndParent, id) ;

5.按钮:(PUSHBUTTON

当滑鼠游标在按钮中时,按下滑鼠按键将使按钮用三维阴影重画自己,就好像真的被按下一样。放开滑鼠按键时,就恢复按钮的原貌,并父视窗发送一个 WM_COMMAND 讯息和 BN_CLICKED 通知码。与其他按钮型态相似,当按钮拥有输入焦点时,在文字的周围就有虚线,按下及释放 Spacebar 键与按下及释放滑鼠按键具有相同的效果。

以下的操作将导致按钮被按下:

SendMessage (hwndButton, BM_SETSTATE, 1, 0) ; 

下面的呼叫使按钮恢复正常:

SendMessage (hwndButton, BM_SETSTATE, 0, 0) ;

6.复选框CHECKBOX

核取方块最常用的两种样式是 BS_CHECKBOX 和 BS_AUTOCHECKBOX ,当您需要按钮目前的状态时,可以向控制项发送 BM_GETCHECK 讯息:

iCheck = (int) SendMessage (hwndButton, BM_GETCHECK, 0, 0) ; 

如果该按钮被选中,则 iCheck 的值为 TRUE 或者非零数;如果按钮末被选中,则 iCheck 的值为 FALSE 或 0

7.单选框:(RADIOBUTTON

当您收到来自单选按钮的 WM_COMMAND 讯息时, 应该向它发送 wParam 等於 1

的 BM_SETCHECK 讯息来显示其选中状态:

SendMessage (hwndButton, BM_SETCHECK, 1, 0) ; 

对同组中的其他所有单选按钮,您可以通过向它们发送 wParam 等於 BM_SETCHECK 讯息来显示其未选中状态:

SendMessage (hwndButton, BM_SETCHECK, 0, 0) ;

8.组合框(GROUPBOX

样式为 BS_GROUPBOX  , 用来包含其他的按钮控制项 ,它既不处理 键盘 鼠标消息,也不处理WM_COMMAND消息。

9. 改变按钮文字

您可以通过 SetWindowText 来改变按钮(或者其他任何视窗)内的文字:

SetWindowText (hwnd, pszString) ;

您也可以取得视窗目前的文字:

iLength = GetWindowText (hwnd, pszBuffer, iMaxLength) ; // iMaxLength 指定复制到 pszBuffer 指向的缓冲区中的最大字元数。

10.WM_SETFOCUS&&WM_KILLFOCUS 

Windows 将输入焦点从一个视窗(例如一个父视窗)转换到另一个视窗(例如一个子视窗控制项)时,它首先给正在失去输入焦点的视窗发送一个 WM_KILLFOCUS 讯息, wParam 参数是接收输入焦点的视窗的代号。然後, Windows 正在接收输入焦点的视窗发送一个 WM_SETFOCUS 讯息,同时 wParam 是还在失去输入焦点的视窗的代号(在这两种情况中,wParam值可能为 NULL,它表示没有视窗拥有或者正在接收输入焦点。

通过处理 WM_KILLFOCUS 讯息, 父视窗可以阻止子视窗控制项获得输入焦点。

SetFocushwnd)后就会产生WM_SETFOCUS消息!

case WM_KILLFOCUS : 

if (hwnd == GetParent ((HWND) wParam)) 

SetFocus (hwnd) ; 

return 0 ;

11.SetClassLong( )  && GetClassLong ( ) 

   改变WNDCLASSEX 结构的参数,例如改变窗口类的背景画刷窗口过程WNDPROC

的地址  。。。

SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) 

                    CreateSolidBrush (RGB (color[0], color[1], color[2]))) ;

Value :

GCL_HBRBACKGROUND

GCL_WNDPROC

GCL_HICON...

12.视窗子类别化:

  用GetWIndowLong( ) 函数可以获得 WndProc 的地址,用SetWindowLong( )可以设定新的WndProc地址。它能让您给现存的视窗。讯息处理程式设定「挂勾」,以便在自己的程式中处理一些讯息,同时将其他所有讯息传递给旧的(原来的)视窗讯息处理程式。

代码如下:

OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC, (LONG)  ScrollProc) ;

设定 hwndScroll[i] 窗口过程函数 为 ScrollProc(函数), 的窗口过程函数为 OldScroll[i] ,卷动列控制项是区别于窗口控制项(WndProc) 的过程函数,是卷动列的窗口处理过程!注意区别!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值