CClientDC dc(this);
CBrush *b=new CBrush(RGB(0,0,0));
dc.SelectObject(b);
dc.RoundRect(60,60,300,160,10,10);
RoundRect
函数功能:该函数画一个带圆角的矩形,此矩形由当前画笔画轮廓,由当前画刷填充。 函数原型:BOOL RoundRect(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidth, int nHeight); 参数: hdc:设备环境句柄。 nLeftRect:指定矩形左上角的X坐标。 nTopRect:指定矩形左上角的Y坐标。 nRightRect:指定矩形右下角的X坐标。 nbottomRect:指定矩形右下角的Y坐标。 nWidth:指定用来画圆角的椭圆的宽。 nHeight:指定用来画圆角的椭圆的高。 返回值:如果函数调用成功,则返回值非空,否则返回值是0。 Windows NT:若想获得更多的错误信息,请调用GetLastError函数。 备注:此函数不使用和改变当前位置。 Windows 95和Windows 97:限定矩形的坐标之和不能超过32767。nLeftRect和nRightRect之和或nTopRect和nBottomRect之和均不能超过32767。 速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。 |
BOOL LineDDA( int nXStart, // 线条起点的X坐标 int nYStart, // 线条起点的Y坐标 int nXEnd, // 线条终点的X坐标 int nYEnd, // 线条终点的Y坐标 LINEDDAPROC lpLineFunc, // 回调函数的指针 LPARAM lpData // 应用程序定义数据的指针); |
VOID CALLBACK LineDDAProc(int X, // 被求值点的X坐标 int Y, // 被求值点的Y坐标 LPARAM lpData // 应用程序定义数据的指针); |
void CLineDDAView::DrawWave(CPoint ptFrom, CPoint ptTo, COLORREF crValue) { g_crValue=crValue; //绘制图形用的颜色 CDC* pDC=GetDC(); //获取当前设备环境句柄 //通过LineDDA函数调用回调函数Proc以完成复杂线条的绘图工作 LineDDA(ptFrom.x,ptFrom.y,ptTo.x,ptTo.y,(LINEDDAPROC)Proc,(long)pDC); ReleaseDC(pDC); //释放申请到的设备环境句柄 } |
viod CALLBACK Proc(int X, int Y, LPARAM lpData) { //使用lpData传递用于绘图的CDC对象的引用 CDC* pDC; pDC = (CDC*)lpData; //该回调函数将在线上每个点处被调用,因此随着X坐标的变化,纵坐标Y+sin(X) //也就呈正弦波形波动,通过CDC类的SetPixel函数将计算出的波浪线上的每一点 //都显示出来。 pDC->SetPixel(X,Y+sin(X),g_crValue); } |
在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统。Windows提供了几种映射方式,每一种映射都对应着一种坐标系。例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两个坐标表示,x 表示横坐标,y表示纵坐标。在所有的GDI绘制函数中,这些坐标使用的是一种“逻辑单位”。当GDI函数将结果输出送到某个物理设备上时,Windows将逻辑坐标转换成设备坐标(如屏幕或打印机的像素点)。本文讨论了图形环境中的各个映射模式,包括它们是什么,怎么工作的,以及它们真正的含义。
一、基础知识
当在微软的窗口中进行绘图时,绘图的坐标原点在屏幕的左上角,任何物体在屏幕上定位都要参考这个坐标原点。在笛卡尔坐标系统中这个点被定义为坐标原点(0,0),水平坐标轴的正方向是从该点出发向右延伸,垂直坐标轴的正方向是从该点出发向下延伸。
图一、笛卡尔坐标系 |
void CExoDraw1View::OnPaint()
{
CPaintDC dc(this); // 绘图的设备厂上下文
CPen PenBlue;
// 兰色画笔
PenBlue.CreatePen(PS_SOLID, 1, RGB(0, 12, 255));
dc.SelectObject(&pPen);
dc.Ellipse(-100, -100, 100, 100);
}
|
图二、代码效果图 |
void CExoDraw1View::OnPaint()
{
CPaintDC dc(this); // 绘图的设备上下文
CRect Recto;
CPen PenBlue;
PenBlue.CreatePen(PS_SOLID, 1, RGB(0, 12, 255));
dc.SelectObject(&PenBlue);
dc.Ellipse(-100, -100, 100, 100);
CPen PenBlack;
PenBlack.CreatePen(PS_SOLID, 1, BLACK_PEN);
dc.SelectObject(&PenBlack);
// 得到客户区域的尺寸;
GetClientRect(&Recto);
dc.MoveTo(Recto.Width() / 2, 0);
dc.LineTo(Recto.Width() / 2, Recto.Height());
dc.MoveTo(0, Recto.Height() / 2);
dc.LineTo(Recto.Width(), Recto.Height() / 2);
}
|