用VS制作对话框向导.docx
《用VS制作对话框向导.docx》由会员分享,可在线阅读,更多相关《用VS制作对话框向导.docx(31页珍藏版)》请在冰豆网上搜索。
用VS制作对话框向导
用VS2008制作对话框向导
用VS2008制作对话框向导(完)
本内容整理自rover12421《用VS2008制作对话框向导(完)》
本人喜欢用VS,所以先说明,在这只教大家怎么用VS2008制作杨老师的那个对话框向导。
或许你还能做的比那个更好。
至于VC6的那个请自己查阅资料。
制作步骤:
1.制作一个对话框工程
2.创建一个空向导
3.制作对话框向导
4.怎么让别人使用你制作的向导制作前,先说下VS路径。
我是用的是默认路径:
C:
\ProgramFiles\MicrosoftVisualStudio9.0\VC。
如果不是这个路径的,请修改成对用的目录就行。
后面不再提示。
帖子因为中间有人回帖,和评分问题,所以操作步骤并不是一个一个的接着了,但也不是很乱。
希望对大家有帮助。
第二步,创建空向导。
文件--新建--VisualC++---自定义向导
下载(81.96KB)
2010-2-811:
03
我命名为DialogBasedApplication。
在弹出对话框点下一步。
下载(31.25KB)
2010-2-811:
03
这里,因为我们不需要交互操作,也不需要弹出什么提示,选择界面什么的,就不选择“用户界面”。
然后完成。
下载(24.35KB)
2010-2-811:
03
只有简单的几个文件。
制作向导最关键的是default.js文件和Templates.inf文件。
创建好以后,在“新建--项目--向导”里就能看到这个向导了
下载(61.27KB)
2010-2-811:
03
现在这个向导什么事也不能。
下一步再教大家制作一个功能完善的向导。
这节很简单,就说一些相关知识,以减少下节的负担。
首先看下怎么向导向导说明。
就是上图中位于名称上方的“TODO:
向导说明。
”这个需要在vsdir文件修改。
打开DialogBasedApplication.vsdir文件,只有简单的一行:
DialogBasedApplication.vsz||DialogBasedApplication|1|TODO:
向导说明。
||6777||DialogBasedApplication
大家一定看到了“TODO:
向导说明。
”这句话吧,我先来修改这句话,改成“DialogBasedApplication.By<Rover12421>”。
保存,然后新建项目选择我们刚才创建的向导,是不是已经改过来了?
如果以前创建过,可能这里并不能看出来。
关于vsdir文件,大家也可以参考MSDN,下面贴下MSDN上的一些说明,大家看看就行了。
可为VSDir文件中的每个记录指定下列字段:
字段
含义
RelPathName
必需。
向导的.vsz文件的名称(如MyWizard.vsz),此文件与VisualStudio安装目录有关。
{clsidPackage}
可选。
表示产品的GUID,该产品(如VisualC++)带有的DLL中包含本地化资源。
通常,对于符合第三方向导的VSDir文件,此字段为空。
LocalizedName
可选。
这是向导或模板的可本地化的名称以及出现在“添加项”对话框中的名称。
它可以是字符串或#ResID形式的资源标识符。
SortPriority
必需。
表示向导的排序顺序和相对优先级的整数,1为最高。
例如,如果此项为“1”,那么它出现在其他1之后和所有2或更低级别之前。
说明
必需。
当选定项后,将在“添加项”对话框中显示的模板或向导的可本地化说明。
它可以是字符串或#ResID形式的资源标识符。
仅应用于模板文件,不应用于文件夹。
DLLPath或{clsidPackage}
必需。
指定到DLL或EXE文件的完整路径,或产品的GUID,该产品所带的.dll文件包含要为向导加载的图标。
该图标使用给定的IconResourceId作为DLL/EXE文件外部的资源加载。
此设置重写图标位置的{clsidPackage}(如果已指定)。
仅应用于模板文件,不应用于文件夹。
IconResourceId
可选。
DLL文件内确定要显示的图标的资源标识符。
如果未定义图标,环境用默认图标替代与该项具有相同扩展名的文件。
仅应用于模板文件,不应用于文件夹。
Flags
可选。
请参见下面的Flags说明和表。
仅应用于模板文件,不应用于文件夹。
SuggestedBaseName
必需。
在对话框的“名称”字段中显示的向导的默认名称。
它是字符串或#ResID形式的资源标识符。
如果该名称不是唯一的,那么环境将为该名称追加一个整数。
例如,MyFile.aspx可能更改为MyFile1.aspx。
如果未提供名称,那么使用“Project”。
仅应用于模板文件,不应用于文件夹。
说明任何没有有含义的数据的非必选字段应包含零(0)作为占位符。
如果未提供本地化名称,则使用相对路径。
如果未定义图标,则IDE用该扩展名替换文件的默认图标。
如果未提供建议的基名称,则使用“Project”。
Flags
一组用于启用或禁用“添加项”对话框中的“名称”和“位置”字段的位标志。
也就是说,当用户从“添加”菜单中选择“添加新项”时,项目将决定名称和位置是否显示在“模板”窗格上,而标志将决定名称和位置是否可由用户使用。
将Flags的值设置为各个值的和。
即33等于VSDIRFLAG_NonLocalTemplate|VSDIRITEM_DisableLocationField。
标志名称十进制值DescriptionVSDIRFLAG_NonLocalTemplate1使用非本地用户界面行为和保存机制。
VSDIRFLAG_BlankSolution2创建空白(空)解决方案。
不创建项目。
VSDIRFLAG_DisableBrowseButton4对此项目或项禁用“浏览”按钮。
VSDIRFLAG_DontAddDefExtension8不将默认扩展名追加到为项提供的名称中。
(此设置对项目无效。
)VSDIRFLAG_DisableLocationField32禁用此项目或项的位置字段。
VSDIRFLAG_DontInitNameField4096不用有效的名称初始化此项目或项的名称字段。
VSDIRFLAG_DisableNameField8192禁用此项目或项的名称字段。
接着说下Default.js,具体也参考MSDN
默认情况下,项目的Default.js文件包含以下函数:
AddConfig
添加项目的配置。
可以提供编译器和链接器设置。
AddFilesToCustomProj
当用户单击“完成”时,将指定的文件添加到项目中。
AddFilters
当用户单击“完成”时,将指定的源筛选器添加到项目中。
CreateCustomProject
当用户单击“完成”时,在指定位置创建项目。
CreateCustomInfFile
创建项目的Templates.inf文件。
DelFile
删除指定的文件。
GetTargetName
获取指定文件的名称。
OnFinish
当用户单击“完成”时,由向导调用以创建项目、添加文件和筛选器、呈现模板以及设置配置。
PchSettings
设置预编译头设置。
有关更多信息,请参见Common.js参考中的SetCommonPchSettings。
下节我们只需要修改AddFilters函数,来把文件分别添加到源文件,头文件和资源文件里。
还需要修改GetTargetName函数,用来修改项目的文件名,使每次创建的项目的文件名都不一样。
差不多了解这些就行。
第三步,制作对话框向导
这步就是让大家制作功能完善的自定义向导。
首先我们把第一节中制作的Win32DLG对话框项目的文件拷贝到自定义向导中。
下载(41.33KB)
2010-2-813:
15
打开Win32DLG项目目录,选择所有的头文件,源文件和资源文件,拷贝到向导项目下的\Templates\2052下面.
下载(48.14KB)
2010-2-813:
15
然后在“模板文件”上点“右键--添加现有项”,把刚刚拷贝到\Templates\2052下的几个文件全部添加进来。
下载(34.54KB)
2010-2-813:
15
再打开Templates.inf文件,把添加的文件的文件名全部写到里面。
为什么要写着里呢?
这是我们使用向导新建项目所需要的文件,default.js通过调用AddFilesToCustomProj函数,把写在Templates.inf中的文件拷贝到新建的项目文件夹里。
下载(57.36KB)
2010-2-813:
15
现在我们来修改default.js文件。
找到GetTargetName函数,修改它。
修改后的代码:
1.
2.functionGetTargetName(strName,strProjectName)
3.{
4.try
5.{
6.//TODO:
基于模板文件名设置呈现文件的名称
7.varstrTarget=strName;
8.if(strName=='readme.txt')
9.strTarget='ReadMe.txt';
10.if(strName=='sample.txt')
11.strTarget='Sample.txt';
12.if(strName=='Win32DLG.cpp')
13.strTarget=strProjectName+'.cpp';
14.if(strName=='Win32DLG.h')
15.strTarget=strProjectName+'.h';
16.if(strName=='Win32DLG.ico')
17.strTarget=strProjectName+'.ico';
18.if(strName=='Win32DLG.rc')
19.strTarget=strProjectName+'.rc';
20.returnstrTarget;
21.}
22.catch(e)
23.{
24.throwe;
25.}
26.}
functionGetTargetName(strName,strProjectName)
{
try
{
//TODO:
基于模板文件名设置呈现文件的名称
varstrTarget=strName;
if(strName=='readme.txt')
strTarget='ReadMe.txt';
if(strName=='sample.txt')
strTarget='Sample.txt';
if(strName=='Win32DLG.cpp')
strTarget=strProjectName+'.cpp';
if(strName=='Win32DLG.h')
strTarget=strProjectName+'.h';
if(strName=='Win32DLG.ico')
strTarget=strProjectName+'.ico';
if(strName=='Win32DLG.rc')
strTarget=strProjectName+'.rc';
returnstrTarget;
}
catch(e)
{
throwe;
}
}
我们添加了4个if语句,用来把原来的文件名改成“新建的项目名”+扩展名。
这个规则可以自定义,但是一定要和后面的更改一致。
说下这个函数的两个参数,strName就是传进来的文件名,strProjectName就是传进来的项目名。
接着往上找到AddFilters函数,修改如下:
1.
2.functionAddFilters(proj)
3.{
4.try
5.{
6.//将文件夹添加到项目
7.//varstrSrcFilter=wizard.FindSymbol('SOURCE_FILTER');
8.//vargroup=proj.Object.AddFilter('源文件');
9.//group.Filter=strSrcFilter;
10.proj.Object.AddFilter('源文件').Filter='cpp;c';
11.proj.Object.AddFilter('头文件').Filter='hpp;h';
12.proj.Object.AddFilter('资源文件').Filter='ico;rc;bin';
13.}
14.catch(e)
15.{
16.throwe;
17.}
18.}
functionAddFilters(proj)
{
try
{
//将文件夹添加到项目
//varstrSrcFilter=wizard.FindSymbol('SOURCE_FILTER');
//vargroup=proj.Object.AddFilter('源文件');
//group.Filter=strSrcFilter;
proj.Object.AddFilter('源文件').Filter='cpp;c';
proj.Object.AddFilter('头文件').Filter='hpp;h';
proj.Object.AddFilter('资源文件').Filter='ico;rc;bin';
}
catch(e)
{
throwe;
}
}AddFilter(''),是我们要添加到项目中显示的那个目录里面,比如源文件、SourceFile,可以自定义,但最好写成相对应的中文或英文,Filter后面的就是判断的扩展名。
差不多这样就修改完成了。
可以先新建一个项目看看,看起来会没什么问题,但是编译会出错,这很正常,因为我们还有几个地方需要做小小的修改。
我们需要把所有老的项目名命名的地方全部改成新建的项目名,用到就是[!
outputPROJECT_NAME]。
一共有两个文件,一个是Win32DLG.cpp,一个是Win32DLG.rc
打开Win32DLG.cpp,找到#include"Win32DLG.h"
,修改成
#include"[!
outputPROJECT_NAME].h"
Win32DLG.rc是资源文件,不能直接双击编辑,要在上面点“右键,查看代码”。
下载(22.22KB)
2010-2-813:
15找到
IDI_WIN32DLGICON"Win32DLG.ico"
修改成
IDI_WIN32DLGICON"[!
outputPROJECT_NAME].ico"
还有一处
IDS_APP_TITLE"Win32DLG"
IDC_WIN32DLG"WIN32DLG"
对应的修改成
IDS_APP_TITLE"[!
outputPROJECT_NAME]"
IDC_WIN32DLG"[!
outputPROJECT_NAME]"
这样保存之后这个向导就算完成了。
大家可以自己用这个向导生成试试。
下一节讲讲怎么把这个向导给别人使用。
1.制作一个DialogBasedApplication(对话框应用程序)程序。
下载(60.32KB)
2010-2-809:
26
新建一个Win32项目,配置使用默认的就行。
我新建的项目是Win32DLG。
先看下这个项目有哪些文件
下载(18.1KB)
2010-2-809:
26
一共是10个文件。
首先我们需要修改的是资源文件----Win32DLG.rc。
这里的修改很简单。
新建一个Dialog对话框资源或直接修改现有的ABOUT对话框资源也行。
我用的新建。
在Dialog上点右键,插入Dialog.
下载(49.11KB)
2010-2-809:
26
默认的界面如下。
我们只保留一个确定按钮。
调整界面大小,标题,风格等等,这些很容易就不说了。
相信大家都会。
下载(13.05KB)
2010-2-809:
26
我修改的如下,并修改确认按钮的ID为IDC_OK。
主界面的ID为IDD_Main.
下载(10.63KB)
2010-2-809:
26
接着删除无用的资源IDD_ABOUTBOX和IDC_WIN32DLG
下载(18.41KB)
2010-2-809:
26
下载(13.35KB)
2010-2-809:
26
界面就修改好了。
接着就是重点,修改Win32DLG.cpp文件。
除了包含的头文件和WinMain函数,其他全部删除。
WinMain函数里也只保留前两句,和return。
并把“return(int)msg.wParam;”修改成“return0;”
下载(46.25KB)
2010-2-809:
26
然后在WinMain函数里添加一条DialogBox,来显示我们的主界面
DialogBox(hInstance,MAKEINTRESOURCE(IDD_Main),NULL,WinProc);
再在后面添加主界面的处理函数WinProc,以及主界面的载入和关闭事件函数Main_OnInitDialog,Main_OnClose,和OnCommand事件函数Main_OnCommand。
完成的Win32DLG.cpp代码如下
1.
2.//Win32DLG.cpp:
定义应用程序的入口点。
3.//
4.#include"stdafx.h"
5.#include"Win32DLG.h"
6.intAPIENTRY_tWinMain(HINSTANCEhInstance,
7.HINSTANCEhPrevInstance,
8.LPTSTRlpCmdLine,
9.intnCmdShow)
10.{
11.UNREFERENCED_PARAMETER(hPrevInstance);
12.UNREFERENCED_PARAMETER(lpCmdLine);
13.DialogBox(hInstance,MAKEINTRESOURCE(IDD_Main),NULL,WinProc);
14.return0;
15.}
16.BOOLWINAPIWinProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
17.{
18.switch(uMsg)
19.{
20.HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
21.HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
22.HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
23.}
24.returnFALSE;
25.}
26.BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
27.{
28.returnTRUE;
29.}
30.voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
31.{
32.switch(id)
33.{
34.caseIDC_OK:
35.{
36.MessageBox(hwnd,_T("HelloWorld"),_T("OK"),MB_OK);
37.}
38.break;
39.default:
40.break;
41.}
42.}
43.voidMain_OnClose(HWNDhwnd)
44.{
45.EndDialog(hwnd,0);
46.}
//Win32DLG.cpp:
定义应用程序的入口点。
//
#include"stdafx.h"
#include"Win32DLG.h"
intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
intnCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
DialogBox(hInstance,MAKEINTRESOURCE(IDD_Main),NULL,WinProc);
return0;
}
BOOLWINAPIWinProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
}
returnFALSE;
}
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
returnTRUE;
}
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDC_OK:
{
MessageBox(hwnd,_T("HelloWorld"),_T("OK"),MB_OK);
}
break;
default:
break;
}
}
voidMain_OnClose(HWNDhwnd)
{
EndDialog(hwnd,0);
}主要的函数都写好了,按钮的事件也添加到Main_OnCommand里了。
现在就是要处理头文件。
打开Win32DLG.h头文件,添加函数声明。
先看看我们在Win3