15,979
社区成员
发帖
与我相关
我的任务
分享
void CDrawYunView::OnDraw(CDC* pDC)
{
if (!pDC)
return;
CDrawYunDoc* pDoc = GetDocument();//获得文档类对象指针,向导自动添加的
ASSERT_VALID(pDoc);////验证文档对象
if (!pDoc)
return;
//添加代码
CDC dc;//定义一个设备上下文
CDC* pDrawDC = pDC;
CBitmap bitmap;//定义位图对象
CBitmap* pOldBitmap;
// only paint the rect that needs repainting只绘画需要绘画的区域
CRect client;
pDC->GetClipBox(client);//该函数得到一个能够完整包含当前可见区域的最小矩形的大小。该可见区域由当前的剪切区域定义或由剪切路径所定义或者由任何重叠的窗口所定义
CRect rect = client;
DocToClient(rect);//调整坐标系,因View派生于CScrollView的,在OnPaint里面还要调用DocToClient()进行下坐标转换的
if (!pDC->IsPrinting())//CDC类成员,IsPrinting 确定正在使用的设备上下文是否用于打印
{
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC))//该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。//建立一個相容的DC重畫來加速視覺更新
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))//该函数创建与指定的设备环境相关的设备兼容的位图//為相容DC提供畫布
{
OnPrepareDC(&dc, NULL);//在OnDraw成员函数调用前被框架函数调用用于屏幕显示
pDrawDC = &dc;
// offset(偏移) origin(原点) more because bitmap(位图) is just piece(块) of the whole drawing(整张图)
dc.OffsetViewportOrg(-rect.left, -rect.top);//只是调节视口原点的偏移量,//令装置座标(rect.left, rect.top)位于view视窗的左上角
pOldBitmap = dc.SelectObject(&bitmap);//SelectObject:选取GDI绘制对象
dc.SetBrushOrg(rect.left % 8, rect.top % 8);//設置Brush起點
// might as well clip to the same rectangle:还不如夹相同的矩形
dc.IntersectClipRect(client);//该函数创建了一个新的剪切区域,该区域是当前剪切区域和一个特定矩形的交集。
}
}
}
// paint background 绘制背景
CBrush brush;
if (!brush.CreateSolidBrush(pDoc->GetPaperColor()))//CreateSolidBrush()该函数创建一个具有指定颜色的逻辑刷子。
return;
brush.UnrealizeObject();//重设brush
pDrawDC->FillRect(client, &brush);//该函数用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形的右下边界
if (!pDC->IsPrinting() && m_bGrid)
DrawGrid(pDrawDC);//调用绘制网格线函数
pDoc->Draw(pDrawDC, this);//函数包括绘制对象和绘制8或2点的句柄光标。
if (pDrawDC != pDC)
{
pDC->SetViewportOrg(0, 0);//设置视区起点
pDC->SetWindowOrg(0,0);//设置设备上下文的窗口起点
pDC->SetMapMode(MM_TEXT);//设置当前映射模式,MM_TEXT 每个逻辑单位转换为1设备像素。 正x是在右侧;正y向下递增
dc.SetViewportOrg(0, 0);//设置视区起点
dc.SetWindowOrg(0,0);//设置设备上下文的窗口起点
dc.SetMapMode(MM_TEXT);//设置当前映射模式,MM_TEXT 每个逻辑单位转换为1设备像素。 正x是在右侧;正y向下递增。
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);//BitBlt()用于从原设备中复制位图到目标设备,SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
dc.SelectObject(pOldBitmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
}
}
CDC dc;//定义一个设备上下文
CDC* pDrawDC;
CBitmap bitmap;//定义位图对象
CBitmap* pOldBitmap;
CRect client;
CRect rect;
CBrush brush;
其中指针我在构造函数指向NULL,其它的初始化怎么进行,
”这样的定义放在头文件里,只定义一次,然后用完就释放,包括其它需要释放的都要释放“您的意思的释放是在OnDraw()函数里吗,能举下例子吗?