Win32窗口应用程序_空窗口框架

 还是4年前在一本游戏开发的书里看到的,重新翻出来整理了下

#include<windows.h>
#include<time.h>

#define WINDOW_WIDTH 1300//宽
#define WINDOW_HEIGHT 1000//高
#define WINDOW_TITLE L"窗口标题"
#define T 1                                                 //画面刷新周期,单位ms

/【全局变量声明】
HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL;//设备DC句柄
DWORD g_tPre = 0, g_tNow = 0;//用于比较上次刷新画面的时间与当前时间
int ColorOfNumber = 0;//花里胡哨

/【全局函数声明】
LRESULT  CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//回调
BOOL Init(HWND hwnd);//初始化
VOID Paint(HWND hwnd);//绘制
BOOL CleanUp(HWND hwnd);//清理

//【创建窗口】/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX wndClass = { 
        sizeof(WNDCLASSEX),
        CS_HREDRAW | CS_VREDRAW,//一旦移动或调整窗口尺寸,就发出WM_PAINT消息重新绘制窗口
        WndProc,0,0,hInstance,
        (HICON)::LoadImage(NULL,L"D3TK.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_LOADFROMFILE),//ico图标
        LoadCursor(NULL,IDC_ARROW),//鼠标样式
        (HBRUSH)GetStockObject(GRAY_BRUSH),//笔刷样式
        NULL,
        L"Win32_Demo" //窗口类名称
    };
    if (!RegisterClassEx(&wndClass))
    {
        return -1;
    }
    HWND hwnd = CreateWindow(
        L"Win32_Demo", //窗口类名称
        WINDOW_TITLE, //窗口标题
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, 
        WINDOW_WIDTH, //宽度
        WINDOW_HEIGHT, //高度
        NULL, NULL, hInstance, NULL
    );

    //MoveWindow(hwnd, 200, 100, WINDOW_WIDTH, WINDOW_HEIGHT, true);
    //移动窗口位置
    ShowWindow(hwnd, nShowCmd);
    //第二个参数换成SW_SHOWMAXIMIZED全屏显示
    UpdateWindow(hwnd);

    if (!Init(hwnd))
    {
        MessageBox(hwnd, L"窗口创建失败", L"错误", 0);
        return FALSE;
    }

    //【消息循环】/
    MSG msg = { 0 };
    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))//收到消息时转发消息
        {
            TranslateMessage(&msg);//转换
            DispatchMessage(&msg);//发送
        }
        else {//没消息时按周期循环重绘窗口
            g_tNow = GetTickCount64();
            if (g_tNow - g_tPre >= T)
            {
                Paint(hwnd);
            }
        }
    }
    UnregisterClass(L"Win32_Demo", hInstance);//收到退出窗口消息,注销窗口类
    return 0;
}
//【回调】/
LRESULT  CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    PAINTSTRUCT paintstruct;

    switch (message)
    {
    case WM_PAINT://收到重绘消息
        g_hdc = BeginPaint(hwnd, &paintstruct);//获取设备句柄
        Paint(hwnd);//绘制窗口
        EndPaint(hwnd, &paintstruct);//结束绘制
        ValidateRect(hwnd, NULL);//更新窗口
        break;
    case WM_KEYDOWN://按键消息
        if (wparam == VK_ESCAPE)//ESC键
        {
            DestroyWindow(hwnd);
            break;
        }
        break;
    case WM_DESTROY:
        CleanUp(hwnd);
        PostQuitMessage(0);
        break;
    default://其他消息由系统默认处理
        return DefWindowProc(hwnd, message, wparam, lparam);
    }
    return 0;
}

//【初始化】/
BOOL Init(HWND hwnd)
{
    HBITMAP None;

    g_hdc = GetDC(hwnd);//设备DC
    g_mdc = CreateCompatibleDC(g_hdc);//内存DC
    g_bufdc = CreateCompatibleDC(g_hdc);//缓存DC

    None = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
    SelectObject(g_mdc, None);

    Paint(hwnd);
    return TRUE;
}
//【绘图】/
VOID Paint(HWND hwnd)
{
    //置顶窗口
    SetForegroundWindow(hwnd);

    //文字输出
        //字体创建(局部变量时才能修改字体大小,就很迷惑)
    HFONT YaHei = CreateFont(50, 0, 0, 0, 0, 0, 0, 0, UNICODE, 0, 0, 0, 0, L"微软雅黑");

    wchar_t text0[] = L"测试";

    SetBkMode(g_mdc, TRANSPARENT);//设置文字背景透明

    //输出文字
    SelectObject(g_mdc, YaHei);
    SetTextColor(g_mdc, RGB(0, 255, ColorOfNumber));//设置文字前景色
    TextOut(g_mdc, 200, 400, text0, wcslen(text0));

    //字体颜色循环
    ColorOfNumber += 1;
    if (ColorOfNumber > 255)
    {
        ColorOfNumber = 0;
    }

        //释放字体
    DeleteObject(YaHei);
    //从内存DC绘图到DC
    BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
}

//【资源释放函数】/
BOOL CleanUp(HWND hwnd)
{
    //释放资源
    ReleaseDC(hwnd, g_hdc);
    DeleteDC(g_mdc);
    DeleteDC(g_bufdc);
    return TRUE;
}

因为要用C++弄个示例程序,参考的代码是MFC写的,一个项目里一堆.cpp,里面全是各种class,互相之间又各种纠缠不清,看了半天脑子里全是"这个类是干嘛的、为什么写在这个文件里、它在哪被调用了、里面的这堆参数又都是什么玩意...",黑人问号.jpg

面向对象可能确实很牛逼,写出来的东西换个人来看也是真的看不懂

之前已经用python20行代码就实现了功能,然而说客户关心过程要求C++,这才就个窗口屁功能都没实现都一百多行了,人生苦短,我想用python

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值