MFC编程参考Word文档下载推荐.docx

上传人:b****5 文档编号:19914108 上传时间:2023-01-12 格式:DOCX 页数:18 大小:37.13KB
下载 相关 举报
MFC编程参考Word文档下载推荐.docx_第1页
第1页 / 共18页
MFC编程参考Word文档下载推荐.docx_第2页
第2页 / 共18页
MFC编程参考Word文档下载推荐.docx_第3页
第3页 / 共18页
MFC编程参考Word文档下载推荐.docx_第4页
第4页 / 共18页
MFC编程参考Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

MFC编程参考Word文档下载推荐.docx

《MFC编程参考Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MFC编程参考Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

MFC编程参考Word文档下载推荐.docx

typedefunsignedshortWORD;

双字

DWORD

4B

typedefunsignedlongDWORD;

无符号整数

UINT

2B(Win16)/4B(Win32)

typedefunsignedintUINT;

(2)四字符代码

为了简化RIFF文件中的4字符标识的读写与比较,WindowsSDK在多媒体头文件mmsystem.h中定义了类型FOURCC(Four-CharacterCode四字符代码):

typedefDWORDFOURCC;

及其构造宏(用于将4个字符转换成一个FOURCC数据)

FOURCCmmioFOURCC(CHARch0,CHARch1,CHARch2,CHARch3);

其定义为MAKEFOURCC宏:

#definemmioFOURCC(ch0,ch1,ch2,ch3)MAKEFOURCC(ch0,ch1,ch2,ch3);

而MAKEFOURCC宏定义为:

#defineMAKEFOURCC(ch0,ch1,ch2,ch3)\

((DWORD)(BYTE)(ch0)|((DWORD)(BYTE)(ch1)<

8)|\

((DWORD)(BYTE)(ch2)<

16)|((DWORD)(BYTE)(ch3)<

24));

例如:

#include<

mmsystem.h>

#defineID_RIFFmmioFOURCC('

R'

'

I'

F'

#defineID_WAVEmmioFOURCC('

W'

A'

V'

E'

......

FOURCCid;

if(id!

=ID_RIFF){

......

4)出错处理

在文件读写过程中,如果出现读写错误或文件的格式与数据不对,可动态创建一个普通的(generic)文件异常类(CFileException)对象,作抛出(throw)处理。

例如

MessageBox(NULL,"

NotRIFFformat!

"

"

Error"

MB_OK);

throw(newCFileException(CFileException:

generic));

2.绘图

绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行:

voidCWaveView:

OnDraw(CDC*pDC)

CWaveDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahere

在绘图前,必须先访问文档数据、得到客户区大小、设置绘图颜色,然后再根据文档数据来绘制图形。

1)访问文档数据

可通过在OnDraw函数中自动生成的代码所得到的文档指针pDoc来访问文档类对象中的各种变量和数组,并根据这些数据来绘图。

for(i=0;

i<

pDoc->

n;

i++){

x=(int)(i*dx+0.5);

y=h0-(int)(pDoc->

d[i]*dy+0.5);

if(i==0)pDC->

MoveTo(x,y);

elsepDC->

LineTo(x,y);

}

2)得到客户区的大小

绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使绘制的图形能随窗口大小自动改变,必须先得到当前客户区大小的数据(宽w和高h)。

获取客户区大小的方法有两种:

(1)在消息响应函数OnSize中获得

使用类向导ClassWizard,在视图类中添加WM_SIZE消息的响应函数OnSize。

该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。

其输入参数中的cx和cy就是客户区大小的宽和高,可将他们赋值给类变量(如w和h)供绘图时使用。

voidCClassView:

OnSize(UINTnType,intcx,intcy)

w=cx;

h=cy;

(2)调用函数GetClientRect得到

可在绘图前,定义一个矩形变量crect,然后再调用函数GetClientRect得到当前客户区矩形的数据,其中的右(right)与底(bottom)就是客户区的宽与高(其左left与顶top都为0),如:

