对话框上动态控件的创建、在Picture Control控件上显示图片
1 MFC对话框之上的动态控件的创建
对话框上的控件是MFC类的一个具体对象。
当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息、响应函数以及变量。
当需要在对话框中动态的创建某个控件时,就需要手动来代替类向导为动态控件添加消息、响应函数及变量。
动态创建控件时,可按照以下步骤进行:
(1) 明确控件所属于的类
每一个控件都对应着一个类(例如按钮Button所属于的类为CButton)。
如,在程序中我们需要用CButton类创建一个具体的按钮对象,并用函数指示它在对话框之上的位置及大小。
由于指针的众多好处,可用一个CButton
*类型的变量来管理所创建的按钮。但要谨慎使用指针变量,防止内存泄露,野指针。
(2) 确定控件的ID号
当用控件类来创建具体的控件对象时, 需要独一无二ID来作为标识。ID号其实是一个宏,为了控件ID
的有序性,可以到VS2012“资源管理器”下的String
Table下为每一个控件定义ID值。这些ID号会自动的被保存到Resource.h文件中形成宏。
(3) 动态创建控件的一般流程
在明确了控件类和其ID号之后,就可以在合适的函数内编写动态创建控件的代码。动态生成按钮(Button)、文本框(Staic Text)、编辑框(Edit Control)、联合框(Combo Box)等控件的流程可表述如下(以创建文本框为例):
创建一个文本框的函数:
//动态创建一个静态文本框
CStatic *CMFCDialogDlg::CreateOneStatic(LPCTSTR str, CRect Coord, UINT IDC)
{
CStatic *pStatic = NULL; pStatic = new CStatic;
ASSERT_VALID(pStatic);
pStatic->Create(str, WS_CHILD|WS_VISIBLE|SS_CENTER, Coord, this, IDC); return pStatic;
}
PS:
首先, 明确文本框类为CStatic; 然后, 用C++的动态分配函数分配一个文本框对象; 随后, 利用文本此对象的 Create函数将对象按照指定风格(标题str,文本框显示外表,坐标,ID号)显示在对话框之上。最后,将创建的控件地址返回给调用函数以管理。
动态创建控件的核心就是每个控件类的对象中的create函数,不同的控件类的create函数需要的参数可能不同。当需要释放创建的动态按钮时,用 delete语句释放动态按钮的地址即可(这也属于new-delete动态分配必须的搭配),在对画框之上创建的控件也会随之消失。
(4) 动态控件大小随对话框比例变化
利用控件内的Create函数动态创建控件到对话框上时,可以不要将坐标都用常值。因为对话框窗口可以跟随用户的需要发生变化。
MFC中指定了对话框大小发生变化的消息ON_WM_SIZE(),只要在ON_WM_SIZE()消息,对应的响应函数OnSize()中获取到大小变化后的对话框的尺寸,就能够按照动态控件与对话框的比例来决定当前控件的大小了。这样,动态控件也能够跟随对话框成比例的变化了。
2 Picture Control控件显示图片
在MFC中,CImage类中包含了载入图片、绘制图片到某区域的成员函数。而PictureControl控件正是为CImage对象提供了一个平台。也就是说经CImage对象载入到内存中的图片可以在Picture
Control控件之上绘制出来。所以,CImage类和PictureControl控件类可以搭配使用。
(1) 准备Picture Control控件
直接切换到对话框文件下,往对话框中拖入一个PictureControl控件。记住其ID号。
(2) Picture Control控件显示图片的代码
只从显示图片这个角度上说。PictureControl控件只是为图片显示提供了一个平台,载入图片及绘制图片的操作都是由CImage对象的成员函数完成的,另外还会用到一些其它的常用函数。
下面的这段代码可以在MFC视类的onDraw函数中,或者对话框中的OnPaint函数中进行实现。
int cx, cy;
CImage image;
CRect rect; //根据路径载入图片
image.Load(_T("E:\\MyLibrayPhotoShop\\log.jpg"));
//获取图片的宽 高度
cx = image.GetWidth();
cy = image.GetHeight(); //获取Picture Control控件的大小
GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect);
//将客户区选中到控件表示的矩形区域内
ScreenToClient(&rect);
//窗口移动到控件表示的区域
GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left, rect.top, cx, cy, TRUE);
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_PICTURE);//获取控件句柄
pWnd->GetClientRect(&rect);//获取句柄指向控件区域的大小 CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture的DC image.Draw(pDc->m_hDC, rect);//将图片绘制到picture表示的区域内 ReleaseDC(pDc);
PS:
[1] CImage内的Load方法将指定路径下的图片载入,然后在利用其内的GetWidth和GetHeight方法获取到图片的宽度和高度。
[2] GetDlgItem通过PictureControl控件的ID获取到它的句柄,然后,调用Picture Control中的GetWindRect方法来获取它本身在对话框中所占用的范围。再利用ScreenToClient方法将客户区转到PictureControl内,目的是利用PictureControl内的MoveWindow方法重新设置控件在对话框上所占的位置,是它适应图片的大小。
[3] 再重新设获取pictureControl在对话框中占用的面积。用pDc来管理PictureControl中的DC。然后CImage的Draw方法就可以利用获取的参数在rect区域绘制图片了。
参考文章
1. 最老实巴交,对话框动态控件的创建 在Picture Control控件上显示图片
对话框上动态控件的创建、在Picture Control控件上显示图片的更多相关文章
- C++MFC之picture control控件铺满图片
UpdateData(true); //更新路径公共变量 CString m_path = m_edit1.GetString(); if(m_path=="") ...
- OpenCV 通过 MFC 的 Picture Control 控件操作图像
假设希望对显示在MFC Picture Control 控件里的图像进行操作,比方画线画点之类的,能够利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 怎样将图像显示到 Picture C ...
- OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中
OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...
- mfc Picture Control 控件属性
知识点: Picture Control 控件属性 CStatic类 图片控件 图片控件使用 一.图片控件属性 Picture Control 属性: Type:Frame //框架 Type:Etc ...
- picture control控件
注意:picture control控件,需要先更改其ID再使用. CImage myImage; CFileDialog fileDlg(TRUE,NULL,NULL,OFN_ALLOWMULTIS ...
- 利用MFC Picture Control控件 加载bmp,png
1.在资源视图,选择PictureControl,并且在属性中把Type设置为Bitmap. 2.加载PNG CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC) ...
- 在VC++中使用Tab Control控件
系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用 查阅MSDN文档,对于创建T ...
- 【MFC】Tab Control 控件的使用(转)
原文转自 http://blog.csdn.net/hustspy1990/article/details/5425365 1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control ...
- 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
今天关闭一个窗体,报出这样的一个错误"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke.",这个不用多想,肯定是那个地方没有释放掉.既然碰到这个问题, ...
随机推荐
- SQL中rownum和order by的执行顺序的问题
在一个SQL中,如果同时使用rownum和order by,会有一个先后顺序的问题. 比如select id1,id2 from t_tablename where rownum<3 order ...
- Fix Valgrind's must-be-redirected error in Gentoo
Last week, I tried to use Valgrind to identify potential memory related bugs, since segmentation fau ...
- 1975: [Sdoi2010]魔法猪学院
k短路,只会写A*的飘过..priority_queue超空间差评!
- 基于Json.NET自己实现MVC中的JsonValueProviderFactory
写了博文ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项”之后,继续看着System.Web.Mvc.JsonValueProviderFactory的开源代码. 越看越 ...
- bzoj 1820 dp
最普通dp要4维,因为肯定有一个在上一个的位置,所以可以变为3维,然后滚动数组优化一下. #include<bits/stdc++.h> #define LL long long #def ...
- linux用户下的.profile文件丢失
登录用户时出现以下问题: #su - wqq-bash-4.1$ -bash-4.1$ 查看时发现环境变量文件丢失造成的 解决方法: # ls -la /etc/skel/ total 36drwx ...
- 纯CSS仿制Google女生节Doodle
看到google今天的女生节Doodle,自己用纯css仿制一个,送给老妈.老婆.女儿. 大家可以点这里在线观看效果,点这里下载收藏效果. 实现原理 1.利用checkbox侦听处理单击事件. 2.单 ...
- Ionic Js一:上拉菜单(ActionSheet)
上拉菜单(ActionSheet)通过往上弹出的框,来让用户选择选项. 非常危险的选项会以高亮的红色来让人第一时间识别.你可以通过点击取消按钮或者点击空白的地方来让它消失. HTML 代码 <b ...
- spring boot上传文件错误The temporary upload location [/tmp/tomcat.5260880110861696164.8090/work/Tomcat/localhost/ROOT] is not valid
参考了:https://www.jianshu.com/p/cfbbc0bb0b84 再次感谢,但还是有些调整 一.在zuul服务中加入两个配置参数(location: /data/apps/temp ...
- react篇章-事件处理
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...