创建方法:① 使用BUTTON类,② CreateWindow,③ CreateWindowEx函数创建。
使用BUTTON类(示例)
类定义:button.h
#pragma once
// 简单的文本或图像按钮
class Button : public Control
{
public:
HRESULT CreateText(HWND hParent, const TCHAR *szCaption, int nID, const Rect& rcBound);
HRESULT CreateBitmap(HWND hParent, int nImgID, int nID, const Rect& rcBound);
BOOL SetImage(WORD nImgId);
void SetCheck(int nCheck)
{
SendMessage(BM_SETCHECK, (WPARAM)nCheck, 0L);
}
BOOL IsChecked()
{
return SendMessage(BM_GETCHECK, 0, 0 ) == BST_CHECKED;
}
};
实现:button.cpp
HRESULT Button::CreateText(HWND hParent, const TCHAR *szCaption, int nID,
const Rect& rcBound)
{
CREATESTRUCT create;
ZeroMemory(&create, sizeof(CREATESTRUCT));
create.x = rcBound.left;
create.y = rcBound.top;
create.cx = rcBound.right - create.x;
create.cy = rcBound.bottom - create.y;
create.hwndParent = hParent; //父组件
create.lpszName = szCaption; //按钮标题
create.hMenu = (HMENU)(INT_PTR)nID; //ID
create.lpszClass = TEXT("BUTTON"); //类名
create.style = BS_PUSHBUTTON | BS_FLAT; //按钮样式
return Control::Create(create);
}
CreateWindow函数:
在窗口消息(WM_CREATE)响应的回调函数中使用
HWND hBtn = CreateWindow(L"button", L"推送按钮", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_FLAT ,30, 30, 80, 30, hwnd,
(HMENU)1000,//控件ID
pcs->hInstance, NULL);
CreateWindowEx函数:
增加扩展窗口样式(外观及功能等,如接受拖放等)
m_hwnd = CreateWindowEx(
dwExStyle, ClassName(), lpWindowName, dwStyle, x, y,
nWidth, nHeight, hWndParent, hMenu, GetModuleHandle(NULL), this
);
//例
hBtn = CreateWindowEx(0, TEXT("Button"), TEXT("按钮"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_NOTIFY | WS_TABSTOP, 20, 10,
150, 25, hwnd, (HMENU)(1001),
((LPCREATESTRUCT)lParam)->hInstance, NULL);
按钮样式
类型
BS_PUSHBUTTON 普通按钮(或按下)
BS_CHECKBOX 复选框
BS_GROUPBOX 分组框
BS_RADIOBUTTON 单选按钮
BS_3STATE 三态复选框
BS_OWNERDRAW 自绘制
BS_COMMANDLINK 命令链接按钮
BS_SPLITBUTTON 拆分按钮
BS_AUTO3STATE BS_AUTOCHECKBOX BS_AUTORADIOBUTTON
BS_DEFCOMMANDLINK BS_DEFPUSHBUTTON BS_DEFSPLITBUTTON
外观
BS_BITMAP 位图
BS_ICON 图标
BS_TEXT 文本
BS_FLAT 平面(不具有阴影)
BS_PUSHLIKE 类PUSH按钮
BS_MULTILINE 文本分行
对齐
BS_LEFT、BS_RIGHT、BS_TOP、BS_BOTTOM
BS_CENTER
BS_VCENTER
功能行为
BS_NOTIFY 通知 BN_KILLFOCUS,BN_SETFOCUS
其它
待更新……
窗口样式
WS_CHILD 子窗口
WS_VISIBLE 可视
WS_BORDER 细线边框
WS_HSCROLL 水平滚动条
WS_VSCROLL 垂直滚动条
……
扩展窗口样式
WS_EX_ACCEPTFILES
WS_EX_CLIENTEDGE
WS_EX_WINDOWEDGE
……
要全面掌握控件使用,还需了解以下内容:
按钮状态:焦点状态,推送状态,检查状态。
功能函数:CheckDlgButton,CheckRadioButton,IsdlgButtonChecked
按钮宏:Button_Enable,Button_GetCheck,Button_GetState,Button_SetCheck ……
按钮消息:BCM_GETNOTE,BM_CLICK,BM_SETSTYLE ……
按钮通知:BN_CLICKED,BN_DBLCLK,BN_DISABLE ……
按钮结构:BUTTON_IMAGELIST, BUTTON_SPLITINFO, NMBCDROPDOWN, NMBCHOTITEM
一个简单响应的片断(WM_COMMAND):
if (id == 1000 && code == BN_CLICKED)
{
MessageBox(hwnd, L"普通按钮被单击!", L"提示",MB_OK);
}
内容繁多,无法详尽,谨以抛砖引玉,详细参照 Microsoft 的 learn。