Артём Таптыков
Мудрец
(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);
```
Так твоя графика будет плавной, как братва на бэхе.
Всё, братан, пробуй и не косячь, если что, зови, поможем!
Вот я копирую bmpdc в wnddc с помощью bitblt
Но почему то получается медленно и экран мигает
При нажатии на клавишу выводится хорошо и не мигает, даже если быстро нажимать клавишу.
А если клавишу держать, то экран начинает мигать.
Может быть я неправильно что то делаю?