RECTcrect;

GetClientRect(&

crect);

intw=crect.right,h=crect.bottom;

其中,表示矩形的结构RECT的定义为(windef.h)

typedefstruct_RECT{

LONGleft;

LONGtop;

LONGright;

LONGbottom;

}RECT;

其对应的MFC类为CRect。

3)设置绘图颜色

(1)颜色

Windows中的颜色一般用4个字节表示(4B=32b=0BGR[高位在前]=RGB0[低位在前]),定义了一个专门表示颜色索引值的变量类型COLORREF:

(windef.h)

typedefDWORDCOLORREF;

及由红绿蓝三原色构造颜色值的宏RGB:

(wingdi.h)

#defineRGB(r,g,b)((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<

8))|(((DWORD)(BYTE)(b))<

16)))

其中,r、g、b为字节变量,取值范围为0~255。

其函数说明为:

COLORREFRGB(

BYTEbRed,//redcomponentofcolor

BYTEbGreen,//greencomponentofcolor

BYTEbBlue//bluecomponentofcolor

);

例如:

COLORREFred,gray;

red=RGB(255,0,0);

gray=RGB(128,128,128);

(2)点色(像素)

在Windows中,像素(pixel)的颜色是直接由设备上下文类CDC的成员函数SetPixel来设置的,该函数的原型为:

COLORREFSetPixel(intx,inty,COLORREFcrColor);

其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。

(3)线色(笔)

在Windows中,线状图必须用笔(pen)来画,所以线的颜色就由笔色来确定。

笔的创建与使用的步骤为:

●创建笔对象:

创建笔类CPen对象的方法有如下两种:

⏹使用构造函数CPen

CPen(intnPenStyle,intnWidth,COLORREFcrColor);

其中,nPenStyle为笔的风格,可取值:

风格值

风格名称

线例

PS_SOLID

实心

PS_DASH

虚线

PS_DOT

点线

PS_DASHDOT

虚点线

PS_DASHDOTDOT

虚点点线

nWidth为笔宽,与映射模式有关,使用缺省映射时为像素数,若nWidth=0,则不论什么映射模式,笔宽都为一个像素;

crColor为笔的颜色值。

CPen*pGrayPen=newCPen(PS_SOLID,0,RGB(128,128,128));

CPengrayPen(PS_SOLID,0,RGB(128,128,128));

⏹使用成员函数CreatePen

BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);

如:

CPengrayPen;

grayPen.CreatePen(PS_SOLID,0,RGB(128,128,128));

⏹缺省的笔为单像素宽的实心黑色笔

●将笔对象选入设备上下文:

为了能使用我们所创建的笔对象,必须先将它选入设备上下文,这可以调用设备上下文类CDC的成员函数SelectObject来完成:

CPen*SelectObject(CPen*pPen);

返回值为指向原来笔对象的指针(一般将其保存下来,供下次在装入时使用)。

pOldPen=pDC->

SelectObject(&

pen);

另外,Windows中有一些预定义的笔对象,可用CDC的另一成员函数SelectStockObject将其选入DC,其函数原型为:

virtualCGdiObject*SelectStockObject(intnIndex);

预定义的笔对象有BLACK_PEN(黑色笔)、WHITE_PEN(白色笔)、NULL_PEN(空笔/无色笔)。

pDC->

SelectStockObject(BLACK_PEN);

●使用设备上下文画线状图:

画线状图所使用的是当前设备上下文中的笔对象。

线状图有直线、折线、矩形、(椭)圆(弧)等,详见4)

(2)

●将笔对象从设备上下文中放出:

为了能删除使用过的笔对象,必须先将它从设备上下文中释放出来后,然后才能删除。

释放的方法是重新装入原来的笔对象,如

pDC->

SelectObject(pOldPen);

●删除笔对象:

为了能删除笔对象,必须先将其从设备上下文中释放。

删除方法有

