MFC编程参考

MFC编程参考
2010年12月03日
  为了能选用不同的字体和大小来输出文本串,须使用作为GDI对象的CFont类。Windows和常用的字处理软件(如Word)、绘图软件(如CorelDraw)等应用软件会提供多种与设备无关的字体,主要是TrueType轮廓字体。 CFont类是CGDIObject的派生类:CObject → CGDIObject → CFont。只有一个缺省构造函数CFont( ); 必须用下列字体创建成员函数CreateFont[Indirect]或CreatePointFont [Indirect]来初始化。
  其中的CreatePointFont提供了创建字体的一种简单方法:
  BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL );
  l 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 l lpszFaceName为字体名称字符串的指针
  l 若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位
  如
  CFont font;
  font.CreatePointFont(160, "宋体");
  注意:CFont类的这些逻辑字体创建函数,并不是从无到有创建一个新的GDI字体,而只是从GDI的物理字体库中选择与所设置参数最匹配的字体。 为了方便用户选择各种字体参数,可使用字体公用对话框:
  汉字的字号与磅数
  字体公用对话框
  使用字体公用对话框需要用到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或IDCANCEL
  CString GetFaceName( ) const; // 返回字体名称串
  int GetSize( ) const; // 返回所选择的字体大小,以0.1点为单位
  COLORREF GetColor( ) const; // 返回所选择的字体颜色 常用的文本输出函数有TextOut、DrawText和ExtTextOut,它们都是CDC类的成员函数。下面只介绍最简单的TextOut:
  BOOL TextOut( int x, int y, const CString& str );
  其中,x与y为显示串的左上角坐标,str为要显示的文本串。如:
  pDC->TextOut(10, 10, L"Test text");
  还可以使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:(缺省的前景色为黑色,背景色空)
  virtual COLORREF SetTextColor( COLORREF crColor );
  virtual COLORREF SetBkColor( COLORREF crColor );
  如: pDC->SetTextColor(RGB(0, 128, 0));pDC->TextOut(10, 30, L"Test text"); pDC->SetBkColor(RGB(0, 0, 128));pDC->TextOut(10, 50, L"Test text"); 创建名为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 = L"Test 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);
  }
  下面是该例程序的编写步骤框图: 在建立项目 (Project)时,选择Siggle document (SDI单文档界面)或Multiple documents(MDI多文档界面,缺省)而不是Dialog based(基于对话框)的应用程序,并且选择缺省的Document/View architecture suport?(支持文档-视图体系)的复选框,建立支持文档/视图体系的项目。
  应用程序框架会自动生成应用程序类C*App、文档类C*Doc、主框架窗口类CMainFrame、视图类C*View,对多文档界面还有子框架窗口类CChildFrame。 在应用程序框架自动生成的C*Doc类的Serialize(系列化)成员函数中使用其输入参数--文档类CArchive的对象ar--来读写文件,读写方法似文件流操作。如
  void CWaveDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here 写文件 ... ... ar > id; ar >> fileLen; ... ... }
  }
  注意,用>输出或输入的为二进制数据;为了输出或输入字符串,可以用CArchive类的成员函数:void WriteString( LPCTSTR lpsz ); 或Bool ReadString(CString& rString );。如: char str[80]; sprintf(str, "%d区(%XA1~%XFE):\r\n", a, c1, c1); ar.WriteString(str);
  可将重要的读入数据作为文档类的类变量或数组,供视图类的代码访问和图形输出,也可供文档类自己在写入文件时使用。 为了简化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)
  #define ID_RIFFmmioFOURCC('R', 'I', 'F', 'F')
  #define ID_WAVEmmioFOURCC('W', 'A', 'V', 'E')
  ... ...
  FOURCC id;
  ... ... ar >> id; if (id != ID_RIFF) { ... ...
  }
  ... ... 在文件读写过程中,如果出现读写错误或文件的格式与数据不对,可动态创建一个普通的(generic)文件异常类(CFileException)对象,作抛出(throw)处理。例如 if (id != ID_RIFF) { ::MessageBox(NULL, L"Not RIFF format!", L"Error", MB_OK); throw(new CFileException(CFileException:: genericException));
  } 函数PlaySound可以播放系统声音、声音资源和声音文件,其函数原型为:
  BOOL PlaySound(
  LPCSTR pszSound,
  HMODULE hmod,
  DWORD fdwSound
  );
  其中参数
  l pszSound的含义与fdwSound的设置有关。
  n 若fdwSound标志设置为SND_ALIAS、SND_FILENAME或SND_RESOURCE,则pszSound为系统事件的别名、文件名或资源ID
  n 若fdwSound标志没有设置这些值,则先在注册表或win.ini中寻找串为pszSound的声音,若没有,则视其为文件名
  n 若pszSound=NULL,则停止播放正在播放的任何声音(同sndPlaySound)。若要停止非波形格式的声音,必须设置fdwSound的标志SND_PURGE
  l hmod
  n 若设置了fdwSound的标志SND_RESOURCE,则hmod为包含pszSound所指定资源的可执行文件的句柄
  n 若没有设置fdwSound的标志SND_RESOURCE,则hmod必须为NULL
  l 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。先按"应用"钮,再按"确定"钮关闭对话框。 绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行:
  void CWaveView::OnDraw(CDC* pDC)
  { CWaveDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here
  }
  在绘图前,必须先访问文档数据、得到客户区大小、设置绘图颜色,然后再根据文档数据来绘制图形。 可通过在OnDraw函数中自动生成的代码所得到的文档指针pDoc来访问文档类对象中的各种变量和数组,并根据这些数据来绘图。如 CWaveDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); ... ... for(i = 0; in; i++) { x = (int)(i * dx + 0.5); y = h0 - (int)(pDoc->d[i] * dy + 0.5); if(i == 0) pDC->MoveTo(x, y); else pDC->LineTo(x, y); } 绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使绘制的图形能随窗口大小自动改变,必须先得到当前客户区大小的数据(宽w和高h)。获取客户区大小的方法有两种: 使用类向导ClassWizard,在视图类中添加WM_SIZE消息的响应函数OnSize。该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。其输入参数中的cx和cy就是客户区大小的宽和高,可将他们赋值给类变量(如w和h)供绘图时使用。如
  void CClassView::OnSize(UINT nType, int cx, int cy)
  { w = cx; h = cy;
  } 可在绘图前,定义一个矩形变量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。 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))Windows中,像素(pixel)的颜色是直接由设备上下文类CDC的成员函数SetPixel来设置的,该函数的原型为:
  COLORREF SetPixel( int x, int y, COLORREF crColor );
  其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。 在Windows中,线状图必须用笔(pen)来画,所以线的颜色就由笔色来确定。笔的创建与使用的步骤为:
  l 创建笔对象:创建笔类CPen对象的方法有如下两种:
  n 使用构造函数CPen
  CPen( int nPenStyle, int nWidth, COLORREF crColor );
  其中,nPenStyle为笔的风格,可取值: nWidth为笔宽,与映射模式有关,使用缺省映射时为像素数,若nWidth = 0,则不论什么映射模式,笔宽都为一个像素;crColor为笔的颜色值。例如
  CPen* pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128));
  CPen grayPen(PS_SOLID, 0, RGB(128, 128, 128));
  n 使用成员函数CreatePen
  BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );
  如:
  CPen grayPen;
  grayPen.CreatePen(PS_SOLID, 0, RGB(128, 128, 128));
  n 缺省的笔为单像素宽的实心黑色笔
  l 将笔对象选入设备上下文:为了能使用我们所创建的笔对象,必须先将它选入设备上下文,这可以调用设备上下文类CDC的成员函数SelectObject来完成:
  CPen* SelectObject( CPen* pPen );
  返回值为指向原来笔对象的指针(一般将其保存下来,供下次在装入时使用)。如
  pOldPen = pDC->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(); } 在Windows中,面状图必须用刷(brush)来填充,所以面的颜色就由刷色来确定。MFC中的刷类为CBrush,刷的创建与使用的步骤与笔的相似。
  l 构造函数有3个:
  n CBrush( COLORREF crColor ); // 创建颜色为crColor的实心刷
  n CBrush( int nIndex, COLORREF crColor ); // 创建风格由nIndex指定且颜色为crColor的孵化(hatch)刷,其中nIndex可取孵化风格(Hatch Styles)值: 符号常量 数字常量 风格 图案 HS_HORIZONTAL 0 水平线 ----- HS_VERTICAL 1 垂直线 ||||| HS_FDIAGONAL 2 正斜线 \\\\\ HS_BDIAGONAL 3 反斜线 / HS_CROSS 4 十字线 +++++ HS_DIAGCROSS 5 斜十字线 xxxxx n 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 缺省的刷为空刷 在Windows中,绘图一般在视图窗口的客户区进行,使用的是设备上下文类CDC中各种绘图函数。 缺省情况下,绘图的默认映射模式为MM_TEXT,其绘图单位为像素(只要不打印输出,使用该模式就够了)。若窗口客户区的宽和高分别为w和h,则其x坐标是从左到右,范围为0 ~ w-1;y坐标是从上到下,范围为0 ~ h-1。参见下图:
  缺省的Windows窗口坐标系 画像素点就是设置像素点的颜色,从前面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。 在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 ); 在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 ); 为了能画移动的位置标识(如十字、一字)和随鼠标移动画动态虚线框,必须在不破坏原有背景图形的基础上移动这些图形。所用的方法为异或画图。 绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。可使用CDC类的成员函数SetROP2 来设置绘图模式:(ROP = Raster OPeration光栅操作)
  int SetROP2( int nDrawMode );
  其中,nDrawMode可取值: 符号常量 作用 运算结果 R2_BLACK 黑色 pixel = black R2_WHITE 白色 pixel = white R2_NOP 不变 pixel = pbCol R2_NOT 反色 pixel = ~scCol R2_COPYPEN 覆盖 pixel = pbCol 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 与 pixel = scCol & pbCol R2_NOTMASKPEN 与非 pixel = ~(scCol & pbCol) R2_XORPEN 异或 pixel = scCol ^ pbCol R2_NOTXORPEN 异或非 pixel = ~(scCol ^ pbCol) 其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN(异或)常用。 移动图形采用的是异或画图方法,移动图形的过程为:异或画图、在原位置再异或化图(擦除)、在新位置异或画图、...。
  如 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; 为了编写颜色调色板的程序,需要建立基于对话框的项目,并要在控件中画图,动态改变编辑框中的数据,还要在对话框中响应编辑消息和鼠标消息。 编辑好对话框资源后,可以使用ClassWizard为对话框的控件(ID)添加(用于数据交换的)类数据成员,它们可以是不同的数据类型,如整数、浮点数、字符串等,还可以为它们设置初值和取值范围。 在程序运行时可以调用对话框类的基类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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理方面的实例,第四部分讲述打包实例。全书基本上面向实例进行阐述,讲解透彻、易于掌握。本书既可作为初学者和大专院校师生的自学参考书,也可作为计算机软件开发人员的技术参考书。 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他时间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个类 83 5.4 例4 初始化应用程序屏幕 84 5.5 例5 保存应用程序屏幕 86 5.6 例6 处理命令行选项 88 5.7 例7 动态改变应用程序图标 91 5.8 例8 提示用户优先选项 93 5.9 例9 保存和恢复用户优先选项 97 5.10 例10 终止应用程序 100 5.11 例11 创建一个启动窗口 101 第6章 菜单 107 6.1 例12 使用菜单编辑器 107 6.2 例13 添加一个菜单命令处理函数 109 6.3 例14 根据当前可视文档动态改 变菜单 110 6.4 例15 启用和禁用菜单命令 111 6.5 例16 复选标记菜单命令 112 6.6 例17 单选标记菜单命令 113 6.7 例18 动态修改菜单 114 6.8 例19 动态修改系统菜单 116 6.9 例20 触发一个菜单命令 117 6.10 例21 创建弹出式菜单 117 第7章 工具栏和状态栏 120 7.1 例22 使用工具栏编辑器 120 7.2 例23 启用和禁用工具栏按钮 122 7.3 例24 为工具栏按钮添加字 123 7.4 例25 非标准工具栏大小 128 7.5 例26 保持工具栏按钮按下 129 7.6 例27 保持工具栏按钮组中 一个按钮按下 130 7.7 例28 为工具栏添加非按钮控件 131 7.8 例29 修改应用程序的状态栏 136 7.9 例30 更新状态栏窗格 138 7.10 例31 为状态栏添加其他控件 139 第8章 视图 145 8.1 例32 滚动视图 145 8.2 例33 改变鼠标光标形状 147 8.3 例34 沙漏光标 148 8.4 例35 窗体视图 149 8.5 例36 列表视图 152 8.6 例37 动态分割一个视图 163 第9章 对话框和对话条 166 9.1 例38 使用对话框编辑器 166 9.2 例39 创建一个对话框类 168 9.3 例40 模式对话框 170 9.4 例41 无模式对话框 171 9.5 例42 在无模式对话框的控件间 切换焦点 172 9.6 例43 对话框中的动画 173 9.7 例44 消息框 174 9.8 例45 对话条 176 第10章 控件窗口 182 10.1 例46 在任意位置创建一个控 件窗口 182 10.2 例47 用子分类定制一个通用 控件窗口 183 10.3 例48 用超分类定制一个通用 控件窗口 188 10.4 例49 在按钮上放置位图 190 10.5 例50 动态填充一个组合框 192 10.6 例51 排序一个列表控件 194 10.7 例52 分隔线控件 196 第11章 绘图 198 11.1 例53 绘制图形 198 11.2 例54 绘制文本 201 11.3 例55 从任意位置装入一个图 标并绘制 203 11.4 例56 从任意位置装入一个位 图和绘制一个位图 204 11.5 例57 从文件中创建一个位图 206 11.6 例58 创建一个自绘位图 211 第三部分 内部处理实例 第12章 消息 215 12.1 例59 添加消息处理函数或重 载MFC类 216 12.2 例60 添加命令范围消息处理函数 219 12.3 例61 重定向命令消息 221 12.4 例62 创建自己的窗口消息 222 第13章 文件、串行化和数据库 225 13.1 例63 访问二进制文件 225 13.2 例64 访问标准I/O文件 227 13.3 例65 访问内存文件 228 13.4 例66 在数据类中实现串行化 229 13.5 例67 串行化SDI或MDI文档 235 13.6 例68 按要求串行化 240 13.7 例69 透明地更新串行化的文档 242 13.8 例70 串行化多态类 246 13.9 例71 串行化数据集 248 13.10 例72 访问ODBC数据库 252 13.11 例73 访问DAO数据库 257 第14章 杂类 263 14.1 例74 剪切、拷贝和粘贴文本 数据 263 14.2 例75 剪切、拷贝、粘贴多信 息文本数据 268 14.3 例76 剪切、拷贝和粘贴二进制 数据 273 14.4 例77 数组函数 280 14.5 例78 列表函数 281 14.6 例79 映像函数 283 14.7 例80 系统键盘输入 285 14.8 例81 时间 288 第四部分 打包实例 第15章 库 291 15.1 例82 静态链接C/C++库 291 15.2 例83 动态链接C/C++库 295 15.3 例84 动态链接MFC扩展类库 300 15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序类 328 附录D 开发中注意事项 330 附录E MFC快速参考指南 339
