逐梦旅程(著:毛星云)---学习笔记第三章

希望国内的单机游戏开发环境能越来越好吧

#include<Windows.h>
#pragma comment(lib,"winmm.lib")


//窗口过程函数
/*
    LRESULT CALLBACK WindowProc(
        _In_ HWND hwdn,
        _In_ UINT uMsg,    
        _In_ WPARAM wParam,
        _In_ LPARAM lParam
    );
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

    /*
        hInstance: h->handle  Instance:句柄
        hPrevInstance: h->handle  Instance:句柄  Prev:前一个
        lpCmdLine: 指定传输给运用程序的命令行参数  lp:参数为一个指针    Cmd:command  Line:命令行
        nCmdShow: 窗口如何显示
    */

    /*
        int WINAPI MessageBox(_In_opt HWND hWnd, _In_opt LPCTSTER lpText, _In_opt LPCTSTER lpCation, _In_opt UINT uType);
        hWnd: 窗口的句柄
        lpText: 窗口显示的内容
        lpCation: 标题
        uType: 样式

    */

    MessageBox(NULL, L"你好,Visual Studio!", L"消息窗口", 0);

    boolean error = 0;

    if (error) {
        MessageBox(NULL, L"在这里填写错误信息", L"在这里填写错误信息", 0);
    }

    /*
        BOOL PlaySound(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound);
        pszSound: 要播放的文件
        hmod: 句柄
        fdwSound: 控制文件播放的标识
    */

    //PlaySound(L"FirstBlood.wav", NULL, SND_FILENAME | SND_ASYNC);    //SND_FILENAME:pszSound参数指定了WAVE文件名  SND_ASYNC:同步播放声音 播放完后函数返回
    //MessageBox(NULL, L"FirstBlood,你好,游戏开发世界", L"FirstBlood!", 0);

    /* 消息 传递双击事件等
        typedef struct tagMSG{
            HWND hwnd;  消息的窗口
            UINT message; 消息的标识符
            WPARAM wParam; 附加信息
            LPARAM lParam; 附加信息
            DWORD time; 投递到消息队列的时间
            POINT pt; 投递到消息队列中时鼠标的位置
        }MSG
    */

    /*控制窗口的特征
        typedef struct tagWNDCLASSEX{
            UINT cbSize; 结构体的字节数大小
            UINT style; 窗口的风格样式
            WNDPROC lpfnWndProc; 窗口过程
            int cbClsExtra; 窗口类附加内存
            int cbWndExtra; 窗口的附加内存
            HINSTANCE hInstance;  实力句柄
            HICON hIcon; 图标句柄
            HCURSOR hCurosr; 光标句柄
            HBRUSH hbrBackground; 背景画刷句柄
            LPCTSTR lpszMenuName; 菜单名
            LPCTSTR lpszClassName; 窗口类的名字
            HICON hIconSm; 窗口类的小图标句柄
        }WNDCLASSEX, *PWNDCLASSEX;
    */

    //窗口类的构建
    WNDCLASSEX wndClass = { 0 };
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = L"GameDevelopDepartment";

    //窗口类的注册 RegisterClassEx
    RegisterClassEx(&wndClass);

    //窗口的正式创建
    /*
        HWND WINAPI CreateWindow(
            _In_opt LPCTSTR lpClassName,  对应窗口类名
            _In_opt LPCTSTR lpWindowName, 创建的窗口类名
            _In DWORD dwStyle, 窗口样式
            _In_int x, 水平位置
            _In_int y, 竖直位置
            _In_int nWidth, 窗口宽度
            _In_int nHeight, 窗口高度
            _In_opt HWND hWndParent, 父窗口句柄
            _In_opt HMENU hMenu, 资源句柄
            _In_opt HINSTANCE hInstance, 应用程序实例句柄
            _In_opt LPVOID lpParam 附加参数
        );
    */
    HWND hWnd = CreateWindowW(L"GameDevelopDepartment", L"游戏开发部", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);

    //窗口的显示和更新
    //1.改变窗口的位置和大小
    /*
        BOOL WINAPI MoveWindow(
            _In_ HWND hWnd,
            _In_ int x,
            _In_ int y,
            _In_ int nWidth,
            _In_ int nHeight,
            _In_ BOOL bRepaint 是否重画窗口
        );
    */
    MoveWindow(hWnd, 200, 50, 800, 600, true);

    //2.显示窗口
    /*
        BOOL WINAPI ShowWindow(
            _In HWND hWnd,
            _In int nCmdShow 窗口的显示状态
        );
    */
    ShowWindow(hWnd, nCmdShow);

    //3.更新窗口
    /*
        BOOL UpdateWindow(
        _In_ HWND hWnd
        );
    */
    UpdateWindow(hWnd);


    //GetMessage为核心的消息循环体系
    //GetMessage只有在接收到WM_QUIT的情况下才会返回0,错误返回-1 无消息时会一直等待
    /*
        BOOL WINAPI GetMessage(
            _Out_ LPMGS lpMsg, 指向一个消息结构体
            _In_opt_ HWND hWnd, 接受哪一个窗口的消息
            _In_ UINT wMsgFilterMin, 获取消息的最小值
            _In_ UINT wMsgFilterMax 获取消息的最大值
        );
    */
    //MSG msg = { 0 };    //定义一个MSG结构体
    //while (GetMessage(&msg, NULL, 0, 0)) {    
    //    TranslateMessage(&msg);    //虚拟键消息转化为字符消息
    //    DispatchMessage(&msg);    //分发消息给窗口
    //}

    //PeekMessage为核心的消息循环体系
    //PeekMessage在接收到消息的时候返回非0 不能接收到消息返回0 不论是否有消息都会继续执行
    /*
        BOOL WINAPI PeekMessage(
            _Out_ LPMGS lpMsg, 指向一个消息结构体
            _In_opt_ HWND hWnd, 接受哪一个窗口的消息
            _In_ UINT wMsgFilterMin, 获取消息的最小值
            _In_ UINT wMsgFilterMax, 获取消息的最大值
            _In_ UINT wRemoveMsg 消息的获取方式
        );
    */
    MSG msg = { 0 };
    while (msg.message != WM_QUIT) {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);    
            DispatchMessageW(&msg);
        }
    }

    //注销窗口
    /*
        BOOL WINAPI UnregisterClass/UnregisterClassEx(
            _In_ LPCTSTR lpClasName, 注销的类名
            _In_opt HINSTANCE hInstane
        );
    */
    UnregisterClassW(L"GameDevelopDepartment", hInstance);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值