81概述 81.4颜色和颜色对话框 在MFC中,CDC使用的是RGB颜色空间。其中, COLORREF是用来表示RGB颜色的一个32位 的数据类型,它可以用下列的十六进制表示一个RGB值: 0xoobbggr 在具体操作RGB颜色时,还可使用下列的宏操作: GetB value 获得32位RGB颜色值中的蓝色分量 GetG Value 获得32位RGB颜色值中的绿色分量 GetRvalue 获得32位RGB颜色值中的红色分量 RGB 将指定的R、G、B分量值转换成一个32位的RGB颜色值 MFC的 C ColorDialog类为我们应用程序提供了颜色选择通用对话框,它具有下列的构造函数 CColorDialog( colorref clrInit=0, dWord dw Flags=0, CWnd= pParentW'nd= NULL ) 我们可以在 CColorDialog提供的颜色列表中选择一种颜色或定制一种颜色。当该对话框“OK” 退出(即 DoModal返回IOK)时,还可以调用下列成员获得相应的颜色 COLORREF GetColor()const ∥返回用户选择的颜色。 void SetCurrent color( COLORREF C),∥强制使用cr作为当前选择的颜色 statiC COlOrreF* GetSaved Custom Colors()/∥返回用户自己定义颜色 例如,下面的代码片断: CColorDialog dle if(dlg. DoModalo 1= IDOK)return; COLORREF my Color =dIg GeColorO
8.1 概述 8.1.4 颜色和颜色对话框 在MFC中,CDC使用的是RGB颜色空间。其中,COLORREF是用来表示RGB颜色的一个32位 的数据类型,它可以用下列的十六进制表示一个RGB值: 0x00bbggrr 在具体操作RGB颜色时,还可使用下列的宏操作: GetBValue 获得32位RGB颜色值中的蓝色分量 GetGValue 获得32位RGB颜色值中的绿色分量 GetRValue 获得32位RGB颜色值中的红色分量 RGB 将指定的R、G、B分量值转换成一个32位的RGB颜色值。 MFC的CColorDialog类为我们应用程序提供了颜色选择通用对话框,它具有下列的构造函数: CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL ); 我们可以在CColorDialog提供的颜色列表中选择一种颜色或定制一种颜色。当该对话框“OK” 退出(即DoModal返回 IDOK)时,还可以调用下列成员获得相应的颜色。 COLORREF GetColor( ) const; // 返回用户选择的颜色。 void SetCurrentColor( COLORREF clr ); // 强制使用clr作为当前选择的颜色 static COLORREF * GetSavedCustomColors( );// 返回用户自己定义颜色 例如,下面的代码片断: CColorDialog dlg; if (dlg. DoModal() != IDOK) return; COLORREF myColor = dlg.GeColor();
81概述 815简单数据类CPon、CSie和 CRect 1. COin、 CSize和CRec类的构造函数 CPoint类带参数的常用构造函数原型如下 CPoint( int init, int initr); CPoint( Point initPt) CSize类带参数的常用构造函数原型如下: CSize( int initCX, int initCr) CSize( size initSize ) CRect类带参数的常用构造函数原型如下 CRect( int /, int t, int r, int b) CRect( const reCT& srcRect CRect( LPCReCt lp SrcRect ) CRect( point point, SIZE size ) CRect( POInT topLeft, PoinT bottom Right) 2. CPoint、CSie和 CRect的基本运算符操作 (1)“+”操作 若向 CPoint对象加上一个 CSize对象,则返回 CPoint对象。 若向 CRect对象加上一个 CPoint对象或 CSize对象,则返回CRec对象。 若向CRet对象加上一个 CSize对象,则将一个RECT(或 CRect)值偏移(移动) CSize大小
8.1 概述 8.1.5 简单数据类CPoint、CSize和CRect 1. CPoint、CSize和CRect类的构造函数 CPoint类带参数的常用构造函数原型如下: CPoint( int initX, int initY ); CPoint( POINT initPt ); CSize类带参数的常用构造函数原型如下: CSize( int initCX, int initCY ); CSize( SIZE initSize ); CRect类带参数的常用构造函数原型如下: CRect( int l, int t, int r, int b ); CRect( const RECT& srcRect ); CRect( LPCRECT lpSrcRect ); CRect( POINT point, SIZE size ); CRect( POINT topLeft, POINT bottomRight ); 2. CPoint、CSize和CRect的基本运算符操作 (1) “+”操作 若向CPoint对象加上一个CSize对象,则返回CPoint对象。 若向CRect对象加上一个CPoint对象或CSize对象,则返回CRect对象。 若向CRect对象加上一个CSize对象,则将一个RECT(或CRect)值偏移(移动)CSize大小
81概述 (2)“3操作 若从 COin对象减去一个 CSize对象,则返回一个 CPoint对象。 若从 COin对象减去一个 CPoint对象,则返回一个 CSize对象。 若从 CRect对象减去一个 CPoint对象或 CSize对象,则返回一个 CRect对象。 3. CRect类的常用操作 由于一个CRec类对象包含用于定义矩形的左上角和右下角点的成员变量,因此在传递 LPRECT、 LPCRECT或RECT结构作为参数的任何地方,都可以使用 CRect对象来代替。 成员函数 InflateRect和 DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的, 也就是说,若指定 InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此下面只给 出 InflateRect函数的原型: void InflateRect( int x, int y) void InflateRect( sIzE Size void InflateRect( LPCreCt lpRect void InflateRect( int 1, int t, int r, int b) 成员函数 Intersectrect和 Unionrect分别用来将两个矩形进行相交和合并,当结果为空时 返回 FALSE,否则返回TRUE。它们的原型如下 BOOL IntersectRect( LPCRECt lpRect1, LPCRECT lpRect2) BOOL UnionRect( LPCRect lpRect/, LPCrect lpRect2
8.1 概述 (2) “-”操作 若从CPoint对象减去一个CSize对象,则返回一个CPoint对象。 若从CPoint对象减去一个CPoint对象,则返回一个CSize对象。 若从CRect对象减去一个CPoint对象或CSize对象,则返回一个CRect对象。 3. CRect类的常用操作 由于一个CRect类对象包含用于定义矩形的左上角和右下角点的成员变量,因此在传递 LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以使用CRect对象来代替。 成员函数InflateRect和DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的, 也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此下面只给 出InflateRect函数的原型: void InflateRect( int x, int y ); void InflateRect( SIZE size ); void InflateRect( LPCRECT lpRect ); void InflateRect( int l, int t, int r, int b ); 成员函数IntersectRect和UnionRect分别用来将两个矩形进行相交和合并,当结果为空时 返回FALSE,否则返回TRUE。它们的原型如下: BOOL IntersectRect( LPCRECT lpRect1, LPCRECT lpRect2 ); BOOL UnionRect( LPCRECT lpRect1, LPCRECT lpRect2 );
8.1概述 其中, prEeti和 lpRect2用来指定操作的两个矩形。例如: CRect ectoNe(125, 0, 150, 200) CRect rect Two( 0, 75, 350, 95) CRect rectInter rectInter. IntersectRect(rectOne, rect Two) ∥结果为(125,75,150,95) asserT(rectInter = CRect(125, 75, 150, 95)) rectInter. UnionRect (rectOne, rect Two) ∥结果为(0,0,350,200) AssERT(rectInter == CRect(0, 0, 350, 200))
8.1 概述 其中,lpRect1和lpRect2用来指定操作的两个矩形。例如: CRect rectOne(125, 0, 150, 200); CRect rectTwo( 0, 75, 350, 95); CRect rectInter; rectInter.IntersectRect(rectOne, rectTwo); // 结果为(125, 75, 150, 95) ASSERT(rectInter == CRect(125, 75, 150, 95)); rectInter.UnionRect (rectOne, rectTwo); // 结果为(0, 0, 350, 200) ASSERT(rectInter == CRect(0, 0, 350, 200));
8.2简单图形的绘制 821创建画笔 创建一个修饰画笔,可以使用CPen类的 CreatePen函数,其原型如下 BOOL CreatePen( int nPenStyle, int nWidth, COlORREF crColor 其中,参数 nPenStyle、 n width、 crColor分别用来指定画笔的风格、宽度和颜色。 BOOL CreatePenIndirect( LPlogPen lpLogPen 此函数用由 LOGPEN结构指针指定的相关参数创建画笔, LOGPEN结构如下 typedef struct tag LOGPEN i *lgp*/ UINT lopn Style,∥画笔风格,同上 POINT loan Width;/PONT结构的y不起作用而用x表示画笔宽度 COLORREF lopn color ∥画笔颜色 1 LOGPEN 值得注意的是: 当修饰画笔的宽度大于1个像素时,画笔的风格只能取 PS NULL、 PS SOLID或 PS INSIDEFRAME,定义为其他风格不会起作用。 画笔的创建工作也可在画笔的构造函数中进行,它具有下列原型 CPen( int nPen Style, int nWidth, colOrreF crColor
8.2 简单图形的绘制 8.2.1 创建画笔 创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下: BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 其中,参数nPenStyle、nWidth、crColor分别用来指定画笔的风格、宽度和颜色。 BOOL CreatePenIndirect( LPLOGPEN lpLogPen ); 此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下: typedef struct tagLOGPEN { /* lgpn */ UINT lopnStyle; // 画笔风格,同上 POINT lopnWidth;// POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor; // 画笔颜色 } LOGPEN; 值得注意的是: n 当修饰画笔的 宽度大于1 个像素时,画 笔的风格只能 取PS_NULL、PS_SOLID 或 PS_INSIDEFRAME,定义为其他风格不会起作用。 n 画笔的创建工作也可在画笔的构造函数中进行,它具有下列原型: CPen( int nPenStyle, int nWidth, COLORREF crColor );