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

(1) 准备Picture  Control控件

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

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

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

    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控件上显示图片

时间: 2024-10-09 20:53:14

对话框上动态控件的创建、在Picture Control控件上显示图片的相关文章

OpenCV 通过 MFC 的 Picture Control 控件操作图像

如果希望对显示在MFC Picture Control 控件里的图像进行操作,比如画线画点之类的,可以利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 如何将图像显示到 Picture Control 控件不谈,本文是采用的这篇博客所介绍的方法实现的. 点击打开链接 给对话框添加 WM_LBUTTONDOWN 鼠标左键点击消息,在消息响应函数中添加如下代码: void CMFCOpenCVShowDlg::OnLButtonDown(UINT nFlags, CPoint point

OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上非常多人表示仅仅要将那两个文件人为的提取出来然后放到project里面就解决这个问题了,也提供了两个文件的下载,可是这麻烦不说.还会导致一些奇奇怪怪的报错(至少本人是这种,非常崩溃!).所以在了解了一些gdi画图之后结合网上的代码写了例如以下的函数,仅仅需调用就能够将O

OpenCV 2.2版本以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序员无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上很多人表示只要将那两个文件人为的提取出来然后放到工程里面就解决问题了,也提供了两个文件的下载,但是这麻烦不说,还会导致一些奇奇怪怪的报错(至少本人是这样的,很崩溃!).所以在了解了一些gdi绘图之后结合网上的代码写了如下的函数,只需调用就可以将OpenCV的图片显示在上面

Picture Control 控件

Picture Control 控件属性  CStatic类  图片控件  图片控件使用 一.图片控件属性 Picture Control 属性: Type:Frame //框架 Type:Etched Horz水平蚀刻线条 Type:Etched Vert垂真蚀刻线条 Type:Rectangle实心矩形 Type:Bitmap位图 Type:Icon  图标 Type:Enhanced Metafile 增强图元 支持wmf格式图片 Type:Owner Draw   自绘图 Color:颜

mfc Picture Control 控件属性

知识点: Picture Control 控件属性 CStatic类 图片控件 图片控件使用 一.图片控件属性 Picture Control 属性: Type:Frame //框架 Type:Etched Horz水平蚀刻线条 Type:Etched Vert垂真蚀刻线条 Type:Rectangle实心矩形 Type:Bitmap位图 Type:Icon 图标 Type:Enhanced Metafile 增强图元 支持wmf格式图片 Type:Owner Draw 自绘图 Color:颜色

OpenCV获取摄像头视频并在MFC的Picture控件上显示

分为两步:OpenCV获取摄像头数据+图像在Picture上显示 第一步:OpenCV获取摄像头数据 参考:http://www.cnblogs.com/epirus/archive/2012/06/04/2535190.html http://blog.sina.com.cn/s/blog_6dbe9bdb0100nii7.html http://blog.csdn.net/augusdi/article/details/8762961 #include "stdafx.h" #in

MFC&Opencv 在Picture控件里显示和处理图像

在VS2005和2008里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上只包含一个 Program),当我们要构建一个多Program的应用时(例如一个客户端程序加一个服务器应用程序),利用 Solution 可以将这些 Projects 组合起来.并且共享文件和函数库.通常需要为Solution创建一个主路径,其中包含了有Projects的路径.不过在这篇文章里,我们只构建一个简单的Project,所以在创建MFC的New Project对话框里

基于wince的MFC Tab Control控件的使用

1,先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control控件放到对话框中的合适位置上. 再在对话框类中,声明一个CTabCtrl变量: CTabCtrl m_tab; 变量m_tab用来与对话框中的Tab Control控件交互,为此要在DoDataExchange函数中加入DDX_Control语句: 1 //{{AFX_DATA_MAP(CTABDlg) 2 DDX_Control(pDX, IDC_TAB, m_tab); 3 //}}AFX_DATA_MAP IDC_

在VC++中使用Tab Control控件

系统环境:Windows 7 软件环境:Visual Studio 2008 SP1 本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用 查阅MSDN文档,对于创建Tab Control控件,MSDN上说明如下: To use CTabCtrl directly in a dialog box 1.     In the dialog editor, add a Tab Control to your dialog template resource. Sp