Windows应用程序框架的创建

Windows应用程序框架的创建

2006-10-10 09:33:43

#include<windows.h>//包含应用程序中所需要的数据类型和数据结构定义
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语句重新恢复的时候没有关闭这个进程,这样再次运行修改后的程序,就会出现错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值