关闭

第3章学习笔记

1163人阅读 评论(1) 收藏 举报
Diyinside Community Academy Course (Beta)

Windows API自学课程(3)--Windows消息队列机制

学习任务:

1,解释Windows消息事件模型;

2,详细书上阅读HELLOWIN.C代码,并且对代码进行解释;

3,详细描述Windows API应用程序执行步骤

4,编写一个具有Windows消息事件的Win32 API应用程序


Learning WIN32 API Homework By citypw(Shawn Chang)
 
学习内容:

阅读<Programming Windows,Fifth Edition> Chapter 3
1,解释Windows消息事件模型;
Windows开发是不同于DOS开发的模型,Windows开发是基于消息事件驱动的设计,当用户需要完成某种功能时,会调用操作系统的API,然后操作系统将用户的需要包装成消息放到消息队列(QUEUE)里,消息队列是一个先进先出(FIFO)的,最后应用程序从消息队列里取走消息并进行响应.

2,详细书上阅读HELLOWIN.C代码,并且对代码进行解释;


3,详细描述Windows API应用程序执行步骤
创建窗口:1,设计一个窗口类 2,注册窗口类 3,创建窗口 4,显示与更新窗口
用户开始做操作,开始消息循环,一直到应用程序关闭.

4,编写一个具有Windows消息事件的Win32 API应用程序
#pragma comment(lib,"WINMM.LIB") //要用多媒体必须的文件
#include <windows.h>

//消息处理函数
//参数:窗口句柄,消息,消息参数,消息参数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    RECT rect;
    PAINTSTRUCT ps;
    //处理感兴趣的消息
    switch (message)
    {
    case WM_CREATE:
        //自己录的
        PlaySound (TEXT ("hello.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
        return 0 ;

    case WM_PAINT:
        //绘制一个"Hello,QUAKE III ARENA"
        hdc = BeginPaint (hwnd, &ps) ;

        GetClientRect (hwnd, &rect) ;

        DrawText (hdc, TEXT("Hello, QUAKE III ARENA"), -1, &rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
        EndPaint (hwnd, &ps);
        return 0;
    case WM_KEYDOWN:
        //用户按下键盘上的字母或者数字就会弹出消息
        MessageBox(hwnd,TEXT("Shit"),TEXT("yeah"),NULL);
        return 0 ;

    case WM_DESTROY:
        //当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
        PostQuitMessage (0) ;
        return 0 ;
    }
    //其他消息交给由系统提供的缺省处理函数
    return ::DefWindowProc (hwnd, message, wParam, lParam) ;
}

//应用程序主函数
//参数:实例句柄、前一个实例的句柄、命令行参数、窗口显示方式
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    //1.注册窗口类
    static TCHAR szAppName[] = TEXT ("HelloWin") ; //窗口类名称

    WNDCLASS wndclass ;                //定制"窗口类"结构
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    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 = szAppName; //类名称
    //注册
    if (!RegisterClass (&wndclass))
    {
        MessageBox (NULL, TEXT ("RegisterClass Fail!"),
            szAppName, MB_ICONERROR) ;
        return 0 ;
    }

    //建立窗口
    HWND hwnd ;
    hwnd = CreateWindow (szAppName, //窗口类名称
        TEXT ("The Hello Program"), //窗口标题
        WS_OVERLAPPEDWINDOW, //窗口风格
        100,        //窗口启动时的X座标
        300,        //窗口启动时的Y座标
        500,        //窗口初始宽度
        300,        //窗口初始高度
        NULL,
        NULL,
        hInstance, //实例句柄
        NULL);




    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    //消息循环
    MSG msg ;
    while (GetMessage (&msg, NULL, 0, 0)) //从消息队列中取消息
    {
        TranslateMessage (&msg) ; //转换消息
        DispatchMessage (&msg) ; //分发消息
    }
    return msg.wParam ;
}
                                                         
                                                          id:CityPW
                                                          Shawn Chang
                                                          http://blog.csdn.net/raiden56

参考:Programming Windows和SUNXIN的视频第1章
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:138666次
    • 积分:2164
    • 等级:
    • 排名:第17562名
    • 原创:60篇
    • 转载:15篇
    • 译文:3篇
    • 评论:100条
    最新评论