`
vey156zh
  • 浏览: 17858 次
社区版块
存档分类
最新评论

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);
分享到:
评论

相关推荐

    MFC编程参考资料文档

    MFC编程参考资料文档

    Visual.C++.MFC编程参考资料/WindowsAPI参考大全/。。

    资料;WindowsAPI参考大全;C语言趣味程序百例精解;MFC类库详解;MFC深入浅出_从MFC设计到MFC编程; 里面包含以上几个文件,希望对大家有用。哈哈

    MFC类库参考手册--MFC编程必备

    MFC类库参考手册,详细的描述了MFC的类库,是学习使用VC编程的必备参考

    visual c++mfc编程实例

    其包含了mfc编程函数的汉语说明。本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的...

    VISUAL C++ MFC编程实例

    再奉献一个 VISUAL C++MFC编程实例。 本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述...

    Visual C++ MFC编程实例.rar

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    MFC编程实例(pdf版本)

    本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...

    VISUAL_C++MFC编程实例

    本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...

    MFC 编程(PDF)

    本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...

    Visual C++ MFC编程实例.PDF

    本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...

    C++MFC编程实例

    目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 ...附录E MFC快速参考指南 339

    VC++MFC编程实例(十八)

    本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述用户界面的实例,第三部分讲述MFC内部处理...

    MFC深入浅出_从MFC设计到MFC编程

    MFC,深入浅出,大家都懂的,讲得挺好的,对初学者很有帮助,对编程高手也是一很好的参考书

    MFC编程实例代码参考

    该压缩包内含有微软官方提供的MFC编程实例代码,在学习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 ...附录E MFC快速参考指南 339

    MFC编程思路和技巧

    MFC的架构描述和工作原理分析!主要参考MFC深入浅出教程!

    Visual C++ MFC编程详解和实例

    该书共分成15个章节,由易到难,由浅及深的介绍了MFC的功能框架和实际运用。每个知识点都有对应的代码实例。学习起来快速而不费力。更重要的是不是扫描版本。看着舒服。...附录E MFC快速参考指南 339

    MFC 编程实例讲解

    MFC 编程实例讲解,内部有代码,初学者可以参考。

    《Visual C++MFC编程实例》.rar

    很系统、很全面的讲解了VC++,全书共分20章,本书通过85个实例全面讲述了应用MFC进行Visual C++编程的思想。每个实例均以编写一个应用程序要走的步骤编写。全书共分四部分进行介绍,第一部分是基础知识,第二部分讲述...

    MFC 程序开发参考大全

    MFC 编程参考大全,适合C++使用MFC框架编程参考。内容包括基本框架结构说明,类,窗体控件,打印技术,数据库编程等等。

Global site tag (gtag.js) - Google Analytics