在Windows中隐藏控件

时间:2011-06-08 07:49:54

标签: windows winapi controls hide showwindow

我无法弄清楚如何隐藏子窗口(控件),更具体地说是GroupBox和PushButton。我认为 ShowWindow() SW_HIDE ,因为第二个参数可以完成这项工作,但它根本不起作用。然而 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

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

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();
}

如下所述,ommited代码没有对类进行任何影响,使用正确的HWND调用带有SW_HIDE IS的ShowWindow,但没有任何事情发生。

2 个答案:

答案 0 :(得分:5)

可以使用

隐藏窗口或对话框中的控件
  

ShowWindow(hControlWin,SW_HIDE);

在对话框中,您可以通过调用

来检索控件窗口句柄
  

GetDlgItem(hDlg,< CtrlID>);

通常你写的东西是:

  

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

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

答案 1 :(得分:1)

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