Как Правильно Перерисовывать Окна
но я не знаю где на них найти ответ - в книгах
такие мелочи не рассматриваются - а 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);
- но почему окно нерерисовывается полностью ?
А ещё проше сделать так.
UpdateWindow(hWnd);
UpdateWindow();
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 ..............................
UpdateWindow(); -
не дает эффекта на перерисовку а -
Invalidate() и InvalidateRect() - помещают
сообщения в очеередь и конечно не чего не перирисовывают - пока данное окно не получит
фокус ввода
Это не совсем так. На самом деле всё работает так.
Invalidate() помечает всю область окна нуждающейся в обновлении и ставит сообщение WM_PAINT в очередь.
WM_PAINT имеет низкий приоритет и пропускает впереди себя другие сообщения. Это делается для того, чтобы вы могли дать Invalidate() 50 раз подряд, но перерисовка была бы только одна.
UpdateWindow() ищет WM_PAINT в очереди сообщений и (если оно там есть) вызывает его обработчик непосредственным обращением к оконной функции (call-ом, так сказать). Таким образом, перерисовка происходит раньше, чем станут обрабатываться прочие сообщения.
Поэтому фокус ввода тут совершенно ни при чём. Советую почитать Петцольда. Я считаю эту книгу обязательной к прочтению для всех, кто имеет дело с разработкой для Windows.
...функция ClientToScreen() - преобразует так же как и GetWindowRect(win,&rec)...
GetWindowRect() ничего не преобразует. Преобразует ваш код rec.right -= rec.left.... Возможно, он делает это и правильно, но только для подобных преобразований уже написаны функции ScreenToClient() и ClientToScreen(). Можно, конечно, и вместо strcpy() писать каждый раз свой цикл, но только так почему-то никто не делает.