MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠

164 篇文章 11 订阅

请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图?

我想到的是:

JavaScript code?

1

2

3

4

5

6

7

8

9

10

11

12

13

HWND hwndButtonWindow = ::CreateWindowEx(

        WS_EX_TRANSPARENT,        //拓展样式-穿透,使其上的点击等消息发送至其后的主窗口

        wndclass.lpszClassName,    //使用的窗口类名称

        L"button",                //窗口标题

        WS_POPUP | WS_CHILD,        //样式-弹出窗口(无标题栏)

        400,                        //x,该位置在主窗口上

        430,                        //y

        50,                        //w,按钮的宽

        30,                        //h,按钮的高

        hwnd,                    //父窗口句柄

        NULL,                    //菜单

        hInstance,                //程序实例句柄

        NULL);                    //用户数据


然后设置它随主窗口(hwnd)一起移动

 

引用 5 楼 smwhotjay 的回复:

控件就是控件,了解下win32 sdk编程 就知道了


好的,我看了一下Win32编程,上面说botton控件就是一个子窗口,在User32.dll加载时就已经注册好这个窗口类了,所以只要用“button”这个类名创建窗口就行了,当该窗口被点击时会向父窗口发送WM_COMMAND消息,其中LOWORD(wParam)指定了该子窗口(控件)的ID,lParam指定了该子窗口的句柄,而其上显示的文字其实是它的“标题”
应该就是这样:

C/C++ code?

1

2

3

4

5

6

7

8

9

10

11

12

13

::CreateWindowEx(

    0,                                                   //拓展样式:无

    "button",                                                     //窗口类:button

    "Start",                                                    //按钮显示文字:Start

    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,     //WS是窗口样式,BS是按钮样式

    50,                                                    //窗口(按钮)的位置和尺寸

    50,

    80,

    30,

    hwnd,                                                   //父窗口句柄

    (HMENU)IDC_BUTTON,                                                   //系统菜单

    hInstance,                                                    //程序实例句柄

    NULL);


感谢这位前辈提供线索

 

一般 控件 都是 窗口 (hWnd), 无窗口的 叫 wndless, 是 直接绘制到 屏幕上的 。(DirectDraw)


言简意赅

 

MFC(Microsoft Foundation Classes),通常你会通过创建一个事件响应函数来处理按钮点击事件。以下是一个简单的步骤: 1. 首先,你需要在`OnInitDialog`函数按钮控件关联到一个消息映射上,例如处理`BN_CLICKED`事件: ```cpp afx_msg void OnInitDialog() { // 初始化对话框... CButton* pButton = GetDlgItem(IDC_YOUR_BUTTON_ID); // 替换为你实际的按钮ID if (pButton) { pButton->ConnectNotify(WM_COMMAND, NULL, IDC_YOUR_BUTTON_ID, OnButtonClick); } } afx_msg LRESULT OnButtonClick(UINT nIDCtrl, UINT nCode, HWND hWndCtrl, BOOL& bHandled) { // 点击事件处理 bHandled = TRUE; // 在这里编写你的计算逻辑,并获取结果 int result = CalculateYourValue(); } ``` 2. 在`OnButtonClick`函数,你可以编写你的计算逻辑,比如计算两个数的加法,然后使用`CWnd::CreateWindow`或者`CDialogEx`等方法创建一个新的窗口来显示结果。例如: ```cpp int CalculateYourValue() { // 这里是你的计算代码... int a = 5, b = 10; // 示例数据 int result = a + b; // 创建新的对话框 CDialog dlg(IDD_DIALOG结果显示); // IDD_DIALOG结果显示是你新建的对话框资源ID if (dlg.DoModal() == IDOK) // 如果用户关闭了对话框,则返回 { // 在新窗口显示结果 CString strResult = "计算结果: " + Format(_T("%d"), result); dlg.SetDlgItemText(IDC结果显示, strResult); // IDC结果显示是对话框的文本框ID } return result; } ``` 3. 最后,记得在头文件包含必要的对话框类声明,并在项目的资源编辑器添加一个新的对话框资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值