Скрытие элемента управления в Windows

Я не могу понять, как скрыть дочернее окно (элемент управления), точнее, 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.

Это изображение имеет макет окна, поэтому вы точно понимаете, что я делаю:

Когда пользователь щелкает внутри статического элемента управления "Набор микросхем", он загружает информацию для данной плитки (которая хранится в массиве, но это не имеет значения). В зависимости от настройки, она будет скрывать кнопку "Edit bitwall" слева и показывать пустой групповой ящик позади нее или наоборот. Just to be clear this isn't something wrong with my windows api wrappers, I am getting the correct HWND. Though ShowWindow might not be able to be called from a Window Procedure that isn't the parent's (that'd be weird).

EDIT2: Using C++ with Visual Studio 2008, no MFC, no WTL, no CLR, no.NET

EDIT3: I'll post even more code so it's easier

Inside the static's window procedure, I handle WN_LBUTTONDOWN like this:

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

The ommited code does nothing to affect the classes, as I said before, ShowWindow with SW_HIDE IS getting called, with the correct HWND, but nothing is happening.

2 ответа

Элемент управления в окне или диалоге может быть скрыт с помощью

ShowWindow(hControlWin, SW_HIDE);

В диалоговом окне вы можете получить дескриптор окна управления, вызвав

GetDlgItem(hDlg, );

Обычно вы пишете что-то вроде:

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

Было бы полезно, если бы вы дали больше информации и немного кода: как вы создали элементы управления? Какой язык, компиляцию и фреймворк вы использовали?

Я думаю, что вызов функции, которую вы хотите, это EnableWindow. Я использовал это раньше, чтобы отключить кнопку на форме. Сначала вам нужно будет получить дескриптор Window (объекта), поэтому вы можете использовать EnumChildWindows для перебора всех элементов управления, чтобы найти тот, который вам нужен.

Другие вопросы по тегам