Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Вниз

Как обновить изображение нарисованное на окне?   Найти похожие ветки 

 
kDenis   (2005-09-30 20:47) [0]

Великие мастера! У меня тут большой трабл...
Рассказываю все по порядку...

Вобщем, создаю окно (WS_POPUPWINDOW) функцией CreateWindowEx, создаю кисть,

закрашиваю весь экран в черный цвет (функцией FillRect), запускаю таймер

функцией SetTimer. Через указанные промежутки времени (60мс), по таймеру

прямоугольник меняет цвет. А точнее, цвет остается тот-же, а меняется

яркость. Ну, короче, цвет меняется в диапазоне от $000000h до $00FF00h с

шагом $100h (тоесть через каждые 60мс код цвета увеличивается или уменьшается

на $100h).

А проблема в том, что все эти изменения на экране не отображаются! Вот, если

нажать Alt+Tab и перейти на другую прогу, а потом вернутся назат к этой, то

экран обновляется. Я пробовал его обновить функцией UpdateWindow (вызывая ее

каждые 60мс), пробовал посылать окну сообщение WM_PAINT. Ничего не помогает.

Перед началом рисования я вызываю  BeginPaint, а по завершении рисования -

EndPaint. Тоесть, они каждые 60мс вызываются.

ПОМОГИТЕ МНЕ ОБНОВИТЬ ЭТО ПАКОСНОЕ ОКНО!!!
Всем заранее спасибо за помощь.


 
kDenis   (2005-09-30 23:29) [1]

Че, никто не поможет? Плиз! Подскажите что-то!


 
kDenis   (2005-10-01 11:41) [2]

Всем спасибо за сотрудничество. :)
Я уже разобрался...
После Вызова EndPaint нужно вызывать InvalidateRect.


 
Eraser ©   (2005-10-01 12:08) [3]


> kDenis   (01.10.05 11:41) [2]

Да вообще неплохо бы всё прорисовку осуществлять в OnPaint


 
kDenis   (2005-10-01 23:00) [4]

Я пишу без VCL. То, что происходит OnPaint я ловлю, когда окно получает сообщение WM_PAINT (Это в принципе одно и то-же). А оно получает это сообщение в следующих случаях:
1. Была активной другая программа, и пользователь переключился на мою.
2. Пользователь изменил размер окна.
3. Была вызвана функция InvalidateRect, которую нужно вызывать после прорисовки.
Кстати, если перерисовывать экран при получении WM_PAINT, то прога скорее всего повиснет. Потому что после перерисовки автоматически повторно посылается WM_PAINT, выходит бесконечный цыкл...


 
Eraser ©   (2005-10-01 23:37) [5]


> kDenis   (01.10.05 23:00) [4]

Как понимать функция InvalidateRect, которую нужно вызывать после прорисовки, эту функцию как раз таки нужно вызывать, чтобы перерисовать нужный участок.

Кстати, если перерисовывать экран при получении WM_PAINT, то прога скорее всего повиснет.

An application sends the WM_PAINT message when Windows or another application makes a request to paint a portion of an application"s window.


 
Sashka ©   (2005-10-01 23:39) [6]

InvalidateRect надо бы вызывать не после отрисовки, а по таймеру... Отрисовку по таймеру делать не следует, её действительно лучше запихать в обработчик WM_PAINT и больше никуда.


 
kDenis   (2005-10-02 10:25) [7]

>InvalidateRect надо бы вызывать не после отрисовки, а по таймеру... >Отрисовку по таймеру делать не следует, её действительно лучше запихать >в обработчик WM_PAINT и больше никуда.

Ладно, попробую. Спасибо.


 
acc15 ©   (2005-10-03 14:10) [8]

Рисовать можно и по таймеру. Microsoft по этому поводу даже пример написал... Если в сях никак, то скажи, переведу :))

