在数字钟表或嵌入式系统中,经常看到七段LCD显示。本文将介绍如何创建一个简单的控制,通过鼠标拖动数字来快速设置日期和时间。这种控制不仅外观类似于数字钟表,而且使用起来非常简单,部署时也不需要安装额外的字体或进行特殊的安装。
开发者希望创建一个易于使用且易于部署的控件,以便用户能够通过拖动鼠标快速设置日期和时间。这种控件的设计灵感来自于数字时钟,同时确保其简单易用,无需安装额外的字体或执行特殊的安装过程。
Clcd7类是整个控制的核心。演示应用程序包含了一个完全功能的设置时间的演示控制,其中LCD用于设置时间(应用程序本身只是将结果放入编辑框中):
Clcd7 hour1, hour2;
Clcd7 minute1, minute2;
在父对话框的IntDialog()函数中,可以设置操作参数,例如:
m_lcd.SetBgColor(RGB(192, 192, 192));
m_lcd.SetFgColor(RGB(12, 12, 12));
LCD将向其父对话框发送以下消息:
#define WM_OVERFLOW (WM_USER + 1)
#define WM_UNDERFLOW (WM_USER + 2)
#define WM_TCHANGE (WM_USER + 3)
确保这些消息在应用程序中是唯一的,或者使用RegWndMsg。要捕获这些消息,请使用:
BEGIN_MESSAGE_MAP(CTimectrlDlg, CDialog)
//{{AFX_MSG_MAP(CTimectrlDlg)
...
ON_MESSAGE(WM_TCHANGE, lcd_change)
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP
要捕获消息:
void CTimectrlDlg::lcd_change(WORD wparam, LONG lparam)
{
TRACE("lcd change on %d\r\n", wparam);
}
wparam包含发送消息的LCD的控件ID。
开发者使用了Windows消息机制,在LCD发生变化时发送消息。这使得更新UI反馈和更新显示当前数字的编辑框的代码非常简单。
溢出或下溢消息可以用来非常简单地将多个LCD连接在一起。原理如下:
if (pMsg->message == WM_OVERFLOW)
{
TRACE("CTimectrlDlg::PreTranslateMessage WM_OVERFLOW on %d\r\n", pMsg->wParam);
if (pMsg->wParam == CONTROL_FOR_LOWER_DIGIT)
{
// m_lcd2是CONTROL_FOR_HIGHER_DIGIT
m_lcd2.num++;
m_lcd.Invalidate();
}
}
同样的方法也适用于UNDERFLOW。当Invalidate()被调用时,如果发生溢出,控件可能会发送消息。这允许级联多个LCD。
要将LCD设置为十六进制模式,请使用:
// Hex Mode:
SetMinMax(0, 15);
// Dec Mode:
SetMinMax(0, 9);
开发者还安排了对控件参数的设置,使其对Windows创建状态敏感。这样,可以在预创建状态下设置参数,而不会用ASSERT破坏整个系统。
void Clcd7::SetBgColor(COLORREF col)
{
bg = col;
if (::IsWindow(m_hWnd))
Invalidate();
}