【问题标题】:Hiding a control in Windows在 Windows 中隐藏控件
【发布时间】:2011-09-10 16:02:50
【问题描述】:

我不知道如何隐藏子窗口(控件),更具体地说是 GroupBox 和 PushButton。我认为带有 SW_HIDE 作为第二个参数的 ShowWindow() 可以完成这项工作,但它根本不起作用。然而 SW_SHOW 工作得很好。我对这两个控件都有正确的窗口句柄,所以这不是问题。

我用谷歌搜索,我只能找到人们询问如何隐藏对话框,而不是控件。该应用程序或基于 MFC 的应用程序在此处不适用。 我使用的是纯 Windows API,没有 MFC

我做错了什么?

编辑:更多信息:我正在为 WinApi 控件编写一些简单的类包装器。除了其他方法,WindowsControl 类还具有以下用于显示和隐藏控件的方法:

void Show() {
    ShowWindow(this->_hWnd,SW_SHOWNOACTIVATE);
}

void Hide() {
    ShowWindow(this->_hWnd,SW_HIDE);
}

每个控件都继承自 WindowsControl。

这张图片有窗口布局,所以你明白我在做什么:http://i.stack.imgur.com/PHQnH.png

当用户在“Chipset”静态控件内单击时,它将加载给定 Tile 的信息(存储在数组中,但这无关紧要)。根据设置,它将隐藏左侧的“编辑位墙”按钮并在其后面显示空的 GroupBox,反之亦然。 只是要清楚这不是我的 windows api 包装器有问题,我得到了正确的 HWND。尽管可能无法从不是父级的窗口过程调用 ShowWindow(这很奇怪)。

EDIT2:在 Visual Studio 2008 中使用 C++,没有 MFC,没有 WTL,没有 CLR,没有 .NET

EDIT3:我会发布更多代码,这样会更容易

在静态的窗口过程中,我这样处理 WN_LBUTTONDOWN:

case WM_LBUTTONDOWN: {
  ...
  update_tiledata(c, l)


void update_tiledata(GroupBox * c, ListView* l ) {
    ...

   if (chp_copy.Tiles[selectedTile].Pass() == PT_BITWALL) {
          c->Controls(CTL_BTNEDITBIT)->Show();
          c->Controls(CTL_FRPHOLD)->Hide();
   } else {

          c->Controls(CTL_FRPHOLD)->Show();
          c->Controls(CTL_BTNEDITBIT)->Hide();
   }
   update_edits();
}

省略的代码不会影响类,正如我之前所说,使用正确的 HWND 调用带有 SW_HIDE 的 ShowWindow,但没有发生任何事情。

【问题讨论】:

  • 我能问一下你想达到什么目标,因为可能有更好的解决方案!
  • 您能发布您的代码吗?

标签: windows winapi controls hide showwindow


【解决方案1】:

可以使用隐藏窗口或对话框中的控件

ShowWindow(hControlWin, SW_HIDE);

在对话框中,您可以通过调用来检索控件窗口句柄

GetDlgItem(hDlg, );

通常你会这样写:

ShowWindow(GetDlgItem(hDlg, 2), SW_HIDE);

如果您提供更多信息和一些代码会很有帮助:您是如何创建控件的?您使用什么语言、编译器和框架?

【讨论】:

  • 你的代码中的 this->_hWnd 是什么?这是控件的 hwnd 还是其父窗口的 hwnd?您是否尝试过 SW_SHOW 而不是 SW_SHOWNOACTIVATE?
  • _hWnd 是控件的 HWND。父母的也在班级中作为_parent。另外,我第一次尝试使用 SW_SHOW 但没有成功,所以我切换到 SW_SHOWNOACTIVATE。
  • 据我所知,您拨打的电话本身是正确的 - 它们用于所有 Windows 应用程序。所以肯定是其他地方有问题。你必须调试它。
  • 如果我调整主窗口的大小,按钮将被隐藏。这有帮助吗?
  • 只是补充一下:我刚刚将按钮的父窗口设为主窗口,现在 SW_HIDE 确实可以工作,所以这似乎是 GroupBoxes 的问题。
【解决方案2】:

我认为你想要的函数调用是EnableWindow 我以前用它来禁用表单上的按钮。不过,您需要先获取 Window(对象)的句柄,因此您可能希望使用 EnumChildWindows 遍历所有控件以找到所需的控件。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多