最简单的win32程序

一个完整的Win32程序,该程序实现的功能是创建一个窗口,并在该窗口中响应键盘及鼠标消息,程序实现的步骤为: WinMain函数的定义; 创建一个窗口; 进行消息循环; 编写窗口过程函数. 

WinMain函数的原型声明如下:

        int WINAPI WinMain(
            HINSTANCE hInstance,              // handle to current instance
            HINSTANCE hPrevInstance,      // handle to previous instance
            LPSTR lpCmdLine,                     // pointer to command line
            int nCmdShow                             // show state of window
        );
第一个参数hInstance表示该程序当前运行的实例的句柄,这是一个数值。当程序在Windows下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过hInstance参数传递给WinMain函数。
第二个参数hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,这个参数总是NULL,即在Win32环境下,这个参数不再起作用。
第三个参数lpCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。例如:在D盘下有一个Mytext.txt文件,当我们用鼠标双击这个文件时将启动记事本程序(notepad.exe),此时系统会将D:/Mytext.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的全路径名后,就在窗口中显示该文件的内容。要在VC++开发环境中向应用程序传递参数,可以单击菜单【Project】→【Settings】,选择“Debug”选项卡,在“Program arguments”编辑框中输入你想传递给应用程序的参数。
第四个参数nCmdShow指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。
 
窗口类:
typedef  struct  _WNDCLASS  ...
    UINT    style; 
    WNDPROC lpfnWndProc; 
    
int     cbClsExtra; 
    
int     cbWndExtra; 
    HANDLE  hInstance; 
    HICON   hIcon; 
    HCURSOR hCursor; 
    HBRUSH  hbrBackground; 
    LPCTSTR lpszMenuName; 
    LPCTSTR lpszClassName; 
}
 WNDCLASS; 

第一个成员变量style指定这一类型窗口的样式。
第二个成员变量lpfnWndProc是一个函数指针,指向窗口过程函数,窗口过程函数是一个回调函数。
第三个成员变量cbClsExtra:Windows为系统中的每一个窗口类管理一个WNDCLASS结构。
第四个成员变量cbWndExtra:Windows系统为每一个窗口管理一个内部数据结构。
第五个成员变量hInstance指定包含窗口过程的程序的实例句柄。
第六个成员变量hIcon指定窗口类的图标句柄。
第七个成员变量hCursor指定窗口类的光标句柄。
第八个成员变量hbrBackground指定窗口类的背景画刷句柄。
第九个成员变量lpszMenuName是一个以空终止的字符串,指定菜单资源的名字。
第十个成员变量lpszClassName是一个以空终止的字符串,指定窗口类的名字。

注册窗口类:

ATOM MyRegisterClass(HINSTANCE hInstance)
... {
    WNDCLASSEX wcex;

    wcex.cbSize 
= sizeof(WNDCLASSEX);

    wcex.style          
= CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    
= (WNDPROC)WndProc;
    wcex.cbClsExtra     
= 0;
    wcex.cbWndExtra     
= 0;
    wcex.hInstance      
= hInstance;
    wcex.hIcon          
= LoadIcon(hInstance, (LPCTSTR)IDI_DETAILWIN);
    wcex.hCursor        
= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  
= (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   
= (LPCSTR)IDC_DETAILWIN;
    wcex.lpszClassName  
= szWindowClass;
    wcex.hIconSm        
= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

    
return RegisterClassEx(&wcex);
}

创建窗口:

HWND CreateWindow(
  LPCTSTR lpClassName,  
//  pointer to registered class name
  LPCTSTR lpWindowName,  //  pointer to window name
  DWORD dwStyle,         //  window style
   int  x,                 //  horizontal position of window
   int  y,                 //  vertical position of window
   int  nWidth,            //  window width
   int  nHeight,           //  window height
  HWND hWndParent,       //  handle to parent or owner window
  HMENU hMenu,           //  handle to menu or child-window identifier
  HANDLE hInstance,      //  handle to application instance
  LPVOID lpParam         //  pointer to window-creation data
);
参数lpClassName指定窗口类的名称。产生窗口的过程是由操作系统完成的,如果在调用CreateWindow函数之前,没有用RegisterClass函数注册过窗口类型,操作系统将无法得知这一类型窗口的相关信息,从而导致创建窗口失败。
参数lpWindowName指定窗口的名字。如果窗口样式指定了标题栏,那么这里指定的窗口名字将显示在标题栏上。
参数dwStyle指定创建的窗口的样式。
参数x,y,nWidth,nHeight分别指定窗口左上角的x,y坐标,窗口的宽度,高度。如果参数x被设为CW_USEDEFAULT,那么系统为窗口选择默认的左上角坐标并忽略y参数。如果参数nWidth被设为CW_USEDEFAULT,那么系统为窗口选择默认的宽度和高度,参数nHeight被忽略。
参数hWndParent指定被创建窗口的父窗口句柄参数hMenu指定窗口菜单的句柄。
参数hInstance指定窗口所属的应用程序实例的句柄。
参数lpParam:作为WM_CREATE消息的附加参数lParam传入的数据指针。在创建多文档界面的客户窗口时,lpParam必须指向CLIENTCREATESTRUCT结构体。多数窗口将这个参数设置为NULL。
如果窗口创建成功,CreateWindow函数将返回系统为该窗口分配的句柄,否则,返回NULL。注意,在创建窗口之前应先定义一个窗口句柄变量来接收创建窗口之后返回的句柄值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值