怎样用MFC画圆,要求圆要随着窗口的改变而改变!谢谢!

怎样用MFC画圆,要求圆要随着窗口的改变而改变!谢谢!,第1张

用画椭圆的函数Ellipse(x1,y1,x2,y2);
x1,y1是椭圆外切矩形的左上角坐标,x2,y2是右下角坐标。你只要确保这两点确定的是一个正方形,那么内切的椭圆就正好是圆了。
随着窗口改变,你可以随时获取窗口坐标,大小这些属性,来决定x1,y1,x2,y2的值即可

VC++画圆形可以使用API函数:Ellipse(int  x1, int y1, int x2, int y2);

其画圆的原理是矩形的内切圆,四个参数中的前两个是矩形左上角坐标,后两个是矩形右下角坐标。VC++画图形前得先有一块画布DC即设备上下文。下面个例子:

void CrrDlg::PaintCircle()   //画实心圆函数
{
CDC pDC = this->GetDC(); //获取DC
CBrush brush,oldbrush;   //画刷
//通过定时器中num递增,实现红色圆形与绿色圆形交替出现,即闪灯现象
if (num%2){    //num为定时器计数参数,其为偶数时画红色圆形
brushCreateSolidBrush(RGB(255,0,0));
}
else{         //num为奇数时,画绿色圆形
brushCreateSolidBrush(RGB(0,255,0));
}

oldbrush=pDC->SelectObject(&brush);
pDC->Ellipse(10,10,100,100);
pDC->Ellipse(110,10,200,100);
pDC->SelectObject(oldbrush);
ReleaseDC(pDC);
}
void CrrDlg::OnTimer(UINT_PTR nIDEvent)  //定时器
{
num++;
PaintCircle();
CDialogEx::OnTimer(nIDEvent);
}
画空心圆环需要使用画笔CPen,画法一样。

注意事项:
1如果是映射菜单命令的话,可以视图类映射,也可以在主框架映射,还可以在文档类或者应用类映射都可以,因为它是全局命令。但是你调用
pDC->Ellipse(100,100,200,200); 的话,在不同的类中映射位置可能不一样。
2 CDC pDC; 你只是声明了一个设备上下文的指针,这个设备上下文里面什么都没有,当然画不了图。应该对它赋值后再绘图。
CDC dDC=GetDC();这样就可以了。

以下方法可在MFC和控制台中都可以实现:
1HDC hdc = GetDC(HWND hWnd); 获得设备上下文的客户区一个指定的窗口或整个屏幕
eg:如果是在窗口类中可以:
HDC hdc = GetDC(this->m_hWnd);
2在窗口区画点。
SetPixel(
hdc,
x, // 横坐标
y , // 纵坐标
RGB(100,100,100)); //点的颜色。
3 画线
MoveToEx(
HDC hdc,
int X, // 横坐标
int Y, // 纵坐标
LPPOINT lpPoint //保存先前的点的位置,在这里你可以直接写NULL
)
LineTo(
HDC hdc, // device context handle
int nXEnd, // x-coordinate of line's ending point
int nYEnd // y-coordinate of line's ending point
);
4画圆
函数:
Ellipse(
HDC hdc, // handle to device context
int nLeftRect, // x-coord of bounding rectangle's upper-left corner
int nTopRect, // y-coord of bounding rectangle's upper-left corner
int nRightRect, // x-coord of bounding rectangle's lower-right corner
int nBottomRect // y-coord of bounding rectangle's lower-right corner
);
eg :Ellipse(hdc,0,0,100,100);

你需要一个类(也可以是别的什么)用来保存数据你的鼠标/键盘 *** 作只是不断的把采集的的图形参数保存到这个类里而绘图函数(如OnDraw)则只单纯的依据这些数据来绘图这样处理你还可以方便的实现如图形编辑等 *** 作

CClient DC(this);
CBrush pOldBrush = DCSelectObject(CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSHL)));
DCClientDCEllipse(10,10,100,100);
DCSelectObject(pOldBrush);
其中GetStockObject它是返回一个空的画刷, 但是这个画刷的类型是HGDIOBJECT, 它和HBRUSH不一样, 但是HBRUSH和HGDIOBJECT的关系就像基类和派生类, 但是还不是, 所以不强制类型转换的话就会报错 因此需要加一个强制类型转换
转换后的画刷句柄传给CBrush类的一个静态成员函数FromHandle, 它会把句柄变为一个CBrush类的对象, 并返回其指针
这样就得到了一个空画刷的对象, 然后用CClientDC的成员函数SelectObject把空画刷对象选到设备描述表中, 然后就可以画圆了
最后还要记得把原始画刷替换回去, 不然会引发一些图像的错误


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13350493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-19
下一篇 2023-07-19

发表评论

登录后才能评论

评论列表(0条)

保存