Всем здравствуйте.
Рисую маленькое окно в обработчике WM_CREATE, чтобы вывести progress bar — индикатор загрузки. Все идет нормально, если ничего не трогать, но если пару раз кликнуть вокруг и сместить фокус, то окно перестает обновляться и progress bar останавливается. Иногда все это окно становится серым. Иногда главное окно, которое появляется после, не имеет закладки в taskbar, появляется только если кликнуть по нему. Вобщем где-то я туплю.
WinMain:
W.style = CS_HREDRAW | CS_VREDRAW;
W.lpfnWndProc = DefWindowProc;
W.cbClsExtra = 0;
W.cbWndExtra = DLGWINDOWEXTRA;
W.hInstance = hInst;
W.lpszMenuName = NULL;
W.lpszClassName = szLoadName;
if(!RegisterClass(&W)) return -1;
Fun_onCreate (обработчик WM_CREATE):
hwndLoad = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, szLoadName, szLoadName,
WS_CAPTION | WS_OVERLAPPED | WS_VISIBLE, 200, 200, 200, 110, NULL, NULL, hInstance, NULL);
hwndPB = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE,
10, 50, 175, 20, hwndLoad, NULL, hInstance, NULL);
for() {
...
SendMessage(hwndPB, PBM_SETPOS, pos, 0);
UpdateWindow(hwndPB);
...
}
DestroyWindow(hwndLoad);
Пробовал создавать окно как диалог из ресурса, вобщем эффект тот же.
Заранее спасибо за любую помощь.
Здравствуйте, unz0r, Вы писали:
U>Всем здравствуйте.
U>Рисую маленькое окно в обработчике WM_CREATE, чтобы вывести progress bar — индикатор загрузки. Все идет нормально, если ничего не трогать, но если пару раз кликнуть вокруг и сместить фокус, то окно перестает обновляться и progress bar останавливается. Иногда все это окно становится серым. Иногда главное окно, которое появляется после, не имеет закладки в taskbar, появляется только если кликнуть по нему. Вобщем где-то я туплю.
U>WinMain:
U>U> W.style = CS_HREDRAW | CS_VREDRAW;
U> W.lpfnWndProc = DefWindowProc;
U> W.cbClsExtra = 0;
U> W.cbWndExtra = DLGWINDOWEXTRA;
U> W.hInstance = hInst;
U> W.lpszMenuName = NULL;
U> W.lpszClassName = szLoadName;
U> if(!RegisterClass(&W)) return -1;
U>
U>Fun_onCreate (обработчик WM_CREATE):
U>U>hwndLoad = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, szLoadName, szLoadName,
U> WS_CAPTION | WS_OVERLAPPED | WS_VISIBLE, 200, 200, 200, 110, NULL, NULL, hInstance, NULL);
U>hwndPB = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE,
U> 10, 50, 175, 20, hwndLoad, NULL, hInstance, NULL);
U>for() {
U>...
U>SendMessage(hwndPB, PBM_SETPOS, pos, 0);
U>UpdateWindow(hwndPB);
U>...
U>}
U>DestroyWindow(hwndLoad);
U>
U>Пробовал создавать окно как диалог из ресурса, вобщем эффект тот же.
U>Заранее спасибо за любую помощь.
Пример на Pascal
for
...
SendMessage(hwndPB, PBM_SETPOS, pos, 0);
//
if PeekMessage(Msg, hwndLoad, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
//
...
Здравствуйте, vlad_gri, Вы писали:
_>Пример на Pascal
_>_>for
_>...
_> SendMessage(hwndPB, PBM_SETPOS, pos, 0);
_> //
_> if PeekMessage(Msg, hwndLoad, 0, 0, PM_REMOVE) then
_> begin
_> TranslateMessage(Msg);
_> DispatchMessage(Msg);
_> end;
_> //
_>...
_>
Огромное спасибо.

Я правильно понял что без цикла сообщений они просто не доходили до DefWindowProc и вообще не обрабатывались?
Здравствуйте, unz0r, Вы писали:
А очередь сообщений обрабатываешь (GetMessage || PeekMessage, TranslateMessage, DispatchMessage)
Если нет, то скорее всего очередь сообщений основного окна переполняется, и окно "зависает" Поставь обработчик очереди внутри
for
for(...){
while(PeekMessage(...))
{
TransleteMessage(...);
DispatchMessage(...);
}
SendMessage(hwndPB, PBM_SETPOS, pos, 0);
UpdateWindow(hwndPB);
}
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Здравствуйте, unz0r, Вы писали:
U>Здравствуйте, vlad_gri, Вы писали:
_>>Пример на Pascal
_>>_>>for
_>>...
_>> SendMessage(hwndPB, PBM_SETPOS, pos, 0);
_>> //
_>> if PeekMessage(Msg, hwndLoad, 0, 0, PM_REMOVE) then
_>> begin
_>> TranslateMessage(Msg);
_>> DispatchMessage(Msg);
_>> end;
_>> //
_>>...
_>>
U>Огромное спасибо.
U>Я правильно понял что без цикла сообщений они просто не доходили до DefWindowProc и вообще не обрабатывались?
Ну вообще то это не цикл. Это принудительная передача сообщений окну хозяину Progess`а.
В остальном ты понял правильно.