关于MFC问题
答案:1 悬赏:20 手机版
解决时间 2021-01-20 11:31
- 提问者网友:低吟詩仙的傷
- 2021-01-19 12:23
关于MFC问题
最佳答案
- 五星知识达人网友:佘樂
- 2021-01-19 13:20
你注册的窗口类是"我爱老婆", 后面创建窗口却用的是"爱你一万年",
"爱你一万年"你没注册过肯定不行, 一般情况下系统或其他也都不会注册过这个类名
都改成一样的就行追问首先感谢您的热心。在好几个地方提问,只有您回答了我。非常感谢!
我现在又两个问题想在趁着这个机会咨询您一下:
1.为什么这种工程必须建立非控制台程序?
2.按照您的指点确实可以看到运行程序了,但是没看到我写的“我爱老婆”这个窗口类名。为什么?
有点烦!请原谅。本人太笨,这也许是我的成长过程。呵呵
谢谢您……追答控制台就是命令行窗口那个,入口是main, 就算你建立自己的窗口,也会出现多余命令窗口
窗口类名不是窗口标题, 你的标题添的是SDK Application,换这个就行
因为创建窗口很多时候创建的都差不多,所以用窗口类把共同的特性记录一起, 然后创建窗口时可以直接用追问WndProc这个函数名前面有下面两个标示符。我右键看他们的定义分别为:
#define CALLBACK __stdcall;#define WINAPI __stdcall这应该是一个宏定义呀。我知道_stdcall是明明规则。如果按照define的语法说明,那这两句话的意思是用着两个标示符代替_stdcall,但是在程序中很明显不应该这样理解。请问:上面两句话是什么意思?追答没错阿, 替换成__stdcall
stdcall是调用方式, 告诉编译器参数的传递方式,调用方还是被调函数清理堆栈等等
如果2边对不上,很容易出问题
#define 就是预处理命令, 进行文本替换而已, 把callback和winapi替换成stdcall追问但是我在程序中没见到stdcall。所以我就纳闷对这个宏进行定义有什么作用?
还有就是为什么在wndproc函数前与返回值result之间必须加上callback和winapi?我查了msnd,但是还是不是很理解。追答当然看不到,编译器在预处理时会替换的
int WINAPI WinMain ......
替换后变成
int __stdcall WinMain ......
__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理
常见的函数调用约定:stdcall cdecl fastcall thiscall naked call
__stdcall表示
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。
编译器默认是cdecl, windows又按stdcall,两边不一样,很容易出问题,所以加个关键字修改调用约定,
用宏替换, 可读性比较好, CALLBACK是回调函数, WINAPI是windows的api, APIENTRY是入口
也就是让程序员看的
"爱你一万年"你没注册过肯定不行, 一般情况下系统或其他也都不会注册过这个类名
都改成一样的就行追问首先感谢您的热心。在好几个地方提问,只有您回答了我。非常感谢!
我现在又两个问题想在趁着这个机会咨询您一下:
1.为什么这种工程必须建立非控制台程序?
2.按照您的指点确实可以看到运行程序了,但是没看到我写的“我爱老婆”这个窗口类名。为什么?
有点烦!请原谅。本人太笨,这也许是我的成长过程。呵呵
谢谢您……追答控制台就是命令行窗口那个,入口是main, 就算你建立自己的窗口,也会出现多余命令窗口
窗口类名不是窗口标题, 你的标题添的是SDK Application,换这个就行
因为创建窗口很多时候创建的都差不多,所以用窗口类把共同的特性记录一起, 然后创建窗口时可以直接用追问WndProc这个函数名前面有下面两个标示符。我右键看他们的定义分别为:
#define CALLBACK __stdcall;#define WINAPI __stdcall这应该是一个宏定义呀。我知道_stdcall是明明规则。如果按照define的语法说明,那这两句话的意思是用着两个标示符代替_stdcall,但是在程序中很明显不应该这样理解。请问:上面两句话是什么意思?追答没错阿, 替换成__stdcall
stdcall是调用方式, 告诉编译器参数的传递方式,调用方还是被调函数清理堆栈等等
如果2边对不上,很容易出问题
#define 就是预处理命令, 进行文本替换而已, 把callback和winapi替换成stdcall追问但是我在程序中没见到stdcall。所以我就纳闷对这个宏进行定义有什么作用?
还有就是为什么在wndproc函数前与返回值result之间必须加上callback和winapi?我查了msnd,但是还是不是很理解。追答当然看不到,编译器在预处理时会替换的
int WINAPI WinMain ......
替换后变成
int __stdcall WinMain ......
__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理
常见的函数调用约定:stdcall cdecl fastcall thiscall naked call
__stdcall表示
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。
编译器默认是cdecl, windows又按stdcall,两边不一样,很容易出问题,所以加个关键字修改调用约定,
用宏替换, 可读性比较好, CALLBACK是回调函数, WINAPI是windows的api, APIENTRY是入口
也就是让程序员看的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