Помогите с GDI
От: dap  
Дата: 07.04.05 19:18
Оценка:
Таймером вызываю функцию SendMessage(hWnd, WM_PAINT, NULL, NULL);
Блок обработки WM_PAINT выглядит так:

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    SetPixel(hdc, x++, 30, RGB(0,0,0));
    EndPaint(hWnd, &ps);
    break;


Точки рисуются только тогда, когда Виндовз сама пошлет WM_PAINT.
Вопрос: почему точки не рисуются по таймеру?
Re: Помогите с GDI
От: AlexEagle Украина http://www.vik.oil
Дата: 07.04.05 19:35
Оценка:
Здравствуйте, dap, Вы писали:

dap>Таймером вызываю функцию SendMessage(hWnd, WM_PAINT, NULL, NULL);

Ты лучше вызывай InvalidateRect
Re: Помогите с GDI
От: Аноним  
Дата: 07.04.05 19:36
Оценка:
Здравствуйте, dap, Вы писали:

dap>Таймером вызываю функцию SendMessage(hWnd, WM_PAINT, NULL, NULL);

dap>Блок обработки WM_PAINT выглядит так:

dap>
dap>case WM_PAINT:
dap>    hdc = BeginPaint(hWnd, &ps);
dap>    SetPixel(hdc, x++, 30, RGB(0,0,0));
dap>    EndPaint(hWnd, &ps);
dap>    break;
dap>


dap>Точки рисуются только тогда, когда Виндовз сама пошлет WM_PAINT.

dap>Вопрос: почему точки не рисуются по таймеру?


InvalidateRect(hWnd, nil, True);
Re: Помогите с GDI
От: Аноним  
Дата: 08.04.05 13:11
Оценка:
Здравствуйте, dap, Вы писали:

dap>Таймером вызываю функцию SendMessage(hWnd, WM_PAINT, NULL, NULL);

dap>Блок обработки WM_PAINT выглядит так:

dap>
dap>case WM_PAINT:
dap>    hdc = BeginPaint(hWnd, &ps);
dap>    SetPixel(hdc, x++, 30, RGB(0,0,0));
dap>    EndPaint(hWnd, &ps);
dap>    break;
dap>


dap>Точки рисуются только тогда, когда Виндовз сама пошлет WM_PAINT.

dap>Вопрос: почему точки не рисуются по таймеру?

Была такая фигня, юзай или Invalidate или еще круче RedrawWindow.
Re: Помогите с GDI
От: Vadim B  
Дата: 08.04.05 20:59
Оценка:
Здравствуйте, dap, Вы писали:

dap>Таймером вызываю функцию SendMessage(hWnd, WM_PAINT, NULL, NULL);

dap>Блок обработки WM_PAINT выглядит так:

dap>
dap>case WM_PAINT:
dap>    hdc = BeginPaint(hWnd, &ps);
dap>    SetPixel(hdc, x++, 30, RGB(0,0,0));
dap>    EndPaint(hWnd, &ps);
dap>    break;
dap>


dap>Точки рисуются только тогда, когда Виндовз сама пошлет WM_PAINT.

dap>Вопрос: почему точки не рисуются по таймеру?

Потому что DC, созданный BeginPaint, клиппирован по текущему невалидному региону. То есть если не было вызвано никаких InvalidateRect / InvalidateRgn, то невалидных областей у окна не будет и BeginPaint даст тебе DC с пустой областью отрисовки. А если InvalidateRect / InvalidateRgn были вызваны, то Windows пошлет тебе WM_PAINT и сама, без твоего вмешательства. Вывод: либо по таймеру делай InvalidateRect, либо создавай DC с помощью GetDC().
Re: Помогите с GDI
От: FirstStep Россия  
Дата: 09.04.05 18:45
Оценка:
Здравствуйте, dap, Вы писали:

dap>Таймером вызываю функцию SendMessage(hWnd, WM_PAINT, NULL, NULL);

dap>Блок обработки WM_PAINT выглядит так:

dap>
dap>case WM_PAINT:
dap>    hdc = BeginPaint(hWnd, &ps);
dap>    SetPixel(hdc, x++, 30, RGB(0,0,0));
dap>    EndPaint(hWnd, &ps);
dap>    break;
dap>


dap>Точки рисуются только тогда, когда Виндовз сама пошлет WM_PAINT.

dap>Вопрос: почему точки не рисуются по таймеру?

Просто у тя недействительный прямоугольник не изменяется и WM_PAINT понимает что рисовать то нечего... поэтому и не рисует точки...
Если написать в таймере

RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW);


то должно рисоваться.... правда мерцать могит, но это уже другая история
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.