`
dogasshole
  • 浏览: 867260 次
文章分类
社区版块
存档分类
最新评论

MFC对话框画图

 
阅读更多

【原创,转载请注明出处】

实现功能:

1、在对话框上的一块区域绘制彩色线条。

2、窗口被覆盖后恢复时,图像自动重绘。

3、改变按钮颜色。

操作:

根据向导建立一个对话框程序。在资源中添加一个静态文本框,其ID为IDC_STATIC。

在DialogXXXDlg.h 中加入如下内容

CBrush m_brush;//用于自定义颜色
CDC m_memDC;//屏幕DC兼容的内存DC
CBitmap m_Bmp;//位图
CWnd* m_pDrawWnd;//用于保存静态文本框的对象指针
//
// 初始化和双缓冲相关的数据
voidInitialDBB();
//双缓冲内存上绘图
voidDrawOnMem();
//在静态区域画图
voidDrawOnStaticArea();
//更改颜色的消息响应函数
afx_msg HBRUSH OnCtlColor(CDC *pDC, CWnd*pWnd, UINT nCtlColor);

在DialogXXXDlg.cpp 中加入如下内容

1、添加消息映射

ON_WM_CTLCOLOR()

2、OnInitDialog()中添加初始化代码

// TODO: 在此添加额外的初始化代码
m_brush.CreateSolidBrush(RGB(255,0,0));//初始化画刷
m_pDrawWnd= GetDlgItem(IDC_STATIC);//获得静态窗口对象指针
InitialDBB();// 初始化双缓冲相关的数据

3、重写函数OnCtlColor()

//改变按钮颜色
HBRUSH CDialogDrawDlg::OnCtlColor(CDC *pDC, CWnd*pWnd, UINT nCtlColor)
{
HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
//
if(pWnd->GetDlgCtrlID()==IDOK || pWnd->GetDlgCtrlID()==IDCANCEL)
{
pDC->SetTextColor(RGB(255,0,0));//设置文本颜色
pDC->SetBkMode(TRANSPARENT);//文字背景设为透明
pDC->SetBkColor(RGB(255,0,0));//设置背景色
return m_brush;
}
//
return hbr;//m_brush;///hbr
}

4、添加头文件中声明的函数的定义代码


// 初始化和双缓冲相关的要素
voidCDialogDrawDlg::InitialDBB()
{
CRect rt;
m_pDrawWnd->GetClientRect(&rt);
CDC* sDC = m_pDrawWnd->GetDC();
// 为屏幕DC创建兼容的内存DC
if(!m_memDC.CreateCompatibleDC(sDC))//
{
::PostQuitMessage(0);
}

// 创建位图,不能是m_memDC,否则无颜色
m_Bmp.CreateCompatibleBitmap(sDC, rt.Width(), rt.Height());//m_memDC
// 相当于选择画布,m_pDrawWnd->
::SelectObject(m_memDC.GetSafeHdc(), m_Bmp);
m_pDrawWnd->ReleaseDC(sDC);
}


//双缓冲内存上绘图
voidCDialogDrawDlg::DrawOnMem()
{
CRect rect;
m_pDrawWnd->GetClientRect(&rect);

//COLORREF crl = GetSysColor(COLOR_3DFACE);
//m_memDC.FillSolidRect(rect, crl);
//m_memDC.FillSolidRect(&rect, 0x00FFFFFF);// 白色填充, 注意,这次是画在内存设备环境上
CPen pen(PS_SOLID,1,RGB(255,0,0));
m_memDC.SelectObject(&pen);

//画图部分
m_memDC.MoveTo(rect.right,rect.bottom);
m_memDC.LineTo(rect.left,rect.top);
}
//
//在静态区域画图
voidCDialogDrawDlg::DrawOnStaticArea()
{
CWnd* pWnd= GetDlgItem(IDC_STATIC);//获得静态文本框的窗口对象
CRect rect;
pWnd->GetClientRect(&rect);
//
CDC* pDC = pWnd->GetDC();//
//
DrawOnMem();
// 一次性的将内存设备环境上绘制完毕的图形"贴"到屏幕上
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY);
pWnd->ReleaseDC(pDC);//
//
}

5、OnPaint()函数中添加绘图代码(红色部分为添加内容)

voidCDialogDrawDlg::OnPaint()
{
if (IsIconic())
{
CPaintDCdc(this); // 用于绘制的设备上下文

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

// 使图标在工作区矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
//重绘图像区域
PAINTSTRUCT ps;
CRect rt;
m_pDrawWnd->GetClientRect(&rt);
CDC* pDC=m_pDrawWnd->BeginPaint(&ps);
DrawOnMem();
pDC->BitBlt(0, 0, rt.Width(), rt.Height(), &m_memDC, 0, 0, SRCCOPY);
m_pDrawWnd->EndPaint(&ps);
}
}

这里需要用BeginPaint()EndPaint()函数获得DC。原因是主窗体在处理WM_PAINT消息的时候也需要绘制发送消息给各个控件有机会绘制自己;如果不用BeginPaint()EndPaint()函数获得控件DC,该控件的消息队列中的WM_PAINT消息就不会被删除,控件就还会调用其自身的OnPaint()函数重绘控件,从而我们绘制的图像会被覆盖。

说明:这里的DrawOnStaticArea()没有用到。这是用作扩展时在该区域绘图的,写在这里是方便日后扩展。如果这样的话,OnPaint()中就不需要DrawOnMem();这句,直接将前面绘好的图贴上来就是。

分享到:
评论

相关推荐

    MFC对话框画图Demo

    本示例“MFC对话框画图Demo”是基于MFC库创建的一个对话框应用程序,用于在对话框上绘制各种图形,这对于学习和理解MFC的绘图机制非常有帮助。 1. **MFC绘图基础** 在MFC中,绘图主要通过`CDC`(Device Context)类...

    animation-technology.zip_mfc gif_mfc 对话框画图

    在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架下,利用对话框类进行GIF动画的显示。MFC是微软提供的一套C++库,用于简化Windows应用程序的开发,它提供了丰富的功能,包括对对话框、视图...

    MFC 利用对话框画函数曲线

    总结,利用MFC对话框画函数曲线涉及了C++面向对象编程、Windows GDI图形绘制以及MFC的对话框管理。通过这种方式,我们可以创建一个直观且灵活的图形化工具,不仅限于sin函数,还可以应用于其他任何可表达为数学函数...

    MFC用鼠标和对话框画圆矩形直线

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库在Windows应用程序中实现鼠标和对话框交互式地绘制圆形、矩形以及直线。MFC是Microsoft为C++开发Windows应用程序提供的一种类库,它封装了...

    mfc在对话框中画直线

    1. **创建对话框类** 首先,你需要创建一个继承自`CDialog`的类,并在类中添加必要的成员变量和函数。例如,如果要画直线,你可能需要存储起点和终点坐标。 2. **重载 OnInitDialog() 函数** `OnInitDialog()`...

    绘制折线图,MFC,ChartCtrl

    本文将详细讲解如何利用MFC库中的ChartCtrl控件来绘制折线图。 首先,理解ChartCtrl的基本概念。ChartCtrl是MFC提供的一种图形用户界面控件,用于展示各种数据图表,包括折线图、柱状图、饼图等。它是Microsoft ...

    MFC绘制图表(折线图、饼图、柱形图)控件 High-speed Charting Control

    在VS2015环境下64位、32位编译通过。High-speed Charting Control--MFC绘制图表(折线图、柱形图)控件。中文翻译文档可参照https://blog.csdn.net/xuanyuanlei1020/article/details/53487107

    对话框中画图

    1. **MFC框架**:在Windows平台上,Microsoft Foundation Classes (MFC) 是一种面向对象的类库,它基于Windows API构建,使得开发者可以更方便地创建Windows应用程序,包括对话框。MFC提供了CDialog类,用于创建和...

    mfc基础教学实例

    **MFC基础教学实例——VC++ MFC基于对话框画正余弦曲线** MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于简化Windows应用程序开发。在这个基础教学实例中,我们将探讨如何使用VC++ MFC来在...

    基于对话框的抛物线画法

    在编程实现上,可能使用了如MFC(Microsoft Foundation Classes)或者Qt这样的库来创建对话框,并处理用户的输入事件。当用户点击“确定”按钮时,程序会读取编辑框中的值,然后根据这些系数计算一系列坐标点,这些...

Global site tag (gtag.js) - Google Analytics