MFC编程参考.docx
- 文档编号:8777328
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:30
- 大小:119.09KB
MFC编程参考.docx
《MFC编程参考.docx》由会员分享,可在线阅读,更多相关《MFC编程参考.docx(30页珍藏版)》请在冰豆网上搜索。
MFC编程参考
MFC编程参考
0.文字输出
为了能选用不同的字体和大小来输出文本串,须使用作为GDI对象的CFont类。
Windows和常用的字处理软件(如Word)、绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要是TrueType轮廓字体。
1)创建字体函数
CFont类是CGDIObject的派生类:
CObject→CGDIObject→CFont。
只有一个缺省构造函数CFont();必须用下列字体创建成员函数CreateFont[Indirect]或CreatePointFont[Indirect]来初始化。
其中的CreatePointFont提供了创建字体的一种简单方法:
BOOLCreatePointFont(intnPointSize,LPCTSTRlpszFaceName,CDC*pDC=NULL);
●nPointSize为字体的大小,以0.1点(像素/墨点/磅数)为单位,如汉字的字号与nPointSize值及磅数的对应关系见下表:
汉字字号
nPointSize值
磅数
汉字字号
nPointSize值
磅数
初号
420
42
四号
140
14
小初
360
36
小四
120
12
一号
260
26
五号
105
10.5
小一
240
24
小五
90
9
二号
220
22
六号
75
7.5
小二
180
18
小六
65
6.5
三号
160
16
七号
55
5.5
小三
150
15
八号
50
5
●lpszFaceName为字体名称字符串的指针
●若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位
如
CFontfont;
font.CreatePointFont(160,“宋体”);
注意:
CFont类的这些逻辑字体创建函数,并不是从无到有创建一个新的GDI字体,而只是从GDI的物理字体库中选择与所设置参数最匹配的字体。
2)字体公用对话框
为了方便用户选择各种字体参数,可使用字体公用对话框:
汉字的字号与磅数
字体公用对话框
使用字体公用对话框需要用到CFontDialog类。
CFontDialog类的构造函数为
CFontDialog(LPLOGFONTlplfInitial=NULL,DWORDdwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);
其中,lplfInitial为逻辑字体结构的指针(可用CFont的成员函数GetLogFont来获得,参见《Windows程序设计》),dwFlags为对话框的可选参数,CF_EFFECTS表示对话框中有删除线和下划线复选框与选择颜色的下拉式组合框,CF_SCREENFONTS则使得对话框中只列出系统支持的显示字体。
CFontDialog类的常用成员函数有:
virtualintDoModal();//显示对话框,返回IDOK或IDCANCEL
CStringGetFaceName()const;//返回字体名称串
intGetSize()const;//返回所选择的字体大小,以0.1点为单位
COLORREFGetColor()const;//返回所选择的字体颜色
3)文本输出函数
常用的文本输出函数有TextOut、DrawText和ExtTextOut,它们都是CDC类的成员函数。
下面只介绍最简单的TextOut:
BOOLTextOut(intx,inty,constCString&str);
其中,x与y为显示串的左上角坐标,str为要显示的文本串。
如:
pDC->TextOut(10,10,L"Testtext");
还可以使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:
(缺省的前景色为黑色,背景色空)
virtualCOLORREFSetTextColor(COLORREFcrColor);
virtualCOLORREFSetBkColor(COLORREFcrColor);
如:
pDC->SetTextColor(RGB(0,128,0));pDC->TextOut(10,30,L"Testtext");
pDC->SetBkColor(RGB(0,0,128));pDC->TextOut(10,50,L"Testtext");
4)例子
创建名为Font的MFC单文档应用程序,在视图类中添加若干字体参数类变量:
CFontfont;
CStringm_sFontName;
intm_iFontSize;
COLORREFm_colTextColor;
CStringm_sStr;
并在构造函数中对它们进行初始化:
m_sFontName=L"宋体";
m_iFontSize=120;
font.CreatePointFont(m_iFontSize,m_sFontName);
m_colTextColor=RGB(0,0,0);
m_sStr=L"Testtext测试文本";
添加字体设置菜单项ID_FONT_SET及其响应函数,在里面打开公用字体对话框,将用户选择的字体参数保存到视图类的类变量中,创建新的字体对象,并调用重绘窗口函数:
voidCFontView:
:
OnFontSet(){
//TODO:
在此添加命令处理程序代码
LOGFONTlf;
font.GetLogFont(&lf);
CFontDialogfontDlg(&lf);
fontDlg.m_cf.rgbColors=m_colTextColor;
if(fontDlg.DoModal()==IDOK)
{
m_sFontName=fontDlg.GetFaceName();
m_iFontSize=fontDlg.GetSize();
m_colTextColor=fontDlg.GetColor();
font.DeleteObject();
font.CreatePointFont(m_iFontSize,m_sFontName);
RedrawWindow();
}
}
创建文本串输入对话框的资源,添加对应的对话框类和编辑控件变量。
添加字符串输入菜单项ID_STRING_INPUT及其响应函数,在里面打开输入对话框,将用户输入的字符串保存到视图类的对应类变量中:
voidCFontView:
:
OnStringInput(){
//TODO:
在此添加命令处理程序代码
CInputDlgdlg;
dlg.m_sStr=m_sStr;
if(dlg.DoModal()==IDOK){
m_sStr=dlg.m_sStr;
RedrawWindow();
}
}
在视图类的OnDraw函数中,选入所设置的字体、设置文本颜色、输出用户的字符串:
voidCFontView:
:
OnDraw(CDC*pDC)
{
CFontDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)return;
//TODO:
在此处为本机数据添加绘制代码
pDC->SelectObject(&font);
pDC->SetTextColor(m_colTextColor);
pDC->TextOut(20,20,m_sStr);
}
下面是该例程序的编写步骤框图:
1.文件读写
1)建立支持文档/视图体系项目
在建立项目(Project)时,选择Siggledocument(SDI单文档界面)或Multipledocuments(MDI多文档界面,缺省)而不是Dialogbased(基于对话框)的应用程序,并且选择缺省的Document/Viewarchitecturesuport?
(支持文档-视图体系)的复选框,建立支持文档/视图体系的项目。
应用程序框架会自动生成应用程序类C*App、文档类C*Doc、主框架窗口类CMainFrame、视图类C*View,对多文档界面还有子框架窗口类CChildFrame。
2)在系列化函数中用文档类对象读写文件
在应用程序框架自动生成的C*Doc类的Serialize(系列化)成员函数中使用其输入参数——文档类CArchive的对象ar——来读写文件,读写方法似文件流操作。
如
voidCWaveDoc:
:
Serialize(CArchive&ar){
if(ar.IsStoring()){
//TODO:
addstoringcodehere写文件
......
ar< ar< ...... } else{ //TODO: addloadingcodehere读文件 ...... ar>>id; ar>>fileLen; ...... } } 注意,用<<或>>输出或输入的为二进制数据;为了输出或输入字符串,可以用CArchive类的成员函数: voidWriteString(LPCTSTRlpsz);或BoolReadString(CString&rString);。 如: charstr[80]; sprintf(str,"%d区(%XA1~%XFE): \r\n",a,c1,c1); ar.WriteString(str); 可将重要的读入数据作为文档类的类变量或数组,供视图类的代码访问和图形输出,也可供文档类自己在写入文件时使用。 3)数据类型 (1)无符号整数 名称 类型 字节数 定义(windef.h) 字节 BYTE 1B typedefunsignedcharBYTE; 字 WORD 2B 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 #defineID_RIFFmmioFOURCC('R','I','F','F') #defineID_WAVEmmioFOURCC('W','A','V','E') ...... FOURCCid; ...... ar>>id; if(id! =ID_RIFF){ ...... } ...... 4)出错处理 在文件读写过程中,如果出现读写错误或文件的格式与数据不对,可动态创建一个普通的(generic)文件异常类(CFileException)对象,作抛出(throw)处理。 例如 if(id! =ID_RIFF){ : : MessageBox(NULL,L"NotRIFFformat! ",L"Error",MB_OK); throw(newCFileException(CFileException: : genericException)); } 2.播放波形声音文件 函数PlaySound可以播放系统声音、声音资源和声音文件,其函数原型为: BOOLPlaySound( LPCSTRpszSound, HMODULEhmod, DWORDfdwSound ); 其中参数 ●pszSound的含义与fdwSound的设置有关。 ⏹若fdwSound标志设置为SND_ALIAS、SND_FILENAME或SND_RESOURCE,则pszSound为系统事件的别名、文件名或资源ID ⏹若fdwSound标志没有设置这些值,则先在注册表或win.ini中寻找串为pszSound的声音,若没有,则视其为文件名 ⏹若pszSound=NULL,则停止播放正在播放的任何声音(同sndPlaySound)。 若要停止非波形格式的声音,必须设置fdwSound的标志SND_PURGE ●hmod ⏹若设置了fdwSound的标志SND_RESOURCE,则hmod为包含pszSound所指定资源的可执行文件的句柄 ⏹若没有设置fdwSound的标志SND_RESOURCE,则hmod必须为NULL ●fdwSound为标志参数,可以取下列值: PlaySound函数中的fdwSound参数的值 fdwSound值 对应数值 含义 SND_ASYNC 0x01 异步播放,调用后立即返回(最常用) SND_LOOP 0x08 循环播放,必须与SND_ASYNC标志同用 SND_MEMORY 0x04 lpszSound指向内存中波形声音映像(可以动态生产声音) SND_NODEFAULT 0x02 找不到指定声音时,不播放缺省的声音 SND_NOSTOP 0x10 如果有声音正在播放,则不播放指定的声音而直接返回 SND_SYNC 0x00 同步播放,直到声音播完后调用才返回(缺省值) SND_NOWAIT 0x002000 若设备忙,则不等待(不播放声音,立即返回) SND_ALIAS 0x010000 pszSound为注册项的别名 SND_ALIAS_ID 0x110000 别名是一个预定义的ID SND_FILENAME 0x020000 pszSound为文件名 SND_RESOURCE 0x040004 pszSound为资源名或原子(atom) SND_PURGE 0x40 清除任务的非静止事件 SND_APPLICATION 0x80 使用应用程序指定关联程序来播放声音 例如: PlaySound(“c: \\sounds\\sample.wav”,NULL,SND_ASYNC); PlaySound(ar.GetFile()->GetFilePath(),NULL,SND_ASYNC); 为了使包含PlaySound的程序能够编译通过,必须包含多媒体头文件: #include 并在项目中添加多媒体链接库: 选“项目\*属性”(其中*号表示项目名)菜单项或按Alt+F7组合键,弹出“*属性页”对话框。 在该其左上角的“配置”栏的下拉式列表中,选择“所有配置”项。 在其左边的“配置”目录栏中,选中“配置属性\链接器\输入”项,在右边顶行的“附加依赖项”栏中键入winmm.lib。 先按“应用”钮,再按“确定”钮关闭对话框。 3.绘图 绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行: voidCWaveView: : OnDraw(CDC*pDC) { CWaveDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO: adddrawcodefornativedatahere } 在绘图前,必须先访问文档数据、得到客户区大小、设置绘图颜色,然后再根据文档数据来绘制图形。 1)访问文档数据 可通过在OnDraw函数中自动生成的代码所得到的文档指针pDoc来访问文档类对象中的各种变量和数组,并根据这些数据来绘图。 如 CWaveDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); ...... for(i=0;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,右right=客户区的宽、底bottom=客户区的高),如: 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_P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 编程 参考