win32窗口程序开发步骤详解

1.程序进入点

windows程序的进入点是WinMain函数,它有四个参数,形式如下:

int WINAPI WinMain ( HINSTANCE     hInst,

                   HINSTANCE       hPrevInst,

                   LPSTR           lpCmdLine,

                   int             nCmdShow )

参数说明:

hInst 为当前实例句柄,Windows 环境下用于区别同一应用程序的不同实例;hPrevInst表示应用程序先前实例的句柄(如果有的话),否则为 NULL,可以用来确定当前实例是否为应用程序的第一个实例;

lpCmdLine是以NULL结尾的命令行字符串长指针;nCmdShow指定窗口初始显示方式的整型常量(1 = 通常;7 = 最小化) 。

2.注册窗口类

    一个窗口在建立以前,必须进行一些初始化,比如窗口的大小、标题及边框的颜色等,完成这些工作我们还必须一个API函数RegisterClass来注册窗口类:

函数功能:该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。 RegisterClass函数己经由函数RegisterClassEx函数来代替,但是,如果不需要设置类的小目标则仍然可以使用RegisterClass函数

函数原型:ATON RegisterClass(CONST WNDCLASS *lpWndClass);

参数:

    lpWndClass:指向一个WNDCLASS结构的指针。在将它传递给函数之前,必须在该结构中填充适当的类属性。

返回值:如果函数成功,返回值是唯一标识已注册的类的一个原子;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

下面是WNDCLASS的一个结构说明:

结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性,定义如下:

typedef struct _WNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS, *LPWNDCLASS;

 

例子:

WNDCLASS wndclass;

        //初始化窗口的属性

        …………….

    //注册窗口类

    if(!RegisterClass(&wndclass))

    {

        MessageBeep(0);

        return FALSE;

    }

3.创建窗口

窗口属性设置好并且注册了窗口类之后,我们就要建立一个窗口了,CreateWindow函数会完成这个工作,如:

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);

    }

4.窗口函数

    这是窗口的生命中枢,因为它是处理各种消息的地方。上面消息循环中DispatchMessage就是将消息分派到窗口处理函数。

所谓的窗口函数。窗口函数形如:

 

LRESULT CALLBACK WndProc( HWND hWnd,

 

UINT message,

 

WPARAM wParam,

 

LPARAM lParam)

 

{

 

switch ( message ) {

 

case WM_LBUTTONDOWN:

case WM_MOUSEMOVE:

case WM_DESTROY:

PostQuitMessage ( 0 );

default:

return DefWindowProc ( hWnd, message, wParam, lParam );

}

return ( 0 );

}

CALLBACK是一种函数调用习惯,被定义为__stdcall,说明此函数为回调函数,由系统(Windows)自动调用的,当MYAPP.EXE接收到消息并DispatchMessage之后,系统(Windows)就自动调用窗口函数WndProc了(DispatchMessage函数又将消息传回了Windows系统,然后Windows系统通过消息中的窗口据柄找到对应的WndProc)。

注意窗口函数中消息的分支结构中default分支必须是return DefWindowProc ( hWnd, message, wParam, lParam );因为不论什么消息都必须被处理,DefWindowProcwindows内部预设的消息处理函数。以上就是windows程序的精要所在!

5.举例说明

#include <windows.h>

//包含应用程序中数据类型和数据结构的定义

long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//窗口说明

//WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数其功能是完成//一系列的定义和初始化,并产生消息循环

/* WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检

测到WM_QUIT消息时终止程序运行

WinMain函数有三个基本部分组成:函数说明、初始化和消息循环*/

//函数说明

int WINAPI WinMain(

HINSTANCE hInstance, // handle to current instance

HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine, // command line

int nCmdShow // show state

)

//初始化

//初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分

{

HWND hwnd;

MSG Msg;

WNDCLASS wndclass;

char lpszClassName[]="窗口";//窗口类名

char lpszTitle[]="徐新坡"; //窗口标题名

//窗口类定义

//窗口类定义了窗口的形式与功能窗口类定义通过给窗口类数据结构WNDCLASS赋值完成

//该数据结构中包含窗口类的各种属性

wndclass.style =0; // 窗口类型为缺省类型

wndclass.lpfnWndProc=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; //窗口类名为“窗口”

以下是窗口类的注册 Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类//窗口类必须先注册后使用

if(!RegisterClass(&wndclass)) //如果注册失败发出警告

{MessageBeep(0); return FALSE;}

///创建窗口创建一个窗口的实例由函数CreateWindow()实现

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; //消息循环结束即程序结束时将信息返回系统

}

/窗口函数

//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的

//处理过程,时消息处理分支控制语句的集合

long CALLBACK WndProc(

HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam

)

{

switch(message)

{

case WM_DESTROY:

PostQuitMessage(0);

default: //缺省时采用系统消息缺省处理函数

return DefWindowProc(hwnd,message,wParam,lParam);

}

return (0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值