⏹调用笔类CDC的成员函数DeleteObject,之后可再用成员函数CreatePen在笔对象中继续创建新的笔内容。

pen.DeleteObject();

⏹使用删除运算符delete将笔对象彻底删除,如deletepen;

⏹自动删除:

若笔对象为局部变量,则在离开其作用域时,会被系统自动删除

下面为一段较完整地创建与使用笔的代码:

CPenpen,*pOldPen;

for(intj=0;

j<

=255;

j++){

HSLtoRGB(m_hue,m_sat,255-j,r,g,b);

pen.CreatePen(PS_SOLID,0,RGB(r,g,b));

pOldPen=pDC->

MoveTo(0,j);

pDC->

LineTo(40,j);

pen.DeleteObject();

(3)面色(刷)

在Windows中,面状图必须用刷(brush)来填充,所以面的颜色就由刷色来确定。

MFC中的刷类为CBrush,刷的创建与使用的步骤与笔的相似。

●构造函数有3个:

⏹CBrush(COLORREFcrColor);

//创建颜色为crColor的实心刷

⏹CBrush(intnIndex,COLORREFcrColor);

//创建风格由nIndex指定且颜色为crColor的孵化(hatch)刷,其中nIndex可取孵化风格(HatchStyles)值:

符号常量

数字常量

风格

图案

HS_HORIZONTAL

水平线

-----

HS_VERTICAL

1

垂直线

|||||

HS_FDIAGONAL

2

正斜线

\\\\\

HS_BDIAGONAL

3

反斜线

/////

HS_CROSS

4

十字线

+++++

HS_DIAGCROSS

5

斜十字线

xxxxx

⏹CBrush(CBitmap*pBitmap);

//创建位图为pBitmap的图案刷

●与构造函数相对应,也有3个创建不同类型刷的成员函数:

⏹BOOLCreateSolidBrush(COLORREFcrColor);

⏹BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);

⏹BOOLCreatePatternBrush(CBitmap*pBitmap);

FillRect(&

rect,newCBrush(RGB(r,g,b)));

●预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH(白刷)

●缺省的刷为空刷

4)画图

在Windows中,绘图一般在视图窗口的客户区进行,使用的是设备上下文类CDC中各种绘图函数。

(1)坐标系

缺省情况下,绘图的默认映射模式为MM_TEXT,其绘图单位为像素(只要不打印输出,使用该模式就够了)。

若窗口客户区的宽和高分别为w和h,则其x坐标是从左到右,范围为0~w-1;

y坐标是从上到下,范围为0~h-1。

参见下图:

缺省的Windows窗口坐标系

(1)画像素点

画像素点就是设置像素点的颜色,从前面3)

(2)已知道这可由CDC的成员函数SetPixel来做,该函数的原型为:

COLORREFSetPixel(POINTpoint,COLORREFcrColor);

SetPixel(i,j,RGB(r,g,b));

另外,表示点的结构POINT的定义为(windef.h)

typedefstructtagPOINT{

LONGx;

LONGy;

}POINT;

对应的MFC类为CPoint。

(2)画线状图

在Windows中,线状图必须用笔来画(笔的创建与使用见前面的3)(3)),下面介绍的是CDC类中可以绘制线状图的常用成员函数:

●当前位置:

设置当前位置为(x,y)或point:

(返回值为原当前位置的坐标)

CPointMoveTo(intx,inty);

或CPointMoveTo(POINTpoint);

●画线:

使用DC中的笔从当前位置画线到点(x,y)或point:

(若成功返回非0值):

BOOLLineTo(intx,inty);

或BOOLLineTo(POINTpoint);

●画折线:

使用DC中的笔,依次将点数组lpPoints中的nCount(≥2)个点连接起来,形成一条折线:

BOOLPolyline(LPPOINTlpPoints,intnCount);

●画多边形:

似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:

BOOLPolygon(LPPOINTlpPoints,intnCount);

●画矩形:

