Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403310
  • 博文数量: 95
  • 博客积分: 5001
  • 博客等级: 大校
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-13 11:43
文章分类

全部博文(95)

文章存档

2007年(95)

我的朋友

分类: WINDOWS

2007-05-13 12:20:54

#include   
#include   
#include   

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

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,       //HINSTANCE实例(程序自身)句柄
                    PSTR szCmdeLine, int iCmdShow )
{
    static TCHAR szAppName[] = TEXT( "HelloWin" );
    HWND        hwnd;                        //窗口句柄
    MSG         msg;                         //消息结构
    /*-------------------------------------------------------------------------------------------------------------------
    typedef struct tagMSG
    {
        HWND    hwnd;       //消息发向的窗口的句柄
        UINT    message;    //消息标示符,以前缀WM(window message)开头
        WPARAM  wParam;     //一个32位的消息参数
        LPARAM  lParam;     //一个32位的消息参数
        DWORD   time;       //消息放入消息队列的时间
        POINT   pt;         //消息放入消息队列时的鼠标坐标
    }
    ----------------------------------------------------------------------------------------------------------------------*/

/*-----------------------------------注册窗口------------------------------*/
    WNDCLASS    wndclass;                          //窗口类结构
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;                  //CS:类风格选项-这两个标示符确保了改变窗口大小要刷新窗口
    wndclass.lpfnWndProc    = WndProc;                                  //所有基于这个类来创建的窗口所使用的窗口过程的地址
    wndclass.cbClsExtra     = 0;                                        //用于在类结构的窗口结构中预留一些空间
    wndclass.cbWndExtra     = 0;                                        //在windows内部保存的窗口中预留空间;cb前缀是字节数的意思
    wndclass.hInstance      = hInstance;                       //程序的实例句柄
    wndclass.hIcon          = LoadIcon( NULL, IDI_APPLICATION );        //LoadIcon()加载图标供程序使用;IDI图标ID号
    wndclass.hCursor        = LoadCursor( NULL, IDC_ARROW );            //LoadCursor()加载鼠标指针供程序使用;IDC光标ID号
    wndclass.hbrBackground  = ( HBRUSH )GetStockObject( WHITE_BRUSH );  //获取一个图形对象,这里是一个绘制背景的刷子
    wndclass.lpszMenuName   = NULL;                         //应用程序菜单
    wndclass.lpszClassName  = szAppName;                          //窗口类的文本名

    if( !RegisterClass( &wndclass ) )                                //为程序窗口注册窗口类
    {
        MessageBox( NULL, TEXT( "This program requires Windows NT!" ),  //显示消息框
                    szAppName, MB_ICONE RROR );
        return 0;
    }
/*----------------------------------创建窗口--------------------------------*/
    hwnd = CreateWindow( szAppName,                         //CreateWindow(WNDCLASS *)创建一个窗口;窗口类名
                        TEXT( "The Hello Program !" ),  //窗口标题
                        WS_OVERLAPPEDWINDOW,          //窗口类型;WS窗口风格
            
                        CW_USEDEFAULT,                   //初始化x轴位置;CW创建窗口选项
                        CW_USEDEFAULT,          //初始化y轴位置
                        CW_USEDEFAULT,          //初始化x轴大小
                        CW_USEDEFAULT,          //初始化y轴大小
                        NULL,          //父窗口处理
                        NULL,             //窗口菜单处理
                        hInstance,           //程序实例处理
                        NULL );                             //创建参数,可以用这个指针访问以后想要引用的程序的数据
/*----------------------------------显示窗口----------------------------------*/
    ShowWindow( hwnd, iCmdShow );                  //显示窗口
    UpdateWindow( hwnd );                             //指示窗口刷新自己
/*-------------------------------进入循环消息队列,取出消息---------------------*/
    while( GetMessage( &msg, NULL, 0, 0 ) )                 //从消息队列中获取消息;"消息循环"代码,从消息队列中取出消息
    {                                                       //GetMessage传给Windows一个指向msg的指针;WM_QUIT导致GetMessage返回0
                                                            //第二第三第四个参数设置为NULL和0,表示程序接收它自己创建的所有窗口的所有消息
        TranslateMessage( &msg );                     //转换某些键盘消息
        DispatchMessage( &msg );                         //将消息发送给窗口过程
    }
    return msg.wParam;
}

/*-----------------------------------窗口过程----------------------------------*/
//                  窗口过程是可以任意命名的;
//                  一个Windows程序可以包含多个窗口过程;
//                  一个窗口过程总是与调用RegisterClass注册的特定窗口类想关联的;
//                  CreateWindow函数根据特定窗口类创建一个窗口;
//                  基于一个窗口类可以创建多个窗口

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    HDC         hdc;                         //设备描述表句柄
    PAINTSTRUCT ps;                          //绘图结构 
    RECT        rect;                  //矩形结构


/*--------------------------------------------------------------------------------
    一般来说,使用swith和case结构来确定窗口过程接受的是什么消息,以及如何适当地处理
他们.窗口过程在处理消息时,必须反回0.
    窗口不予以处理的所有消息应该被窗给名为DefWindowProc的Windows函数.从Def..返回的
值必须由窗口过程返回.
----------------------------------------------------------------------------------*/
    switch( message )
    {
    case WM_CREATE:
        PlaySound( TEXT("Windows.wav"), NULL, SND_FILENAME | SND_ASYNC );   //播放身音;SND声音选项
        return 0;

    case WM_PAINT:          //当窗口客户区域的一部分或者全部变成"无效",以致于必须刷新时将由这个消息通知程序
        hdc = BeginPaint( hwnd, &ps );                      //开始窗口绘制
     
        GetClientRect( hwnd, &rect );                             //获取窗口客户区的尺寸

        DrawText( hdc, TEXT( "Hello Windows XP!" ), -1, &rect,          //显示文本串
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER );        //DT绘制文本选项
        EndPaint( hwnd, &ps );                           //结束窗口绘制
        return 0;

    case WM_DESTROY:        //该消息是拥护单击Close按钮或者在程序菜单声选择close产生的
        MessageBox( NULL, TEXT( "This program requires Windows NT!" ),  //显示消息框
                    hwnd, MB_ICONE RROR );
        PostQuitMessage(0);                                          //再消息队列中插入一条"退出"消息
        return 0;

    }
    return DefWindowProc( hwnd, message, wParam, lParam );              //执行默认的消息处理

}

阅读(970) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~