MFC 子窗口利用双缓冲在指定控件中绘制椭圆

这篇具有很好参考价值的文章主要介绍了MFC 子窗口利用双缓冲在指定控件中绘制椭圆。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

想通过点击一个按钮,弹出一个对话框,在此对话框中绘制椭圆(对话框弹出时椭圆已绘制完毕,不需要点击按钮触发)。则需要在新建对话框的OnPaint()函数中绘制

1 建立模态对话框
1.1 插入一个新的对话框

MFC 子窗口利用双缓冲在指定控件中绘制椭圆

1.2 修改对话框ID:选择对话框,Alt+Enter快捷键进入属性表

MFC 子窗口利用双缓冲在指定控件中绘制椭圆

1.3 对话框关联到 类中

右键对话框 添加类(或者双击窗口也可)
MFC 子窗口利用双缓冲在指定控件中绘制椭圆
加入类名
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

1.4 模态创建

xxDlg.h窗口加入模态类头文件
MFC 子窗口利用双缓冲在指定控件中绘制椭圆
xx.DIALOG对话框双击【双缓冲绘制椭圆】按钮,进入xxDlg.cpp窗口

MFC 子窗口利用双缓冲在指定控件中绘制椭圆
OnBnClickedButton2()函数中加入以下代码:

CDlgEllipse dlg;
dlg.DoModal();

MFC 子窗口利用双缓冲在指定控件中绘制椭圆
运行效果:
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

1.5 子窗口加入控件

在子窗口中加入一个Group控件,修改ID
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

2 子窗口中绘制图形
2.1 添加消息映射标志

在子窗口.cpp文件中添加消息映射标志

ON_WM_PAINT()

MFC 子窗口利用双缓冲在指定控件中绘制椭圆

2.2 添加函数声明

在子窗口.h文件中添加OnPaint()函数声明

afx_msg void OnPaint();

MFC 子窗口利用双缓冲在指定控件中绘制椭圆

2.3 添加代码

在子窗口.cpp文件中实现OnPaint()函数,在else中添加绘制代码,这样模态对话框弹出的时候,图形就绘制好了

void CDlgEllipse::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		//dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CWnd *pWnd = GetDlgItem(IDC_ELLIPSE); //IDC_ELLIPSE为Group控件ID
		CPoint ptCenter;
		CRect rect2, ellipseRect; //存放组框控件大小
		pWnd->GetClientRect(&rect2);
		ptCenter = rect2.CenterPoint();//返回CRect的中心点

		CDC *dc2;
		dc2 = pWnd->GetDC(); //获取控件的CDC指针

		CDC dcMem2;	  //用于缓冲作图的内存DC
		dcMem2.CreateCompatibleDC(dc2); //依附窗口DC创建兼容内存DC

		CBitmap bmp2;  //内存中承载临时图像的位图
		bmp2.CreateCompatibleBitmap(dc2, rect2.Width(), rect2.Height());
		CBitmap *pOldBmp = dcMem2.SelectObject(&bmp2); //将位图选择进内存DC
		dcMem2.FillSolidRect(0, 0, rect2.Width(), rect2.Height(), RGB(255, 153, 204));//在缓冲DC上绘制背景

		CBrush brush;
		brush.CreateSolidBrush(RGB(102, 102, 153)); // 用选择的颜色创建新画刷   
		CBrush *oldbrush;
		oldbrush = dcMem2.SelectObject(&brush);//选新的画刷

		CRgn rgn;
		rgn.CreateEllipticRgn(0, 0, rect2.Width(), rect2.Height());
		dcMem2.FillRgn(&rgn, &brush);

		CBrush brush2;
		CBrush *oldbrush2;
		brush2.CreateSolidBrush(RGB(rand() % 255, rand() % 255, rand() % 255));
		oldbrush2 = dcMem2.SelectObject(&brush2);//选新的画刷

		for (int i = 10; i > 0; i--)  //在内存DC上做同样的同心圆图象
		{		
			ellipseRect.SetRect(ptCenter, ptCenter);
			ellipseRect.InflateRect(i * 10, i * 10);		
			dcMem2.Ellipse(ellipseRect);		
		}

		dc2->StretchBlt(0, 0, rect2.Width(), rect2.Height(), &dcMem2, 0, 0, rect2.Width(), rect2.Height(), SRCCOPY);

		dcMem2.SelectObject(oldbrush);//将原来的画刷选回去
		dcMem2.SelectObject(pOldBmp);
		brush.DeleteObject(); // 删除新画刷   
		DeleteObject(&bmp2);  //删除位图
		dcMem2.DeleteDC();	 //删除DC
		DeleteObject(pOldBmp);	//删除备份位图
		ReleaseDC(dc2);

		CDialogEx::OnPaint();
	}
}

运行效果:
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

3 子对话框添加图标
3.1 先打开类向导为子对话框添加OnInitDialog() 成员虚函数

MFC 子窗口利用双缓冲在指定控件中绘制椭圆
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

2、子对话框选中,属性—>Title bar改为true
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

3、导入对应的图标到文件中;
MFC 子窗口利用双缓冲在指定控件中绘制椭圆
MFC 子窗口利用双缓冲在指定控件中绘制椭圆