> Drawing at Timed Intervals
> You can draw at timed intervals by creating a timer with
> the SetTimer function. By using a timer to send WM_TIMER
> messages to the window procedure at regular intervals, an
> application can carry out simple animation in the client
> area while other applications continue running.
>
> In the following example, the application bounces a star
> from side to side in the client area. Each time the window
> procedure receives a WM_TIMER message, the procedure erases
> the star at the current position, calculates a new position,
>  and draws the star within the new position. The procedure
> starts the timer by calling SetTimer while processing the
> WM_CREATE message.
>
> RECT rcCurrent = {0,0,20,20};
> POINT aptStar[6] = {10,1, 1,19, 19,6, 1,6, 19,19, 10,1};
>  
> int X = 2, Y = -1, idTimer = -1;
> BOOL fVisible = FALSE;
> HDC hdc;
>  
> LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM
> wParam, LPARAM lParam)
> {
>     PAINTSTRUCT ps;
>     RECT rc;
>  
>     switch (message)
>     {
>         case WM_CREATE:
>  
>             // Calculate the starting point.
>  
>             GetClientRect(hwnd, &rc);
>             OffsetRect(&rcCurrent, rc.right / 2, rc.bottom
> / 2);
>  
>             // Initialize the private DC.
>  
>             hdc = GetDC(hwnd);
>             SetViewportOrgEx(hdc, rcCurrent.left,
>                 rcCurrent.top, NULL);
>             SetROP2(hdc, R2_NOT);
>  
>             // Start the timer.
>  
>             SetTimer(hwnd, idTimer = 1, 10, NULL);
>             return 0L;
>  
>         case WM_DESTROY:
>             KillTimer(hwnd, 1);
>             PostQuitMessage(0);
>             return 0L;
>  
>         case WM_SIZE:
>             switch (wParam)
>             {
>                 case SIZE_MINIMIZED:
>  
>                     / Stop the timer if the window is minimized.
>  
>  
>                     KillTimer(hwnd, 1);
>                     idTimer = -1;
>                     break;
>  
>                 case SIZE_RESTORED:
>  
>                     // Move the star back into the client
> area
>                     // if necessary.
>  
>                     if (rcCurrent.right > (int) LOWORD(lParam))
>
>                     {
>                         rcCurrent.left =
>                             (rcCurrent.right =
>                                 (int) LOWORD(lParam)) -
> 20;
>                     }
>                     if (rcCurrent.bottom > (int) HIWORD(lParam))
>
>                     {
>                         rcCurrent.top =
>                             (rcCurrent.bottom =
>                                 (int) HIWORD(lParam)) -
> 20;
>                     }
>  
>                     // Fall through to the next case.
>  
>                 case SIZE_MAXIMIZED:
>  
>                     // Start the timer if it had been stopped.
>  
>  
>                     if (idTimer == -1)
>                         SetTimer(hwnd, idTimer = 1, 10,
> NULL);
>                     break;
>             }
>             return 0L;
>  
>         case WM_TIMER:
>  
>             // Hide the star if it is visible.
>  
>             if (fVisible)
>                 Polyline(hdc, aptStar, 6);
>  
>             // Bounce the star off a side if necessary.
>
>  
>             GetClientRect(hwnd, &rc);
>             if (rcCurrent.left + X < rc.left ||
>                 rcCurrent.right + X > rc.right)
>                 X = -X;
>             if (rcCurrent.top + Y < rc.top ||
>                 rcCurrent.bottom + Y > rc.bottom)
>                 Y = -Y;
>  
>             // Show the star in its new position.
>  
>             OffsetRect(&rcCurrent, X, Y);
>             SetViewportOrgEx(hdc, rcCurrent.left,
>                 rcCurrent.top, NULL);
>             fVisible = Polyline(hdc, aptStar, 6);
>  
>             return 0L;
>  
>         case WM_ERASEBKGND:
>  
>             // Erase the star.
>  
>             fVisible = FALSE;
>             return DefWindowProc(hwnd, message, wParam,
> lParam);
>  
>         case WM_PAINT:
>  
>             // Show the star if it is not visible. Use BeginPaint
>
>             // to clear the update region.
>  
>             BeginPaint(hwnd, &ps);
>             if (!fVisible)
>                 fVisible = Polyline(hdc, aptStar, 6);
>             EndPaint(hwnd, &ps);
>             return 0L;
>     }
>     return DefWindowProc(hwnd, message, wParam, lParam);
>  
> }
> This application uses a private device context to minimize
> the time required to prepare the device context for drawing.
>  The window procedure retrieves and initializes the private
> device context when processing the WM_CREATE message, setting
> the binary raster operation mode to allow the star to be
> erased and drawn using the same call to the Polyline function.
>  The window procedure also sets the viewport origin to allow
> the star to be drawn using the same set of points regardless
> of the star"s position in the client area.
>
> The application uses the WM_PAINT message to draw the star
> whenever the window must be updated. The window procedure
> draws the star only if it is not visible; that is, only
> if it has been erased by the WM_ERASEBKGND message. The
> window procedure intercepts the WM_ERASEBKGND message to
> set the fVisible variable, but passes the message to DefWindowProc
> so that the system can draw the window background.
>
> The application uses the WM_SIZE message to stop the timer
> when the window is minimized and to restart the timer when
> the minimized window is restored. The window procedure also
> uses the message to update the current position of the star
> if the size of the window has been reduced so that the star
> is no longer in the client area. The application keeps track
> of the star"s current position by using the structure specified
> by rcCurrent, which defines the bounding rectangle for the
> star. Keeping all corners of the rectangle in the client
> area keeps the star in the area. The window procedure initially
> centers the star in the client area when processing the
> WM_CREATE message.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.037 c
1-1131086643
Zhekson
2005-11-04 09:44
2005.12.04
Объединённые ячейки в StringGrid


6-1125327416
VadimX
2005-08-29 18:56
2005.12.04
WinSock SEND,RECV слепляются команды


14-1132194091
Antonn
2005-11-17 05:21
2005.12.04
С днем студента!


4-1128330458
yura_moz
2005-10-03 13:07
2005.12.04
usb devices


2-1132149733
IfBeginThenEnd
2005-11-16 17:02
2005.12.04
Частотные срезы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский