WindowsApi学习笔记-创建一个简单的窗口

#include <windows.h>
 
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型
 
int APIENTRY WinMain(                               //APIENTRY是__stdcall的宏定义
                     HINSTANCE hInstance,           //本模块的实例句柄
                     HINSTANCE hPrevInstance,       //Win16留下的废物
                     LPSTR lpCmdLine,               //命令行参数
                     int nCmdShow                   //主窗口初始化时的现实形式
                     )
{
    char szClassName[] = "MainClass";
    WNDCLASSEX wndclass;   //用来描述主窗口的结构
    wndclass.cbSize = sizeof(wndclass);  //结构的大小
    wndclass.style = CS_HREDRAW|CS_VREDRAW; //如果窗口大小,横向改变和竖向改变都会重画窗口
    wndclass.lpfnWndProc = MainWndProc;//窗口函数指针
    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 = szClassName;//窗口类的名称
    wndclass.hIconSm = NULL;//没有类的小图标
 
    ::RegisterClassEx(&wndclass);//注册这个窗口类
 
    HWND hwnd = ::CreateWindowEx(
        0,//扩展样式
        szClassName,//类名
        "My First Window",//窗口名。标题
        WS_OVERLAPPEDWINDOW,//窗口风格
        CW_USEDEFAULT,//初始X坐标
        CW_USEDEFAULT,//初始Y坐标
        CW_USEDEFAULT,//宽度
        CW_USEDEFAULT,//高度
        NULL,//父窗口句柄
        NULL,//菜单句柄
        hInstance,//实例句柄
        NULL//用户数据
        );
    if(hwnd == NULL)
    {
        ::MessageBox(NULL,"创建窗口出错","系统提示",MB_OK);
    }
    ::ShowWindow(hwnd,nCmdShow);//显示窗口
    ::UpdateWindow(hwnd);//刷新窗口
    MSG msg;
    while(::GetMessage(&msg,NULL,0,0))
    {
        ::TranslateMessage(&msg);//转换为键盘消息
        ::DispatchMessage(&msg);//将消息发送到相应的窗口函数
    }
    return msg.wParam;//当GetMessage返回FALSE时程序结束
}
 
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    char szText[] = "最简单的窗口程序";
    switch(message)
    {
    case WM_PAINT:
        {
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = ::BeginPaint(hwnd,&ps);//使无效的客户区变的有效,并取得设备环境句柄
            ::TextOut(hdc,10,10,szText,strlen(szText));//输出文本
            ::EndPaint(hwnd,&ps);
            return 0;
        }
    case WM_DESTROY:
        {
            ::PostQuitMessage(0);//向消息队列投递一个WM_QUIT消息,促使GET MESSAGE函数返回0,结束消息循环
            return 0;
        }
    }
    return ::DefWindowProc(hwnd,message,wParam,lParam);
}
posted @   liulun  阅读(553)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示