huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


效果:


录制_2020_05_31_10_03_55_933.gif


支持拉伸窗口,自动调整大小,最大化窗口等基本操作,且支持自定义标题栏等样式


这都只需要一个头文件就可以做到:


图片.png


项目下载地址:

ver1(完整项目)

EasyXWndPlus.zip


ver2(仅头文件)

更新:窗口大小改变时可以拥有消息响应函数

EasyXWndPlus_ver2.zip


(环境:VS2019社区版+win7旗舰版sp1)


VC6兼容版:

ForVC6.zip


内含有编译好的文件及项目源码

将EasyXWndPlus.h拷贝到你的项目下即可使用。

使用示例在main.cpp中。



WndPlus

存储一个窗口的信息

// 窗口类
struct WndPlus
{
    // 窗口宽
    int width;

    // 窗口高
    int height;

    // 窗口标题
    LPCTSTR title_name;

    // 窗口图标
    IMAGE icon;

    // 标题样式
    bool isShowIcon;            // 是否显示图标
    int title_name_mode;        // 标题文字模式
    COLORREF title_name_color;    // 标题文字颜色

    // 窗口标题栏区域
    RECT title_bar_area;

    // 标题栏颜色
    COLORREF title_bar_color;

    // 关闭按钮
    Button close_btn;
    // 关闭按钮的消息响应函数
    void (*OnClose)() = NULL;

    // 最大化按钮
    Button max_btn;
    // 最大化时转为正常的按钮
    Button normal_btn;
    // 最大化按钮的消息响应函数
    void (*OnMax)() = NULL;

    // 最小化按钮
    Button min_btn;
    // 最小化按钮的消息响应函数
    void (*OnMin)() = NULL;

    // 窗口颜色
    COLORREF wnd_color;

    // 窗口是否带有边框
    bool isBorder;

    // 边框颜色(如果有边框的话)
    COLORREF border_color;

    // 窗口类型(是否能够改变大小)
    int type;
};


其中,标题样式中的title_name_mode可以为:

//////////////////// 标题样式定义 ////////////////////

#define TS_NONE 0    // 不显示标题文字
#define TS_LEFT 1    // 左侧显示标题文字
#define TS_CENTER 2    // 居中显示标题文字


窗口类型type可以为:

//////////////////// 窗口类型定义 ////////////////////

#define WND_NORMAL 0    // 普通窗口
#define WND_RESIZE 1    // 可以被拖动来设置大小的窗口



使用InitWnd函数来为一个窗口类进行基本的初始化,然后再进行自己的一些修改,即可创建窗口:

// 使用EasyXWndPlus
#include "EasyXWndPlus.h"

// 标记是否关闭窗口
bool close = FALSE;

// 关闭按钮的消息响应函数
void Close()
{
    // 弹出确认关闭的对话框
    if (MessageBox(GetHWnd(), L"确实要关闭窗口吗?", L"关闭窗口", MB_OKCANCEL) == IDOK)
    {
        close = TRUE;
    }
}

int WINAPI _tWinMain
(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nShowCmd
)
{
    // 创建窗口类
    WndPlus wnd;
    
    // 为窗口类进行基本的初始化
    InitWnd(&wnd,200,200);
    
    // 修改窗口的一些属性
    wnd.type = WND_RESIZE;            // 窗口大小:可改变
    wnd.title_name_mode = TS_CENTER;  // 程序标题:居中
    wnd.isShowIcon = FALSE;           // 不显示窗口图标
    wnd.OnClose = Close;              // 设置窗口上的关闭按钮的消息响应函数为Close函数
    wnd.wnd_color = WHITE;            // 窗口背景色:白色
    
    // 创建绘图窗口
    InitGraphPlus(&wnd);
    
    setbkcolor(BLUE);

    while (true)
    {
        // 清除程序屏幕
        ClearWnd(&wnd);
        
        // 得到可绘画区域
        RECT rct = GetDrawArea(&wnd);

        // 设置文字颜色
        settextcolor(BLACK);

        // 在可绘画区域的中央输出hello world
        drawtext(L"hello world", &rct, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

        // 在可绘画区域的坐上家输出Good morning!
        outtextxy(DA_X(0, wnd), DA_Y(0, wnd), L"Good morning!");
         // DA_X和DA_Y宏是用来得到一个坐标相对于程序窗口的位置

        // 显示刚才输出的内容
        FlushBatchDraw();

        // 如果出现了关闭程序的标志,那么退出程序
        if (close == TRUE)
        {
            return 0;
        }

        Sleep(10);
    }

    return 0;
    
}


DA_X和DA_Y宏是用来得到一个坐标相对于程序窗口的位置,如果你使用了坐标来绘图,请务必使用这两个宏,否则画出来的东西可能会显示到标题栏上。

DA_X 转换X坐标

DA_Y 转换Y坐标


例子:转换x坐标200为wnd窗口内的x坐标200:

int x = DA_X(200, wnd);



程序实现原理请参考:

鼠标物理位置、状态 http://www.huidong.xyz/index.php?mode=2&id=84

函数指针 http://www.huidong.xyz/index.php?mode=2&id=88

接收双击事件 http://www.huidong.xyz/index.php?mode=2&id=90

设置窗口状态 http://www.huidong.xyz/index.php?mode=2&id=89

SetWindowPos http://www.huidong.xyz/index.php?mode=2&id=80

GetSystemMetrics http://www.huidong.xyz/index.php?mode=2&id=79

自定义窗口样式 http://www.huidong.xyz/index.php?mode=2&id=78

创建多线程 http://www.huidong.xyz/index.php?mode=2&id=75    



返回首页


Copyright (C) 2018-2024 huidong