如何在运行时创建控件?

发布于 2024-08-19 22:37:14 字数 33 浏览 3 评论 0原文

如何创建动态MFC控件并在运行时处理控件的消息映射?

How to create dynamic MFC controls and handle message maps of the controls at runtime?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长亭外,古道边 2024-08-26 22:37:14

这实际上取决于您想要创建哪些控件,特别是如果您想知道应该设置哪些标志。一般来说,它可以归结为:

通常使用 CreateCreateEx 创建 CWnd 派生控件。例如,对于 CButton:

CButton button;
button.Create("Button text", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | DT_CENTER, CRect(5, 5, 55, 19), this, nID);

其中 CRect 指定按钮位置,this 是指向父窗口的指针,nID 是控件ID。

如果控件未按预期显示,可能是因为缺少某些标志。我建议您在设计模式下绘制一个示例控件,在 RC 文件中检查该控件的代码,并将标志复制到 Create 调用方。

至于消息映射,它们通常被路由到父窗口。您在Create 中使用的nID 值在这里很重要,因为它将是标识消息映射中的控件的数字。如果您有固定数量的控件,则可以对控件的 nID 编号进行硬编码(例如,从 10000 开始);如果没有,您必须为父窗口提供一种识别它们的方法。然后您只需添加消息映射条目即可。

ON_BN_CLICKED(10000, OnBnClicked)
ON_CONTROL_RANGE(BN_CLICKED, 10010, 10020, OnBtnsClicked)

您可以使用 ON_CONTROL_RANGE 消息映射将一系列 ID 映射到同一函数。

It really depends on which controls do you want to create, especially if you want to know which flags should you set. In general it goes down to this:

Normally a CWnd-derived control is created using Create or CreateEx. For a CButton, for instance:

CButton button;
button.Create("Button text", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | DT_CENTER, CRect(5, 5, 55, 19), this, nID);

where the CRect specifies the button position, this is a pointer to the parent window, and nID is the control ID.

If the control doesn't come out as expected, it's probably because some flags are missing. I suggest you draw a sample control in design mode, check out the code for that control in the RC file, and copy the flags to the Create caller.

As for the message maps, they are normally routed to the parent window. The nID value you used in Create is important here, because it will be the number that identifies the control in the message map. If you have a fixed number of controls, you can hard-code the nID numbers for your controls (starting at 10000, for instance); if not, you'll have to provide a way for the parent window to identify them. Then you just add the message map entries.

ON_BN_CLICKED(10000, OnBnClicked)
ON_CONTROL_RANGE(BN_CLICKED, 10010, 10020, OnBtnsClicked)

You can use the ON_CONTROL_RANGE message map to map a range of IDs to the same function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文