平台:VS2012
程序类型:MFC 应用程序
动态创建控件时,可按照以下步骤进行:
每一个控件都对应着一个类,如按钮Button所属于的类为CButton。在程序中我们需要用CButton类创建一个具体的按钮对象,并用函数指示它在对话框之上的位置及大小。由于指针的众多好处,可用一个CButton *类型的变量来管理所创建的按钮。但要谨慎使用指针变量,防止内存泄露,野指针。
在对话框中的每一个控件都有一个独一无二的ID号。当用控件类来创建具体的控件对象时也需要这个ID来作为标识。ID号其实是一个宏,为了控件ID的有序性,可以到VS2012“资源管理器”下的String Table下为每一个控件定义ID值。这些ID号会自动的被保存到Resource.h文件中形成宏。
[cpp] view plain copy //动态创建一个静态文本框 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; }
以上是创建一个文本框的函数。首先明确文本框类为CStatic,然后用C++的动态分配函数分配一个文本框对象,最后利用文本此对象的Create函数将对象按照指定风格(标题str,文本框显示外表,坐标,ID号)显示在对话框之上。最后将创建的控件地址返回给调用函数以管理。动态创建控件的核心就是每个控件类的对象中的create函数,不同的控件类的create函数需要的参数可能不同。当需要释放创建的动态按钮时,用delete语句释放动态按钮的地址即可(这也属于new-delete动态分配必须的搭配),在对画框之上创建的控件也会随之消失。
在MFC中,CImage类中包含了载入图片、绘制图片到某区域的成员函数。而Picture Control控件正是为CImage对象提供了一个平台。也就是说经CImage对象载入到内存中的图片可以在Picture Control控件之上绘制出来。所以,CImage类和Picture Control控件类可以搭配使用。
直接切换到对话框文件下,往对话框中拖入一个Picture Control控件。记住其ID号。
[cpp] view plain copy 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);
读这段代码。
[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区域绘制图片了。
程序运行如下:
如果程序需要多次运行以上代码时才能够准确的显示图片,那么可以先一次性(如在OnInitDialog()函数中)载入图片。然后在OnPaint()函数中编写绘制图片的函数,让它得到多次运行。 MFC Note Over.