Скрытие элемента управления в Windows - PullRequest
1 голос
/ 08 июня 2011

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

Когда пользователь щелкает внутри статического элемента управления «Набор микросхем», он загружает информацию для данной плитки (которая хранится в массиве, но это не имеет значения). В зависимости от настройки, она будет скрывать кнопку «Edit bitwall» слева и показывать пустой GroupBox за ней или наоборот. Просто чтобы быть ясно, что это не что-то не так с моими оболочками API Windows, я получаю правильный HWND. Хотя ShowWindow может не вызываться из оконной процедуры, которая не является родительской (это было бы странно).

EDIT2 : Использование C ++ с Visual Studio 2008, без 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();
}

Опущенный код никак не влияет на классы, как я уже говорил, вызывается ShowWindow с SW_HIDE IS, с правильным HWND, но ничего не происходит.

Ответы [ 2 ]

5 голосов
/ 08 июня 2011

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

ShowWindow (hControlWin, SW_HIDE);

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

GetDlgItem (hDlg, );

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

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

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

1 голос
/ 08 июня 2011

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

...