如何在vc++中用cdc绘图.docx
- 文档编号:7695202
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:8
- 大小:47.95KB
如何在vc++中用cdc绘图.docx
《如何在vc++中用cdc绘图.docx》由会员分享,可在线阅读,更多相关《如何在vc++中用cdc绘图.docx(8页珍藏版)》请在冰豆网上搜索。
如何在vc++中用cdc绘图
如何在vc++中用cdc绘图
如何在vc++中用cdc绘图
如何在vc++中用cdc绘图
悬赏分:
50-解决时间:
2006-8-914:
36
偶菜鸟,以前没有用过vc的,只是看了两天的实例,跟着作了个helloworld,今天公司要求用cdc画图,我看了下cdc方面的东西,也找了些源码,可是不知道怎么用的,希望有懂的朋友告诉我下如何之前的一些东西,比如建立什么样的工程,在哪里添加函数之类的,谢谢了。
提问者:
f234f234-助理二级
最佳答案
简单说点吧。
SDI,MDI和基于对话框的程序都可以用CDC绘图。
SDI和MDI的程序,可以在View类的OnDraw(CDC*pDC)里直接用这个pDC参数来画图,也可以在自己添加的View类的成员函数中,使用CClientDCdc(this);或者CDC*pDC=GetDC(),然后用dc或者pDC来画图。
对话框程序中可以直接CDC*pDC=GetDC(),然后用pDC来画图。
比如,pDC->MoveTo(100,100);pDC->LineTo(200,200);就是从(100,100)到(200,200)画条直线。
具体的各种画图函数啊,环境设置函数啊什么的,楼主自己找找吧。
回答者:
tanyuguo-同进士出身七级8-718:
15
提问者对于答案的评价:
谢了,也感谢其他回答的兄弟
评价已经被关闭 目前有0个人评价
好
50%(0) 不好
50%(0)
相关问题
?
关于C语言绘图问题.
?
用vc给MFC绘图程序添加橡皮擦功能
?
vc绘图中怎样设置,才能使后画的覆盖开始画的。
我画...
?
VC++关于简单绘图的程序!
?
ASSERT(FALSE==IsBadReadPtr(pDC,sizeof(CDC*)));
其他回答 共2条
一、VC是什么?
学VC是学什么?
首先VC是一个软件(IDE集成开发环境)(编译、编辑、调试)
CDC
CDialog
CWinApp
CGdiObject及子类
CString、CPoint、CRect、CSize等简单数据类型
CFile
以上提到的这些内容,是每个人都会用到的内容。
二、MFC简介
上述主要内容都是与实际操作关系非常密切的,在此不可能讲清楚;而且,这些在一般的书里都会讲到。
我主要将最重要的MFC介绍一下。
MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。
应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。
如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。
下面介绍最重要的MFC。
CWnd:
窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。
该类很大,一开始也不必学,知道就行了。
CDocument文档,负责内存数据与磁盘的交互。
最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)
CView视图,负责内存数据与用户的交互。
包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。
最重要的是OnDraw(重画窗口),通常用CWnd:
:
Invalidate()来启动它。
另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。
你自己的许多功能都要加在里面,你打交道最多的就是它。
CDC设备文本。
无论是显示器还是打印机,都是画图给用户看。
这图就抽象为CDC。
CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。
把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。
CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。
CDialog对话框
CWinApp应用程序类。
似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。
最常用函数InitInstance():
初始化。
CGdiObject及子类,用于向设备文本画图。
它们都需要在使用前选进DC。
CPen笔,画线
CBrush刷子,填充
CFont字体,控制文字输出的字体
CBitmap位图
CPalette调色板
CRgn区域,指定一块区域可以用于做特殊处理。
CFile文件。
最重要的不外是Open(打开),Read(读入),Write(写)
CString字符串。
封装了C中的字符数组,非常实用。
CPoint点,就是(x,y)对
CRect矩形,就是(left,top,right,bottom)
CSize大小,就是(cx,cy)对(宽、高)
三、用好MSDN和例子
作为提高,推荐看的例子有:
nHello最简单的程序框架
nScribble鼠标绘图。
教程:
编程基础,GDI
nDiblook图像处理最简单范例
nMFCIE因特网浏览器
nEnroll数据库
nDaoviewDao(数据访问对象)范例。
树型和列视控件
nCubeOpenGL范例,画一个不断旋转的方块
nHierSvrOLE服务器
nOclientOLE包容器
nDrawcli鼠标绘图。
也包括OLE。
nWordPad写字板。
OLE
四、几点经验
A.为什么要用Windows而不是DOS编程
Windows编程并不比DOS编程难很多,只是在刚刚接触的时候感到头绪繁多,不知从何下手。
实际上,如果你会C语言,你会发现Windows编程的难度并不比当年学C语言时大。
DOS编程要想成为高手,也需要学习几百个函数(无论是TC、BC、MicrosoftC),并要深入了解汇编语言级的DOS功能调用。
而现在在Windows下,付出相同的工作量,你却可以获得几倍的收益。
如果你以前熟悉DOS编程,现在再搞Windows编程,只要两个星期肯定会感到巨大的优越性:
在DOS下,每一件事都要自己干,而且还有64K内存、显示精度等的限制,实在是事倍功半了。
B.为什么要用VC而不是其他Windows编程语言
n大多数大型软件(包括Windows自己)都是用C、C++编的,所以可以利用的源代码特别多。
例如Photoshop,就有VC的编程接口。
的其他的语言都不如VC有历史优势。
而且VC的开发工具特别多,从控件公司到硬件开发商,其产品很少敢不提供VC接口的。
nVC适合组织大工程(VB就不行)
nBorlandC++或C++Builder也很不错,并不比VC差。
但BC的版本兼容性不好,从3.1到4.0就出现“代沟”,而且VC提供了极为丰富的文档和范例,VC的参考资料也远比BC多。
并且VC与其他的VisualStudio成员可以协调工作,对软件工程有利。
n
C.开始不要学WinAPI编程,但以后最好学学WinAPI
特别要注意,开始不要买讲WindowsSDK编程的书。
一个臭名昭著的例子就是“HelloWorld”。
各种计算机语言在入门课中往往都给出一个例子,显示一行文字“HelloWorld”,无论是在Basic、C、Pascal,甚至汇编中,这个最简单的小程序都几行就可以写完。
但在早期的Windows编程中,刚才讲到的“HelloWin”这个有名的例子就要组织一个工程、写上几百行代码才能实现。
这就吓跑了很多想学Windows编程的人。
实际上,在Windows下显示“Helloworld”,最简单的方法只要5行就够了:
#include“windows.h”
voidWinMain()
{
MessageBox(NULL,”HelloWorld!
”,”MyFirstWindowsApplication”,MB_OK);
}
当然这个程序只建立了一个最简单的对话框,但这已经够了。
如果你没有SDK编程的经验,学VC就是要利用MFC绕过Windows编程的许多细节。
有好的工具为什么不用呢?
现在你在VC写一个”HelloWorld”,只要写一行代码就可以了。
voidCYourView:
:
OnDraw(CDC*pDC)
{
//…….其他的代码
pDC->TextOut(100,100,”HelloWorld!
”);
}
但MFC不是万能的,WinAPI和VC中有很多功能在MFC中并不能反映出来。
在入门后,要想发挥VC的完全能力,WindowsAPI还是非常重要的。
而且,这些API在其他Windows语言中也用得到。
学语言,与练武道理也差不多。
VC、VB、Dlphi、VFP,以及其他的Windows编程语言,都属于同一个门派:
Windows门,虽然招式不同,但内功都是一样的,这就是WindowsAPI(应用编程接口),大概是两千个函数。
任何武功,招式即使再复杂,通常也能在很短时间内记下来;但内功就不是一朝一夕的事。
而且,各门派的内功不同,Unix、Linux门有Uinx的内功,Apple(苹果)门有Mac的内功,Java更是自成一派。
我们这里说的学VC,只是学招式,学招式一个月差不多就够了,聪明的两个星期就可以掌握。
光学招式,吓唬人是够了,但和高手一过招,非出丑不可。
要想精通VC,必须熟悉WindowsAPI。
D.高级语言与自然语言
一门高级语言与一门自然语言是类似的。
关键要素有三:
语法:
了解C和C++基本语法,这是比较容易的。
修辞:
编程的艺术和风格。
通常,这是与软件工程联系起来的。
算法上的小伎俩并非是关键的。
严谨,严格按照规范去做,同时又能发挥出极大的创造性,才是语言学家的本色。
词汇:
如何利用别人的工作?
如何利用自己以前的工作?
这是一个软件工程师成功的关键。
如果词汇量不丰富,就写不出好文章,就会有想法表达不出。
一个人的语法在上小学之前就基本上学成了,修辞水平也在年轻时就确定了,惟有词汇量需要根据需要不断学习、不断扩充。
VC编程中,拥有大的词汇量就意味着要掌握较多的类、函数和其他编程组件。
如:
WindowsSDK,MFC,以及你所专攻的领域的现成的SDK,比如3D编程中的OpenGL,多媒体编程中的DirectX,图像处理中的Victor库。
另外,ActiveX控件的掌握往往也是成败的关键。
我们这几年的工作也总结成了一个类库,叫IPX(图像处理框架),大大简化了图像处理的工作;不过现在还有很多细节问题要解决,如果有同学感兴趣可以参与这方面的工作。
学习VC,千万不要用我们在学校里学英语的方法,而要用小孩学说话的方法。
所谓学英语的方法,就是我们在本科时学C语言的那种模式:
详细搞懂每一个细节,背大量的规则,很少上机实践,没有实际问题供解决,最后由考试来断定学习成果。
这种模式的后果大家都清楚:
我们学了十几年英语,可有不少人还只会四五千个单词,写百把字的文章,不会说,不能听;尤其要命的是,看不懂VC的帮助文档。
我们要象婴儿一样,在使用中学会语法、修辞和词汇;一开始肯定只能编出最糟糕的,就好象小孩开始只会说:
“爸爸坐车车”;但“爸爸”“车车”这些词对小孩是最需要的,学习的效率反而最高。
学VC的时候,应从我的需要出发,先做一个最简单的东西,然后一点一点复杂起来,象滚雪球一样。
学习VC尤其要和别人交流,你苦苦思考不明白的,也许别人早就解决了。
一定要善于学习:
从书店找出有用的书;向身边的高手学习;寻找可以利用的源代码、类库、组件、控件、库;如果能上互连网,那就更加能解决问题了。
参考资料:
回答者:
l1530s-助理二级8-718:
09
去这个网站看看,我保证你什么问题都没有了.哈哈,这个假期之前我也是只懂C和C++,而在MFC方面还不如你呢.我甚至连什么是CDC都不知道,可是看过之后就觉得思路很清楚,试试吧,就是需要一点时间.我建议你先下载下来再看,这样可以自己调节进度.
8月10日
VC使用CDC绘图的程序摘录
以前一直用VC的GDI来画图,但一直没有整理过完整的过程,导致常常会产生一些怪异的现像
现摘录如下:
可以在ONCreate中创建内存DC,然后只要更新这个内存DC,再bitblt到显示DC上即可
CDC*pDC=GetDC();
pMem=newCDC;
pMem->CreateCompatibleDC(pDC);
pBitmap=newCBitmap;
w=GetSystemMetrics(SM_CXSCREEN);
h=GetSystemMetrics(SM_CYSCREEN);
pBitmap->CreateCompatibleBitmap(pDC,w,h);//如创建一个屏幕大小的bitmap
oldpBitmap=(CBitmap*)pMem->SelectObject(pBitmap);
pMem->SetTextColor(RGB(255,0,0));
于是在每次绘图时
CPenpen;
pen.CreatePen(PS_SOLID,1,RGB(0,255,255));
CPen*oldpen=(CPen*)pMem->SelectObject(&pen);
CBrushbrush(RGB(0,0,0));
CBrush*oldbrush=(CBrush*)pMem->SelectObject(&brush);
......//pen和brush绘图
CPenpen2;
pen2.CreatePen(PS_SOLID,1,RGB(255,255,0));
pMem->SelectObject(&pen2);
......//pen2绘图
pMem->SelectObject(oldpen);
pMem->SelectObject(oldbrush);
pen.DeleteObject();
brush.DeleteObject();
pen2.DeleteObject();
//从内存cpy到显存
CDC*pDC=GetDC();
pDC->BitBlt(0,0,w,h,pMem,0,0,SRCCOPY);
pDC->DeleteDC();//<<=====至关重要!
!
今天因为未把get的DC给del掉,结果贴了近10000遍图后产生得不到DC的错误
结束程序
pMem->SelectObject(oldpBitmap);
if(pBitmap)deletepBitmap;
if(pMem)deletepMem;
值得注意的是
在OnDraw(CDC*pDC)传入的DC指针,最后不能DeleteDC()掉
#
查看共享空间
更多信息
(没有名字)
8月11日11:
20
(
可能是你的调用方法不对,或openCV没有得到DC,具体openCV没有用过,楼上的继续努力哦
#
查看共享空间
更多信息
fee
8月11日10:
09
(
CDC绘画会不会和其他的画图语句冲突?
比方说用OPENCV的库函数画个矩形,好像就画不出来,非要用画笔才行,使我调用库函数的地方不对,还是确实有冲突呢?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 vc 中用 cdc 绘图