关于VC技术内幕-控件上绘图代码的解释

合集下载

VC中MFC绘图详细教程

VC中MFC绘图详细教程
休息 14
前一页
休息
字体对象 CFont NewFont; (2)创建字体
CreateFont( int nheight,int nWidth,//高,宽 int nEscapement, //每行文字相以于页底的角 int nOrienation, //每个….. DWORD nWeight , //字体粗细 DWORD dwltalic, //非零表示倾斜 DWORD dwUnderline, //非零表示下划线 DWORD dwStrikeout, //非零表示中划线 DWORD dwCharset, //字符集 DWORD dwOutputPrecision, //输出精度 DWORD dwClipPrecision, //剪裁精度 DWORD dwQuality, //输出质量 DWORD dwPitchAndFamily, //字体系列 lpszFaceName//字体名称} ; 前一页 DWORD 休息
4
休息
设备环境
设 备 环 境




获取设备环境 (1)使用GetDC()函数 CDC *CWnd GetDC() int ReleaseDC(CDC * pDC ) (2)直接构造CDC对象 用声明一个CDC类或其派生类对象的方式来 获取设备环境 CClientDC dc(CWnd *)
前一页
休息
3
设备环境

设 备 环 境

前一页
(1)CWindowDC 和CClientDC CPaintDC区别 CWindowDC提供客户区和非客户区画图的设备环 境;坐标原点在屏幕左上角 CClientDC CPaintDC提供画图的设备环境;坐标原 点在客户区左上角 (2) CClientDC 和CPaintDC区别 CPaintDC是响应WM_PAINT消息,用在OnPaint() 函数中;只支持屏幕显示 CClientDC不响应WM_PAINT消息,只担负此时的 绘图工作;支持屏幕显示,也支持打印 CDC常用函数(参见MSDN)

VC图像控件Picture编程

VC图像控件Picture编程

VC图像控件Picture
图像控件对应的MFC类为CStatic。

和静态文本控件属于同一个类。

属性
ID设置控件的ID。

visible是否可见
group将控件分组。

help id确定控件是否具有帮助ID
disabled是否可用
tab stop按tab键是否能够获得焦点
Type如果在Type类型中选择Icon或Bitmap,则Image可用,用于选择图像的ID。

如果选择Frame(帧)或Rectangle则Color可用,用于选择填充的颜色。

Enhanced Metafile 是增强图形元件。

sunken控件具有凹陷边框
notify选中后能够处理鼠标消息
right justify标签的宽度会增加
border控件具有边框
client edge使控件边框下凹
static edge控件边缘为实边框
modal frame控件呈现3D效果
transparent控件透明。

控件下方的窗口不会被控件掩盖。

accept files是否接受文件拖动。

用户在对话框中拖动一个文件,控件将收到WM_DROPFILES消息。

图像控件的默认ID为IDC_STATIC。

这样是不能够关联CStatic对象的。

如果要关联对象进行一些操作,如动态地更换图像,就需要更改ID,然后将其与CStatic对象关联。

visio vbc编程

visio vbc编程

visio vbc编程如何通过VBC编程在Visio中创建和修改绘图。

Visio是一种流程图和图表绘制工具,它可以使用户以视觉化方式展示复杂的数据和信息。

通过使用VBC编程语言,用户可以自动化创建和修改Visio 绘图,并为其添加各种功能和交互性。

在本文中,我们将探讨如何使用VBC编程来进行Visio绘图的创建和修改。

我们将按照以下步骤进行操作:第一步:了解VBC编程语言VBC是Microsoft Visual Basic for Applications的一种版本,它是一种灵活且易于学习和使用的编程语言。

VBC可以通过Microsoft Office系列产品(如Visio、Excel和Word)的宏来编写和执行代码。

在Visio中,用户可以使用VBC编程来创建和修改图形对象、控制绘图元素的属性以及实现自定义功能。

第二步:启动Visio并打开绘图首先,我们需要启动Visio应用程序,并打开我们想要进行编程的绘图。

我们可以通过访问Visio应用程序的对象模型来编程访问和操作绘图的各个方面。

第三步:创建新的形状接下来,我们将学习如何使用VBC编程在Visio中创建新的形状。

Visio提供了几种不同的形状类型供用户选择,例如矩形、圆形、箭头和文字框等。

我们可以使用VBC编程来创建这些形状,并设置它们的位置、大小和样式等属性。

第四步:修改形状属性一旦我们创建了形状,我们可以通过VBC编程来修改其属性。

例如,我们可以更改形状的大小、颜色、字体和边框样式等。

我们可以使用Visio应用程序对象模型中的属性和方法来实现这些修改。

第五步:创建连接线Visio不仅可以绘制单独的形状,还可以创建形状之间的连接线。

使用VBC编程,我们可以创建连接线对象,并将其连接到两个形状之间。

我们可以设置连接线的样式、颜色和宽度等属性,以及连接线的起点和终点。

第六步:实现自定义功能除了创建和修改形状和连接线之外,VBC编程还可以实现许多其他自定义功能。

计算机图形学 使用VC开发绘图程序的基本方法

计算机图形学  使用VC开发绘图程序的基本方法

七、思考题(尽量做,计入成绩) :
1、为什么要用 CDC 定义一个对象来作图? Windows 使用与设备无关的图形设备环境进行显示 。MFC 基础类库定义了设备环境对象类----CDC 类。 因为使用的是 mfc,如果是 sdk 的话就得用 dc,这个 cdc 想当是一个给设备画画的笔。 2、如果要绘制多条直线,应该如何编程?
4、 VC 中编程环境中,工程(project)是什么意义?为什么要用 project 的方式管理代码?
Project 文件的扩展名是 dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息, 每个工程都对应有一个 dsp 类型的文件。 clw 为扩展名的文件是用来存放应用程序中用到的类和资源的信 以 息的,这些信息是 VC 中的 ClassWizard 工具管理和使用类的信息来源。 因为用 project 的方式管理代码比较方便,可以看成是在一个文件夹下进行的。
3、 在 MyView.cpp 文件的 OnDraw 函数中加入如下代码。 pDC->MoveTo(100,100); pDC->LineTo(200,200); CPen *pOldPen; CPen dashPen; dashPen.CreatePen(PS_DASH,1,RGB(255,0,0)); pOldPen = pDC->SelectObject(&dashPen); pDC->LineTo(300,100); pDC->SelectObject(pOldPen); pDC->LineTo(400,200);
实验(No. 1
)题目:使用 VC 开发绘图程序的基本方法
实验目的及要求:
一、实验目的:
编写一个具有一定功能的 MFC 类库应用程序 (引入简单的视图/文档概念) 掌握 GDI 画图的基本方法, , 并调用系统函数画直线。

VC++绘图

VC++绘图
设置绘图模式设置绘图模式rr22blackblack像素总为黑色像素总为黑色rr22whitewhite像素总为白色像素总为白色rr22nopnop像素保持不变像素保持不变rr22not像素为显示颜色的反转色像素为显示颜色的反转色rr22copypencopypen缺省绘图模式缺省绘图模式像素为画笔颜色像素为画笔颜色rr22notcopypennotcopypen像素为画笔颜色的反转色像素为画笔颜色的反转色rr22maskpenmaskpen像素为显示颜色与画笔颜色的公共颜色的组合像素为显示颜色与画笔颜色的公共颜色的组合rr22notmaskpennotmaskpen像素为像素为rr22maskpenmaskpen颜色反转色颜色反转色rr22xorpenxorpen像素为画笔颜色与显示颜色的组合像素为画笔颜色与显示颜色的组合但不同时为这两种颜色但不同时为这两种颜色rr22notxopennotxopen像素为像素为rr22xorpenxorpen颜色反转色颜色反转色改变绘图模式的函数原型为
PS_DASHDOTDOT
含义 划线,即为虚 线 点划线 双点划线 点线
画笔风格 PS_INSIDEFRAME PS_NULL PS_SOLID
含义 在边界区域内实笔画线 空画笔 实线
PS_DOT
画笔对象初始化后,就可以调用CDC的成员函数SelectObject将画笔选入设备文本对 象。对于画笔,SelectObject的原型为:CPen* SelectObject(CPen* pPen); 其中,参数pPen是指向画笔对象的指针。
选择库存绘图工具
函数原型是:virtual CGdiObject* SelectStockObject(int nIndex); nIndex是所要选入设备文本对象的库存对象代码,对于画刷和画笔,其值 如表3-1所示。 例如,可以使用以下代码选择白色画笔和黑色画刷: pDC->SelectStockObject(WHITE_PEN); pDC->SelectStockObject(BLACK_BRUSH);

VC++绘图介绍-3

VC++绘图介绍-3

pDC->RoundRect(100,100,300,300,30,60); pDC->SetBkColor(RGB(255,255,0)); pDC->SetBkMode(OPAQUE); pDC->Ellipse(300,100,500,200); pDC->Pie(300,100,600,400,300,400,600,400); pDC->SelectObject(OldPen); pDC->SelectObject(OldBrush); }
ห้องสมุดไป่ตู้
void CMyLineView::OnMouseMove (UINT nFlags, CPoint point) { SetCursor(m_HCursor); //设置自定义光 设置自定义光 标 if(m_pLMouseDown) {CClientDC dc(this); dc.SetROP2(R2_NOT); //设置绘图模式, 设置绘图模式, 设置绘图模式 以屏幕颜色的相反色绘图
void CMyDrawView::OnDraw(CDC *pDC) { CPen Pen; CPen *OldPen; Pen.CreatePen(PS_SOLID,4,RGB(0,0,0)); OldPen=pDC->SelectObject(&Pen); POINT points[7];
points[0].x=100; points[0].y=100; points[1].x=200; points[1].y=200; points[2].x=300; points[2].y=200; points[3].x=400; points[3].y=300; points[4].x=500; points[4].y=400; points[5].x=300; points[5].y=400; points[6].x=200; points[6].y=400; pDC->PolyBezier(points,7); pDC-> SelectObject(OldPen);}

VC6.0简单绘图说明

VC6.0简单绘图说明

第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。

有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。

可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。

初学编程想要绘图就得用TC,很是无奈。

还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。

所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。

新的图形学的书有不少是用的OpenGL,可是门槛依然很高。

要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。

下面是VC下简单绘图函数的基本说明。

1.系统支持操作系统版本:Windows 2000 及以上系统。

编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。

2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。

安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。

安装程序不会修改注册表或者本机的任何文件。

如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。

3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。

在vc窗口中绘图

在vc窗口中绘图

图形设备接口(GDI)与设备描述表(DC)图形设备接口(GDI)许多MS-DOS程序都直接往视频存储区或打印机端口输送数据,这种做法的不利之处在于需要对每种显示卡或打印机类型提供相应的驱动程序。

Windows则提供了一抽象的接口,称之为图形设备接口(GDI)。

Windows 己经提供了各种显示卡及打印机的驱动程序,这样我们的程序就可以不必关心与系统相连的显示卡及打印机的类型。

我们的程序可以通过调用GDI函数和硬件打交道,而各种GDI函数会自动参考被称为设备环境(CDC)的数据结构。

Windows会自动将设备环境结构映射到相应的物理设备,并且会提供正确的输入输出指令。

设备描述表(DC)在Windows环境中,各程序的输出必须限制在自己的窗口中。

GDI使用一种简单的机制保证在窗口中画图的各程序遵循这个规则。

这种机制即为设备描述表(DC);当Windows程序在屏幕、打印机或其它设备上画图时,它并不是将像素直接输出到设备上,而是将图绘制到由设备描述表表示的逻辑意义上的"显示平面"上去。

设备描述表是深寓于Windows中的一种数据结构,它包含GDI需要的所有关于显示平面情况的描述字段,包括相连的物理设备和各种各样的状态信息。

设备描述表对象在使用MFC编制Windows程序时,设备描述表具有更加突出的作用。

除了可作为通往各种设备的桥梁之外,设备描述表对象还封装了程序用来产生输出的GDI函数。

在MFC中,你不用捕获设备描述表句柄和调用GDI输出函数,至少不必直接捕获和调用,而是通过创建一设备描述表对象并调用它的成员函数来画图。

设备描述表句柄在平面上画图之前,Windows程序从GDI获取设备描述表句柄,并在每次调用完GDI输出函数时将句柄返回给GDI。

在MFC应用程序中获取设备描述表的一种方法是调用CWnd::GetDC,它返回指向表示Windows设备描述表的CDC对象的指针。

在画图完毕,要用CWnd::ReleaseDC释放指针(注:在OnPaint处理程序中,不用显示调用这两个函数)CDC派生类为了避免获取和释放设备描述表所带来的麻烦,MFC提供了一些CDC派生类,如CPaintDC,CClientDC,CWindowDC这些类被设计为可直接进行实例化。

VC++中利用MFC绘图的几种方法的探讨

VC++中利用MFC绘图的几种方法的探讨

基于OpenGL的绘图
04
方法
OpenGL简介
OpenGL(Open Graphics Library) 是一个跨语言、跨平台的专业图形编程 接口,用于渲染2D和3D图形。
OpenGL独立于窗口系统和操作系统,可以 在各种计算机平台上实现高性能的图形渲染 。
OpenGL提供了一套丰富的图形处 理功能,包括建模、变换、光照、 纹理映射等。
Direct2D绘图
适用于需要高性能绘图的场景,如游戏、多媒体应用、实时渲染等 。
方法选择建议
对于简单的图形绘制和文本输出,可以选择使用GDI 绘图。
对于需要更丰富的图形处理功能的场景,可以选择使 用GDI+绘图。
对于需要高性能绘图的场景,建议选择使用Direct2D 绘图。同时,需要注意Direct2D的使用门槛相对较高
VC++中利用MFC绘图 的几种方法的探讨
汇报人:XX 20XX-01-27
目录
• 引言 • 基于GDI+的绘图方法 • 基于Direct2D的绘图方法 • 基于OpenGL的绘图方法 • 基于自定义控件的绘图方法 • 绘图方法比较与选择
引言
01
目的和背景
探讨VC中利用MFC进行绘图的 方法和技巧,提高开发效率和绘
调用 ID2D1DeviceContext对 象的EndDraw方法结束绘 图,并检查绘图操作是否 成功。
优缺点分析
硬件加速
Direct2D利用硬件加速技术,可以 显著提高图形渲染的性能。
丰富的图形处理功能
Direct2D提供了丰富的图形处理功能 ,如变换、裁剪、透明度和图层等, 可以满足各种复杂的图形需求。
Direct2D可以与其他DirectX技术(如 Direct3D和DirectWrite)无缝集成,以实现更 复杂的图形效果。

C++绘图介绍

C++绘图介绍

BOOL CreatePen(int nPenStyle, int nWidth,COLORREF crColor); nPenStyle : PS_SOLID PS_DOT PS_DASH PS_DASHDOT PS_DASHDOTDOT nWidth : 线的宽度 线宽>1均产生实线 线的宽度(线宽 均产生实线) 线宽 均产生实线
1.2 选择绘图工具
画笔,画刷,字体等等。 画笔,画刷,字体等等。 系统默认的画笔和画刷: 系统默认的画笔和画刷: 默认的画笔画出的线为宽度为1像素 默认的画笔画出的线为宽度为 像素 的黑色实线。 默认的画刷是白色的, 的黑色实线 。 默认的画刷是白色的 , 己用默认的画刷填充图形时, 己用默认的画刷填充图形时 , 图形的 内部填充成白色。 内部填充成白色。
RGB(0,0,0);黑色 黑色RGB(255,255,255);白色 黑色 白色 RGB(128,0,0);深红 深红RGB(255,0,0);淡红 深红 淡红 RGB(0, 128,0);深绿 深绿RGB(0, 255,0);淡绿 深绿 淡绿 RGB(0,0,128);深蓝 深蓝RGB(0,0.255);淡蓝 淡蓝 深蓝 RGB(128,128,0);深黄 深黄 RGB(255,255,0);淡黄 淡黄 RGB(0,128,128);深青 深青 RGB(0,255,255);淡青 等。 淡青
选择画笔2 选择画笔
画刷的2种初始化方法: 画刷的2种初始化方法: BOOL CreateSolidBrush( COLORREF crColor); BOOL CreateHatchBrush( int nIndex,COLORREF crColor);
影线方式:水平,垂直, 影线方式:水平,垂直,斜,网格等

vc6对话框或控件上显示图片

vc6对话框或控件上显示图片

VC中在对话框上显示图片用图片控件,好像图片最多色彩数不超过256色,也就是8位,但是用代码在里面写的方法就可以解决这个问题了.让一个对话框显示背景通常有两种做法:使用图片控件、在WM_PAINT消息中画图。

用图片控件非常简单,但功能功能不强大,不能对图片拉申等。

在WM_PAINT中画图,相对复杂,但可以做很多特殊处理(如对图片拉申、图片取反等等)。

那么下面就对两种方法略述。

1、用图片控件在对话框中加入Picture控件,属性页中General->Type设为Bitmap, Image中选中相关联的图片资源号。

这样就编译运行,你就会发现它己经可以了。

耶,不对,图片复盖了其它控件!怎么办?哈哈,这是由于你的Picture控件是后面放上去的。

这样它会显示在最上层,所以有些控件看不到了。

有两种方法可以解决:(1)、选中所有控件Ctrl+A, 然后取消对图片控件的选择,将其它控件剪切Ctrl+X,再粘帖Ctrl+C,编译运行或Ctrl+T看看,是不是可以了?(2)、在.rc文件中找到此对话框的定义,此处以例子中的一对话框为例。

(用记事本打开.rc 文件)IDD_DLG_USE_STA TIC DIALOGEX 0, 0, 266, 201STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENUEXSTYLE WS_EX_APPWINDOWCAPTION "DlgUseStatic"FONT 9, "宋体"BEGINCONTROL 129,IDC_STATIC,"Static",SS_BITMAP,0,0,266,201PUSHBUTTON "取消",IDCANCEL,210,23,50,14DEFPUSHBUTTON "确定",IDOK,210,7,50,14LTEXT "这是个通过图片控件来实现Dialog背景的",IDC_STATIC,13,106,156,8PUSHBUTTON "方法二>>",IDC_BUTTON1,215,104,50,14END在BEGIN至END中便是各个控件的定义和先后顺序,你可以随意调整它们的顺序,这样最先的,它将会显示在最底层(即可能被其它控件覆盖)。

VC6屏幕的绘图基础总结

VC6屏幕的绘图基础总结

VC6屏幕的绘图基础总结VC6屏幕的绘图基础总结VC6屏幕的绘图基础总结在VC6中,屏幕绘图是通过设备环境(Device Context)实现的,它是GDI的的关键元素。

一、设备环境获取的一些函数:WINUSERAPI HDC WINAPI GetDC(HWND hWnd); //获取窗口的设备环境WINUSERAPI HDC WINAPI GetWindowDC( HWND hWnd);WINGDIAPI HDC WINAPI CreateCompatibleDC(HDC);二、设备环境的坐标:(1)、设备坐标:指的是显示设备或者打印设备坐标系下的坐标。

这种坐标以设备上的像素点为坐标单位,通常情况下,它的原点在窗口客户区的左上角。

(2)、逻辑坐标:指的是各种映射模式下的坐标。

(3)、物理坐标:指的是开发人员自定义的坐标。

三、设备环境的颜色COLORREF数据类型,用8位十六进制值0x00bbggrr表示一个RGB(红、绿、蓝)值,每个颜色分量的最大值为0xff。

获取一个COLORREF变量的各分量颜色值的宏:BYTE GetRValue(DWORD rgb); //取得红色分量值BYTE GetGValue(DWORD rgb); //取得绿色分量值BYET GetBValue(DWORD rgb); //取得蓝色分量值COLORREF RGB(BYTE red,BYTE green,BYTE blue);四、使用GDI对象定义GDI对象后,要用SelectObject()函数把定义的GDI对象选择用在当前的环境中。

例如:HDC hdc;HBRUSH hbr;hdc=GetDC(hwnd);hbr=CreateSolidBrush(RGB(255,0,0));SelectObject(hdc,hbr);五、使用画刷画刷(HBRUSH)可以用来填充指定区域的特性。

画刷通常包括填充颜色、填充图案、填充样式3种属性。

VC图形编程讲解

VC图形编程讲解

建立并运行这个程序,选择Build 菜单下的!Executive hello.exe
2.2 windows图形系统
2.2.1 图形设备接口(Graphical Device Interface,GDI) 是windows用来管理图形操作 的一个与设备无关的函数库,提供了许多 有关图形操作的API函数。 Windows图形编程主要是利用图形设备接口 (GDI)中的相关函数实现的。
2.2.2 设备环境类
•设备环境DC(Device Context)又称设备上下文,也 称设备描述表。
DC 实际上是一个关于如何绘制图形的方法的集 合,它不仅可以绘制各种图形,而且还可以确定在应 用窗口中绘制图形的方式,即确定绘图模式和映射模 式。
用户在绘图之前,必须获取窗口区域的一个设备 环境DC。接着才能进行 GDI函数的调用,执行适合于 设备环境DC的命令。
void CHelloView::OnDraw(CDC* pDC) {
CPixelDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); // TODO: add draw code for native data here
pDC->TextOut(100,100,"Hello!");

CDC类的派生类简介
派生类名称 CClientDC 说 明 这是一个设备描述表,提供对窗口客户区域的图形访问。 在窗口中画图时可使用此类DC,但对WM_PAINT Windows消息除外。 这个设备描述表代表Windows元文件,它包含一系列命令 已重新产生图像,想要创建独立于设备的文件是可用此类 DC,用户可以回放这种文件来创建图像。 这是创建响应WM_PAINT Windows消息的设备描述表。应 用程序可以使用此DC更新Windows显示,通常在MFC应用 程序的OnPaint()函数中使用。 可以提供在整个窗口(包括客户区和非客户区)中画图的 设备描述表。

VC源码-在控件中绘图

VC源码-在控件中绘图

VC实现波形不闪烁动态绘图一、程序运行时波形效果二、在信号处理中,通常需要把采集信号的实时波形显示出来。

如果直接在屏幕上动态绘图的话,会出现闪烁现象,为了克服这个问题,本文采用的就是先在内存绘图,然后再拷贝到屏幕,从而实现动态绘图而不闪烁。

详细介绍如下:2.1首先在头文件中定义以下私有变量,并在对话框资源中放置一个picture控件private:CDC *pDC; //屏幕绘图设备CDC memDC; //内存绘图设备int m_High; //绘图起点int m_Low; //绘图终点int m_lCount[1024]; //数据存储数组int m_now; //记录波形当前点2.2在实现文件中初始化变量,并设置定时器BOOL CDrawTest::OnInitDialog()?{CDialog::OnInitDialog();// TODO: Add extra initialization herem_Low = 0;m_High = 1024;m_now =0;SetTimer(1,100,NULL);return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}2.3在定时器里创建内存绘图设备,并调用绘图函数在内存设备中绘图,绘图完毕后把内存设备中图拷贝到屏幕void CDrawTest::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCRect rect;CWnd* pWnd = GetDlgItem(IDC_COORD);//获得对话框上的picture的窗口句柄pWnd->GetClientRect(&rect);// 指针pDC = pWnd->GetDC();pWnd->Invalidate();pWnd->UpdateWindow();//内存绘图CBitmap memBitmap;CBitmap* pOldBmp = NULL;//创建内存绘图设备memDC.CreateCompatibleDC(pDC);memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom); pOldBmp = memDC.SelectObject(&memBitmap);memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);//自定义绘图函数,详细见源程序DrawWave(&memDC);//把内存绘图拷贝到屏幕pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);memDC.SelectObject(pOldBmp);memDC.DeleteDC();memBitmap.DeleteObject();CDialog::OnTimer(nIDEvent);}void CDrawTest::DrawWave(CDC *pDC){CRect rect;CString str;int i;int m_left,m_top,m_right,m_bottom;int m_Interval = (m_High - m_Low)/10;if (m_Interval < 1) m_Interval = 1;CWnd* pWnd = GetDlgItem(IDC_COORD);pWnd->GetClientRect(&rect);pDC->Rectangle(&rect);m_left = rect.left+10;m_top = rect.top+10;m_right = rect.right-10;m_bottom = rect.bottom-20;int m_IntervalPan = (m_right - m_left)/11;if (m_IntervalPan < 1 ) m_IntervalPan =1;// 创建画笔对象CPen* pPenRed = new CPen;// 红色画笔pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));// 创建画笔对象CPen* pPenBlue = new CPen;// 蓝色画笔pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));// 创建画笔对象CPen* pPenGreen = new CPen;// 绿色画笔pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0));// 选中当前红色画笔,并保存以前的画笔CGdiObject* pOldPen = pDC->SelectObject(pPenRed);// 绘制坐标轴pDC->MoveTo(m_left,m_top);// 垂直轴pDC->LineTo(m_left,m_bottom);// 水平轴pDC->LineTo(m_right,m_bottom);// 写X轴刻度值for(i=0;i<10;i++){//str.Format(_T("%d"),m_Min+i*m_Interval);str.Format(_T("%d"),m_Low+i*m_Interval);pDC->TextOut(m_left+i*m_IntervalPan,m_bottom+3,str); }//str.Format(_T("%d"),m_Max);str.Format(_T("%d"),m_High);pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);// 绘制X轴刻度for (i = m_left; i < m_right-20; i += 5){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, m_bottom);pDC->LineTo(i + 10, m_bottom+4);}else{// 10的倍数pDC->MoveTo(i + 10, m_bottom);pDC->LineTo(i + 10, m_bottom+2);}}// 绘制Y轴箭头pDC->MoveTo(m_right-5,m_bottom-5);pDC->LineTo(m_right,m_bottom);pDC->LineTo(m_right-5,m_bottom+5);// 绘制X轴箭头pDC->MoveTo(m_left-5,m_top+5);pDC->LineTo(m_left,m_top);pDC->LineTo(m_left+5,m_top+5);// 绘制Y轴网格选择绿色画笔pDC->SelectObject(pPenGreen);//int iTemp = (m_bottom - m_top)/5;for (i = 1 ;i <= 5 ;i++){pDC->MoveTo(m_left,m_bottom - i*iTemp);pDC->LineTo(m_right,m_bottom - i*iTemp);}//数组赋值if(m_now<1024){m_now++;}else{m_now = 0;}for(i = m_Low;i<m_High;i++){//m_lCount[i]=(rand()%10+rand()%100+rand()%1000)%1024; m_lCount[i] = (int)(sin(i-m_now)*204);}int xTemp;int yTemp;// 更改成蓝色画笔pDC->SelectObject(pPenBlue);for (i = m_Low; i <= m_High; i=i+3){xTemp = m_left+(i-m_Low)*m_IntervalPan/m_Interval; yTemp = m_bottom/2 - (int) (m_lCount[i] * m_bottom / 1024); if (yTemp < m_top) yTemp = m_top;if((xTemp >=m_left)&&(xTemp <=m_right)){pDC->MoveTo(xTemp, m_bottom/2);pDC->LineTo(xTemp, yTemp);}}// 恢复以前的画笔pDC->SelectObject(pOldPen);delete pPenRed;delete pPenBlue;delete pPenGreen;return; }。

VC++6.0绘图基础

VC++6.0绘图基础

2.3.3 CDC类的主要绘图成员函数
1. 绘制像素函数
• 类属:CDC::SetPixel • 原型:COLORREF SetPixel(int x,int y,COLORREF crColor ); • 设置某像素点的RGB值
1. 绘制像素函数
• 参数说明:SetPixel 函数中,COLORREF是32位 颜色数据类型; • 第一和第二个参数x,y是像素点位置的逻辑坐标 值, • 第三个参数crColor是像素点的颜色值, COLORREF型变量可以利用RGB(bRed, bGreen,bBlue)来指定相应的颜色值,每种颜 色用一个字节表示,可以被设定为0~255之间的 任意值,0代表无色,255代表全色。
MM_TWIPS
MM_ISOTROPIC
MM_ANSIOTROPIC
映射模式
• 在缺省情况下,一般使用的是设备坐标系 MM_TEXT,坐标原点位于客户区的左上角, X轴水平向右,Y轴垂直向下,坐标基本单 位为一个像素。
1. 设置映射模式函数
• 类属:CDC::SetMapMode • 原型:virtual int SetMapMode(int nMapMode ); • 返回值:原映射模式。 • 参数说明:nMapMode是表2-1的模式代码。
• 在【Resource View】 面板中显示所创建的 资源
• 在【FileView】面板中 显示源程序文件,主 要包括程序源文件 (*.CPP) 、头文件 (*.h) 和资源文件 (*.ico、*.bmp等)
• 从【ClassView】面板可以看出
– CTestApp是应用的主函数类,用来处理消息。 – MFC中的数据是存储在CTestDoc类文档中 – 结果的显示是在CTestView类中 – 文档类负责管理和维护数据本身 – 视图类负责处理用户鼠标和键盘的操作

VC中图像控件的用法与总结

VC中图像控件的用法与总结

VC中图像控件的用法与总结使用picture控件动态显示图片方法一控件适应于图片尺寸添加一个picture控件,修改ID为IDC-PICTURE,并添加一CBitmap m_bmp成员变量在OnInitDialog()函数中添加如下代码if(m_bmp.m_hObject!=NULL) m_bmp.DeleteObject();//以绝对路径加载BMP图片HBITMAPhbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"1.b mp",IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE);if(hbmp==NULL) return false;//获得加载位图的文件信息m_bmp.Attach(hbmp);DIBSECTION ds;BITMAPINFOHEADER &bminfo=ds.dsBmih;//获得位图信息图m_bmp.GetObject(sizeof(ds),&ds);int cx=bminfo.biWidth;//获得位图宽度int cy=bminfo.biHeight;//获得位图高度//该段程序根据图象的宽和高,调整控件大小,让它正好显示一张图片CRect rect;GetDlgItem(IDC_PICTRUE)->GetWindowRect(&rect);//获得控件所在矩形区域ScreenToClient(&rect);GetDlgItem(IDC_PICTRUE)->MoveWindow(rect.left,rect.top, cx,cy,true);//调整控件大小在OnPaint()函数中添加如下代码//三种方法获得pictrue控件DC,图象将被绘制在控件上CPaintDC dc(GetDlgItem(IDC_PICTRUE));//CPaintDC dc(this);//CDC dc;//dc.m_hDC=::GetDC(NULL);CRect rcclient;GetDlgItem(IDC_PICTRUE)->GetClientRect(&rcclient);CDC memdc;memdc.CreateCompatibleDC(&dc);CBitmap bitmap;bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclie nt.Height());memdc.SelectObject(&bitmap);CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_h DC,0);CDC maskdc;maskdc.CreateCompatibleDC(&dc);CBitmap maskbitmap;maskbitmap.CreateBitmap(rcclient.Width(),rcclient.Height(), 1,1,NULL);maskdc.SelectObject(&maskbitmap);maskdc.BitBlt(0,0,rcclient.Width(),rcclient.Height(),&memdc, rcclient.left,rcclient.top,SRCC OPY);CBrush brush;brush.CreatePatternBrush(&m_bmp);dc.FillRect(rcclient,&brush);dc.BitBlt(rcclient.left,rcclient.top,rcclient.Width(),rcclient.Hei ght(),&memdc,rcclient.left,rcclient.top,SRCPAINT);brush.DeleteObject();二图片适用于控件尺寸添加一个picture控件,修改ID为IDC-PICTURE在OnPaint()函数中添加如下代码CWnd *pWnd=GetDlgItem(IDC_PICTRUE);//获得pictrue控件窗口的句柄CRect rect;pWnd->GetClientRect(&rect);//获得pictrue控件所在的举行区域CDC *pDC=pWnd->GetDC();//获得pictrue控件的DCIStream *pStm;CFileStatus fstatus;CFile file;LONG cb;IPicture *pPic;//定义显示图片的接口(可显示jpg格式图片)CString m_sPath="1.BMP";//设置想要显示的图片//打开图象文件,获取文件字节数if(file.Open(m_sPath,CFile::modeRead) && file.GetStatus(m_sPath,fstatus)&& ((cb=fstatus.m_size)!=-1)){//分配全局存储空间HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);LPVOID pvData=NULL;if(hGlobal!=NULL){//锁定分配内存块if((pvData=GlobalLock(hGlobal))!=NULL){//读入文件到内存缓冲区file.ReadHuge(pvData,cb);GlobalUnlock(hGlobal);CreateStreamOnHGlobal(hGlobal,true,&pStm);}}}//装载图象文件if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID _IPicture,(LPVOID*)&pPi c))){OLE_XSIZE_HIMETRIC hmWidth;OLE_XSIZE_HIMETRIC hmHeight;pPic->get_Width(&hmWidth);//获得图象真实宽度pPic->get_Height(&hmHeight);//获得图象真实高度//在控件上显示图片pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeigh t,hmWidth,-hmHeight,NULL);pPic->Release();}图片显示通用模块首先为类添加如下两个函数和一个成员变量IPicture* m_pPicture;//图片加载函数HRESULT LoadFromBuffer(BYTE *pBuff, int nSize){bool bResult=false;HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,nSize);//分配内存空间void *pData=GlobalLock(hGlobal);//定义图象数据指针memcpy(pData,pBuff,nSize);GlobalUnlock(hGlobal);//释放内存空间IStream *pStream=NULL;//定义数据流指针//创建数据流if(CreateStreamOnHGlobal(hGlobal,TRUE,&pStream)==S_OK){HRESULT hr;//定义返回结果if((hr=OleLoadPicture(pStream,nSize,FALSE,IID_IPicture,(LPV OID*)&m_pPicture))==S_ OK)bResult=true;pStream->Release();//释放数据流}return bResult;}//图片显示函数BOOL DrawFromFile(CString filename, CDC *pDC){CFile cFile;CFileException e;//打开文件if(cFile.Open(filename,CFile::modeRead | CFile::typeBinary,&e)){BYTE *pBuff=new BYTE[cFile.GetLength()];//定义分配内存if(cFile.Read(pBuff,cFile.GetLength())>0)//将文件读入缓存LoadFromBuffer(pBuff,cFile.GetLength());delete []pBuff;//释放缓存long hmWidth,hmHeight;m_pPicture->get_Width(&hmWidth);m_pPicture->get_Height(&hmHeight);//获取图片尺寸intnWidth=MulDiv(hmWidth,pDC->GetDeviceCaps(LOGPIXELSX),2 540);intnHeight=MulDiv(hmHeight,pDC->GetDeviceCaps(LOGPIXELSX), 2540);//在内存中画CDC MenDC;CBitmap bmp;bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);MenDC.CreateCompatibleDC(NULL);MenDC.SelectObject(&bmp);m_pPicture->Render(MenDC.m_hDC,0,0,nWidth,nHeight,0,h mHeight,hmWidth,-hmHeight, NULL);//将内存中画拷贝到目的地pDC->BitBlt(0,0,nWidth,nHeight,&MenDC,0,0,SRCCOPY);}return true;}然后在OnPaint()函数中显示void CDialogDlg::OnPaint(){CPaintDC dc(this); // device context for paintingif (IsIconic()){SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.DrawIcon(x, y, m_hIcon); }else{CString filename;filename="1.bmp"; DrawFromFile(filename,&dc); CDialog::OnPaint();}}。

轻松学VisualC之常用控件介绍

轻松学VisualC之常用控件介绍

单选框按钮例子
下面举个单选框的小例子,实现单击“查询” 按钮弹出用户所选择的职业。
5.4 复选框按钮
复选框按钮(Check Box)也是Windows提 供的又一种很常见的按钮。但是使用的时候不 需要像单选按钮那样进行分组。可以使用复选 按钮,从一组选项中选择一个选项或多个选项, 各个选项之间的选中状态互不相关。本节也只 介绍复选框最常用的操作,其它一些属性或控 件类型变量的使用可根据前几节介绍的方法自 己尝试或查看相应的帮助文档。
第5章 常用控件介绍
控件是Windows应用程序的图形界面的重要组成 部分,用户可以通过控件完成与应用程序的交互。 控件其实在MFC中是对数据和方法的封装,当然 控件就有自己的属性和方法。在MFC中,所有的 控件都是由CWnd类派生来的,所以控件可以作 为对话框的子窗口而创建。本章以对话框程序为 基础介绍一些基本和常用的控件,学习掌握 Windows控件一般的使用方法和步骤。
5.3 单选按钮
使用单选按钮(Radio Button)从一组选 项中选择唯一一个选项,当我们在填写表格 时经常会用到。例如,在一组职业中选择你 的职业等。本节讲解单选按钮最常用的操作 及一些特点。
单选按钮的特点及其应用
单选按钮(Radio Button)不同于前面讲的 那些控件,它有自己一套独特的操作方式。 单选按钮通常以组的方式呈现,在组中选择 符合要求的那个选项。
输入
信息是否已存在
N
插入
选择
Y
调整顺序
显示
5.7 列表视图控件
在5.5节讲过列表框,列表视图可以当做是 功能增强型的列表框。列表视图控件可以很 好的用来显示项目元素,在编写数据库软件 时也经常会用到。在Windows系统中文件 夹目录也是以列表视图呈现。

利用VC编写简单的绘图程序

利用VC编写简单的绘图程序

利用VC编写简单的绘图程序上机实验环境亦可选择Microsoft Visual C++〔以下简称VC〕。

VC是美国微软公司生产的基于其Windows系统的软件开发工具。

它具有使用灵活,并与32位Windows内核〔使用于Windows 2000/Windows XP〕高度兼容的特点,从而被Windows程序员们广泛使用。

VC 在图形图像处理方面有着广泛的应用,MFC中提供了大量的图形图像函数,下面我们将对使用VC/MFC编写简单的绘图程序。

一、使用VC编写MFC单文档应用程序很简单,只需要按照下面几个步骤进行:1.翻开MSVC集成开发环境。

双击桌面或“开始〞菜单中的Microsoft VisualC++6.0,不久将看到VC的编辑窗口,如图3-5:图1 VC启动界面2.选择菜单“File | New〞,在弹出的对话框中1)单击上方的选项卡“Project〞,2)选择“MFC AppWizard(exe)〞,3)在“Project name〞一栏中填写工程名,例如draw,4)在“Location〞一栏中填写你想把文件存放的位置〔目录〕。

