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

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

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

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

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

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

1.3 对话框关联到 类中

右键对话框 添加类(或者双击窗口也可)

加入类名

1.4 模态创建

xxDlg.h窗口加入模态类头文件

在xx.DIALOG对话框双击【双缓冲绘制椭圆】按钮,进入xxDlg.cpp窗口


在OnBnClickedButton2()函数中加入以下代码:

CDlgEllipse dlg;
dlg.DoModal();


运行效果:

1.5 子窗口加入控件

在子窗口中加入一个Group控件,修改ID

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

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

ON_WM_PAINT()

2.2 添加函数声明

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

afx_msg void OnPaint();

2.3 添加代码

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

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

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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();
	}
}

运行效果:

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


2、子对话框选中,属性—>Title bar改为true

3、导入对应的图标到文件中;

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

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

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

原文地址:https://54852.com/zaji/5671046.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存