效果:
支持拉伸窗口,自动调整大小,最大化窗口等基本操作,且支持自定义标题栏等样式
这都只需要一个头文件就可以做到:
项目下载地址:
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