




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC编程参考0文字输出为了能选用不同的字体和大小来输出文本串,须使用作为GDI对象的CFont类。Windows和常用的字处理软件(如Word)、绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要是TrueType轮廓字体。1)创建字体函数CFont类是CGDIObject的派生类:CObject CGDIObject CFont。只有一个缺省构造函数CFont( ); 必须用下列字体创建成员函数CreateFontIndirect或CreatePointFont Indirect来初始化。其中的CreatePointFont提供了创建字体的一种简单方法:BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL );l nPointSize为字体的大小,以0.1点(像素/墨点/磅数)为单位,如汉字的字号与nPointSize值及磅数的对应关系见下表:汉字字号nPointSize值磅数汉字字号nPointSize值磅数初号42042四号14014小初36036小四12012一号26026五号10510.5小一24024小五909二号22022六号757.5小二18018小六656.5三号16016七号555.5小三15015八号505l lpszFaceName为字体名称字符串的指针l 若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位如CFont font;font.CreatePointFont(160, “宋体”);注意:CFont类的这些逻辑字体创建函数,并不是从无到有创建一个新的GDI字体,而只是从GDI的物理字体库中选择与所设置参数最匹配的字体。2)字体公用对话框为了方便用户选择各种字体参数,可使用字体公用对话框: 汉字的字号与磅数字体公用对话框使用字体公用对话框需要用到CFontDialog类。CFontDialog类的构造函数为CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );其中,lplfInitial为逻辑字体结构的指针(可用CFont的成员函数GetLogFont来获得,参见Windows程序设计),dwFlags为对话框的可选参数,CF_EFFECTS表示对话框中有删除线和下划线复选框与选择颜色的下拉式组合框,CF_SCREENFONTS则使得对话框中只列出系统支持的显示字体。CFontDialog类的常用成员函数有:virtual int DoModal( ); / 显示对话框,返回IDOK或IDCANCELCString GetFaceName( ) const; / 返回字体名称串int GetSize( ) const; / 返回所选择的字体大小,以0.1点为单位COLORREF GetColor( ) const; / 返回所选择的字体颜色3)文本输出函数常用的文本输出函数有TextOut、DrawText和ExtTextOut,它们都是CDC类的成员函数。下面只介绍最简单的TextOut:BOOL TextOut( int x, int y, const CString& str );其中,x与y为显示串的左上角坐标,str为要显示的文本串。如:pDC-TextOut(10, 10, LTest text);还可以使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:(缺省的前景色为黑色,背景色空)virtual COLORREF SetTextColor( COLORREF crColor );virtual COLORREF SetBkColor( COLORREF crColor );如:pDC-SetTextColor(RGB(0, 128, 0);pDC-TextOut(10, 30, LTest text);pDC-SetBkColor(RGB(0, 0, 128);pDC-TextOut(10, 50, LTest text);4)例子创建名为Font的MFC单文档应用程序,在视图类中添加若干字体参数类变量:CFont font;CString m_sFontName;int m_iFontSize;COLORREF m_colTextColor;CString m_sStr;并在构造函数中对它们进行初始化:m_sFontName = L宋体;m_iFontSize = 120;font.CreatePointFont(m_iFontSize, m_sFontName);m_colTextColor = RGB(0,0,0);m_sStr = LTest text 测试文本;添加字体设置菜单项ID_FONT_SET及其响应函数,在里面打开公用字体对话框,将用户选择的字体参数保存到视图类的类变量中,创建新的字体对象,并调用重绘窗口函数:void CFontView:OnFontSet() / TODO: 在此添加命令处理程序代码LOGFONT lf;font.GetLogFont(&lf);CFontDialog fontDlg(&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及其响应函数,在里面打开输入对话框,将用户输入的字符串保存到视图类的对应类变量中:void CFontView:OnStringInput() / TODO: 在此添加命令处理程序代码CInputDlg dlg;dlg.m_sStr = m_sStr;if (dlg.DoModal() = IDOK) m_sStr = dlg.m_sStr;RedrawWindow();在视图类的OnDraw函数中,选入所设置的字体、设置文本颜色、输出用户的字符串:void CFontView: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);下面是该例程序的编写步骤框图:创建一个MFC单文档应用程序在视图类中添加若干字体参数类变量在视图类的构造函数中对它们进行初始化量在视图类的OnDraw函数中,选入字体、设置文本色、输出字符串添加设置字体的菜单项及其响应函数打开公用字体对话框、保存字体参数、创建新字体对象调用重绘窗口函数添加输入串的菜单项及其响应函数打开输入串对话框、保存串参数创建输入串对话框的资源、添加对话框类和控件变量1文件读写1)建立支持文档/视图体系项目在建立项目 (Project)时,选择Siggle document (SDI单文档界面)或Multiple documents(MDI多文档界面,缺省)而不是Dialog based(基于对话框)的应用程序,并且选择缺省的Document/View architecture suport?(支持文档-视图体系)的复选框,建立支持文档/视图体系的项目。应用程序框架会自动生成应用程序类C*App、文档类C*Doc、主框架窗口类CMainFrame、视图类C*View,对多文档界面还有子框架窗口类CChildFrame。2)在系列化函数中用文档类对象读写文件在应用程序框架自动生成的C*Doc类的Serialize(系列化)成员函数中使用其输入参数文档类CArchive的对象ar来读写文件,读写方法似文件流操作。如void CWaveDoc:Serialize(CArchive& ar) if (ar.IsStoring() / TODO: add storing code here 写文件. .ar id;ar id;ar fileLen;. .注意,用输出或输入的为二进制数据;为了输出或输入字符串,可以用CArchive类的成员函数:void WriteString( LPCTSTR lpsz ); 或Bool ReadString(CString& rString );。如:char str80;sprintf(str, %d区(%XA1%XFE):rn, a, c1, c1);ar.WriteString(str);可将重要的读入数据作为文档类的类变量或数组,供视图类的代码访问和图形输出,也可供文档类自己在写入文件时使用。3)数据类型(1) 无符号整数名称类型字节数定义(windef.h)字节BYTE1Btypedef unsigned char BYTE;字WORD2Btypedef unsigned short WORD;双字DWORD4Btypedef unsigned long DWORD;无符号整数UINT2B(Win16) / 4B(Win32)typedef unsigned int UINT;(2) 四字符代码为了简化RIFF文件中的4字符标识的读写与比较,Windows SDK在多媒体头文件mmsystem.h中定义了类型FOURCC(Four-Character Code四字符代码):typedef DWORD FOURCC;及其构造宏(用于将4个字符转换成一个FOURCC数据)FOURCC mmioFOURCC(CHAR ch0, CHAR ch1, CHAR ch2, CHAR ch3);其定义为MAKEFOURCC宏:#define mmioFOURCC(ch0, ch1, ch2, ch3) MAKEFOURCC(ch0, ch1, ch2, ch3);而MAKEFOURCC宏定义为:#define MAKEFOURCC(ch0, ch1, ch2, ch3) (DWORD)(BYTE)(ch0) | (DWORD)(BYTE)(ch1) 8) | (DWORD)(BYTE)(ch2) 16) | (DWORD)(BYTE)(ch3) 24 ); 例如:#include #define ID_RIFFmmioFOURCC(R, I, F, F)#define ID_WAVEmmioFOURCC(W, A, V, E). .FOURCC id;. .ar id;if (id != ID_RIFF) . . .4)出错处理在文件读写过程中,如果出现读写错误或文件的格式与数据不对,可动态创建一个普通的(generic)文件异常类(CFileException)对象,作抛出(throw)处理。例如if (id != ID_RIFF) :MessageBox(NULL, LNot RIFF format!, LError, MB_OK);throw(new CFileException(CFileException: genericException);2播放波形声音文件函数PlaySound可以播放系统声音、声音资源和声音文件,其函数原型为:BOOL PlaySound( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);其中参数l pszSound的含义与fdwSound的设置有关。n 若fdwSound标志设置为SND_ALIAS、SND_FILENAME或SND_RESOURCE,则pszSound为系统事件的别名、文件名或资源IDn 若fdwSound标志没有设置这些值,则先在注册表或win.ini中寻找串为pszSound的声音,若没有,则视其为文件名n 若pszSound=NULL,则停止播放正在播放的任何声音(同sndPlaySound)。若要停止非波形格式的声音,必须设置fdwSound的标志SND_PURGEl hmodn 若设置了fdwSound的标志SND_RESOURCE,则hmod为包含pszSound所指定资源的可执行文件的句柄n 若没有设置fdwSound的标志SND_RESOURCE,则hmod必须为NULLl fdwSound为标志参数,可以取下列值:PlaySound函数中的fdwSound参数的值fdwSound值对应数值含义SND_ASYNC0x01异步播放,调用后立即返回(最常用)SND_LOOP0x08循环播放,必须与SND_ASYNC标志同用SND_MEMORY0x04lpszSound指向内存中波形声音映像(可以动态生产声音)SND_NODEFAULT0x02找不到指定声音时,不播放缺省的声音SND_NOSTOP0x10如果有声音正在播放,则不播放指定的声音而直接返回SND_SYNC0x00同步播放,直到声音播完后调用才返回(缺省值)SND_NOWAIT0x002000若设备忙,则不等待(不播放声音,立即返回)SND_ ALIAS0x010000pszSound为注册项的别名SND_ ALIAS_ID0x110000别名是一个预定义的IDSND_ FILENAME0x020000pszSound为文件名SND_ RESOURCE0x040004pszSound为资源名或原子(atom)SND_ PURGE0x40清除任务的非静止事件SND_ APPLICATION0x80使用应用程序指定关联程序来播放声音例如:PlaySound(“c:soundssample.wav”, NULL, SND_ASYNC);PlaySound(ar.GetFile()-GetFilePath(), NULL, SND_ASYNC);为了使包含PlaySound的程序能够编译通过,必须包含多媒体头文件:#include 并在项目中添加多媒体链接库:选“项目*属性”(其中*号表示项目名)菜单项或按Alt+F7组合键,弹出“*属性页”对话框。在该其左上角的“配置”栏的下拉式列表中,选择“所有配置”项。在其左边的“配置”目录栏中,选中“配置属性链接器输入”项,在右边顶行的“附加依赖项”栏中键入winmm.lib。先按“应用”钮,再按“确定”钮关闭对话框。3绘图绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行:void CWaveView:OnDraw(CDC* pDC)CWaveDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here在绘图前,必须先访问文档数据、得到客户区大小、设置绘图颜色,然后再根据文档数据来绘制图形。1)访问文档数据可通过在OnDraw函数中自动生成的代码所得到的文档指针pDoc来访问文档类对象中的各种变量和数组,并根据这些数据来绘图。如CWaveDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);. .for(i = 0; in; i+) x = (int)(i * dx + 0.5); y = h0 - (int)(pDoc-di * dy + 0.5);if(i = 0) pDC-MoveTo(x, y); else pDC-LineTo(x, y);2)得到客户区的大小绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使绘制的图形能随窗口大小自动改变,必须先得到当前客户区大小的数据(宽w和高h)。获取客户区大小的方法有两种:(1) 在消息响应函数OnSize中获得使用类向导ClassWizard,在视图类中添加WM_SIZE消息的响应函数OnSize。该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。其输入参数中的cx和cy就是客户区大小的宽和高,可将他们赋值给类变量(如w和h)供绘图时使用。如void CClassView:OnSize(UINT nType, int cx, int cy) w = cx; h = cy;(2) 调用函数GetClientRect得到可在绘图前,定义一个矩形变量crect,然后再调用函数GetClientRect得到当前客户区矩形的数据,其中的右(right)与底(bottom)就是客户区的宽与高(其左left与顶top都为0,右right = 客户区的宽、底bottom = 客户区的高),如:RECT crect;GetClientRect(&crect);int w = crect.right, h = crect.bottom;其中,表示矩形的结构RECT的定义为(windef.h)typedef struct _RECT LONG left; LONG top; LONG right; LONG bottom; RECT;其对应的MFC类为CRect。3)设置绘图颜色(1) 颜色Windows中的颜色一般用4个字节表示(4B = 32b = 0BGR高位在前 = RGB0低位在前),定义了一个专门表示颜色索引值的变量类型COLORREF:(windef.h)typedef DWORD COLORREF;及由红绿蓝三原色构造颜色值的宏RGB:(wingdi.h)#define RGB(r,g,b) (COLORREF)(BYTE)(r)|(WORD)(BYTE)(g)8)|(DWORD)(BYTE)(b)SelectObject(&pen);另外,Windows中有一些预定义的笔对象,可用CDC的另一成员函数SelectStockObject将其选入DC,其函数原型为:virtual CGdiObject* SelectStockObject( int nIndex );预定义的笔对象有BLACK_PEN(黑色笔)、WHITE_PEN (白色笔)、NULL_PEN(空笔/无色笔)。例如:pDC-SelectStockObject(BLACK_PEN);l 使用设备上下文画线状图:画线状图所使用的是当前设备上下文中的笔对象。线状图有直线、折线、矩形、(椭)圆(弧)等,详见4)(2)l 将笔对象从设备上下文中放出:为了能删除使用过的笔对象,必须先将它从设备上下文中释放出来后,然后才能删除。释放的方法是重新装入原来的笔对象,如pDC-SelectObject(pOldPen);l 删除笔对象:为了能删除笔对象,必须先将其从设备上下文中释放。删除方法有n 调用笔类CDC的成员函数DeleteObject,之后可再用成员函数CreatePen在笔对象中继续创建新的笔内容。如pen.DeleteObject();n 使用删除运算符delete将笔对象彻底删除,如delete pen;n 自动删除:若笔对象为局部变量,则在离开其作用域时,会被系统自动删除下面为一段较完整地创建与使用笔的代码:CPen pen, *pOldPen;for (int j = 0; j SelectObject(&pen);pDC-MoveTo(0, j); pDC-LineTo(40, j);pDC-SelectObject(pOldPen);pen.DeleteObject();(3) 面色(刷)在Windows中,面状图必须用刷(brush)来填充,所以面的颜色就由刷色来确定。MFC中的刷类为CBrush,刷的创建与使用的步骤与笔的相似。l 构造函数有3个:n CBrush( COLORREF crColor ); / 创建颜色为crColor的实心刷n CBrush( int nIndex, COLORREF crColor ); / 创建风格由nIndex指定且颜色为crColor的孵化(hatch)刷,其中nIndex可取孵化风格(Hatch Styles)值:符号常量数字常量风格图案HS_HORIZONTAL0水平线-HS_VERTICAL1垂直线|HS_FDIAGONAL2正斜线HS_BDIAGONAL3反斜线/HS_CROSS4十字线+HS_DIAGCROSS5斜十字线xxxxxn CBrush( CBitmap* pBitmap ); / 创建位图为pBitmap的图案刷l 与构造函数相对应,也有3个创建不同类型刷的成员函数:n BOOL CreateSolidBrush( COLORREF crColor );n BOOL CreateHatchBrush( int nIndex, COLORREF crColor );n BOOL CreatePatternBrush( CBitmap* pBitmap );如:pDC-FillRect( &rect, new CBrush( RGB(r, g, b) ) );l 预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH(白刷)l 缺省的刷为空刷4)画图在Windows中,绘图一般在视图窗口的客户区进行,使用的是设备上下文类CDC中各种绘图函数。(1) 坐标系缺省情况下,绘图的默认映射模式为MM_TEXT,其绘图单位为像素(只要不打印输出,使用该模式就够了)。若窗口客户区的宽和高分别为w和h,则其x坐标是从左到右,范围为0 w-1;y坐标是从上到下,范围为0 h-1。参见下图:缺省的Windows窗口坐标系(2) 画像素点画像素点就是设置像素点的颜色,从前面3)(2)已知道这可由CDC的成员函数SetPixel来做,该函数的原型为:COLORREF SetPixel( int x, int y, COLORREF crColor ); 或COLORREF SetPixel( POINT point, COLORREF crColor );其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。如pDC-SetPixel(i, j, RGB(r, g, b);另外,表示点的结构POINT的定义为(windef.h)typedef struct tagPOINT LONG x; LONG y; POINT;对应的MFC类为CPoint。(3) 画线状图在Windows中,线状图必须用笔来画(笔的创建与使用见前面的3)(3)),下面介绍的是CDC类中可以绘制线状图的常用成员函数:l 当前位置:设置当前位置为(x, y)或point:(返回值为原当前位置的坐标)CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point );l 画线:使用DC中的笔从当前位置画线到点(x, y)或point:(若成功返回非0值):BOOL LineTo( int x, int y ); 或BOOL LineTo( POINT point );l 画折线:使用DC中的笔,依次将点数组lpPoints中的nCount(2)个点连接起来,形成一条折线:BOOL Polyline( LPPOINT lpPoints, int nCount );l 画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:BOOL Polygon( LPPOINT lpPoints, int nCount );l 画矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用DC中的刷填充其内部区域:BOOL Rectangle( int x1, int y1, int x2, int y2 ); 或BOOL Rectangle( LPCRECT lpRect );l 画(椭)圆:使用DC中的笔在左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:BOOL Ellipse( int x1, int y1, int x2, int y2 );BOOL Ellipse( LPCRECT lpRect );l 画弧:(x1, y1)与(x2, y2)或lpRect的含义同画(椭)圆,(x3, y3)或ptStart为弧的起点,(x4, y4)或ptEnd为弧的终点:(逆时针方向旋转)BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );l 画弓弦:参数的含义同上,只是用一根弦连接弧的起点和终点,形成一个弓形,并用DC中的刷填充其内部区域:BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd );(4) 画填充图在Windows中,面状图必须用刷来填充(刷的创建与使用见前面的3)(4))。上面(2)中的Polygon 、Rectangle、Ellipse和Chord等画闭合线状图的函数,只要DC中的刷不是空刷,都可以用来画对应的面状图。下面介绍的是CDC类中只能绘制面状图的其他常用成员函数:l 画填充矩形:用指定的刷pBrush画一个以lpRect为区域的填充矩形,无边线,填充区域包括矩形的左边界和上边界,但不包括矩形的右边界和下边界:void FillRect( LPCRECT lpRect, CBrush* pBrush );l 画单色填充矩形:似FillRect,但只能填充单色,不能填充花纹和图案:void FillSolidRect( LPCRECT lpRect, COLORREF clr );void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr );l 画扇形:参数含义同Arc,但将起点和终点都与外接矩形的中心相连接,形成一个扇形区域,用DC中的刷填充整个扇形区域,无另外的边线:BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );5)移动图形(异或画图)为了能画移动的位置标识(如十字、一字)和随鼠标移动画动态虚线框,必须在不破坏原有背景图形的基础上移动这些图形。所用的方法为异或画图。(1) 绘图模式绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。可使用CDC类的成员函数SetROP2 来设置绘图模式:(ROP = Raster OPeration光栅操作)int SetROP2( int nDrawMode );其中,nDrawMode可取值:符号常量作用运算结果R2_BLACK黑色pixel = blackR2_WHITE白色pixel = whiteR2_NOP不变pixel = pbColR2_NOT反色pixel = scColR2_COPYPEN覆盖pixel = pbColR2_NOTCOPYPEN反色覆盖pixel = pbColR2_MERGEPENNOT反色或pixel = scCol | pbColR2_MERGENOTPEN或反色pixel = scCol | pbColR2_MASKNOTPEN与反色pixel = scCol & pbColR2_MERGEPEN或pixel = scCol | pbColR2_NOTMERGEPEN或非pixel = (scCol | pbCol)R2_MASKPEN与pixel = scCol & pbColR2_NOTMASKPEN与非pixel = (scCol & pbCol)R2_XORPEN异或pixel = scCol pbColR2_NOTXORPEN异或非pixel = (scCol pbCol)其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN(异或)常用。(2) 移动图形移动图形采用的是异或画图方法,移动图形的过程为:异或画图、在原位置再异或化图(擦除)、在新位置异或画图、.。如pOldPen = pDC-SelectObject(pGrayPen);pDC-SetROP2(R2_XORPEN);if (erase) DrawCross(pDC, m_x0, m_y0);DrawCross(pDC, x0, y0);pDC-SetROP2(R2_COPYPEN);pDC-SelectObject(pOldPen);m_x0 = x0; m_y0 = y0;4对话框为了编写颜色调色板的程序,需要建立基于对话框的项目,并要在控件中画图,动态改变编辑框中的数据,还要在对话框中响应编辑消息和鼠标消息。1)添加数据成员编辑好对话框资源后,可以使用ClassWizard为对话框的控件(ID)添加(用于数据交换的)类数据成员,它们可以是不同的数据类型,如整数、浮点数、字符串等,还可以为它们设置初值和取值范围。2)动态修改数据在程序运行时可以调用对话框类的基类CWnd的成员函数:UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE );int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;void SetDlgItemText( int nID, LPCTSTR lpszString );来动态获得和设置指定控件所对应的整数或字符串数据。如:m_hue = GetDlgItemInt(IDC_EDIT_HUE);SetDlgItemInt(IDC_EDIT_RED, m_red, false);3)响应编辑消息为了能在用户修改某一编辑框的数据时,程序能同步修改与之相应的其他控件中的数据,必须使用ClassWizard为编辑控件添加通知消息响应。一般为“改变” 通知消息EN_CHANGE,添加消息响应函数OnChange*。如void CColorDlg:OnChangeEditRed() / TODO: Add your control notification handler code hereif (fcsID != IDC_EDIT_RED) return;m_red = (BYTE)GetDlgItemInt(IDC_EDIT_RED);. .SetDlgItemInt(IDC_EDIT_HUE, m_hue);. .为了防止相关数据相互自动修改,进入无限死循环,必须区分是否为用户修改(控件为输入焦点)。可以再添加对“设置输入焦点”的通知消息EN_SETFOCUS的响应函数OnSetfocus*,并在函数中记录当前输入焦点的控件ID。如void CColorDlg:OnSetfocusEditRed() / TODO: Add your control notification handler code herefcsID = IDC_EDIT_RED;然后,在编辑修改的消息响应函数中,判断是否该编辑控件为输入焦点。只有是输入焦点时,才能对其他控件中的内容作修改。参见前一例子。4)在控件上绘图可以在对话框资源中放置图片控件(其图标在控件工具箱顶排的右边),并对其类型属性选Frame。可在对话框的绘图消息响应函数OnPaint或其他函数中,用CWnd类的函数GetDlgItem:CWnd* GetDlgItem( int nID ) const;来获得图片控件的窗口对象,再用函数GetDC:CDC* GetDC( );由窗口对象得到DC,然后就可以用该DC在控件中画图。如void CColorDlg:OnPaint() if (IsIconic(). .elseCDialog:OnPaint();int i, j;BYTE r, g, b;/ get control window and DC of Hue&SaturationCWnd *pWin = GetDlgItem(IDC_HUESAT);CDC *pDC = pWin-GetDC();/ draw hue-saturation palettefor (i = 0; i 360; i+) for (j = 0; j SetPixel(i, j, RGB(r, g, b);. .5其他1)改变窗口的大小和位置有时需要根据图像的尺寸来调整子窗口的大小,如使用MDI来实现BMP、GIF和JPG等图像的显示。因为窗口可能包括边框、标题条、菜单条、工具条和状态条,而我们只是要改变客户区的大小,可是Windows的SDK和MFC中都没有直接改变客户区大小的函数可供调用。因此,必须先调用CWnd类的GetWindowRect函数来获得整个窗口的位置和大小:void GetWindowRect( LPRECT lpRect ) const;(其中,lpRect中的参数为相对于屏幕左上角的屏幕坐标)再调用CWnd类的GetClientRect函数:void GetClientRect( LPRECT lpRect ) const; (其中,lpRect的left = top = 0、right = 客户区的宽、bottom = 客户区的高)来获得窗口客户区的大小,然后根据窗口与客户区大小来计算所需整个窗口的大小,最后再调用CWnd的MoveWindow函数:void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );(其中,x与y为窗口左上角的坐标(相对于父窗口或屏幕),nWidth与nHeight为窗口的宽和高)来改变窗口的大小和位置。注意,MoveWindow只对普通窗口或框架窗口有效,而直接用对应于客户区的CView类(的this指针)调用MoveWindow是毫无用处的。例如,为使客户区的大小为w*h,可这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司文明诚信活动方案
- 2025年药品安全管理考试试题及答案
- 2025年医疗卫生系统综合能力考试试卷及答案
- 2025年心理治疗师认证考试试卷及答案
- 2025年现代职业教育理论与实践考试试卷及答案
- 2025年特殊教育教师资格考试卷及答案
- 2025年数字内容运营人才招聘考试试卷及答案
- 2025年人际传播与关系管理考试试卷及答案
- 追寻生命意义与心理健康
- 做一个身心健康的中学生
- 绿色施工管理体系及管理制度(土木)
- 护理与风险防范课件
- 2025年高考安徽卷物理真题(解析版)
- 标准件项目管理制度
- 十五五智慧校园建设发展规划
- 中医眼科学绿风内障课件
- 暑假安全家长会课件
- 2025年中小学生安全知识竞赛试题及答案
- 2024年山西烟草专卖局考试真题试卷及答案
- SOP-15天视频起号流程图
- 出口原产地管理制度
评论
0/150
提交评论