windows SDK编程

 


/*****************************************************
我的第一个win32 HelloWorld程序!
*****************************************************
*/


/*Win32应用程序框架主要由"初始化窗口类","窗口注册类","窗口的创建"以"窗口消息函数"等组成*/

#include 
<Windows.h>

//@funD
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM );  //窗口函数说明

/*
WinMain函数是所有windows应用程序的入口,类似于C语言中的Main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。
消息循环是整个程序运行的核心。WinMain函数实现以下功能。
1. 注册窗口类,建立窗口及执行其它必要的初始化工作;
2. 进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程
3. 当消息循环检索到WM_QUIT消息时终止程序运行。

WinMain函数有三个基本的组成部份:函数说明、初始化和消息循环。

WinMain函数的说明如下:
int WINAPI WinMain(  //WinMain函数说明
HINSTANCE hInstance, //程序当前实例句柄
HINSTANCE hPrevInstance,  //应用程序其它实例句柄
LPSTR     lpCmdLine, //指向程序命令行参数的指针
int   nCmdShow  //应用程序开始执行时窗口显示方式的整数值标识
)
由于Window操作系统是多任务的操作系统,能进行多任务的管理,因此,windows应用程序可能被并行的多次执行,因而可能出现同一个程序的多个窗口同时存在的情况,Windows系统将应用程序每一次执行称为该应用程序的一个实例(Instance),并用一个实例句柄唯一的标识它。

*/
int WINAPI WinMain ( HINSTANCE hInstance,         //WinMain函数说明
                       HINSTANCE hPrevInstance,
                       LPSTR     lpCmdLine,
                       
int
       nCmdShow ) {

    
/*

    建议采用Pascal的变量定义风格,即在程序(函数)开始处定义所有变量
    虽然C++的变量定义比较灵活,本程序为了使程序易于理解,未采用这种方法
    
*/
    
    
char lpszClassName[] = "窗口";     //窗口类名
    char lpszTitle[] = "Windows SDK编程之一  窗口示例程序"//窗口标题名
    
    
//---------------窗口类定义-------------------------------------

    /*
    窗口类的定义
    在Windows应用程序中,窗口害定义了窗口的形式与功能。窗口类定义通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包括窗口类的各种属性,在窗口类定义过程中常用到以下函数:
    
*/
    WNDCLASS wndclass;
    wndclass.style 
= 0;                                            //窗口类型为缺省类型
    wndclass.lpfnWndProc = WndProc;                                //窗口处理函数为WndProc
    wndclass.cbClsExtra = 0;                                       //窗口类无扩展
    wndclass.cbWndExtra = 0;                                       //窗口实例无扩展
    wndclass.hInstance = hInstance;                                //当前实例句柄
    
    wndclass.hIcon 
= LoadIcon ( NULL, IDI_APPLICATION );           //使用缺省图标

    /*
    LoadIcon():在应用程序中加载一个窗口图标
    LoadIcon()函数原型为:
    HICON LoadIcon(
    HINSTANCE hInstance,//图标资源所在的模块句柄,为NULL则使用系统预定义图标
    LPCTSTR lpIconName //图标资源名或系统预定义图标标识名
    )
    
*/
    
    
    wndclass.hCursor 
= LoadCursor ( NULL, IDC_ARROW );             //窗口采用箭头光标
    /*
    LoadCursor():在应用程序中加载一个窗口光标
    LoadCursor()函数原型为:
    HCURSOR LoadCursor(
    HINSTANCE hInstance,//光标资源所在的模块句柄,为NULL则使用系统预定义光标
    LPCTSTR lpCursorName //光标资源名或系统预定义光标标识名
    )
    
*/
    
    wndclass.hbrBackground 
= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );    //窗口背景为白色
    
    
/*

    GetStockObject():获取已经定义的画笔、画刷、字体等对象的句柄
    GetStockObject()函数原型为:
    HGDIOBJ GetStockObject(int fnObject); //fnObject为对象的标识名
    
    
*/
    
    wndclass.lpszMenuName 
= NULL;                                  //窗口中无菜单
    wndclass.lpszClassName = lpszClassName;                        //窗口类名为''''窗口实例''''
    
    
//------------------以下是进行窗口类的注册---------------------------

    
    
/*

    注册窗口类
    Windows系统本身提供部份预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由注册函数RegisterClass()实现。其形式为:
    RegisterClass(&wndclass)
    &wndclass为窗口类结构
    RegisterClass函数的返回值为布尔值,注册成功则返回真
    
*/
    
    
if ( ! RegisterClass ( &wndclass ) ) {   //注册窗口,若失败,则发出声音
        MessageBeep ( 0 );
        
return
 FALSE;
    }
    
    
