Консультация № 55113
12.09.2006, 07:45
0.00 руб.
0 5 1
Доброго времени суток вам, уважаемые эксперты!
Такой вопрос. Как можно НЕМЕДЛЕННО перерисовать окно из процедуры окна, в частности, при обработке сообщения WM_HSCROLL (wParam = SB_THUMBTRACK)?

Простой вызов InvalidateRect(hwnd,0,true); не помогает...

Обсуждение

Неизвестный
12.09.2006, 17:35
общий
это ответ
Здравствуйте, Slin!
Рисовать как и в сообщении WM_PAINT с помощью BeginPaint и EndPaint.
Точно не помню, но вроде можно рисовать еще и используя контекст HDC hDC = GetDC(hWnd);
Неизвестный
12.09.2006, 20:38
общий
странно, что invalidaterect не помогает. ПопробуйтеRedrawWindow(hwnd,0, 0, RDW_FRAME or RDW_NOINTERNALPAINT or RDW_INVALIDATE);
Неизвестный
13.09.2006, 07:06
общий
К сожалению, RedrawWindow тоже не помогает... (((Видимо, дело не в этом...Но все равно спасибо
давно
Посетитель
7438
7205
13.09.2006, 15:19
общий
Действительно странно, должно работать.Без текста программы тяжело судить...Рекомендую посмотреть у Петзольда и сравнить. В 8 главе есть пример COLORS1 - как раз на эту тему.ftp://ftp.rusfaq.ru/books/program/win32api/PetzoldПравила подключения читаем здесь http://rusfaq.ru/forum/Opinions/68/3
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
14.09.2006, 06:15
общий
Я пишу программку на Delphi c иерархией динамически созданных объектов... дело касается компонента Memo. В него записывает длинный жирный наклонный текст и используются полосы прокрутки... Так вот, при прокрутке у самого конца строки появляются артефакты изображения, т.е. остается предыдущий текст, который ушел влево. К сожалению, у компонента Memo нет обработчиков событий прокрутки, поэтому пришлось создать его подкласс (в терминах Windows): procedure TForm1.set_wndproc(mem: TMemo); var h:HWND; wp:TFNWndProc; begin h:=mem.Handle; wp:=@MyWndProc; wp:=pointer(SetWindowLong(h,GWL_WNDPROC,longint(@MyWndProc); SetWindowLong(h,GWL_USERDATA,longint(wp; end; Процедура окна такая: function MyWndProc(hwnd:HWND;msg:UINT;wp:WPARAM;lp:LPARAM):LRESULT;stdcall; var wpi:TFNWndProc; mem:TMemo; begin if msg=WM_HSCROLL then begin InvalidateRect(hwnd,0,true); end; wpi:=pointer(GetWindowLong(hwnd,GWL_USERDATA; result:=CallWindowProc(wpi,hwnd,msg,wp,lp) end; Пробовал и так и сяк, в общем-то работает, но не совсем так, как хотелось бы... Трудно описывать... Скажу только, что когда отпускаем клавишу мыши от прокрутки, усе ок. Проблемы именно при движении ползунка. То ли медленно стирает - кратковременно появляется некоторое количество букв, то ли еще чего - при остановке движения (ползунок при этом не отпускается!!!) в конце строки остаются какие-то хвостики букв. Когда отпускаем, они исчезают... Вот такие дела ( В принципе я смирился... хотя и неприятно...
Форма ответа