吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 679|回复: 2
收起左侧

[学习记录] Win32 API 控件库 -- Button

[复制链接]
zeroandnull 发表于 2026-5-31 17:23

Win32 API 控件库 -- Button

创建方法:① 使用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。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zakang 发表于 2026-6-1 06:19
C/C++的窗体应用程序写的也太麻烦了,不像我C# winform,拖拖拽拽,就搞定了
E式丶男孩 发表于 2026-6-1 10:05
看起来像是把文档搬过来了,这东西学了以后还是觉得新出来的东西好用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-17 10:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表