然后按“OK〞。

见图2。

注意:第4〕步中指定你自己的目录,不要使用系统的缺省目录或者随便放在根目录或者其他的目录下。

这样便于你找到自己编写的程序。

图2 应用程序向导主界面3.在MFC Appwizard-Step 1中选择“Single Document〞,即单文档应用程序,点击“Finish〞,如图3所示。

注意:对于下面的操作我们可以忽略,直接点Finish即可。

图3 应用程序向导中选择单文档视图4.系统弹出一个当前工程信息的对话框,如图4所示,直接点“OK〞即可。

图4 新建工程信息5.进入程序编写的主界面,屏幕左下方为工作区,如图5所示,工作区中共有三种视图,分别是:1)文件视图〔“FileView〞〕,主要包括头文件,cpp文件以及资源文件。

我们在头文件中一般添加类的定义,类的成员变量和函数的声明,而在cpp文件中具体实现函数。

vc深入详解之绘图控制

vc深入详解之绘图控制

VC++深入详解之绘图控制2009-12-18 12:291.简单绘图:1)新建一个单文档类型的MFC AppWizard(exe)工程;2)为此程序添加一个子菜单,并为其添加四个菜单项,分别用来控制不同图形的绘制,修改每个菜单项的ID号,并分别为这四个菜单项添加命令响应函数;3)当用户单击某个菜单项时,应该把用户的选择保存起来,以便后面的绘图操作使用,所以为View类添加一个私有变量来保存用户的选择,在视类的构造函数中将此变量初始化为0,选择不同的菜单项时,该变量为不同的值。

