VirtLCD:在Windows上调试各种嵌入式GUI的小工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq446252221/article/details/79638250

前言

为了方便测试和移植嵌入式GUI,自己做的一个小工具,可以在windows上模拟出LCD,键盘和鼠标。

虽然像emwin一样,大多数GUI都提供了自己的模拟工具,但是一般只能用于它本身,不方便移植其它GUI或者自己开发GUI,所以写了这个通用工具,理论上支持移植任何GUI,当然主要是测试目的。


简介

本工具提供了LCD帧缓存以及鼠标和键盘接口,可以定制屏幕宽度,高度和颜色位深,支持16位,24位,32位色。

LCD窗口是在单独的进程中运行,在vs调试GUI的时候,可以单步调试,不会导致LCD窗口无法显示的问题。

VirtLCD.exe作为LCD窗口的服务器,VirtLCD.dll作为LCD窗口的客户端,同一时间只能运行一个LCD服务器。

LCD窗口服务器与客户端使用UDP传输按键和鼠标事件,而帧缓存使用内存映射技术,共享同一段内存。

LCD服务器定时将共享内存的数据绘制到屏幕上,目前刷新率设定为50Hz。


扫描二维码关注公众号,回复: 2938046 查看本文章

如何获取

本工具已经开放源代码,可以在码云下载完整源码,也可以下载打包好的SDK。

下载SDK压缩包: https://download.csdn.net/download/qq446252221/10299754

下载源代码: https://gitee.com/kerndev/VirtualLCD

如何使用
下面的代码作为演示.

/******************************************************************************
* LCD 驱动
******************************************************************************/
#include "virtlcd.h"

#pragma comment(lib, "virtlcd.lib")

#define LCD_FILENAME    "virtlcd.exe"
#define LCD_WIDTH       640
#define LCD_HEIGHT      480
#define LCD_BPP         32

//定义像素类型
typedef unsigned long   PIXEL;

//帧缓存指针
static PIXEL *m_pFrameBuffer;

//计算在X,Y坐标的帧缓存指针
#define GET_OFFSET(x, y)        ( LCD_WIDTH * ( LCD_HEIGHT - (y) - 1) ) + (x) )
#define GET_FRAMEBUFFER(x, y)   ( m_pFrameBuffer + GET_OFFSET(x, y) )

//响应鼠标事件
static void on_mouse_input(int event, int x, int y)
{

}

//响应键盘事件
static void on_keybd_input(int event, int key)
{

}

//初始化LCD
int LCD_Init(void)
{
    int ret;
    ret = VirtLCD_Init(LCD_FILENAME, LCD_WIDTH, LCD_HEIGHT, LCD_BPP);
    if(!ret)
    {
        return 0;
    }
    m_pFrameBuffer = VirtLCD_GetFrameBuffer();
    VirtLCD_SetMouseProc(on_mouse_input);
    VirtLCD_SetKeybdProc(on_keybd_input);
    return 1;
}

//画点
void  LCD_DrawPoint(int x, int y, PIXEL color)
{
    PIXEL *mem;
    mem = GET_FRAMEBUFFER(x, y);
    *mem = color;
}

//画水平直线
void  LCD_DrawHLine(int x1, int y1, int x2, PIXEL color)
{
    PIXEL *mem;
    mem = GET_FRAMEBUFFER(x1, y1);
    for(; x1 < x2; x1++)
    {
        *mem++ = color;
    }
}

//画垂直直线
void  LCD_DrawVLine(int x1, int y1, int y2, PIXEL color)
{
    PIXEL *mem;
    mem = GET_FRAMEBUFFER(x1, y1);
    for(; y1 < y2; y1++)
    {
        *mem = color;
        mem -= LCD_WIDTH;
    }
}

猜你喜欢

转载自blog.csdn.net/qq446252221/article/details/79638250