对话框动态控件的创建 在Picture Control控件上显示图片 (转载)

对话框动态控件的创建 在Picture Control控件上显示图片 (转载)在对话框上的控件是 MFC 类的一个具体对象 其对应的变量内包含了类的数据成员和函数成员 当在对话框之上使用静态控件时 可以根据类向导来为每个控件添加消息 响应函数以及变量 当需要在对话框中动态的创建某个控件时 就需要手动为动态控件添加消息 响应函数及变量 即是手动来代替类向导 动态创建控件时 可按照以下步骤进行 1 明确控件所属于的类每一个控件都对应着一个类 如按钮 But

在对话框上的控件是MFC类的一个具体对象,其对应的变量内包含了类的数据成员和函数成员。当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息、响应函数以及变量。当需要在对话框中动态的创建某个控件时,就需要手动为动态控件添加消息、响应函数及变量,即是手动来代替类向导。

 动态创建控件时,可按照以下步骤进行:

(1) 明确控件所属于的类

每一个控件都对应着一个类,如按钮Button所属于的类为CButton。在程序中我们需要用CButton类创建一个具体的按钮对象,并用函数指示它在对话框之上的位置及大小。由于指针的众多好处,可用一个CButton *类型的变量来管理所创建的按钮。但要谨慎使用指针变量,防止内存泄露,野指针。 

(2) 确定控件的ID号

在对话框中的每一个控件都有一个独一无二的ID号。当用控件类来创建具体的控件对象时也需要这个ID来作为标识。ID号其实是一个宏,为了控件ID的有序性,可以到VS2012“资源管理器”下的String Table下为每一个控件定义ID值。这些ID号会自动的被保存到Resource.h文件中形成宏。

(3) 动态创建控件的一般流程

在明确了控件类和其ID号之后,就可以在合适的函数内编写动态创建控件的代码。动态生成按钮(Button)、文本框(Staic Text)、编辑框(Edit Control)、联合框(Combo Box)等控件的流程可表述如下(以创建文本框为例笔记):

 1 //动态创建一个静态文本框  2 CStatic *CMFCDialogDlg::CreateOneStatic(LPCTSTR str, CRect Coord, UINT IDC)  3 {  4 CStatic *pStatic = NULL;  5  6 pStatic = new CStatic;  7  ASSERT_VALID(pStatic);  8 pStatic->Create(str, WS_CHILD|WS_VISIBLE|SS_CENTER, Coord, this, IDC);  9 10 return pStatic; 11 }

以上是创建一个文本框的函数。首先明确文本框类为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类中包含了载入图片、绘制图片到某区域的成员函数。而Picture  Control控件正是为CImage对象提供了一个平台。也就是说经CImage对象载入到内存中的图片可以在Picture Control控件之上绘制出来。所以,CImage类和Picture Control控件类可以搭配使用。

(1) 准备Picture  Control控件

直接切换到对话框文件下,往对话框中拖入一个PictureControl控件。记住其ID号。

(2) Picture Control控件显示图片的代码

只从显示图片这个角度上说。Picture Control控件只是为图片显示提供了一个平台,载入图片及绘制图片的操作都是由CImage对象的成员函数完成的,另外还会用到一些其它的常用函数。

 1 int cx, cy;  2 CImage image;  3 CRect rect;  4  5 //根据路径载入图片  6 image.Load(_T("E:\\MyLibrayPhotoShop\\log.jpg"));  7 //获取图片的宽 高度  8 cx = image.GetWidth();  9 cy = image.GetHeight(); 10 11 //获取Picture Control控件的大小 12 GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect); 13 //将客户区选中到控件表示的矩形区域内 14 ScreenToClient(&rect); 15 //窗口移动到控件表示的区域 16 GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left, rect.top, cx, cy, TRUE); 17 CWnd *pWnd = NULL; 18 pWnd = GetDlgItem(IDC_PICTURE);//获取控件句柄 19 pWnd->GetClientRect(&rect);//获取句柄指向控件区域的大小 20 21 CDC *pDc = NULL; 22 pDc = pWnd->GetDC();//获取picture的DC 23 24 image.Draw(pDc->m_hDC, rect);//将图片绘制到picture表示的区域内 25 26 ReleaseDC(pDc);