4)画图不外乎由2个点来确定:鼠标按下(获取起始坐标)+鼠标弹起(获取最终坐标+响应函数)。

而菜单项响应仅仅是起标记作用;其最终结果是由鼠标弹起响应,因此就需要为视类分别捕获鼠标左键按下和松开这两个消息,按下时需要将鼠标当前点保存起来(所以再为视类添加一个CPoint类型的私有成员变量,并在构造函数中初始化);5)在鼠标左键按下消息响应函数中,保存当前点,void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or calldefaultm_ptOrigin=point;//保存当前点CView::OnLButtonDown(nFlags, point);}6)在鼠标左键松开消息响应函数中实现绘图功能,void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);//绘图之前需要有DC对象switch (m_nDrawType){case 1://画点dc.SetPixel(point,RGB(255,0,0));break;case 2://画直线dc.MoveTo(m_ptOrigin);//移动到原点dc.LineTo(point);//绘制到终点break;case 3://画矩形dc.Rectangle(CRect(m_ptOrigin,point));break;case 4://画椭圆dc.Ellipse(CRect(m_ptOrigin,point));break;}CView::OnLButtonUp(nFlags, point);}7)绘图函数控制:线条的颜色是由DC中画笔的颜色确定的,这样就需要构造一个CPen对象,并为它指定一种颜色,然后将此画笔选入设备描述表中,在鼠标左键松开消息响应函数中实现CPen pen(PS_SOLID,m_NLineWidth,RGB(255,0,0)); //构造一个CPen对象,指定线型,线宽,颜色dc.SelectObject(&pen);//将此画笔选入设备描述表中8)不想使用DC默认的白色画刷来填充矩形内部,而希望能够看到这些图形的内部内容,可以把DC的画刷设置为透明的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于"VC技术内幕"-控件上绘图代码的解释
vc技术内幕,有一节关于在对话框上控件画图(6.8节)的代码:
void CMyDlg::OnPaint()
{
CWnd *pWnd = GetDlgItem(IDC_STATIC1);
RECT rect;
pWnd->GetClientRect(&rect);
CDC *pControlDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->Rectangle(rect.left, rect.top, rect.right,rect.bottom);
pWnd->ReleaseDC(pControlDC);
}
这里连用了pWnd->Invalidate(); pWnd->UpdateWindow();
原文解释:“这里面的一个技巧就在于我们既要在控件窗口内绘图,又要防止Windows对它进行重复绘制。


