不用向导建立WIN32 Dialog工程解析.docx
- 文档编号:30727965
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:11
- 大小:65.11KB
不用向导建立WIN32 Dialog工程解析.docx
《不用向导建立WIN32 Dialog工程解析.docx》由会员分享,可在线阅读,更多相关《不用向导建立WIN32 Dialog工程解析.docx(11页珍藏版)》请在冰豆网上搜索。
不用向导建立WIN32Dialog工程解析
不用向导建立WIN32Dialog工程解析
一直想不借助老大的向导自己创建一个WIN32Dialog工程,但是在
《C语言也能干大事》第12课中也只有少量提及
今天在老大的提示下终于完成了这一过程,之前在咱们站内收索
中一直没找到详细的介绍,
现在我就和大家分享一下这个过程(*^__^*)~~~
【1】建立一个WIN32Application工程,选择构建一个简单的WIN32程
序
这步就不附图了,相信没有不会的。
。
。
。
--------------------------------------------------------------------------------
【2】点击新建,新建一个资源脚本
建立后会出现ResourceView也就是视图文件,此时点击Resource
View里面的dialogresource会提示这个文件已经在另一个编辑器中
下载(48.72KB)
2010-3-619:
15
打开
此时只要关闭掉右边的文本框就可以了,这时候在点击dialog
resource会显示没有资源,我们右击dialogresource选择插入选项
选择Dialog,然后选择新建
下载(29.13KB)
2010-3-619:
15
这样我们就建立好了一个窗口,此时可以打开ResourceView找到
刚刚创建好的窗口,和老大保持一致,我把窗口改名为IDD_MAIN
右键点击HeaderFile也就是头文件的文件夹,选择添加文件到目
录,在弹出的工程目录窗口中找到resource.h然后添加
里面有窗口程序所用到的宏。
下面就是对这个窗口的调用了
--------------------------------------------------------------------------------
【3】老大说过,WinMain是程序的入口点,打开rupeng.cpp添加缺少
的头文件
resource.h//我们所创建的窗口的头文件,作业就不说了
MainDlg.h//一会我们会用到几个窗体过程函数,声明都写在这里,
自然少不了这个头
COMMCTRL.H//这个是函数InitCommonControls()用到的头文件,在
以前的帖子中有说过(忘了是那个了--!
)是一些高级控件用到的
函数
好了,头文件都齐全了,下面就要用到函数DialogBox这个函数(其
实这是一个宏,具体内容大家可以自己去MSDN和XX百科上看)
,
这个函数是用来创建一个窗口模板,我把MSDN中的函数原型和咱们自己写的函数拿来做下说明
原型:
INT_PTRDialogBox(
HINSTANCEhInstance, //handletomodule
LPCTSTRlpTemplate, //dialogboxtemplate
HWNDhWndParent, //handletoownerwindow
DLGPROClpDialogFunc //dialogboxprocedure
);
第一个参数,根据MSDN中给出的信息是一个句柄模块。
。
这个参数我始终没弄明白到底是什么意思,回头弄明白了在加以补充,※※※第二个参数,一个对话框模板,也就是指我们创建的那个对话框,MSDN上提示我们可以用MAKEINTRESOURCE这个宏来获取模板的值,
关于这个宏的内容我就不多解释了,大家自己看看MSDN上的介绍第三个参数,父窗口的句柄,因为我们创建的这个窗口不存在父窗口,所以这项为NULL最后一个参数,窗口过程,也就是我们后面的Main_Proc函数,用于处理整个窗口的运行过程在老大的模板代码中这还有一个函数InitCommonControls(),在有些帖子中看到说是一些高级控件的应用函数,暂时用不上,去掉也可以这样我们就把入口点函数所在的源文件写好了,来看下:
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//TODO:
Placecodehere.
DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,Main_Proc);
return0;
}
--------------------------------------------------------------------------------
【4】下面我们来写窗口过程函数,首先我们新建一个MainDlg.h我们在这里声明我们要用的函数,在头文件中声明函数的原因我是这么看的,有些函数会在不同的cpp文件中出现,这样就要重复定义,很麻烦,而在头文件中声明函数我们只要include进来这个头文件就可以了,要是说的不对或不全大家给指正补充一下哦(*^__^*)
在头文件里我先加入一个条件编译语句#ifndef,用来处理头文件重复包含的问题,因为我们的WinMain所在的源文件和MainDlg.cpp都要包含这个头,至于怎么使用条件编译语句,大家自己回去翻C语言书吧,我就不在说了
#include
我们在头文件里要声明以下4个函数:
(a)BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
//窗口过程函数,用来处理整个窗口的执行过程,在MSDN中的函数原型为:
INT_PTRCALLBACKDialogProc(
HWNDhwndDlg,//handletodialogbox
UINTuMsg,//message
WPARAMwParam,//firstmessageparameter
LPARAMlParam//secondmessageparameter
);
第一个参数是一个对话框的句柄,第二个参数是一个消息,第三、四个是消息的附加参数
(b)BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam);
//窗口初始化函数
(c)voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify);
//处理用户选择消息的函数
这两个函数的参数信息参看
(d)voidMain_OnClose(HWNDhwnd);
//用来销毁窗口,也就是关闭窗口
这样我们就把头文件做好了,来看下老大给的模板代码:
#ifndef_MAIN_K
#define_MAIN_K
#include
BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam);
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify);
voidMain_OnClose(HWNDhwnd);
#endif
--------------------------------------------------------------------------------
【5】现在我们来对这些函数进行定义,新建一个MainDlg.cpp,来看一下要包含的头文件:
#include"stdafx.h" //在入口点函数WinMain的cpp文件中也有这个头,双击打开看一下,写的是一个标准体系的文件,应该和我们以前用的stdio.h是同一个作业吧
#include
#include
#include"resource.h" //窗口资源的头文件
#include"MainDlg.h" //我们声明函数的头文件,现在要定义这些函数当然不能少了这个头了
以下是几个函数的定义:
(a)Main_Proc函数,这里要补充一下,这个函数的返回值是BOOL类型后面跟了一个WINAPI这个WINAPI和大家在一些程序中看到的CALLBACK一样都是_stdcall的宏,也就是处理压栈的方式,大家可以看下_stdcall的参考
老大的模板代码在这个函数里面用switch选择结构体包含了以下几个信息
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
首先说一下HANDLE_MSG,这是一个消息分流器,说白了就是一个宏,它可以让程序变的更加安全和整洁,大家可以看看关于消息分流器的参考
第一个参数是一个句柄;
第二个参数WM_INITDIALOG,WM_COMMAND,WM_CLOSE这三个都是消息,这三个宏分别表示了初始化一个窗口,用户选择信息的处理,销毁一个窗口,大家可以也在MSDN中找到相应的介绍;
第三个参数是我们的相应函数,用来响应对应的处理消息。
我们定义好了Main_Proc函数,记得最后要returnFALSE,否则会导致程序死掉,原因我认为就是在DialogBox函数调用时没有收到假消息,所以导致一直调用过程函数使程序死掉(个人理解,麻烦知道的高手给大家说明一下,谢谢啦!
!
),来看下Main_Proc定义代码:
BOOLWINAPIMain_Proc(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;
}
(b)Main_OnInitDialog函数,窗口初始化函数,一般直接returnTRUE就可以了,除非你有什么操作是要在初始化的时候做的,定义代码:
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
returnTRUE;
}
(c)Main_OnCommand函数,用户选择信息的处理函数,我们的代码都写在这个函数里面,大家在熟悉不过了吧,定义代码:
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDC_BUTTON1:
{
MessageBox(hwnd,TEXT(""),TEXT("MyHome"),MB_OK);
}
break;
default:
break;
}
}
(d)Main_OnClose函数,用来销毁、关闭一个窗口,定义代码:
voidMain_OnClose(HWNDhwnd)
{
EndDialog(hwnd,0); //销毁窗口的函数,在MSDN中写的很清楚,第一个参数为要销毁的窗口句柄,第二个参数为一个返回值
}
--------------------------------------------------------------------------------
到这里我们就把整个窗口的调用过程写完了,下面我把在写这个工程的时候遇到的问题和大家分享下,大家可能也会遇到
书写的格式错误就不用说了,很好解决,麻烦的是一个叫"无法解析的外部符号"的错误,因为这个是连接错误,所以不指定错误的位置,我找了一些相关的资料和大家分享下
如果大家在确认代码无任何错误的情况下(我就检查了1个多小时。
。
扔找不到任何错误。
。
)但是编译提示仍然有一个"无法解析的外部符号"错误
错误代码是:
error LNK2001:
unresolved external symbol __imp__InitCommonControls@0
Debug/**.exe :
fatal error LNK1120:
1 unresolved externals
这个情况的解决办法如下:
(1)在包含头文件处添加:
#pragma comment (lib, "comctl32.lib")
(2)点击工程->设置->连接->在对象/库模板这一栏里面写入comctl32.lib
下载(68.82KB)
2010-3-619:
15
别忘了添加一个空格,不同的lib之间是以空格格开的,然后点击确定,在编译连接,OK,通过,我看过老大的向导生成的工程,在对象/库模块中都有这个lib文件
好啦~~任务完成
我们来大致回顾一下整个过程,首先WinMain调用DialogBox调用Main_Proc通过宏HANDLE_MSG来处理WM_INITDIALOG等信息,在通过相应的函数来处理信息的响应
再次感谢老大给我的提示帮助,要不累死我也做不出来呀,为老大献上最真挚的感谢,老大万岁~~↖(^ω^)↗
[分享]在VC++6.0中自己建立Dialog工程吧!
[复制链接]
电梯直达
1#
发表于2011-10-718:
49:
38|只看该作者|倒序浏览
【通知】VIP会员再度升值--每月发放100鱼币津贴!
本帖最后由Y.H于2011-10-719:
18编辑
嗯, 刚学会的,本来是在别的网站看到的,我还在想要不要说明算不算只转载的.....但,经过我一想,既然我学会了,那就算是我的了.
开始
第一步:
"文件"------>"新建"------->"Win32Application"工程------->"名字随便"------>"一个简单的Win32程序"
第二部:
接着 "文件"------>"新建"------->注意:
:
是"文件"选项,不是"工程选项"了---------->"脚本资源"----------->名字"resource.rc"
第三步:
如图:
选中中间那个框中的"resource.rc"文件夹图标,然后鼠标"右键"------>"插入"-------->然后选择"Dialog"
------->"新建"
第四步:
切换到"FileView"视图----->"SourceFile"------->打开我们建立的"名字随便.cpp"------>里面有个"APIENTRYWinMain"函数.
第五步:
在intAPIENTRYWinMain()函数的花括号中的第一行插入以下代码:
1.DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,Main_Proc);//注意这里面有个IDD_MAIN
复制代码
//注意这里面有个IDD_MAIN,我们需要到"ResourceView"视图中的"Dialog"下面的资源框选中它鼠标右键"属性"--->"资源"---->"ID"改为IDD_MAIN相同就可以了
第六步:
在我们的"名字随便.cpp"中的intAPIENTRYWinMain()函数的上方声明一下以下四个函数
1.BOOLWINAPIMain_Proc(HWNDhWnd,
2. UINTuMsg,
3. WPARAMwParam,
4. LPARAMlParam);
5.
6.BOOLMain_OnInitDialog(HWNDhwnd,
7. HWNDhwndFocus,
8. LPARAMlParam);
9.
10.voidMain_OnCommand(HWNDhwnd,
11. intid,
12. HWNDhwndCtl,
13. UINTcodeNotify);
14.
15.voidMain_OnClose(HWNDhwnd);
复制代码
然后接着在WinMain函数后面定义这四个函数:
1.BOOLWINAPIMain_Proc(HWNDhWnd,
2. UINTuMsg,
3. WPARAMwParam,
4. LPARAMlParam)
5.{
6. switch(uMsg)
7. {
8. HANDLE_MSG(hWnd,
9. WM_INITDIALOG,
10. Main_OnInitDialog);
11.
12. HANDLE_MSG(hWnd,
13. WM_COMMAND,
14. Main_OnCommand);
15.
16. HANDLE_MSG(hWnd,
17. WM_CLOSE,
18. Main_OnClose);
19. }
20. returnFALSE;
21.}
22.
23.
24.
25.BOOLMain_OnInitDialog(HWNDhwnd,
26. HWNDhwndFocus,
27. LPARAMlParam)
28.{
29. returnTRUE;
30.}
31.
32.
33.voidMain_OnCommand(HWNDhwnd,
34. intid,
35. HWNDhwndCtl,
36. UINTcodeNotify)
37.{
38. switch(id)
39. {
40. caseIDOK:
41. {
42. //可以在这里填写代码
43. }
44. break;
45.
46. default:
47. break;
48. }
49.}
50.
51.
52.
53.voidMain_OnClose(HWNDhwnd)
54.{
55. EndDialog(hwnd,0);
56.}
复制代码
第七步:
记得要在前面包含几个头文件:
1.#include"stdafx.h"
2.#include"resource.h"
3.#include
复制代码
然后咱们编译一下:
OK运行通过..
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 不用向导建立WIN32 Dialog工程解析 不用 向导 建立 WIN32 Dialog 工程 解析