【问题标题】:Removing icon from Windows title bars without ditching close button or system menu?从 Windows 标题栏中删除图标而不放弃关闭按钮或系统菜单?
【发布时间】:2010-09-05 19:41:49
【问题描述】:

我正在开发一个 MFC 应用程序,并且我最近一直在寻找一种从 Windows 标题栏中删除图标但保留关闭按钮的好方法。两个明显的候选解决方案是关闭系统菜单样式或使用工具窗口样式,但我不希望禁用系统菜单或使用缩小的工具窗口标题栏。许多 MFC 应用程序都具有此功能,所以我想知道:我是否缺少执行此操作的一些标准方法?

【问题讨论】:

    标签: c++ windows user-interface mfc


    【解决方案1】:

    如何摆脱系统菜单,然后将其放回您自己的另一个地方(比如关闭按钮旁边等)?

    【讨论】:

      【解决方案2】:

      没有图标,我能想象的用户访问系统菜单的唯一方法是通过右键单击标题栏。

      如果这是您的想法,您可以在主框架上处理 WM_RBUTTONDOWN,然后计算右键单击是否在标题栏上。

      int clickX = GET_X_LPARAM(lParam);
      int clickY = GET_Y_LPARAM(lParam);
      
      CRect frameRect;
      mainFrame.GetWindowRect(&frameRect);
      
      int titleBarHeight = GetSystemMetrics(SM_CYCAPTION);
      
      if (clickX >= frameRect.left &&
          clickX <= frameRect.right &&
          clickY >= frameRect.top &&
          clickY <= frameRect.top + titleBarHeight)
      {
         TrackPopupMenu(m_systemMenu);
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用WM_NCRBUTTONDOWN 来检测用户是否右键单击您的标题,然后调出系统菜单。

        【讨论】:

          【解决方案4】:

          设置WS_EX_DLGMODALFRAME扩展样式。

          【讨论】:

          • 这应该是答案。
          【解决方案5】:

          您可以使用完全透明的图标。

          【讨论】:

            【解决方案6】:

            Delphi 中删除图标的示例代码:

            const
              WM_ResetIcon = WM_APP - 1;
            
            type
              TForm1 = class(TForm)
                procedure FormShow(Sender: TObject);
              protected
                procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon;
              end;
            
            implementation
            
            procedure TForm1.FormShow(Sender: TObject);
            begin
              PostMessage(Handle, WM_ResetIcon, 0, 0);
            end;
            
            procedure TForm1.WMResetIcon(var Message: TMessage);
            const
              ICON_SMALL = 0;
              ICON_BIG   = 1;
            begin
              DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0));
              DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0));
            end;
            

            类似的代码应该适用于 MFC。基本上,您只需要将 WM_SETICON 设置为 NULL 在正确的位置。

            【讨论】:

              猜你喜欢
              • 2010-10-25
              • 2012-02-19
              • 1970-01-01
              • 1970-01-01
              • 2010-12-17
              • 1970-01-01
              • 1970-01-01
              • 2021-01-25
              • 2018-09-10
              相关资源
              最近更新 更多