想通过点击一个按钮,弹出一个对话框,在此对话框中绘制椭圆(对话框弹出时椭圆已绘制完毕,不需要点击按钮触发)。则需要在新建对话框的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
中添加绘制代码,这样模态对话框弹出的时候,图形就绘制好了
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();
}
}
运行效果:
3 子对话框添加图标
3.1 先打开类向导为子对话框添加OnInitDialog() 成员虚函数
2、子对话框选中,属性—>Title bar改为true
3、导入对应的图标到文件中;
4、在子对话框OnInitDialog() 中写入以下代码:文章来源:https://www.toymoban.com/news/detail-458735.html
//创建图标
HICON icon;
//加载图标
icon = AfxGetApp()->LoadIcon(IDI_ICON3);//图标ID
SetIcon(icon,true);
SetIcon(icon,false);
文章来源地址https://www.toymoban.com/news/detail-458735.html
到了这里,关于MFC 子窗口利用双缓冲在指定控件中绘制椭圆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!