Окно с Progress Bar перестает обновляться
От: unz0r  
Дата: 20.06.05 00:04
Оценка:
Всем здравствуйте.
Рисую маленькое окно в обработчике 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);

Пробовал создавать окно как диалог из ресурса, вобщем эффект тот же.
Заранее спасибо за любую помощь.
Re: Окно с Progress Bar перестает обновляться
От: dibil  
Дата: 20.06.05 04:00
Оценка:
а почему нельзя создать диалоговое окно с прогрессбаром?
Re[2]: Окно с Progress Bar перестает обновляться
От: unz0r  
Дата: 20.06.05 04:30
Оценка:
Здравствуйте, dibil, Вы писали:

D>а почему нельзя создать диалоговое окно с прогрессбаром?


Можно, пробовал, эффект тот же. Кроме того пробовал засовывать все окно в InvalidateRect перед вызовом UpdateWindow, и пробовал забирать фокус SetFocus-ом перед UpdateWindow.
Re: Окно с Progress Bar перестает обновляться
От: vlad_gri  
Дата: 20.06.05 05:13
Оценка: 3 (1)
Здравствуйте, 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;
      //
...
Re[2]: Окно с Progress Bar перестает обновляться
От: unz0r  
Дата: 20.06.05 07:24
Оценка:
Здравствуйте, 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 и вообще не обрабатывались?
Re: Окно с Progress Bar перестает обновляться
От: hermit. Россия  
Дата: 20.06.05 07:32
Оценка:
Здравствуйте, 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>>
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re[3]: Окно с Progress Bar перестает обновляться
От: vlad_gri  
Дата: 20.06.05 07:56
Оценка:
Здравствуйте, 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`а.
В остальном ты понял правильно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.