CDC简介_c/c++_电脑编程网 cdc25c
作者:刘胜 和c/c++相关 2009916
简介:这是CDC简介的详细页面,介绍了和c/c++,有关的知识,加入收藏请按键盘ctrl+D,要查看更多相关信息,请点击此处
CPaintDC dc(this);
CDC *dc=GetDlgItem(IDC_STATIC)->GetDC();
CDC *dc=GetDC();
DC(Device Context) 设备上下文,可以理解为我们要在上面写写画画的那张纸。VC中有CDC,CClientDC,CPaintDC。
CDC是Windows绘图设备的基类。
CClientDC:
(1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。
CPaintDC:
(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。
(2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。
(3)CPaintDC也只能用在WM_PAINT消息处理之中。
CWindowDC:
(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。
(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。
(3)关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送。
兼容的DC指不是具体的图形设备,而是虚拟的设备,例如我们可以建一个虚拟的DC来存放和画bitmap,兼容DC的类可以理解成CDC的派生类,可以调用CDC的各种绘图函数。
举几个例子吧,
1、在整个屏幕上画画
创建一个基于对话框的MFC AppWizard(exe),添加一个按钮 button1,建立相关联的响应函数OnButton1(),在函数中添加如下代码:
//获取当前桌面的指针
CWnd* pwnd = GetDesktopWindow();
//获取当前桌面的设备上下文
CDC* pdc = pwnd->GetWindowDC();
//画图
for(int x = 0; x < 600; x++)
for(int y = 0; y < 400; y++)
pdc->SetPixel(x,y,x*y);
编译->运行。
关闭程序,会发现桌面的图画还是存在,怎么在关闭对话框程序后使得图画也消失呢?
可以在classwizard中添加一个WM_ONDESTROY消息,并为它创建OnDestroy()函数,在函数中添加如下代码:
GetDesktopWindow()->RedrawWindow(NULL,NULL,RDW_INVALIDATE|RDW_ALLCHILDREN|RDW_ERASENOW);
就ok了。
2、在对话框上画画
接着怎么在生成的对话框中画画呢,可以用CClientDC即当前程序的设备上下文。创建第二个按钮button2和对应的响应函数OnButton2(),在OnButton2()中添加如下代码:
CClientDC pdc(this);
for(int x = 0; x < 200; x++)
for(int y = 0; y < 200; y++)
pdc.SetPixel(x,y,x*y);
如果要为对话框设置一个背景画呢,那就要重写OnPaint()函数了,将OnPaint()中的代码用以下代码替换:
CPaintDC pdc(this);
RECT* prect = &pdc.m_ps.paintrect;
for(int x = 0; x < prect->right; x++)
for(int y = 0; y < prect->bottom; y++)
pdc->SetPixel(x,y,x+y);
3、在控件上画画
CDC *dc=GetDlgItem(IDC_STATIC)->GetDC();
//CDC *dc=GetDC();
for(int i=0;i<500;++i)
dc->SetPixel(10+i,10+i,0x0000ff);//用画点的办法画一根线,最后一个参数是颜色(32位)
CPen pen(PS_SOLID,2,0x00ff00); //生成绿色画笔
CPen *OldPen=dc->SelectObject(&pen);//把画笔引入设备场境
dc->MoveTo(20,50); //设置画线起点
dc->LineTo(520,550); //画到终点
dc->Arc(100,100,300,300,350,500,350,500);//画圆
dc->SelectObject(OldPen);
ReleaseDC(dc);
更多阅读
怎么测试宽带网速--电脑宽带网速测试 移动宽带怎么测试网速
怎么测试宽带网速--电脑宽带网速测试——简介我们现在有时候想测试一下自己的宽带网络速度如何,或者我们想知道自己的电脑宽带到底有多快的网络访问速度,这时候我们可以进行一下网速测试,好让自己心里有个了解,今天小编根据自己的经验给
如何查询电脑物理网卡地址 电脑网卡物理地址
如何查询电脑物理网卡地址——简介当被生产出来,网卡就有一个自己的mac地址,是固定唯一的。因此在一些重要场合,通常采用mac地址作为识别一台电脑的标注,我们也可以在路由器中绑定指定电脑的mac地址,从而实现某些指定的电脑可以实现上网,
电脑频繁掉线怎么办? 电脑无线网频繁掉线
电脑频繁掉线怎么办?——简介“近期电脑频繁的掉线,有时候个把小时断开一次,立即就能连接上,有时候个把分钟就断开一次”,我一个朋友问我怎么办?电脑频繁掉线是电脑的常见故障之一,导致电脑频繁掉线的原因有硬件的,也有软件的。今天来解决一
163博客申请注册网易博客登录首页_坚决放弃网易163.c 网易放弃英雄三国了吗
163博客申请注册 网易博客登录首页_多年前发现网易有博客后就马上在上面开了自己的博客,这么长时间来也花了不少的时间和精力在那上面,特别是那上面的相册,放了很多很多我的照片,谁知道两个多月前发现博客被屏蔽了,说我上面有非法信息或
电脑网速太慢怎么办? 电脑wifi网速慢怎么办
电脑网速太慢怎么办?——简介很多人不懂自己的电脑为什么太慢,其实我们完全可以做一些简单的事让它变快一点哦。电脑网速太慢怎么办?——方法/步骤电脑网速太慢怎么办? 1、 一、电脑管家直接清理垃圾,最最简单了。电脑网速太慢怎么办