### 回答1: 《MFC编程技巧与范例详解》是一本关于MFC编程的书籍,主要介绍MFC编程常用的技巧和实例,并对MFC编程进行深入的分析和讲解。本书可以帮助读者更好地掌握MFC编程的基本原理和技巧,提高MFC编程的效率和质量。 本书内容全面,详细介绍了MFC中的常用技巧,包括界面设计、消息处理、对话框、菜单等,同时还详细讲解了一些复杂、深入的MFC编程技巧,如多线程编程、控件编程等。每一章节的案例都非常实用,可以让读者更好地理解并掌握MFC编程技巧。 本书注重实例,提供了大量的代码范例和实例,每个实例都有详细的讲解和说明,方便读者理解和模仿。同时本书还涵盖了一些高级的MFC编程技巧和应用实例,如COM编程、ActiveX控件编程等,这些内容对于需要进行相关开发的读者来说会非常有用。 总之,《MFC编程技巧与范例详解》是一本非常有价值的MFC编程实战书籍,可以让读者在实际开发中更好地应用MFC编程技巧,提高工作效率和开发质量。值得一提的是,读者在学习本书的过程中需要具备一定的C++编程基础,并且需要有一定的MFC编程经验才能更好地理解和掌握本书内容。 ### 回答2: "MFC 编程技巧与范例详解" 是一本介绍 MFC 编程技巧和实例的书籍,它详细地解释了 MFC 框架和常见控件的使用方法,以及一些常见的编程技巧和策略。本书的主要内容包括:数据存储和读取、用户界面设计、对话框编程、多线程编程、图像处理等等。 本书在介绍一些技巧时,提供了许多实际的应用案例,为同学们提供了很好的实践流程和编程思路。此外,本书还讲解了一些高级的 MFC 编程技巧,如 Windows 套接字编程、COM 编程等等,可供读者参考学习。 本书的编写目的是为了帮助初学者更深入地理解 MFC 编程模型,并为有一定编程基础的开发者提供参考。在介绍不同 MFC 编程方面的技巧时,作者很注重实例的细节,比如如何进行错误处理,如何调试代码等等。这些细节对于编程初学者来说非常有帮助,可以让他们更快地掌握这些技术。 总之,"MFC 编程技巧与范例详解" 是一本很好的 MFC 编程学习资料,可以帮助大家快速掌握这种编程框架的特点和技巧,从而更好地开发 Windows 应用程序。 ### 回答3: 《MFC编程技巧与范例详解PDF》是一本介绍MFC编程技巧和实例的参考书籍,适合MFC编程的初学者和进阶者阅读学习。这本书的主要特点是全面、详细、实用,通过大量的代码示例和实际案例,系统地介绍了MFC框架、MFC应用程序设计基本概念、MFC消息传递机制、MFC控件使用、MFC文档视图等方面的知识,让读者快速了解和掌握MFC编程的核心技术。 《MFC编程技巧与范例详解PDF》的组织结构紧凑、内容丰富,包括第1到5章,分别介绍MFC应用程序设计的基础、MFC文档视图模式下的开发、MFC控件的使用、MFC消息传递机制和MFC界面设计的技巧。在书中,作者采用了许多实例和案例,贴近实际工作中的需求,让读者能够更好地理解和掌握MFC编程的基本技巧和高级技术。 总的来说,此书内容丰富实用、难度适中,可以帮助读者系统地学习MFC编程的知识和技巧,并且能够在实际编程中运用所学内容。因此,这本书是MFC编程入门者和进阶者学习的好参考

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值