19,468
社区成员
发帖
与我相关
我的任务
分享
void CTestViewportDlg::OnPaint()
{
CPaintDC dc(this);
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CBitmap bitmap;
CRect rcClient;
GetClientRect(rcClient);
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&bitmap);
// Fill bitmap background with write brush.
CBrush bmpBkBrush(RGB(0, 255, 255));
memDC.FillRect(rcClient, &bmpBkBrush);
// Change map mode, positive x right, positive y up.
int nOldMode = memDC.SaveDC();
memDC.SetMapMode(MM_ISOTROPIC);
memDC.SetViewportExt(1, 1);
memDC.SetWindowExt(1, -1);
memDC.SetViewportOrg(rcClient.Width() / 2, rcClient.Height());
// Draw coordinate system.
CPen pen(PS_SOLID, 2, RGB(0, 0, 0));
memDC.SelectObject(&pen);
memDC.MoveTo(-rcClient.Width() / 2, 5);
memDC.LineTo(rcClient.Width() / 2, 5);
memDC.MoveTo(0, 5);
memDC.LineTo(0, rcClient.Height());
memDC.TextOut(2, 22, CString("0,0"));
// Draw testing circle.
CPen shapePen(PS_SOLID, 1, RGB(0 ,0 ,0));
memDC.SelectObject(&shapePen);
CBrush shapeBrush(RGB(255, 0, 0));
memDC.SelectObject(&shapeBrush);
memDC.Ellipse(5, 102, 25, 82);
memDC.Ellipse(15, 50, 35, 30);
memDC.Ellipse(75, 105, 95, 85);
// We must restore mapping mode before copy bitmap to client context.
memDC.RestoreDC(nOldMode);
// Copy double buffer bitmap to client context.
dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
}
}