ShowWindow в WM_CREATE - PullRequest
       1

ShowWindow в WM_CREATE

0 голосов
/ 30 октября 2010

На мой взгляд, одно из применений сообщения WM_CREATE оконной процедуры состоит в том, чтобы освободить вызывающую сторону от бремени выполнения статического кода при инициализации окна. Мое окно должно выполнить некоторый код в сообщении WM_CREATE, включая функцию ShowWindow. Я также хочу, чтобы ShowWindow работал правильно в соответствии с параметром nCmdShow в WinMain. Итак, вот псевдокод, чтобы показать, как у меня все настроено:

int g_nCmdShow;

WinMain(..., int nCmdShow)
{
  g_nCmdShow = nCmdShow;
  ...
  CreateWindow(..., WM_OVERLAPPEDWINDOW, ...)
  ...
}

WndProc()
{
  ...
  WM_CREATE:
    ...
    ShowWindow(hWnd, g_nCmdShow);
    ...
  ...
}

Итак, я настроил программу для запуска Minimized (с помощью Windows XP я создал ярлык для .exe и соответствующим образом настроил его свойства), и он отображается на панели задач свернутым, но не восстанавливается при нажатии в теме. Аналогичным образом, если я запускаю его в развернутом виде, он не будет работать правильно, когда я нажимаю кнопку развернуть (чтобы развернуть его).

Как правильно использовать совместимое с nCmdShow ShowWindow в сообщении WM_CREATE?

Ответы [ 3 ]

2 голосов
/ 31 октября 2010

Проблема в том, что это влияет на границы восстановления окна.Они становятся размером окна после возврата WM_CREATE.Вам придется изменить свой код, чтобы восстановить границы восстановления:

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, 300, 200, NULL, NULL, hInstance, NULL);
WINDOWPLACEMENT wp;
GetWindowPlacement(hWnd, &wp);     // <= Note wp.rcNormalPosition after this call!
RECT rc = {100, 100, 400, 300};
wp.rcNormalPosition = rc;
SetWindowPlacement(hWnd, &wp);

Вы не будете впереди, если будете делать это таким образом.

1 голос
/ 31 октября 2010

Если вам абсолютно необходимо сохранить его в WndProc, попробуйте

case WM_CREATE:
    PostMessage(hwnd,WM_APP,0,0);
    break;
case WM_APP:
    ShowWindow(hwnd,SW_SHOW);
    break;

Но если это так важно, почему бы просто не иметь вспомогательную функцию, которая создает окно и вызывает ShowWindow? MyWindowType_Create (...) и т. Д.

0 голосов
/ 31 октября 2010

Можете ли вы обработать WM_WINDOWPOSCHANGED и переопределить размер окна при первом восстановлении окна?Используйте GetWindowPlacement, чтобы узнать, восстановлено ли окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...