【问题标题】:Minimize button won't appear on MFC Dialog最小化按钮不会出现在 MFC 对话框上
【发布时间】:2020-04-17 19:48:33
【问题描述】:

我在将最小化按钮添加到我的 MFC 对话框应用程序时遇到问题。我已启用最小化框 (true)。

最小化按钮出现在设计器视图中,但是当我运行应用程序时,按钮不可见。

其他设置有: 风格:重叠
应用程序窗口:True
边框:对话框框
工具窗口:错误
系统菜单:是的

我尝试添加: ModifyStyle(0, WS_MINIMIZEBOX, TRUE);

OnInitDialog() 但还没有解决。

我可以选择 3 种样式,分别是弹出式、子级和重叠式。如果我使用弹出窗口,我看不到标题栏,也无法拖动窗口。如果我使用该样式,Child 会引发访问冲突,因此我可以选择的唯一样式是重叠的,它显示标题栏并允许我拖动窗口,但最小化按钮不可见。

我正在使用 Visual Studio 2019 并运行 Windows 10 1809。

我已经仔细检查并将最小化框设置为 TRUE,但是在运行时它仍然不会显示在对话框中。

问题是当我使用弹出窗口样式时,我根本看不到标题栏!此外,如果我使用弹出式样式,我将无法拖动窗口(缺少标题栏)。重叠似乎是我可以使用的唯一样式。

【问题讨论】:

  • 我只有 3 个选项:弹出式、子级或重叠式。我尝试了所有三种不同的样式,但没有一个有按钮。你能给我一个提示,我将在哪里设置 WS_MINIMIZEBOX 样式?谢谢。
  • 在资源编辑器中,选择主对话框,然后在“属性”窗口中滚动找到“最小化框”属性并将其设置为“真”。而且,通常,对话框是一个“弹出”窗口。
  • 问题是当我使用弹出窗口时,我根本看不到标题栏!
  • 它是基于对话框的应用程序还是在应用程序内部激活的对话框?
  • @IInspectable,究竟什么是不需要的?我上面的建议是添加一些样式。这解决了 OP 的问题,无论他在哪里添加它们。

标签: c++ mfc


【解决方案1】:

MFC 与在没有任何框架的情况下编写对话框没有什么不同。您声明一个DIALOGEX 资源,并让系统加载它,并根据该模板显示一个对话框。

要获得带有最小化框的对话框,它至少需要样式 WS_MINIMIZEBOXWS_SYSMENU1。打开定义DIALOGEX 对话框模板的.rc 脚本,并确保STYLE 元素中存在这两种样式。

基于对话框的应用程序(带有最小化框)的默认对话框模板通常定义如下:

IDD_MFCAPPLICATION1_DIALOG DIALOGEX  0, 0, 320, 200
STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION
 | WS_THICKFRAME
 | WS_SYSMENU
 | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION ""
FONT 8, "MS Shell Dlg"
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,209,179,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14
    CTEXT           "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8
END

您无需编写在运行时执行的任何代码即可获得此行为。


1来自Window Styles: "WS_MINIMIZEBOX: 窗口有一个最小化按钮。[...] WS_SYSMENU 样式也必须被指定。"

【讨论】:

    【解决方案2】:

    试试这样的:

    BOOL CMFCApplication1Dlg::OnInitDialog()
    {
        ModifyStyle(0, WS_POPUP | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, TRUE);
        ...
    }
    

    考虑修改您的对话框模板(在 .RC 文件中)以包含必要的样式位,而不是在运行时修改样式。

    【讨论】:

      【解决方案3】:
      BOOL CMFCApplication1Dlg::OnInitDialog(){
      
      ModifyStyle(0, WS_MINIMIZEBOX, TRUE);
      ModifyStyle(0, WS_POPUP, TRUE);
      ModifyStyle(0, WS_BORDER, TRUE);
      ModifyStyle(0, WS_SYSMENU, TRUE);
      ModifyStyle(0, WS_CAPTION, TRUE);
      

      【讨论】:

      • 不鼓励仅使用代码回答。请添加一些解释,说明这如何解决问题,或者这与现有答案有何不同。 From Review
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2011-01-06
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多