今天正式发布一个初学者用的程序库——minivg。这个库结构简洁,使用方便,容易理解。包含基础的绘图函数,键盘鼠标控制,音乐、声音播放,是写小作品的不二选择。
值得一提的是,这个库封装了 GDI+ 绘图接口,GDI+ 是 Windows Vista 之后的系统内置的绘图 API(XP 也能使用),比起传统 GDI,在图像抗锯齿、ALPHA 半透明等方面得到了支持,非常容易绘制出美轮美奂的图像。Vista 之后的界面绘制效果,离不开 GDI+ 的支持。
整个库不需要 lib 文件,也不需要 dll 文件,只需要在你的 cpp 文件里面 #include <minivg.hpp> 它就能工作!测试过的编译器有:C++Builder,vs2017+,gcc。
主文件:
minivg.hpp 主要接口,有注释说明。
minivg.inl 代码实现。
项目Github地址:https://github.com/sdragonx/minivg
博客地址:https://www.cnblogs.com/sdragonx/p/13184935.html
开源协议:MIT(代码在minivg.inl里面,开源,有兴趣自己可以琢磨)
void OnKeyDown(int Key);
int main(int argc, char* argv[])
{
//初始化窗口
initgraph(1024, 600, VG_SIZEABLE);
//设置按键响应函数
key_push_event(OnKeyDown);
//绘图效果
effect_level(VG_QUALITY);
//播放音乐
play_music(TEXT("mp3音乐"));
//主程序循环
while(do_events()){
clear(0, 0, 0);//清屏
pen_color(255, 0, 255, 128);//半透明红色
draw_line(10, 10, 100, 100);//绘制一条线
fill_color(0, 255, 0, 128);//半透明绿色
fill_rect(100, 100, 200, 200);//填充半透明矩形
};
//关闭库,释放资源
quit();
}
void display();
int main(int argc, char* argv[])
{
// 初始化窗口
initgraph("窗口标题", 520, 640);
// 设置绘制函数
display_event(display);
// 绘图效果(高质量)
effect_level(VG_QUALITY);
// 主程序循环
return start_app();
}
void draw_demo()
{
// 画笔颜色
pen_color(0xFFFFFFFF);
// 画笔样式,实心画笔
pen_style(VG_SOLID);
// 绘制三条不同宽度的直线
pen_width(1); // 画笔宽度
draw_line(10, 10, 110, 10);
pen_width(2);
draw_line(10, 20, 110, 20);
pen_width(4);
draw_line(10, 30, 110, 30);
// 画笔样式,点画模式
pen_style(VG_DOT);
// 绘制三条不同宽度的直线
pen_width(1);
draw_line(120, 10, 220, 10);
pen_width(2);
draw_line(120, 20, 220, 20);
pen_width(4);
draw_line(120, 30, 220, 30);
pen_style(VG_SOLID);
pen_width(1.0f);
pen_color(255, 255, 255, 255);
// 绘制基本图元
draw_rect(10, 50, 100, 40);
draw_roundrect(10, 100, 100, 40, 10, 10);
draw_ellipse(10 + 50, 150 + 20, 50, 20);
draw_circle(10 + 50, 200 + 20, 20);
// 填充颜色
fill_color(0, 255, 0, 255);
// 填充模式绘制基本图元
fill_rect(120, 50, 100, 40);
fill_roundrect(120, 100, 100, 40, 10, 10);
fill_ellipse(120 + 50, 150 + 20, 50, 20);
fill_circle(120 + 50, 200 + 20, 20);
// 多边形
vec2f points[] = {
vec2f(30, 420),
vec2f(100, 500),
vec2f(200, 520),
vec2f(300, 500),
};
pen_color(255, 255, 0, 255);
draw_polygon(points, 4); // 绘制多边形
fill_color(0, 255, 0, 64);
fill_polygon(points, 4); // 填充多边形
// 文字输出
pen_color(0x7FFFFFFF); // 绘制的边框颜色
font_name(L"微软雅黑"); // 字体名称
font_size(16); // 字体大小
font_color(255, 0, 0, 255); // 字体颜色
draw_rect(10, 250, 200, 50); // 绘制边框
drawtext(10, 250, 200, 50, L"文字左对齐。", VG_CENTER_V); // 输出字体
font_color(0, 255, 0, 255);
draw_rect(10, 300, 200, 50);
drawtext(10, 300, 200, 50, L"文字居中显示。", VG_CENTER);
font_color(0, 0, 255, 255);
draw_rect(10, 350, 200, 50);
drawtext(10, 350, 200, 50, L"文字右对齐。", VG_CENTER_V | VG_RIGHT);
// 图片绘制
vgImage* image = loadimage("assets/sprite.png");
static float angle = 0.0f;
for (int i = 0; i < 10; ++i) {
drawsprite(
image, 640.0f, 256.0f, 1.0f - i * 0.05f, 1.0f - i * 0.05f,
// angle + i * 4 + i * angle * 0.5f,
-(i + 1.0f) * angle * 0.05f, 0.5f, 0.5f
);
}
angle += 1.0f;
float cx = image->width();
float cy = image->height();
static float a = 0.0f;
float scale = 0.25f;
vec2f center = vec2f(cx / 2, 0.75f);
drawsprite(image, 0.0f, 0.0f, cx, cy, mouse.x, mouse.y, scale, scale, a, center.x, center.y);
a++;
}
void display()
{
// 清屏
clear(0, 128, 255);
draw_demo();
show_fps();
}
修复 bug,统一命名,增加帧率控制。
修正 bug。
库名字由 EZGDI 正式更名为 minivg,计划做成 OpenCV 的迷你版。
支持在对接到已有窗口中,创建背景缓冲区,通过 framebuf_blt() 函数显示。
增加多线程渲染(未加入锁帧功能)。
支持全屏和窗口动态切换:fullscreen(bool) 函数。
支持直接绘制内存二进制数据:draw_pixels() 函数,像素必须是 ABGR 格式。
