修改使得入口函数为WinMain
目的
去掉运行时出现的控制台窗口,将程序入口函数改为WinMain
步骤
修改main入口函数为WinMain,如下:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
注意APIENTRY,这是WinMain的调用约定。可以试试看不加这个约定会出现什么情况。
编译,错误,提示如下:
1>Linking...
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
原因
连接器还是去找main入口函数了。如何告诉连接器不要找main而去找WinMain呢?
修改项目属性,在linker组,修改System页面,将subsystem修改为Windows。
题外话:
一般所说的编译,其实包含了对源代码编译成目标码(.obj)和将目标码链接成exe这两步。第一步错误,不会做第二步。有些时候,这些错误与项目配置相关,需要修改这些配置,经常是在属性窗口里从头看到尾找对应的配置项。其实,一个标准可以减少查看范围,编译期出错,只看C/C++,链接出错,只看Linker。
重新编译,ok。可以正常运行。
增加按钮事件处理函数
目的
在对话框上增加一按钮,当用户点击时,弹出messagebox。
思考
Winx的消息处理机制是学习winx开发的基础。明了该机制后就可以比较轻松的做我们想完成的事情。如果对消息处理机制不清楚的,可以看其他文档。
简单说起来,消息处理机制就是利用模板特性,做到编译器定型,当子类需要处理某消息时,则按照消息处理函数名称契约,完成函数编写,winx最终将调用到我们自己的函数。不需要像MFC一样,也不需要像SDK一样,需要将消息和函数联系起来,仅仅需要遵守一个规则,函数名称和参数符合契约。
为了处理按钮事件,则需要处理WM_COMMAND消息。该消息对应的函数名称为OnCommand。
步骤
在对话框上增加一个按钮IDC_BUTTON1
在CMyDialog类中增加
BOOL winx_msg OnCommand(HWND hWnd, WPARAM wParam, HWND hWndCtlFrom)
{
switch(LOWORD(wParam))
{
case IDOK:
_WINX_PWND->OnOK(hWnd);
return TRUE;
case IDC_BUTTON1:
MessageBox( _T("yes") );
return TRUE;
default:
CloseDialog(hWnd, LOWORD(wParam));
}
return FALSE;
}
结果
当单击按钮时,弹出messagebox。
分析
当用户单击按钮后,流程为:
用户->按钮:单击
按钮->消息:触发WM_COMMAND消息
消息->winx窗口基类:被派遣到
winx窗口基类->CMyDialog:编译时确定有OnCommand
winx窗口基类->CMyDialog:OnCommand
类似这种做法,是否比较类似SDK的做法,繁琐呢?我们需要自己动手来区分command id来源。MFC似乎比较简单呢。Winx有无类似处理方式?
有。