/*

    创建窗口实例
    创建一个窗口类的实例由函数CreateWindow()实现,该函数的原型为:
    HWND  CreateWindow(LPCTSTR lpszClassName,             //创建窗口,窗口类名
    LPCTSTR lpszTitle,                                        //窗口实例的标题名
    DWORD dwStyle,                                        //窗口的风格
    int x,                                                //窗口左上角坐标
    int y,                                             //窗口左上角坐标
    int nWidth,                                        //窗口的宽度
    int nHeight,                                //窗口的高度
    HWND hwndParent,                                //此窗口父窗口
    HWENU hMenu,                                    //此窗口主菜单
    HINSTANCE hInstance,                    //应用程序当前句柄
    LPVOID lpParam);                        //指向一个传递给窗口的参数值的指针
    
*/
    
    
//创建窗口操作
    HWND hwnd; //窗口结构
    
    hwnd 
= CreateWindow ( lpszClassName,   //创建窗口,窗口类名

                          lpszTitle,                     //窗口实例的标题名
                          WS_OVERLAPPEDWINDOW,           //窗口的风格
                          CW_USEDEFAULT, CW_USEDEFAULT,  //窗口左上角坐标为缺省值
                          CW_USEDEFAULT, CW_USEDEFAULT,  //窗口的高度和宽度为缺省值
                          NULL,                          //此窗口无父窗口
                          NULL,                          //此窗口无主菜单
                          hInstance,                     //应用程序当前句柄
                          NULL );                        //不使用该值
                          
    ShowWindow ( hwnd, nCmdShow );     
//显示窗口

    
    UpdateWindow ( hwnd );             
//绘制用户区

    
    
    
/*

    消息循环
    windows应用程序的运行以消息为核心。windows将产生的消息放入应用程序的消息队列中而应用程序WinMain函数的消息循环提取消息队列中的消息,并将其传递给窗口函数为相应处理过程处理。
    MSG msg; //消息结构
    
    while( GetMessage(&msg,NULL,0,0))  //消息循环
    { TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    
*/
    
    MSG msg; 
//消息结构
    
    
/*
GetMessage()作用:从消息队列中读取一条消息,并将消息放在一个MSG结构中:
    BOOL GetMessage(
    LPMSG lpMsg,  //指向MSG结构的指针
    HWND hWnd,
    UINT wMsgFilterMin, //用于消息过滤的最小信息号值
    UINT wMsgFilterMax //用于消息过滤的最大信息号值 如最小值和最大值均为0, 则不过滤消息
    );
    当GetMessage返回0时,即检索到WM_QUIT消息,程序将结束循环并退出
    
    BOOL TranslateMessage(  const MSG *lpMsg );  负责把消息的虚拟键值转换为字符信息
    LRESULT DispatchMessage( const MSG *lpmsg  ); 将参数lpmsg指向的消息传递给指定的窗口
    
    
*/

    
while ( GetMessage ( &msg, NULL, 00 ) ) { //消息循环
        TranslateMessage ( &msg );
        DispatchMessage ( 
&
msg );
    }
    
    
return msg.wParam;                //程序终止时,将信息返回操作系统

    
}


//-----------------------------窗口函数---------------------------------------

/*

窗口消息处理函数定义了应用程序对接收到的不同消息的响应,它包含了应用程序对各种可用接收到的消息的处理过程,通常 
,窗口函数由一个或多个switchcase语句组成,每一条case语句
对应一种消息,当应用程序接收到一个消息时,相应的case语句被 激活并执行相应的响应程序模块。
窗口函数的一般形式如下:
LRESULT CALLBACK WindowProc(          HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case 
.
break;

case WM_DESTROY:
//void PostQuitMessage(int nExitCode)函数的作用是向程序发送WM_QUIT消息,nExitCode应用程序退出代码
PostQuitMessage(0); //调用该函数发出WM_QUIT消息
default: //缺省消息处理函数,以保证所的发往窗口的消息都能被处理
return DefWindowProc(hwnd,message,wParam,lParam);
}

return (0);
}

*/
//@funS
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) {
    
switch
 ( message ) {
        
    
case
 WM_DESTROY:
        PostQuitMessage ( 
0 ); //调用该函数发出WM_QUIT消息

    default:                     //缺省消息处理函数
        return DefWindowProc ( hwnd, message, wParam, lParam );
    }
    
    
return ( 0
 );
}


posted on 2008-10-01 06:01  啊甘  阅读(1025)  评论(1编辑  收藏  举报

导航