读这段代码。

[1] CImage内的Load方法将指定路径下的图片载入,然后在利用其内的GetWidth和GetHeight方法获取到图片的宽度和高度。

[2] GetDlgItem通过PictureControl控件的ID获取到它的句柄后调用Picture Control中的GetWindRect方法来获取它本身在对话框中所占用的范围。然后利用ScreenToClient方法将客户区转到Picture Control内,目的是利用Picture Control内的MoveWindow方法重新设置Picture Control控件在对话框上所占的位置,是它适应图片的大小。

[3] 再重新设获取picture Control在对话框中占用的面积。用pDc来管理Picture Control中的DC。然后CImage的Draw方法就可以利用获取的参数在rect区域绘制图片了。

程序运行如下:

对话框动态控件的创建 在Picture Control控件上显示图片 (转载)
如果程序需要多次运行以上代码时才能够准确的显示图片,那么可以先一次性(如在OnInitDialog()函数中)载入图片。然后在OnPaint()函数中编写绘制图片的函数,让它得到多次运行。

转载于:https://www.cnblogs.com/gzy-zju-edu/articles/4173150.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227325.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:33
下一篇 2026年3月16日 下午9:34


相关推荐

  • oracle 分页查询 优化_oracle分页查询封装

    oracle 分页查询 优化_oracle分页查询封装对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如 此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情 况下,他们只看前几页。 通常有以下两种分页技术可供选择。 1234567Select * from (Select rownumrn,t.* from table t)Where rn>&minnum and rn或者Sel

    2025年7月18日
    9
  • dirsearch讲解_mv命令使用

    dirsearch讲解_mv命令使用dirsearch用法github地址参数选项(机翻)强制:字典设置:常规设置:请求设置:github地址https://github.com/maurosoria/dirsearch参数选项(机翻)强制:Mandatory:-uURL,–url=URL 目标URL-lFILE,–url-list=FILE 目标URL列表文件–stdin TargetURLlistfromSTDIN–cidr=CIDR

    2022年10月5日
    6
  • elastic search数据库集群部署「建议收藏」

    elastic search数据库集群部署「建议收藏」ES数据库安装elasticasearchelasticsearch的概念:是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎ApacheLucene基础上的搜索引擎,使用Java语言编写。1、elasticsearch和MongoDB/redis/memcache一样,是非关系性数据库是一个接近实时的搜索平台,从所索引这个文档到能够被搜索到只有一个轻微的延迟,企业应用定位:采用restfullapi标准的可扩展和高可用的实时数据分析

    2022年6月9日
    45
  • 动作捕捉技术原理及其在机器人科研中的应用深度解析

    动作捕捉技术原理及其在机器人科研中的应用深度解析

    2026年3月12日
    2
  • gitee pycharm_怎么把git上放到pycharm

    gitee pycharm_怎么把git上放到pycharm好久没有使用git,都忘记git的操作流程了,只能强制回忆一下:今天接到领导通知,要把我这边写的代码提交到远程仓库,然后就想,他那边仓库里的代码源码都是我提供的,我本地在pycharm中也是添加了git管理的,所以就想直接我这边的仓库代码直接push到远程仓库上去,先pull,然后在push就行了,结果搞了半天,一直提示我这边的版本在远程仓库之前的版本:hint:Updateswererejectedbecausethetipofyourcurrentbranchisbehi

    2022年8月28日
    6
  • Deep Java Library_java atomicinteger

    Deep Java Library_java atomicintegerjava有NativeMemoryTracking帮助我们查看jvm带来的内存分配问题,这个只能看jvm带来的,如果是jni的调用申请的内存,那这个工具是没有用的。那大家可能疑惑了,那这个工具也没想象的那么有用,java各种分区,堆的,非堆的,还有直接内存的值jmx都有,想排查是否是jvm带来的似乎也可以做到。那NativeMemoryTracking的作用是什么呢?对比现有的工具查看内存数据的工…

    2025年8月13日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号