windows编程基础知识

该文介绍了使用WindowsAPI创建和管理窗口的基本步骤,包括注册窗口类、创建窗口、处理消息,特别是详细讲解了窗口过程WindowProc中的WM_CLOSE、WM_DESTROY、WM_LBUTTONDOWN、WM_KEYDOWN和WM_PAINT消息的处理。此外,文中还展示了如何显示和更新窗口以及如何响应用户的鼠标和键盘输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <windows.h>//包含底层实现窗口的头文件

//第六步:处理消息窗口
//LRESULT 默认返回值
//CALLBACK代表着_stdcall的参数传递顺序,从右至左,依次入栈,并且在函数返回前,清空堆栈
LRESULT CALLBACK WindowProc(//函数名称与下面创建的回调函数名对应
    HWND hwnd,//消息所处的窗口句柄
    UINT uMsg,//具体的消息名称  底层的消息实现都是以WM_xxxx为消息名
    WPARAM wParam,//键盘的附加消息
    LPARAM IParam//鼠标的附加消息 
)
{
    switch (uMsg) {
    case WM_CLOSE://关闭窗口应进行的步骤
        DestroyWindow(hwnd);//DestroyWindow 发送另一个消息给 WM_DESTROY
        //所有xxxwindow为结尾的方法,都不会进入到消息队列中,而是直接执行
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_LBUTTONDOWN://鼠标左键按下事件
    {
        int xPos = LOWORD(IParam);
        int yPos = HIWORD(IParam);

        char buf[1024];
        wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);//打印光标的位置

        MessageBox(hwnd, TEXT("windows"), TEXT("鼠标左键按下"), MB_OK);//弹出消息的窗口

        break;
    }
    case WM_KEYDOWN://键盘事件 
        MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
        break;

    case WM_PAINT://绘图事件
    {
        PAINTSTRUCT ps;//生成一个绘图结构体
        HDC hdc=BeginPaint(hwnd, &ps);//返回值用HDC类型的变量接受
        TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));//开始绘图
        EndPaint(hwnd, &ps);
    }
    }
    //返回值默认处理方式
    return DefWindowProc(hwnd, uMsg, wParam, IParam);
}
//WINAPI代表着_stdcall的参数传递顺序,从右至左,依次入栈,并且在函数返回前,清空堆栈
int WINAPI WinMain(
    HINSTANCE hInstance,//应用程序的实例句柄
    HINSTANCE hPrevInstance,//上一个应用的句柄
    PSTR szCmdLine,//相当于 char *argv[]
    int iCmdShow//显示命令
) {

    //第一步:创建窗口对象
    WNDCLASS wc;
    //对各个属性初始化
    wc.cbClsExtra = 0;//类的额外内存
    wc.cbWndExtra = 0;//窗口的额外内存
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
    wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 如果第一个参数为    NULL 代表使用系统提供的光标
    wc.hIcon = LoadIcon(NULL, IDI_ERROR);//设置图标 如果第一个参数为 NULL 代表使用系统提供的图标
    wc.hInstance = hInstance;//应用程序实例句柄 传入WinMain中的形参即可
    wc.lpszClassName = TEXT("我的窗口");//指定窗口类 名称
    wc.lpszMenuName = NULL;//菜单名称
    wc.style = 0;//显示风格 0代表默认风格
    wc.lpfnWndProc = WindowProc;//回调函数 窗口过程

    //第二步:注册窗口类
    RegisterClass(&wc);

    //第三步:创建窗口
    /*具体形参(变量类型+变量名):
    LPCTSTR lpClassName 窗口类名,要与注册时指定的名称相同
    LPCTSTR lpWindowName 窗口标题
    DWORD dwStyle 窗口样式 WS_OVERLAPPEDWINDOW
    int x 窗口横坐标 程序默认值为:CW_USEDEFAULT
    int y 窗口纵坐标
    int nWidth 宽
    int nHeight 高
    HWND hWndParent 父窗口句柄 NULL
    HMENU hMenu //菜单句柄 NULL
    HINSTANCE hInstance // 应用程序实例句柄 hInstance
    LPVOID lpParam 附加值 NULL
    */

    //依次对应上面11个参数
    //创建一个窗口句柄,接受其返回值
    HWND hwnd = CreateWindow(wc.lpszClassName,
        TEXT("我的窗口"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    //第四步:显示和更新
    //hwnd作为函数的第一个参数,nCmdShow 即展示方法(光标移至函数名 即可查看 函数类型 参数类型等)
    ShowWindow(hwnd, SW_SHOWNORMAL);//显示
    UpdateWindow(hwnd);//更新

    //第五部:通过循环获取消息
    MSG msg;//创建一个消息结构体

    //消息作为结构体存在 转定义查看下列属性
    /*
    HWND        hwnd; 主窗口句柄
    UINT        message; 具体消息名称
    WPARAM      wParam; 附加消息:键盘消息
    LPARAM      lParam;附加消息:鼠标消息
    DWORD       time; 消息产生时间
    POINT       pt; 附加消息:鼠标消息 (坐标点)
    */

    /*
    GetMessage(
    _Out_ LPMSG lpMsg,//传入一个指向MSG结构体的指针
    _In_opt_ HWND hWnd,//获取具体窗口的位置 传入NULL指捕获所有窗口
    _In_ UINT wMsgFilterMin,//获取主消息值的最小值 传入0指捕获所有消息
    _In_ UINT wMsgFilterMax);//获取主消息值的最大值 传入0指捕获所有消息
    */

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);//翻译消息
        DispatchMessage(&msg);//分发消息
    }
}
/*
    底层实现以窗口
    介绍相关词汇:
    SDK:软件工具包
    API:程序编程接口
    窗口:程序生成的显示在屏幕上面的一个矩形区域,分为客户区和非客户区
    句柄:资源标识,应用程序通过句柄访问相应的对象的信息
    消息处理机制
    需要包含的头文件window.h
    程序入口函数 WinMain

    具体实现的六个步骤:
    设计窗口:WNDCLASS wc;
    注册窗口:RegisterClass(&wc);
    创建窗口:CreateWindow
    显示和更新:ShowWindow   UpdateWindow(hwnd)
    通过循环获取消息:创建消息结构体+写循环+翻译消息+分发消息
    窗口过程:写成WinMain函数前):
    创建函数设定形参巴拉巴拉:LRESULT CALLBACK WindowProc
    返回默认处理值
    (以下这些均为本程序所涉及的流程)
    设定关闭机制
    设定鼠标按下机制
    设定安排按下机制
    绘图文字
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值