在LED显示屏的软件控制系统中,文本信息的编辑、字模信息的保存、显示效果的处理、图象预览以及设备通讯是设计的核心工作。下面就这四个核心功能做详细的研究与设计。
在LED显示屏上展现所要显示的内容以及效果,编辑工作是最重要的环节之一。本系统在设计时采用VC6.0开发工具,用VC++完成整个设计工作。以单文档View的形式开启文本区。
下面对工程进行分析和设计:
1文本区的开启:
由于所应用的LED显示屏的像素点数量已定,而计算机屏幕的分辨率显然远远高于显示屏,这样造成逻辑坐标的不同,即而显示的图像会有扭曲、拉长甚至失真情况。所以可以通过选择开启窗口的计算机屏幕像素点与显示屏像素数之间恰当的比例来减小误差。
现在用来解决此问题的方法很多。例如点阵数据的压缩方法,由于在Windows环境下,系统默认的每个汉字为4000多点,而16*16点阵一个字的大屏幕,每个汉字为256点,所以根据计算,可以采用间隔取点的方式,在横向和纵向每隔12个点取一个点,每个汉字256个点组成的原理来压缩数据。
但为了图像不失真,本系统采用所开启文本区与显示屏像素数完全相同的方式,从而避免了圆变椭圆,正方形变矩形,甚至连划斜线时的斜率也不会变。
CMainFrame::PreCreateWindow函数用来设置整个窗口的大小,但是窗口外框还包括菜单,工具栏,状态栏与客户区。而系统定义的文本区要求精确的client area,用于字模信息保存。所以表示客户区大小的纵坐标要加上状态栏
与工具栏的高度,甚至菜单与窗口外框的边缘也要扣除。
所用程序如下:
SetClientSize() //设置客户区大小的函数
{CRect rect;
CSize winSize;
int cx,cy=0;
CControlBar*pBar;
pBar=GetControlBar(AFX_IDW_STATUS_BAR);
if((pBar!=NULL)&&(pBar->IsWindowVisible()))
{
pBar->GetWindowRect(rect);
winSize=rect.Size();
cy +=(winSize.cy); }
pBar=GetControlBar(AFX_IDW_TOOLBAR);
if((pBar!=NULL)&&(pBar->IsWindowVisible()))
{
pBar->GetWindowRect(rect);
winSize=rect.Size();
cy+=(winSize.cy*2);
}
cx=384+(384-m_clientSize.cx);
cy+=(192+(192-m_clientSize.cy));
GetWindowRect(rect);
SetWindowPos(this,rect.left,rect.top,cx,cy,SWP_NOZORDER);}
OnViewStatusBar() {
CFrameWnd::OnBarCheck(ID_VIEW_STATUS_BAR);
SetClientSize();}
通过对客户区的精确控制,可以真正的使文本区的象素点数与显示屏的平面发光点数对应,而且为了编辑操作过程中不至于因为失误造成文本区内的象素改变,所以系统限制了窗体最大化控制:
cs.style&=~WS_MAXIMIZEBOX;//取消最大化使窗体大小固定。
2编辑功能设计:
在控制系统中,把文字与图形的输入通通想象成是图象的编辑,这样就象在画板上一样,随心所欲的完成编辑工作。
MFC的绘图都是通过Device Context(它是设备与数据之间的媒介,可以缩写为DC)来将绘图输出到一个设备上。DC中存储设备的属性与输出绘图的数据。在MFC中要输出绘图数据至一个设备上,必须准备一个针对此设备的DC对象,它是继承于CDC的类的对象。这个DC对象可以使用CDC类的一些绘图函数(如画线、圆、方形等)。每个DC必须附着一些所谓的GDI object(GDI对象,如常见的画笔、画刷、字形、位图等画图工具)以配合DC的绘图函数。
系统通过编写Line()函数画直线、Rectangle()函数画矩形、Ellipse()函数画椭圆、Circle()函数完成图形的编辑。
需要指出的是将newPen析构:调用newPen.DeleteObject()方法。GDI对象的析构很重要,特别是自己创建的对象,一定要在适当的时机(GDI对象已经不在附着在DC时)去掉。解除附着的方法只有以SelectObject函数选择别的新的对象(旧的对象会自动被消除)。可以选择MFC预存的对象来解除对象的依附关系,因为MFC预存的对象会在不用的时候自动析构。DeleteObject是CGdiObject类公开的成员函数,所以它的子类都可以使用。
文字的输入:通过CFontDialog类生成一个选择字体类型(font)的对话框。
CDC*pDC=GetDC();
LOGFONT m_lFont;
COLORREF m_cTextColor;
CFont myFont;
CFont*pOldFont;
CFontDialog FontDlg;
FontDlg.m_cf.lpLogFont=&m_lFont;
FontDlg.m_
if(FontDlg.DoModal()==IDOK)
{
FontDlg.GetCurrentFont(&m_lFont);
m_cTextColor=FontDlg.GetColor();
}
调用系统自带的输入法,包括文字的字体、字形、颜色效果等。
系统加载TextDialog对话框,以文本编辑区左上顶点为坐标原点,向右为X轴正方向,向下为Y轴正方向建立逻辑坐标系,实现文字指定位置的编辑:
CString str;
CTextDlg TextDlg;
//CRect rect(TextDlg.m_ctrEdit.GetClientRect());
if(TextDlg.DoModal()==IDOK)
{
CRect rect(TextDlg.m_iPosX,TextDlg.m_iPosY,
pOldFont=pDC->SelectObject(&myFont);
pDC->SetTextColor(m_cTextColor);
pDC->DrawText(str,rect,0);
pDC->SelectObject(pOldFont);
SaveInStack();
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>