就是这两句代码(pWnd->Invalidate(); pWnd->UpdateWindow(); )让许多人摸不着头脑。

归纳起来有两种问题:
1、认为这是死循环
这是初学者提的问题,这里需指出:pWnd是IDC_STA TIC控件的指针,并不是对当前窗体
2、对Invalidate、UpdateWindow均会引起WM_PAINT事件的不解
“系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和InvalidateRgn函数来完成的。

InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update Region中,当应用的消息队列没有其他消息时,如果窗口的Update Region不为空时,系统就会自动产生WM_PAINT消息。

”最后一句话指出了问题所在,Invalidate使客户区无效,但并没有及时触发WM_PAINT,WM_PAINT 是由系统控制的,只有当在消息队列没有其他消息时才触发WM_PAINT
系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?
"这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做,这样有利于提高绘制的效率:在两个WM_PAINT消息之间多个Invalidate调用使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。

像这种通过InvalidateRect和InvalidateRgn 来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有
时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。

UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管Update Region是否为空等"
这也就解释了代码中去掉pWnd->UpdateWindow() 后不能出现所绘图的现象,其实图像已经绘制,只不过被Invalidate滞后触发的WM_PAINT刷了
MSDN的解释
pWnd->Invalidate();
Specifies whether the background within the update region is to be erased
pWnd->UpdateWindow();
Updates the client area by sending aWM_PAINT message if the update region is not empty. The UpdateWindow member function sends a WM_PAINT message directly, bypassing the application queue. If the update region is empty, WM_PAINT is not sent.
本文来自CSDN博客,转载请标明出处:/sinhua_ren/archive/2007/06/21/1660473.aspx。

相关文档
最新文档