4、在子对话框OnInitDialog() 中写入以下代码:

//创建图标
HICON icon;
//加载图标
icon = AfxGetApp()->LoadIcon(IDI_ICON3);//图标ID
SetIcon(icon,true);
SetIcon(icon,false);

MFC 子窗口利用双缓冲在指定控件中绘制椭圆文章来源地址https://www.toymoban.com/news/detail-458735.html

到了这里,关于MFC 子窗口利用双缓冲在指定控件中绘制椭圆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC第二十七天 通过动态链表实现游戏角色动态增加、WM_ERASEBKGND背景刷新的原理、RegisterClass注册窗口与框架程序开发

    WM_ERASEBKGND是一种消息类型,它是在窗口需要重绘背景时发送给窗口的。背景刷新的原理是在窗口绘制之前,系统首先向窗口发送WM_ERASEBKGND消息,窗口可以在处理此消息时进行背景擦除操作,即清除原有的背景后。系统会发送WM_PAINT消息,窗口可以在处理此消息时进行绘制操作

    2024年02月14日
    浏览(35)
  • MATLAB—绘制椭圆

    绘制圆,变换成椭圆(这里需要一个变换矩阵)。 MATLAB中的绘制:使用参数方程的形式。 figure(1) plot([-5 5],[0 0],\\\'k\\\',\\\'LineWidth\\\',1);hold on;% 画坐标轴 plot([0 0],[-5 5],\\\'k\\\',\\\'LineWidth\\\',1);hold on; theta=0:pi/20:2*pi;% 参数theta a=2;b=3;% 长短轴 x1=a*cos(theta) +1;% 偏置 y1=b*sin(theta) +1; plot(x1,y1,\\\'-\\\');hold on;

    2024年02月07日
    浏览(42)
  • 《数字图像处理-OpenCV/Python》连载(26)绘制椭圆和椭圆弧

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 本章介绍OpenCV的绘图功能和简单的鼠标交互处理方法。与Excel或Matplotlib中的可视化数据图不同,OpenCV中的绘图功能主要用于在图像的指定位置绘制几何图形。 本

    2024年02月06日
    浏览(75)
  • android:绘制圆角矩形,椭圆形

    一、前言:在我们工作中会有绘制不同圆角的按钮图形,具体该怎么做之前也只是了解个大概,今天看了一节课,听完老师讲的我自己又写了一遍,记录一下。 二、代码展示: 首先先创建一个DrawableShapeActivity 相对应的xml 以及两个形状xml:shape_oval_rose.xml shape_ract_gold.xml

    2024年02月06日
    浏览(43)
  • 详解OpenCV的椭圆绘制函数ellipse()

    函数ellipse()用于在图像上绘制椭圆。 有两种原型,这里只列出常用的那种。 C++原型如下: Python原型如下: 参数意义如下: img—绘制的椭圆所在的图像。 center—椭圆的中心坐标。 axes—椭圆的长半轴和短半轴的长度。 angle—椭圆旋转的角度,单位为度。 startAngle—椭圆孤起始

    2024年02月15日
    浏览(38)
  • Opencv(C++)笔记--绘制直线、矩形、椭圆、圆、填充多边形、绘制字体和随机产生坐标点

    目录 1--cv::line()绘制直线 2--cv::Rect()绘制矩形 3--cv::ellipse()绘制椭圆 4--cv::circle()绘制圆 5--cv::fillPoly()填充多边形 6--cv::putText()绘制字体 6--cv::RNG随机产生坐标点 使用 cv::Point p1 定义坐标点; 使用 cv::line() 绘制直线,传入的参数依次为:背景图、两个点的坐标、直线的颜色、直线

    2024年02月14日
    浏览(60)
  • 【MATLAB基础绘图第4棒】绘制椭圆形相关系矩阵图

    数据及代码下载: 下载专区-《MATLAB统计分析与应用:40个案例分析》程序与数据 绘图函数: 数据如下: MATLAB代码如下: 运行上述命令得出变量间的相关系数矩阵R、线性相关性检验的p值矩阵P以及相关系数矩阵图。成图如下所示: 图形参数修改可根据需要对 matrixplot函数 进

    2024年02月04日
    浏览(67)
  • el-tree设置利用setCheckedNodes/setCheckedKeys默认勾选节点,以及通过setChecked新增勾选指定节点

    实现目标:在生成el-tree时,默认勾选其中某几个选项;或在进行某个选项的选中时,同时勾选上另一个选项。 实现效果: 在生成树结构时,默认勾选其中的两个选项。 在勾选其中一个选项时,另一个选项也被同时勾选。 实现方法: 一、设置生成el-tree时默认勾选:两种方法

    2023年04月23日
    浏览(58)
  • OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

    目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse()  4.绘制矩形rectangle() 5.绘制多边形 fillPoly()  6.绘制文字putText() 7.例子 1.绘制直线line() img:绘制圆形的图像 ptl:直线起始点在图像中的坐标 pt2: 直线终点在图像中的坐标 color:圆形的颜色,用三通道表示 thickness:轮廓的宽

    2024年02月09日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包