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