使用DC中的笔画左上角为(x1,y1)、右下角为(x2,y2)或范围为*lpRect的矩形的边线,并用DC中的刷填充其内部区域:

BOOLRectangle(intx1,inty1,intx2,inty2);

BOOLRectangle(LPCRECTlpRect);

●画(椭)圆:

使用DC中的笔在左上角为(x1,y1)、右下角为(x2,y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:

BOOLEllipse(intx1,inty1,intx2,inty2);

BOOLEllipse(LPCRECTlpRect);

●画弧:

(x1,y1)与(x2,y2)或lpRect的含义同画(椭)圆,(x3,y3)或ptStart为弧的起点,(x4,y4)或ptEnd为弧的终点:

(逆时针方向旋转)

BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);

BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);

●画弓弦:

参数的含义同上,只是用一根弦连接弧的起点和终点,形成一个弓形,并用DC中的刷填充其内部区域:

BOOLChord(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);

BOOLChord(LPCRECTlpRect,POINTptStart,POINTptEnd);

(3)画填充图

在Windows中,面状图必须用刷来填充(刷的创建与使用见前面的3)(4))。

上面

(2)中的Polygon、Rectangle、Ellipse和Chord等画闭合线状图的函数,只要DC中的刷不是空刷,都可以用来画对应的面状图。

下面介绍的是CDC类中只能绘制面状图的其他常用成员函数:

●画填充矩形:

用指定的刷pBrush画一个以lpRect为区域的填充矩形,无边线,填充区域包括矩形的左边界和上边界,但不包括矩形的右边界和下边界:

voidFillRect(LPCRECTlpRect,CBrush*pBrush);

●画单色填充矩形:

似FillRect,但只能填充单色,不能填充花纹和图案:

voidFillSolidRect(LPCRECTlpRect,COLORREFclr);

voidFillSolidRect(intx,inty,intcx,intcy,COLORREFclr);

●画扇形:

参数含义同Arc,但将起点和终点都与外接矩形的中心相连接,形成一个扇形区域,用DC中的刷填充整个扇形区域,无另外的边线:

BOOLPie(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);

BOOLPie(LPCRECTlpRect,POINTptStart,POINTptEnd);

5)移动图形(异或画图)

为了能画移动的位置标识(如十字、一字)和随鼠标移动画动态虚线框,必须在不破坏原有背景图形的基础上移动这些图形。

所用的方法为异或画图。

(1)绘图模式

绘图模式(drawingmode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。

可使用CDC类的成员函数SetROP2来设置绘图模式:

(ROP=RasterOPeration光栅操作)

intSetROP2(intnDrawMode);

其中,nDrawMode可取值:

作用

运算结果

R2_BLACK

黑色

pixel=black

R2_WHITE

白色

pixel=white

R2_NOP

不变

pixel=pbCol

R2_NOT

反色

pixel=~scCol

R2_COPYPEN

覆盖

R2_NOTCOPYPEN

反色覆盖

pixel=~pbCol

R2_MERGEPENNOT

反色或

pixel=~scCol|pbCol

R2_MERGENOTPEN

或反色

pixel=scCol|~pbCol

R2_MASKNOTPEN

与反色

pixel=scCol&

~pbCol

R2_MERGEPEN

pixel=scCol|pbCol

R2_NOTMERGEPEN

或非

pixel=~(scCol|pbCol)

R2_MASKPEN

pbCol

R2_NOTMASKPEN

与非

pixel=~(scCol&

pbCol)

R2_XORPEN

异或

pixel=scCol^pbCol

R2_NOTXORPEN

异或非

pixel=~(scCol^pbCol)

其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN(异或)常用。

(2)移动图形

移动图形采用的是异或画图方法,移动图形的过程为:

异或画图、在原位置再异或化图(擦除)、在新位置异或画图、...。

pOldPen=pDC->

SelectObject(pGrayPen);

SetROP2(R2_XORPEN);

if(erase)DrawCross(pDC,m_x0,m_y0);

DrawC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 艺术创意

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1