Как обновить текущее состояние окна после отображения / скрытия элементов управления? - PullRequest
1 голос
/ 06 апреля 2020

Я новичок, и сегодня мой первый день в обучении созданию приложения Windows. У меня есть две кнопки.

#define BUTTON_SW 1
#define BUTTON_SW2 2
HWND Button1;
HWND Button2;
Button1 = CreateWindow("button", "Enter", WS_VISIBLE | WS_CHILD, 215, 10, 40, 25, hwnd, HMENU(BUTTON_SW), NULL, NULL);   
Button2 = CreateWindow("button", "You'll be gone", WS_VISIBLE | WS_CHILD, 260, 10, 95, 25, hwnd, HMENU(BUTTON_SW2), NULL, NULL);

Когда нажимается Button1, как я могу скрыть Button2 или заставить его потерять флаг WS_VISIBLE и правильно отобразить текущую ситуацию, как это?

LONG style = GetWindowLong(Button2,GWL_STYLE);
style = style | WS_VISIBLE; // style = style & ~WS_VISIBLE
SetWindowLong(Button2,GWL_STYLE,style);

Это работает очень хорошо. Однако после присвоения флага WS_VISIBLE кнопка остается невидимой до первого щелчка мышью по нему. И наоборот, когда я использую style = style & ~WS_VISIBLE; после удаления флага WS_VISIBLE, кнопка становится пассивной (не щелкающей), но остается видимой.

Как это исправить? Перепробовал много вещей, которые я нашел в Интернете, но не смог это исправить. Также, пожалуйста, не предлагайте мне купить приличную книгу, у меня пока нет денег.

(PS: ShowWindow функция с SW_HIDE/SW_SHOW почему-то у меня не работает, возможно я Я использую это неправильно. Можете ли вы помочь мне, как я могу правильно скрыть это Button2? Я пытаюсь выполнить следующую команду, но ничего не происходит.)

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

@ Редактировать: I Я заметил, что когда я минимизирую приложение и снова максимизирую его, состояние кнопки обновляется. Но как он будет автоматически обновлять состояние?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Это должно работать

ShowWindow(Button2, SW_HIDE);

или

ShowWindow(GetDlgItem(DialogHWND, BUTTON_SW2), SW_HIDE);

GetDlgItem необходимо HWND родительского окна (диалога) в качестве первого аргумента.

1 голос
/ 06 апреля 2020

Чтобы окно отображало изменения, вы должны попросить ОС сделать это.

Узнайте о RedrawWindow и аннулированной области .

Обратите внимание, что некоторые действия, такие как изменение размера или восстановление из свернутого, автоматически приводят к тому, что ОС делает недействительным регион и перерисовывает его.

Использование:

RedrawWindow(Button2,NULL,NULL,RDW_INVALIDATE | RDW_INTERNALPAINT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...