Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Где можно использовать beginpaint?

Вкусный Бородинский хлеб Мыслитель (7407), закрыт 3 часа назад
Обязательно в событии рисования?
Вот я копирую bmpdc в wnddc с помощью bitblt

Но почему то получается медленно и экран мигает
При нажатии на клавишу выводится хорошо и не мигает, даже если быстро нажимать клавишу.
А если клавишу держать, то экран начинает мигать.
Может быть я неправильно что то делаю?
Лучший ответ
Артём Таптыков Мудрец (12573) 14 часов назад
Слышь, братан, ща расскажу по-пацански.

Значит, смотри, `BeginPaint` — это тема, когда нужно перерисовать окно. Короче, эта функция вызывается в событии рисования окна, когда WM_PAINT прилетает. Только в этом месте её юзай, иначе не по фэншую.

Теперь по поводу твоего мигания. Ситуация такая: когда у тебя окно мигает, это, скорее всего, из-за того, что ты напрямую рисуешь на нём. Вот тебе два совета, чтобы убрать мигание:

1. **Двойная буферизация**: Делай все свои художества сначала на памяти, а потом одним махом перерисовывай на экран. Так ты избавишься от мигания. Это называется double buffering.

2. **InvalidateRect** и **UpdateWindow**: Если не хочешь, чтобы у тебя постоянно пересчитывался весь экран, используй `InvalidateRect`, чтобы указать конкретную область для перерисовки, и потом вызывай `UpdateWindow`.

Скорее всего, у тебя вот где затык:
- **Двойная буферизация**: Создаёшь в памяти буфер, рисуешь всё туда, а потом выводишь этот буфер на окно. Это ускоряет всё и не мигает. В `BeginPaint` должен использовать двойной буфер.

Попробуй так:
1. Создай буфер (создаёшь совместимый DC с твоим окном и bitmap для него).
2. Рисуй на этом буфере, а не напрямую на окне.
3. Когда нарисовал, используй `BitBlt` для копирования буфера на окно.

Примерно вот так:
```cpp
HDC memDC = CreateCompatibleDC(wndDC);
HBITMAP hBitmap = CreateCompatibleBitmap(wndDC, width, height);
HGDIOBJ oldBitmap = SelectObject(memDC, hBitmap);

// Рисуешь на memDC, а не на wndDC

BitBlt(wndDC, 0, 0, width, height, memDC, 0, 0, SRCCOPY);

// Чистишь за собой
SelectObject(memDC, oldBitmap);
DeleteObject(hBitmap);
DeleteDC(memDC);
```
Так твоя графика будет плавной, как братва на бэхе.

Всё, братан, пробуй и не косячь, если что, зови, поможем!
Остальные ответы
Похожие вопросы