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