组织 Win32 窗口控件最直接的方法是什么? [已关闭]

问题描述 投票:0回答:2

我目前正在尝试学习Win32 API来开发Windows 10/11的本机GUI程序。这些将用作包含标签、文本框、按钮、下拉菜单和菜单栏的基本工具。我目前正在分别创建类和窗口时围绕所有基本 Win32 对象(例如 ATOM 和 HWND)编写 C++ 包装器。

我已经能够制作一个带有 2 个按钮的基本窗口,这些按钮可以在调整窗口大小时调整大小。展望未来,我希望能够使用水平和垂直布局框自动组织“小部件”(我的抽象类的名称)。根据我的研究,“STATIC”类窗口似乎执行我需要的容器化,甚至可以根据需要对容器进行样式化。

这是我创建的图表,用于显示我尝试实现的窗口和父级层次结构的外观:

我遇到了两个问题:

  1. 如果我将按钮设为框架的子级,则按钮不会继承主父窗口的字体,并且按下时不会传递 WM_COMMAND 消息。
  2. 如果我将按钮设置为窗口的子级,则框架会定期绘制在按钮上。

我更愿意采用第一种方法,但它似乎破坏了 API 的默认功能。最直接、最传统的方法是什么?这个问题不是问图书馆的推荐。

c++ windows winapi
2个回答
0
投票

您必须通过每个单独控件上的

WM_SETFONT
设置所需的字体。控件不继承其父窗口的字体。

WM_COMMAND
(和
WM_NOTIFY
)由子控件发送到其直接父窗口,因此父窗口的
WndProc
需要处理该消息。这意味着如果按钮是框架的子级,则框架需要处理按钮的通知。

由于您正在设计自己的类框架,请考虑让父级

WndProc
将子级生成的消息反射回发送消息的子窗口,以便子级
WndProc
可以处理自己的通知。

如果另一个控件具有相同的父级,并且该框架在 z 顺序上高于该控件,则您的框架可以显示在另一个控件的顶部。


-2
投票

1,按钮不继承主父窗口的字体

您需要发送

WM_SETFONT message
来设置控件在绘制文本时使用的字体。

2、按下时不传递WM_COMMAND消息。

当您单击该按钮时,WM_COMMAND 消息将发送到其父窗口(这里是

Frame
而不是
parent window
)。
WNDPROC
函数是一个回调函数,您可以在应用程序中定义它,用于处理发送到窗口的消息。

3,如果我将按钮设置为窗口的子级,框架会定期绘制在按钮上。

就我而言,您应该将按钮设为

Frame
的子按钮,而不是
Parent Window

根据你的描述,看来你想实现一个多文档界面(MDI)。如果是这样,我建议您可以按照文档:关于多文档界面

© www.soinside.com 2019 - 2024. All rights reserved.