vc 绘图

来源:互联网 发布:mac ae导出快捷键 编辑:程序博客网 时间:2024/05/29 08:52
1.dialog中绘图
都是在绘图设备上绘图
如果是在onpaint中可以直接使用CPaintDC dc(this)中的dc去绘图
如果不是在onpaint中则需要先创建绘图设备或者取得绘图设备,
a.取得绘图设备

CDC *pDC=GetDC();pDC->DrawText("hello",CRect(0,0,100,100),DT_LEFT);
b.创建内存绘图设备并贴在实际的设备之上:
是针对图像而言的
CreateCompatibleDC:创建内存DC。这个函数可以创建一个内存DC,使用这个函数绘图时可避免发生图像闪烁的现象,也就是大家常说的“二次缓冲”技术.
在这个内存画布画完图之后,需要将这个画布贴到实际的绘图设备上面,
不过是针对图像而言的,如下直接在内存DC中画文字无法显示
CDC *pDC=GetDC();CDC *pMemDC=new CDC;pMemDC->CreateCompatibleDC(pDC);pMemDC->DrawText("hello",CRect(0,0,100,100),DT_LEFT);StretchBlt(pDC->m_hDC,0,0,100,100,pMemDC->m_hDC,0,0,100,100,SRCCOPY);        pMemDC->DeleteDC();//释放
所以,如果想在内存DC中画文字然后贴到目标DC中,需要内存DC->SelectObject(&cbmp)
CDC *pDC=GetDC();CDC memdc;memdc.CreateCompatibleDC(pDC);CRect rect;GetClientRect(&rect);CBitmap cbmp;cbmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); memdc.SelectObject(&cbmp);//选择这个空图像memdc.FillSolidRect(rect,RGB(255,255,255));//白色背景memdc.DrawText("Hello",CRect(0,0,200,200),DT_LEFT);//在内存DC中输出HellopDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);//贴上cbmp.DeleteObject();memdc.DeleteDC();ReleaseDC(pDC);


2.画文字
使用CFont设置字体
使用pDC->SetTextColor(RGB(255,0,0));设置文字颜色
使用pDC->FillSolidRect(0,0,100,100,RGB(255,255,0));设置背景颜色
pDC->SetBkMode(TRANSPARENT)设置透明背景
CDC *pDC=GetDC();CFont font;font.CreatePointFont(500,"宋体");//创建字体pDC->SelectObject(&font);pDC->DrawText("Hello",CRect(0,0,500,500),DT_LEFT);//font.DeleteObject();//需要释放

3.画线和形状

使用CPen设置线条颜色,类型,宽度
使用CBrush设置形状的填充颜色,花纹等
使用pDC->LineTo,pDC->Ellipse等画线,图形

CDC *pDC=GetDC();CPen pen;pen.CreatePen(PS_SOLID,2,RGB(255,0,0));pDC->SelectObject(&pen);CBrush brush;brush.CreateSolidBrush(RGB(255,0,0));pDC->SelectObject(&brush);pDC->LineTo(100,100);pDC->Ellipse(CRect(0,0,100,100));pen.DeleteObject();//需要释放brush.DeleteObject();//需要释放


4.画图像
使用CBitmap载入位图图像
在内存DC中画位图
将内存DC贴到目标DC
可以使用BITMAP获取bitmp的一些属性,如长宽
CDC *pDC=GetDC();/*CRect r;GetClientRect(&r);pDC->FillRect(&r,NULL);//填充背景*/CDC memdc;memdc.CreateCompatibleDC(pDC);CBitmap cbmp;cbmp.LoadBitmap(IDB_BITMAP1);memdc.SelectObject(&cbmp);BITMAP bmp;long width,height;cbmp.GetBitmap(&bmp);width = bmp.bmWidth;height = bmp.bmHeight;pDC->StretchBlt(0,0,(int)(width*1.5),(int)(height*1.5),&memdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);


5.取得绘图设备中的某像素点的RGB
COLORREF color;for (int i=0;i<iWidth;i++){for (int j=0;j<iHeight;j++){color=pDC->GetPixel(i,j);BYTE r=GetRValue(color);BYTE g=GetGValue(color);BYTE b=GetBValue(color);}}pDC->SetPixel(100,90,color);

6.
SetMapMode 设定映射模式
SetWindowExt 设定窗口逻辑尺寸
SetViewportExt 设定视口物理尺寸
SetViewportOrg 设定视口物理坐标原点
a.
画图时比如Rectangle指定的坐标都是逻辑坐标,而在默认情况下逻辑坐标(逻辑单位)=物理坐标(像素单位),即相当于设定了如下4行
CRect rc;
GetClientRect(&rc);
dc.SetWindowExt(rc.right,rc.bottom);//设置窗口逻辑尺寸
dc.SetViewportExt(rc.right,rc.bottom);//设置视口大小,物理坐标
//dc.SetViewportOrg(rc.right/2,rc.bottom/2);//窗口中心为原点
//dc.Rectangle(CRect(0,0,100,100));//以逻辑尺寸画图

此时将dc.SetWindowExt(rc.right,rc.bottom);中的参数改变大小,画出的矩形大小会变化。


b.
dc.SetViewportOrg(100, 100);//设定原点为100,100
CRect rect(0, 0, 200, 200);
dc.Rectangle(rect);


c.
dc.SetWindowOrg(100, 100);//设定100,100为原点
CRect rect(0, 0, 200, 200);
dc.Rectangle(rect);


7.
http://www.cnblogs.com/sxlfybb/archive/2006/06/13/424770.html
CRect rect;
GetClientRect(&rect);//.得到除标题栏和边框之外的客户区,以窗口坐标表示
ClientToScreen(rect);//以屏幕坐标表示

CRect rect;
GetWindowRect(&rect);//得到包括标题栏和边框在内的客户区,以屏幕坐标表示
ScreenToClient(rect);//以窗口坐标表示
原创粉丝点击