Windows应用程序框架的创建
2006-10-10 09:33:43
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明
//----------------初始化窗口类----------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,
LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd; //定义窗口句柄
MSG Msg; //定义消息结构体
WNDCLASS wndclass; //定义窗口类
char lpszClassName[]="窗口"; //定义窗口类名
char lpszTitle[]="My_Windows"; //定义窗口标题名
//定义窗口类
wndclass.style=0; //窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //指定窗口处理函数为WndProc
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄
//窗口最小化图标为缺省图标
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
//窗口采用箭头光标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
//窗口背景为白色
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL; //窗口中无菜单
wndclass.lpszClassName=lpszClassName; //窗口类名称为“窗口”
//注册窗口类
if(!RegisterClass(&wndclass))//如果注册失败则发出警告
{
MessageBeep(0);
return FALSE;
}
//创建窗口
hwnd=CreateWindow
(
lpszClassName,//窗口类名称
lpszTitle,//窗口实例标题名
WS_OVERLAPPEDWINDOW,//窗口风格:带边框、标题栏、系统菜单、最大/小化框,
CW_USEDEFAULT,
CW_USEDEFAULT,//窗口左上角坐标为缺省值
CW_USEDEFAULT,
CW_USEDEFAULT,//窗口的高和宽为缺省值
NULL,//此窗口无父窗口
NULL,//此窗口无主菜单
hInstance,//创建此窗口的应用程序的当前句柄
NULL//不使用该值
);
//显示窗口
ShowWindow(hwnd,nCmdShow);
//绘制用户区
UpdateWindow(hwnd);
//消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);//将消息的虚拟键转换为字符信息
DispatchMessage(&Msg); //将消息传送到指定的窗口函数
}
return Msg.wParam; //消息循环结束即程序终止时将信息返回系统
}
//---------------------------窗口函数-----------------------
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);//调用PostQuitMessage发出WM_QUIT消息
break;
default: //缺省时采用系统消息缺省处理函数
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
(1)在创建Windows应用程序框架的过程中,定义窗口类时通过下面的代码设置窗口背景为白色:
wndclass.hbrBackground=GetStockObject(WHITE_BRUSH)
结果在编译时出现这样的错误:
error C2440: '=' : cannot convert from 'void *' to 'struct HBRUSH__ *'
这是由于函数GetStockObject的返回类型是'void *'而变量wndclass.hbrBackground的类型为HBRUSH,这个错误可以通过强制类型转换来解决:
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
(2)Windows应用程序框架创建完毕之后,编译通过,但是却出现连接错误:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
这是Windows子系统设置错误导致的,即Windows项目要使用Windows子系统,而不是Console,解决方法如下:
[Project] --> [Settings] --> 选择"Link"标签,在Project Options中将/subsystem:console改成/subsystem:windows
(3) 在对程序进行修改的过程中,我删除了窗口处理函数WndProc()中的default语句,再次运行这个程序时,编译连接均可通过,但是运行时没有任何反应,我将程序恢复原状,再次运行,出现下面的连接错误:
LINK : fatal error LNK1104: cannot open file "Debug/windows.exe"
这时打开任务管理器,发现了一个windows.exe进程,将这个进程关闭之后,编译连接通过,程序可以正常运行。导致这个问题的原因我估计可能是这样的:删除了窗口处理函数WndProc()中的default语句之后,运行程序,虽然表面上没有任何反应,看不到窗口的显示,但是windows.exe进程已经建立,并且在我将default语句重新恢复的时候没有关闭这个进程,这样再次运行修改后的程序,就会出现错误。