Ну, просто мне нужно создать сетку прямоугольника и заполнить любой выбранный случай этой сетки при щелчке пользователя. таким образом я сохраняю параметры (цвет, положение ..). Проблема в том, что когда я пытаюсь заполнить случай при событии клика, я не могу никаких изменений, возможно, потому что изменился контекст устройства, даже если я использую метод GetDC()
. Итак, есть ли способ сохранить созданный в OnDraw() метод exmaple и использовать его где-то в другой функции, я пытался использовать SaveDC() и RestoreDC(), но напрасно.MFC как сохранить и повторно использовать контекст текущего устройства CDC
Вот некоторые из моего кода:
void CXThiefManView::OnDraw(CDC* pDC)
{
CXThiefManDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CRect rcClient;
GetClientRect(&rcClient);
// Get the background color of the board
COLORREF clr = pDoc->GetBoardSpace(-1, -1);
// Draw the background first
pDC->FillSolidRect(&rcClient, clr);
// Create the brush for drawing
CBrush br;
br.CreateStockObject(HOLLOW_BRUSH);
CBrush* pbrOld = pDC->SelectObject(&br);
// Draw the squares
for (int row = 0; row < pDoc->GetRows(); row++)
{
for (int col = 0; col < pDoc->GetColumns(); col++)
{
// Get the color for this board space
clr = pDoc->GetBoardSpace(row, col);
// Calculate the size and position of this space
CRect rcBlock;
rcBlock.top = row * pDoc->GetHeight();
rcBlock.left = col * pDoc->GetWidth();
rcBlock.right = rcBlock.left + pDoc->GetWidth();
rcBlock.bottom = rcBlock.top + pDoc->GetHeight();
// Fill in the block with the correct color
pDC->FillSolidRect(&rcBlock, clr);
// Draw the block outline
pDC->Rectangle(&rcBlock);
}
}
saveState = pDC->SaveDC();
DrawItem(pDC, pDoc->GetThiefRow(), pDoc->GetThiefCol(), pDoc->GetThiefColor());
}
void CXThiefManView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
CXThiefManDoc* pDoc = GetDocument();
// the draw item here to fill the case
DrawItem(GetDC(), 5, 5, RGB(0, 0, 0));
}
Вызов 'GetDC', как это вызовет неприятную утечку ресурсов GDI. Вместо этого используйте 'CClientDC'. Я думаю, вы хотите сохранить картину на растровое изображение и обновить рисунок на нем? 'SaveDC' и' RestoreDC' для чего-то другого. –
и как я могу повторно использовать тот же CClientDC во многих местах –
Вы не можете сохранить контекст устройства, полученный в обработчике 'WM_PAINT'. Он воссоздается для каждого вызова [BeginPaint] (https://msdn.microsoft.com/en-us/library/dd183362.aspx) (это то, что [CPaintDC] (https://msdn.microsoft.com/en -us/library/a48eab8d.aspx) делает за крышками). Этот контекст устройства настроил отсечение в область обновления. Область обновления обычно имеет значение от сообщения 'WM_PAINT' до следующего. Кроме того, вы сохраняете 'br', выбранный в контекст вашего устройства, даже после его уничтожения. Это моральный эквивалент висячего указателя. – IInspectable