• 对话框上动态控件的创建、在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控件上显示图片

  • 相关阅读:
    Log4net.config
    ASCII 转换帮助类
    维吉尼亚加密与解密
    nginx配置说明
    验证码
    css 设置下拉菜单
    输出一张自定义文字的图片
    mvc 自定义分页控件
    【模块化】export与export default在一个文件里共存,引入时需注意的地方
    【uniapp】兼容刘海屏底部安全区
  • 原文地址:https://www.cnblogs.com/arxive/p/4908607.html
Copyright © 2020-2023  润新知