mfc 如何在创建窗口时画图

mfc 如何在创建窗口时画图,第1张

不要直接获取picturecontrol的dc以后就开始画画画

获取以后创建一个兼容的bitmap,然后创建一个兼容dc,把bitmap选到dc里,在新dc里画画画,画了以后用SetBitmap搞进去

注意:后续的绘画如果要SetBitmap给它一个新的Bitmap,记得把之前的Bitmap删掉,否则会内存泄漏。

(用GetBitmap出来然后DeleteObject,或者GetBitmap出来然后修改Bitmap之后对控件调用InvalidateRect

1、可以在内存中建立一张缓存,然后在这个上画你需要的图,然后输出到窗体,这样你可以直接保存成了。
2、画在bitmap上
bitmap有save方法
创建graphics的时候用:GraphicsFromImage()

比如现在你有一个BUTTON空间吧!
ID是IDC_BUTTON1,在这个空间上面右击鼠标,选择ClassWizard,添加BN_CLICKED消息,然后在OnButton1消息响应函数中调用
GetDlgItem(IDC_EDIT1)获取当前编辑控件的指针调用SetWindowText()函数设置,形式如下
GetDlgItem(IDC_EDIT1)->SetWindowText("这是个测试");
完成!你可是试验一下

MFC自带的绘图函数有圆形 矩形 圆角矩形 椭圆
好像没有五角星,不过你可以自定义一个函数
截取point A和point B 在两点组成的区域内,用数学几何方法求出五个点的坐标,
然后画五条直线
几何求点的思路:
角度 int A[]={90,90+721,90+722,90+723,90+724};
Point[i]x=Rcos(A[i]);
Point[i]y=Rsin(A[i]);
半径R的算法:
R=rectWidth()>rectHeight()rectWidth():rectHeight();
当用户点击一个工具栏图标时,你要把图标的类型记录到Frame的成员变量
在LButtonDown和LButtonUp的事件中截获两点的坐标
再根据用户选择的工具栏图标类型,在区域内绘制相应的图案

在VS2013/MFC中使用TeeChart绘图控件的方法:
在网上下载TeeChart控件并安装,安装自然不用多说,安装完后找到安装路径(带有TeeChart5ocx文件),复制当前路径
安装完后需要对控件进行简单的注册,打开cmd,通过cd指令并粘贴原来复制好的路径,转到软件安装好的目录;
接着输入:regsvr32 TeeChart5ocx,然后d出对话框提示注册成功
注册完毕,打开VS2013,新建一个MFC项目,在VC++栏中找到MFC项目,选择好项目存放的目录并填写项目名称
接着是创建向导,只需修改选择“基于对话框”模式,至于“最小化框”和“最大化框”随各自情况选择,其余的默认点“下一步”即可
将默认生成的三个控件按delete键删除
接下来导入TeeChart控件,选择“工具"-》"选择工具箱项"-》"COM组件",找到"TeeChart Pro Active control v5"并选中它,点击"确定"
在工具箱中找到“TeeChart Pro Active control v5”控件并拖放到对话框上,适当调整控件大小
控件已经导入了,接下来需要添加相关的“类”和“变量”,首先添加类。
在“类视图”中右键项目名称,选择“添加”-》“类”;
然后选择“MFC”项中的“TypeLib中的MFC类”,点“添加”。
在注册表的可用类型库中找到"TeeChart Pro Active control v5<10>",这里不需要一直下拉慢慢找,只要输入"tee"就可以直接选中
在“接口”中选择所需的类,Teechart控件包含很多类,CTChart是必须的,对应的接口是“ITChart”,其他类包括CSeries、CAxis、CAxes、CTitles等等,这里仅以“CTChart”和“CSeries”为例,选择“ISeries”、“ITChart”。
确定以后可以在类视图中看到新添加的两个类。
接下来需要对控件关联变量,对控件右键选择“添加变量”,选择默认的控件类型,属于类“CTchart1”,对变量进行命名,这里命名为"m_chart",这样类和变量就关联好了。
项目中会多出一个tchart1h文件和tchart1cpp文件,在对话框类的头文件CTestDlgh中会有“CTchart1 m_chart;”的变量定义,但是CTestDlgcpp文件中对话框类的构造函数会多出一句“, m_chart(0)”,需要把它删除,否则会编译出错。这样前期准备工作就完成了
END
控件绘图示例-绘制随机曲线
添加一个按钮,修改属性“Caption”和“ID”
双击按钮自动生成按钮点击事件处理函数,编辑函数,注意添加CSeriesh头文件,用AddXY函数进行绘图,第一个参数表示横坐标,第二个表示纵坐标,和面两个默认NULL就行。
void CTestDlg::OnBnClickedDraw()
{
// TODO: 在此添加控件通知处理程序代码
CSeries lineSeries = (CSeries)m_chartSeries(0);
lineSeriesClear();
for (int i = 0; i < 100; i++)
{
lineSeriesAddXY((double)i, rand(),NULL,NULL);
}
}
这样,一个简单的Teechart应用程序就完成了。

在对话框中响应CDialog::OnLButtonDown(nFlags, point);与CDialog::OnLButtonUp(nFlags, point);CDialog::OnMouseMove(nFlags, point);这三个事件,给个例子,比着这个改一下。
先定义BOOL m_bMove=false;
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_ptOld=point;
m_bMove=TRUE;//保存这个坐标点
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//画出连续的带有颜色的线
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));//创建一个画笔
CPen pOldPen=dcSelectObject(&pen);//选到一个设备描述表中
if(m_bMove==TRUE)
{
dcMoveTo(m_ptOrigin);//划线时先把移动到原点
dcLineTo(point); //划到线的终点
m_ptOrigin=point; //连续划线就要将线的终点重设为下一次线的起点
}
dcSelectObject(pOldPen);/ //释放
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bMove=FALSE;
CView::OnLButtonUp(nFlags, point);
}

不需要这样。

在子对话框 初始化时,在保留的绘图的位置,创建一个 子窗口。

在子窗口的OnPaint事件中完成图形绘制。

具体实现可再交流。


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

原文地址:https://54852.com/yw/10586815.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存