原创 用VC模拟一个点阵屏 之初步 (原创)

2008-12-9 23:44 5070 2 2 分类: 软件与OS

做过几个基于点阵屏的项目,每次都是在屏调通后才开始写界面,


这次改了,考虑通过Win32建一个工程,把一个缓冲区的数据更新到界面上,理论上即为动态生成图像并画出来,具体实现如下:


    为便于更新与保存,做的时候我是利用Butoon的自绘功能实现位图的显示,这里只是演示原理,就以单色屏为研究对象,每个像素点只有0,1两种状态。


首先定义屏的大小,这里我以240×160为例。


#define     DISP_BITMAP_W       240 
#define     DISP_BITMAP_H       160
#define     DISP_BITMAP_Wbyte   ((DISP_BITMAP_W+7)/8)
unsigned char mDispBitMap[DISP_BITMAP_Wbyte*DISP_BITMAP_H];


这就是屏缓存了,接着我们就实现一个接口,刷屏函数。


void CUpdateWindow(void)
{ // 直接更新屏的显示区域,这里只是发了一个消息
 InvalidateRect(GetDlgItem(g_hDlgHwnd, IDC_BUTTON_LCD), NULL, FALSE);
}
我们还需要实现BUTTON的自绘函数,


对于基于Win32的工程,可以实现这个消息处理:


 case WM_DRAWITEM:
 {
  LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
  if (lpdis) DrawGraph(lpdis->hwndItem); // 这个就是我们要实现的画屏函数了
  return TRUE;
 }

画屏函数定义:BOOL DrawGraph(HWND hwndDraw);


要将一个点阵数据显示到屏上,目前我想到了两种办法:


方法1) 采用DOS下显示汉字的原理,一个点一个点地画,利用SetPixel


主要实现部分如下:


 for(i=0;i<DISP_BITMAP_H;i++)
 {
  pBufText = lcdMem + i * APP_LCD_Wbyte;
  for (j=0;j<DISP_BITMAP_Wbyte;j++)
  {
   for(k=0;k<8;k++)
   {
    if((k+j*8)>=DISP_BITMAP_W )  break;
    if(pBufText[j]&(0x80>>k))
    {
     SetPixel(hDC,(k + j*8), i, RGB(0xFF,0xFF,0xFF));
    }
    else
    {
     SetPixel(hDC,(k + j*8), i, RGB(0x00,0x00,0xFF));
    }
   }           
  }
 }


这种实现方式刷屏慢,但也有一个好处,可以实现蓝底白字等较好的对比效果。


方法2) 直接利用缓冲区的数据创建BMP对象,


完整实现如下:


 HDC hDC;
 HDC hdcSrc = CreateCompatibleDC(NULL);
 if(!(hDC = GetDC(hwndDraw)))
 {
  return FALSE;
 }
 HBITMAP hbmNew = CreateBitmap(APP_LCD_W,APP_LCD_H,1,1,(&mDispBitMap[0][0]));
 SelectObject(hdcSrc, hbmNew);
 BitBlt(hDC, 0, 0,APP_LCD_W,APP_LCD_H, hdcSrc, 0, 0, SRCCOPY);
 DeleteDC(hdcSrc);
 ReleaseDC(hwndDraw, hDC);


采用这种方法刷屏较快,但只能实现黑白两色。


对于此感兴趣请继续关注,下一贴将讲一讲如何填充LCD的屏缓冲,即单色的界面生成。


 


 

文章评论0条评论)

登录后参与讨论
相关推荐阅读
walnutcy_696810119 2012-11-21 08:37
Linux下使用smartCOM调试串口
在Windows下的串口调试一直使用sscom,在Linux下只找到一个cutecom,用了几次,很不喜欢,就着手开发了一款自己的串口调试工具,smartCOM。 smartCOM介绍:http...
walnutcy_696810119 2012-10-25 22:27
EDN面目全非,挪窝 http://gnssinfo.com
[nobr] 好多博客内容都丢掉了,非常可惜。 换到SINA去弄吧 http:/gnssinfo.com [/nobr] ...
walnutcy_696810119 2012-03-29 18:12
【博客大赛】原创--测量基础:什么是测量
写在正文之前: 适逢EDNChina搞活动,而我本人也算在测量业工作,就一起作下笔记吧。若有错误,请大家一起斧正。笔者写本文一方面是梳理知识,另一方面也希望与大家探讨有关测量的知识、应用等,希...
walnutcy_696810119 2011-12-20 18:29
GLONASS 15年来,首次实现24颗星在轨可用
  EDN的博客改版后,不太好用,在SINA重开一个,不过重点改为关注GNSS行业新闻 http://blog.sina.com.cn/s/blog_7420cd1701012en9....
walnutcy_696810119 2011-12-20 17:49
逆向工程第一步:通信协议分析
工程中常有这样的事,想分析下其他知名公司产品中的通信协议,以便生产设计兼容产品。 1) 逆向工程,首先要了解产品,知己知彼,百战不怠;     去年受命想仿一款GARMIN的导航盒,但无法...
walnutcy_696810119 2011-11-14 11:30
通用代码调试方法 (Keil, VCC)
调试代码一般需要定位问题,这里给出一个解决方案, 一般的编译器均支持这些宏指令。   #define DEBUG_WALT_1113     1 extern void log_t...
广告
EE直播间
更多
我要评论
0
2
广告
关闭 热点推荐上一条 /6 下一条