问题1:如何使用设置背景色SetBKColor函数 我用pdc->SetBKColor(RGB(0,0,0);有何错误?
问题2:何谓函数的调用协议(如:WINAPI),制作一个窗口时是否一定要使用回调函数?
问题2:何谓函数的调用协议(如:WINAPI),制作一个窗口时是否一定要使用回调函数?
解决方案 »
- VC MFC CListCtrl问题
- 如何创建一个获取磁盘信息的DLL
- 如何在protertysheet中添加图片??要求连同Tab Label也要有图片
- ***********************新手关于SOCKET的初级问题*************************
- 如何能够获得CRecord派生类中特定行的数据信息?(等待)
- 请教:VC6里如何添加一个模板?我添加模板后无法把实现放在CPP文件里。
- 请问如何关闭别的进程的TCP连接,就象TCPVIEW那样,可以随时断开系统中不管哪个进程的TCP连接???
- 衷心谢谢大虾帮助,关于一个实现登入功能的问题
- ActiveX空间加载速度
- char 转CString 出现乱码
- 关于控件
- 问题二则
2.回调机制 包括 消息机制的,如果你做了一个窗体,你不想让它响应一些消息吗,如果想,那么回调函数,你就要用了
制作的窗口不也是消息驱动吗,所以一定要用回调函数了,不然不能从OS那里得到消息的。
2、何谓函数的调用协议(如:WINAPI),制作一个窗口时是否一定要使用回调函数?
所谓的函数调用协议就是涉及到函数的参数如何压栈,以及函数参数的压栈的顺序。如果你要用SDK来创建一个窗口的话就一定要用到回调函数,一般窗口过程函数都是回调函数,例如:
WinProc、DefWinProc(呵呵……可能函数名称写的不太正确,就是这个意思),由于MFC对Windows的SDK进行了封装,一些涉及到窗口的过程的函数都被封装了起来,所以在MFC中创建的窗口也是有回调函数的,只是我们看不到而已。下面是一些关于函数调用约定的一些说明:1、_stdcall
以__stdcall方式调用的函数有以下特征:
参数由右至左压栈
调用返回时,堆栈由被调函数调整2.__cdecl
__cdecl约定是C/C++函数的默认调用约定。它有以下特征:
参数由右至左压栈
调用返回时,堆栈由调用者调整
3、__fastcall
头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数,按从右到左的顺序压栈。又被调用者把参数弹出栈4、thiscall,仅用于C++的成员函数。this指针存在于CX寄存器参数从右到左压栈。thiscall不是关键词,因此不能被程序员指定5、naked call
采用上面四种调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码来恢复这些寄存器的内容。naked call不产生这样的代码。 naked call不是类型修饰符,必须和__declspec共同使用。如:
__declspec(naked) int func(formal_parameters)
{
//函数体
}
2.需要回调函数来处理消息循环事件,要搞懂MFC消息机制,建议看看<<深入浅出MFC>>
1、以“?”标识函数名的开始,后跟函数名;
2、函数名后面以“@@YG”标识参数表的开始,后跟参数表;
3、参数表以代号表示:
X--void ,
D--char,
E--unsigned char,
F--short,
H--int,
I--unsigned int,
J--long,
K--unsigned long,
M--float,
N--double,
_N--bool,
....
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复;
4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
5、参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。 其格式为“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,例如
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
void Test2() -----“?Test2@@YGXXZ” __cdecl调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。 __fastcall调用约定:
规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YI”。 VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用. CB在输出函数声明时使用4种修饰符号
//__cdecl
cb的默认值,它会在输出函数名前加_,并保留此函数名不变,参数按照从右到左的顺序依次传递给栈,也可以写成_cdecl和cdecl形式。
//__fastcall
她修饰的函数的参数将尽肯呢感地使用寄存器来处理,其函数名前加@,参数按照从左到右的顺序压栈;
//__pascal
它说明的函数名使用Pascal格式的命名约定。这时函数名全部大写。参数按照从左到右的顺序压栈;
//__stdcall
使用标准约定的函数名。函数名不会改变。使用__stdcall修饰时。参数按照由右到左的顺序压栈,也可以是_stdcall;