wls([email protected])
2013年4月7日
话说周日上班真的很不习惯,对我这种双休的人来说,放三天假也没有什么吸引力,北京的自然环境这么差也不好在外面蹦跶。问:怎样防雾霾?专家:尽量呆在家里不要开窗。问:怎样防禽流感?专家:多开窗、常通风。
北京只有寒来暑往,没有春去秋来。
洛阳亲友如相问,就说我在开关窗。
=============================我是分割线============================
今天有同事想拷贝一个对画框资源到另一个工程,我帮了个小忙,于是就有了这篇小文档。我会一步一步的描述操作并截图,以再现整个过程。
============================我也是分割线===========================
1新建一个文件夹TransplantDlgRes,我会在这个文件夹里建两个小工程。
新建一个名为DlgRes的对话框工程。如图步骤1-1。
2给对话框资源添加一个按钮,ID改为IDC_BTN_TEST,Caption改为TEST。如图。步骤1-2.
记住,这个对话框是工程本身的对话框,它的ID叫IDD_DLGRES_DIALOG。这个我们不用,只是用于测试在本地新添加的对话框确实能用。
3新添加一个对话框资源ID为IDD_DLG_RES,Caption叫资源对话框。请记住这个资源的ID。如图步骤1-3。
4现在可以往这个对话框上添加各种控件了,我添加了个一个编辑框和按钮,并改变了大小和位置,如图步骤1-4。
5给这个资源对话框添加类,类名为CWLSRes。如图步骤1-5.
6修改新添加按钮的ID为IDC_BTN_TEST和Caption为TEST。如图步骤1-6.
7双击TEST按钮添加函数OnBtnTest.如图步骤1-7.
8给编辑框添加成员变量m_edData,类别为控件,类型为CEdit。如图步骤1-8.
9给OnBtnTest添加一句话.
void CWLSRes::OnBtnTest()
{
CString strText;
m_edData.GetWindowText(strText);
MessageBox(strText);
}
下面来使用一个这个对话框,证明这个确实是可以用的。
10在DlgResDlg的实现文件里引用WLSRes.h。
#include "WLSRes.h"
在CDlgResDlg的OnBtnTest函数里调用一下对话框。
void CDlgResDlg::OnBtnTest()
{
CWLSRes wlsDlg;
wlsDlg.DoModal();
}
11运行一下,是可以用的哦。如图步骤1-11.
现在这个工程可以关闭了,请记住我们要移植的话框ID是IDD_DLG_RES。
=============================我又出现了============================
2.1下面再新建一个工程,名叫DlgDest。如图步骤2-1.
2.2好了,这个工程可以关闭了。对你没有看错,可以关闭了。
2.3我希望大家都装了Editplus或者之类的文本编辑工具。我用的是Editplus。不要问我是不是正版。依次打开DlgRes文件夹下的DlgRes.rc、resource.h,和DlgDest文件夹下的DlgDest.rc和Resource.h。
2.4在DlgRes.rc文件中查找IDD_DLG_RES,会找到如下代码。一般会在Dialog和Version之间。如图2-4-1。把这一块代码拷贝到DlgDest.rc的相应位置。如图2-4-2.
IDD_DLG_RES DIALOG DISCARDABLE 0, 0, 126, 146
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "资源对话框"
FONT 10, "System"
BEGIN
DEFPUSHBUTTON "OK",IDOK,7,73,112,14
PUSHBUTTON "Cancel",IDCANCEL,7,107,112,14
PUSHBUTTON "TEST",IDC_BTN_TEST,7,39,112,14
EDITTEXT IDC_EDIT1,7,7,112,12,ES_AUTOHSCROLL
END
在DlgRes.rc文件中查找IDD_DLG_RES,会找到如下代码。一般会在DESIGNINFO段和String Table段之间。如图2-4-3。把这一块代码拷贝到DlgDest.rc的相应位置。如图2-4-4.
IDD_DLG_RES, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 119
TOPMARGIN, 7
BOTTOMMARGIN, 139
END
注意:我不确定在这个文件里制表符和空格的具体意义,以及是否可以替换,所以我推荐使用文本编辑工具,并将空格、回车、制表符都显示出来,最好将空行都加上。
在DlgRes文件夹下的resource.h中找到新添加的对话框的ID以及对话框中其他资源的ID,代码如下,如图2-4-5。将这些代码拷贝到DlgDest文件夹下的Resource.h中。如图2-4-6.
2-5拷贝WLSRes.cpp、WLSRes.h到DlgDest工程文件夹下。
2-6编辑WLSRes.h文件,将刚才的3个ID定义复制到文件中如图2-6。
============================我是分隔符=============================
3删除DlgDest工程的DlgDest.ncb文件和DlgDest.clw文件。
4双击DlgDest.dsw文件打开工程。向工程添加WLSRes.cpp文件和WLSRes.h文件。
5打开类向导,会弹出提示框,点击确定后重建类向导文件。
6现在可以试一下这个资源是否可用了。
7当你写好简单的测试小代码,比方像我一样点击一个按钮以模式对话框的方式弹出刚才加载的对话框资源。但是build的时候有一个错误,不要担心,删掉无关的文件引用就好了,如图步骤2-7.
8你看,运行成功了。如图步骤8.
============================调皮的分割线===========================
1本文不讨论此种移植方法的具体意义和应用场景
2本文未曾测试在非模式对话框和子对话框的情形下是否能使用MAKEINTRESOURCE、GetDlgItem以及类似的宏和函数。