Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как Правильно Перерисовывать Окна

7.0K
14 июня 2005 года
mixell
28 / / 03.04.2005
Здраствуйте - простите за тупые вопросы -
но я не знаю где на них найти ответ - в книгах
такие мелочи не рассматриваются - а MFC и API -
я знаю плохо ......

так вот - я перерисовываю окно

tagRECT rec;
GetWindowRect(win,&rec);

rec.right -= rec.left;
rec.bottom -= rec.top;
rec.top = 0;
rec.left = 0;

RedrawWindow(win,&rec,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);

- но почему окно нерерисовывается полностью ?
425
15 июня 2005 года
sq_deep
498 / / 18.02.2005
Для преобразования координат есть функции ScreenToClient() и ClientToScreen(). Попробуйте воспользоваться первой из них вместо своего преобразования.

А ещё проше сделать так.
 
Код:
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
С MFC ешё проще:
 
Код:
Invalidate();
UpdateWindow();
7.0K
15 июня 2005 года
mixell
28 / / 03.04.2005
А ещё проше сделать так.
 
Код:
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);С MFC ешё проще:[Invalidate();
UpdateWindow();



- не это протягивыет - UpdateWindow(); -
не дает эффекта на перерисовку а -
Invalidate() и InvalidateRect() - помещают
сообщения в очеередь и конечно не чего не перирисовывают - пока данное окно не получит
фокус ввода -

функция ClientToScreen() - преобразует так же как
и GetWindowRect(win,&rec); - эффект одинаковый -

и при вызове

RedrawWindow(win,&rec,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);

- остается не пересованной FrameRect - окна - и
системное меню - и то место от куда получается
GetWindowText ..............................
488
15 июня 2005 года
Mоngооsе
465 / / 01.04.2005
 
Код:
RedrawWindow(win,&rec,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
Нужен еще RDW_FRAME
425
16 июня 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by mixell
UpdateWindow(); -
не дает эффекта на перерисовку а -
Invalidate() и InvalidateRect() - помещают
сообщения в очеередь и конечно не чего не перирисовывают - пока данное окно не получит
фокус ввода

Это не совсем так. На самом деле всё работает так.

Invalidate() помечает всю область окна нуждающейся в обновлении и ставит сообщение WM_PAINT в очередь.

WM_PAINT имеет низкий приоритет и пропускает впереди себя другие сообщения. Это делается для того, чтобы вы могли дать Invalidate() 50 раз подряд, но перерисовка была бы только одна.

UpdateWindow() ищет WM_PAINT в очереди сообщений и (если оно там есть) вызывает его обработчик непосредственным обращением к оконной функции (call-ом, так сказать). Таким образом, перерисовка происходит раньше, чем станут обрабатываться прочие сообщения.

Поэтому фокус ввода тут совершенно ни при чём. Советую почитать Петцольда. Я считаю эту книгу обязательной к прочтению для всех, кто имеет дело с разработкой для Windows.

Цитата:
Originally posted by mixell
...функция ClientToScreen() - преобразует так же как и GetWindowRect(win,&rec)...

GetWindowRect() ничего не преобразует. Преобразует ваш код rec.right -= rec.left.... Возможно, он делает это и правильно, но только для подобных преобразований уже написаны функции ScreenToClient() и ClientToScreen(). Можно, конечно, и вместо strcpy() писать каждый раз свой цикл, но только так почему-то никто не делает.

284
22 июня 2005 года
michael_is_98
587 / / 25.02.2005
Вот уж воистину "Откуда ни возьмись появились книги по-русски".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог