Отображение дополнительного немодального окна с C ++ и WinApi - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть класс GUIMain, который регистрирует, создает и показывает главное окно для моей программы.На ней есть кнопка, которая, когда пользователь щелкает ее, отображает дополнительное окно.

Если бы я писал это на C #, у меня было бы два варианта:

AdditionalForm myForm = new AdditionalForm();
myForm.ShowDialog(this); // blocking. Returns when myForm is closed;
someOtherFunction();

или

AdditionalForm myForm = new AdditionalForm();
myForm.Show(this);   // non-blocking.
someOtherFunction(); // runs while myForm is still visible

или, черт возьми, даже это будет работать:

AdditionalForm myForm = new AdditionalForm();
new Thread(new ThreadStart(delegate()
  {
    myForm.ShowDialog(this);   // blocks in a separate thread
  })).Start();
someOtherFunction(); // runs while myForm is still visible   

Но я пишу это на C ++, а не на C #.

У меня есть дополнительный класс под названием PreviewWindowкоторый имеет публичные функции-члены Register(), Create() и Show().Последняя функция содержит цикл обработки сообщений, который в основном делает его блокирующим вызовом - аналогично C # ShowDialog().

. Как мне переписать PreviewWindow::Show(), чтобы в нем не было блокирующего цикла:

while (GetMessage(&msg, 0, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

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

У меня сейчас есть:

previewWindow = new PreviewWindow(hInstance, hWnd);

previewWindow->Register();
previewWindow->Create();
previewWindow->Show();         // blocks :(
previewWindow->DisplayImage(); // never runs.

Я пробовал CreateThread, но этоне нравится, что третий аргумент является функцией-членом.Я пытался сделать это статической функцией-членом, но, похоже, это тоже не нравится.Он говорит, что DWORD (__stdcall *) () несовместим с LPTHREAD_START_ROUTINE.

1 Ответ

2 голосов
/ 10 ноября 2011

У вас должен быть только один цикл обработки событий, он будет обрабатывать все окна, кроме модальных (которые запускают свой собственный цикл сообщений для блокировки пользовательского интерфейса).Тогда ваш PreviewWindow::Show просто ShowWindow(handle, SW_SHOW);.Многопоточность обычно следует сохранять, когда это абсолютно необходимо.

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