MFC图形函数(转载)
. 映射模式与坐标系
缺省情况下,绘图的默认映射模式为MM_TEXT,其绘图单位为像素(只要不打印输出,屏幕绘图使用该模式就够了)。若窗口客户区的宽和高分别为w和h像素,则其x坐标是从左到右,范围为0 ~ w-1;y坐标是从上到下,范围为0 ~ h-1。
virtual int SetMapMode( int nMapMode ); // 返回先前的映射模式
符号常量
|
数字常量
|
x方向
|
y方向
|
逻辑单位的大小
|
MM_TEXT
|
1
|
向右
|
向下
|
像素
|
MM_LOMETRIC
|
2
|
向右
|
向上
|
0.1 mm
|
MM_HIMETRIC
|
3
|
向右
|
向上
|
0.01 mm
|
MM_LOENGLISH
|
4
|
向右
|
向上
|
0.01 in
|
MM_HIENGLISH
|
5
|
向右
|
向上
|
0.001 in
|
MM_TWIPS
|
6
|
向右
|
向上
|
1/1440 in
|
MM_ISOTROPIC
|
7
|
自定义
|
自定义
|
自定义
|
MM_ANISOTROPIC
|
8
|
自定义
|
自定义
|
自定义
|
virtual CSize SetWindowExt( int cx, int cy );
virtual CSize SetViewportExt( int cx, int cy );
pDC->SetViewportExt(rect.right, -rect.bottom);
pDC->SetViewportOrg(rect.right / 2, rect.bottom /2);
pDC->Ellipse(CRect(-500, -500, 500, 500));
CDC的成员函数(如各种绘图函数)具有逻辑坐标参数
CWnd的成员函数(如各种响应函数)具有设备坐标参数(如鼠标位置point)
位置的测试操作(如CRect的PtInRect函数)只有使用设备坐标时才有效
长期使用的值应该用逻辑坐标保存(如窗口滚动后保存的设备坐标就无效了)
void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;
void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const;
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {
CRect rect = m_rect; // 逻辑坐标
if (rect.PtInRect(point)) // 位置的测试操作只有使用设备坐标时才有效
void CDrawView:: OnMouseMove (UINT nFlags, CPoint point) {
float t,y;
CDC* pDC = GetDC();
t = t1 + (point.x * dt) / w; sprintf(buf, "%.4fs", t); pSB->SetPaneText(xV, buf);
COLORREF SetPixel( int x, int y, COLORREF crColor ); 或
COLORREF SetPixel( POINT point, COLORREF crColor );
pDC->SetPixel(i, j, RGB(r, g, b));
当前位置:设置当前位置为(x, y)或point:(返回值为原当前位置的坐标)
CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point );
画线:使用DC中的笔从当前位置画线到点(x, y)或point:(若成功返回非0值):
画折线:使用DC中的笔,依次将点数组lpPoints中的nCount(≥2)个点连接起来,形成一条折线:
画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:
画矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用DC中的刷填充其内部区域:
rect = CRect(min(p0.x, point.x), min(p0.y, point.y), max(p0.x, point.x), max(p0.y, point.y));
画圆角矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用宽x3或point.x高y3或point.y矩形的内接椭圆倒角,再用DC中的刷填充其内部区域:
int d = min(rect.Width(), rect.Height()) / 4;
画(椭)圆:使用DC中的笔在左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:
画弧:(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 ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle);
画弓弦:参数的含义同上,只是用一根弦连接弧的起点和终点,形成一个弓形,并用DC中的刷填充其内部区域:
BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
画填充矩形:用指定的刷pBrush画一个以lpRect为区域的填充矩形,无边线,填充区域包括矩形的左边界和上边界,但不包括矩形的右边界和下边界:
画单色填充矩形:似FillRect,但只能填充单色,不能填充条纹和图案:
画饼图(扇形):参数含义同Arc,但将起点和终点都与外接矩形的中心相连接,形成一个扇形区域,用DC中的刷填充整个扇形区域,无另外的边线:
BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
画拖动的矩形:先擦除线宽为sizeLast、填充刷为pBrushLast的原矩形lpRectLast,然后再以线宽为size、填充刷为pBrush画新矩形lpRectLast。矩形的边框用灰色的点虚线画,缺省的填充刷为空刷:
void DrawDragRect( LPCRECT lpRect, SIZE size, LPCRECT lpRectLast,
SIZE sizeLast, CBrush* pBrush = NULL, CBrush* pBrushLast = NULL );
如:pDC->DrawDragRect(rect, size, rect0, size);
填充区域:
用当前刷从点(x, y)开始向四周填充到颜色为crColor的边界:
BOOL FloodFill(int x, int y, COLORREF crColor); // 成功返回非0
用当前刷从点(x, y)开始向四周填充:
BOOL ExtFloodFill(int x, int y, COLORREF crColor,
UINT nFillType); // 成功返回非0
pDC->ExtFloodFill(point.x, point.y, pDC->GetPixel(point), FLOODFILLSURFACE);
LPCRECT lpRectUpdate = NULL,
UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
pDC->FillSolidRect(&rect, RGB(255, 255, 255));