Раньше не занимался рисованием через WinAPI на DC, сейчас изучаю этот процесс. Хочу спросить, как правильно работать с объектами и рисовать на контролах?
Я думаю так: получаю размер клиентской части окна (контрола), на котором рисую (GetClientRect) создаю совместимый DC (CreateCompatibleDC), создаю совместимый Bitmap размером с клиентскую часть окна (CreateCompatibleBitmap), выбираю его в этом совместимом DC (SelectObject), чтобы DC имел нужный размер и цветность.
Далее вывод делаю в созданный совместимый DC, а в обработчике WM_PAINT делаю BeginPaint + BitBlt (перенос из совместимого DC в DC окна) + EndPaint. DeleteDC этого совместимого DC для рисования и DeleteObject созданного вначале Bitmap'а делаю при закрытии окна (именно в этом порядке: сначала DeleteDC(CompatibleDC), затем DeleteObject(Bitmap)).
Правилен ли этот процесс? Не нужно ли делать что-то ещё или можно ли пойти другим путём? Могу ли я удалить совместимый Bitmap (выбранный в DC) раньше, чем DC без ущерба для последнего?
И второй вопрос: создание карандашей, кистей и пр.
- CreatePen (CreateSolidBrush и пр)
- SelectObject
- Рисую
- DeleteObject(Pen/Brush/etc)
Если CreatePatternBrush, то:
- LoadBitmap
- CreatePatternBrush
- SelectObject
- Рисую
- DeleteObject(Brush)
- DeleteObject(Bitmap)
Всё верно или где-то есть ошибка? Можно ли удалять карандаши/кисти до начала рисования (сразу после SelectObject)?
В MSDN написано: Do not delete a drawing object (pen or brush) while it is still selected into a DC. Как же из тогда удалять? Как отменить их выбор? Относится ли это к Bitmap'ам (а не только к Pen/Brush)...
SelectObjectвозвращает предыдущий объект - сохраните его и перед удалением своего Brush/Pen/Bitmap поставьте его обратно с помощьюSelectObject. Это будет наиболее "чисто" и в соответствии с примерами. – Lyth Dec 14 '17 at 14:30