Windows按钮类

子窗口可以向父窗口发送消息:首先调用hwndParent=GetParent(hwndchild)获取父窗口句柄
再调用函数SendMessage(hwndParent,message,wParam,lParam);
给父窗口发送消息

标准子窗口控件:按钮(button),复选框(check box),编辑框(edit box), 列表框(list box),组合框(combo box),文本字符串(text string) 和滚动条(scroll bar)。这些可以直接用CreateWindow函数创建,并捕获WM_COMMMAND就可以用。其他的一切都由Windows承担.

在使用预定义控件时,不需要注册相应子窗口的类。在调用CreateWindow函数时直接使用该名称作为窗口参数

1.按钮类

这个类的名称都是“button”,对应有10种不同的风格

     BS_PUSHBUTTON       
     BS_DEFPUSHBUTTON 
     BS_CHECKBOX     
     BS_AUTOCHECKBOX  
     BS_RADIOBUTTON     
     BS_3STATE         
     BS_AUTO3STATE    
     BS_GROUPBOX     
     BS_AUTORADIOBUTTON
     BS_OWNERDRAW      

一般按钮的窗口样式包括WS_CHILD、WS_VISIBLE、和上面10种中的一种

//返回一个32位的值
//其中低位是字符宽度(x),高位是字符高度(y)
LONG GetDialogBaseUnits(void);

x=LOWORD(GetDialogBaseUnits());
y=HIWORD(GetDialogBaseUnits());

LOWORD(wParam) 控件ID
HIWORD(wParam) 通知码
lParam 子窗口句柄

//创建一个按钮
CreateWindow(L"button", L"BS_PUSHBUTTON", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 200, 100, hwnd, NULL, hInst, NULL);

其中的hInst可以是全局变量,也可以用((LPCREATESTRUCT)lParam)->hInstance这个来获取程序实例句柄还可以用(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE)。

/*
 * 按钮通知码
 */
#define BN_CLICKED          0
#define BN_PAINT            1
#define BN_HILITE           2
#define BN_UNHILITE         3
#define BN_DISABLE          4
#define BN_DOUBLECLICKED    5
#if(WINVER >= 0x0400)
#define BN_PUSHED           BN_HILITE
#define BN_UNPUSHED         BN_UNHILITE
#define BN_DBLCLK           BN_DOUBLECLICKED
#define BN_SETFOCUS         6
#define BN_KILLFOCUS        7
#endif /* WINVER >= 0x0400 */

/*
 * 按钮控件消息
 */
#define BM_GETCHECK        0x00F0
#define BM_SETCHECK        0x00F1
#define BM_GETSTATE        0x00F2
#define BM_SETSTATE        0x00F3
#define BM_SETSTYLE        0x00F4
#if(WINVER >= 0x0400)
#define BM_CLICK           0x00F5
#define BM_GETIMAGE        0x00F6
#define BM_SETIMAGE        0x00F7
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define BM_SETDONTCLICK    0x00F8
#endif /* WINVER >= 0x0600 */

#if(WINVER >= 0x0400)
#define BST_UNCHECKED      0x0000
#define BST_CHECKED        0x0001
#define BST_INDETERMINATE  0x0002
#define BST_PUSHED         0x0004
#define BST_FOCUS          0x0008
#endif /* WINVER >= 0x0400 */

例如:

case WM_CREATE:

        CreateWindow(L"button", L"BS_PUSHBUTTON", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 200, 100, hwnd, NULL, hInst, NULL);

        return 0;
    case WM_COMMAND:

        switch (HIWORD(wParam))
        {
        case BN_CLICKED:

            MessageBox(NULL, L"按钮被点击了", L"", 0);
            break;
        default:
            break;
        }

获取子窗口ID:id=GetWindowLong(hwndchild,GWL_ID);
或者 id=GetDlgCtrlID(hwndchild);

知道子窗口ID和父窗口句柄后,可以得到子窗口的句柄:hwndchild=GetDlgItem(hwndParent,id);

发送一个WM_SETSTATE消息,可以模拟按键按钮的状态变化
比如下面的语句可以使按钮看上去像被按住一样
SendMessage(hwndButton,BM_SETSTATE,1,0);

//松开
SnedMessage(hwndButton,BM_SETSTATE,0,0);

复选框:

wParam参数设置为1会创建一个选中标记,设置为0则清除标记。
可以像控件发送BM_GETCHECK消息来获取复选框当前的被选择状态

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

切换选中标记

  SendMessage((HWND)lParam,BM_SETCHECK,(WPARAM)!SendMessage((HWND)lParam,BM_GETCHECK,0,0),0);

单选按钮:

单击一次选中,第二次单击不会改变其状态,只能通过发送消息使其状态改变
例如:
选中 :SendMessage(hwndButton,BM_SETCHECK,1,0);
取消选中:SendMessage(hwndButton,BM_SERCHECK,0,0);

改变按钮文本:

//要改变文本的窗口句柄,可以是任何窗口

BOOL SetWindowText
( 
  HWND hWnd,   //窗口句柄
  LPCTSTR lpString  //字符串
); 

SetWindowText(hwnd,pszString);

//获取一个窗口的当前文本
int GetWindowText(
HWND hWnd, //窗口句柄
LPTSTR lpString, //存放获取的缓冲区
int nMaxCount //最大字符数
);
iLength=GetWindowText(hwnd,pszBuffer,iMaxLength);

//获取一个窗口的文本长度

iLength=GetWindowTextLength(hwnd);

启用或禁用窗口:

隐藏窗口:ShowWindow(hwndchild,SW_HIDE);

判断窗口是否可见:IsWindowVisible(hwndchild);

禁用子窗口:EnableWindow(hwndchild,FALSE);

重新启用子窗口:EnableWindow(hwndchild,TRUE);

你可能感兴趣的:(学习笔记)