英昌盛
(吉林师范大学计算机学院,吉林四平 136000)
基于MFC的半透明窗口设计与实现
英昌盛
(吉林师范大学计算机学院,吉林四平 136000)
在对工业检测结果进行实时显示过程中,用户常常需要对检测的某些数据点进行观察和分析,并根据分析的结果进行相应处理。在不影响显示检测结果的同时,检测软件还需要实时提供被选定的检测点信息,这些信息不应该占用屏幕上固定区域,而应该随被选定点的变化而浮动显示。本文基于MFC设计了跟随鼠标位置浮动显示选定检测点信息的半透明提示窗口,使软件更人性化的同时提高了用户处理检测结果的效率。
实时;选定;浮动;半透明
随着信息化的推进,光电检测发挥着愈来愈重要的作用。光电检测系统由前端检测和后端显示处理两部分构成。检测部分主要负责待检测内容,经由光学系统、光电转换系统,将光信号转换成电信号;然后在系统内部经放大、模/数转换之后形成数字化信号,从而构成一维或二维的数字信号;显示处理部分则负责处理经电缆传递过来的数字信号,并以图形或图像的形式将检测结果呈现给用户。为了方便用户处理,并给用户更好的体验,需要将检测结果以简洁明要的形式表现出来,同时将用户关心的信息及时提供给用户。一维数字信号通常以曲线形式呈现,而二维信号则通常以灰度图像形式呈现。用户关心的通常是某一检测点的数据值或灰度值,可以使用半透明浮动窗口的形式动态向用户呈现所选择的数据点的信息。
1.1 显示结果分析
检测软件的显示界面通常如图1所示。其由框架区域、显示检测结果对应的曲线区域和浮动显示的动态数据区域等几个部分构成。
图1 检测软件的通常界面
框架区域是整个软件的显示容器;检测结果对应的曲线区域由坐标系统和数据曲线两部分构成,若检测结果为二维信号则应显示图像的灰度信息;浮动显示数据区提供用户选定的检测点相关信息,通常跟随鼠标浮动实时显示,同时为不遮住其下方的曲线及其它内容,需以半透明的方式呈现。
根据检测软件常用界面及要求,可以设计带浮动信息提示窗口的检测软件布局[1],如图2所示。其由主对话框、显示曲线的静态文本区域和显示浮动区域的子对话框构成。
图2 检测软件的界面构成
图3 半透明提示窗口的布局
1.2 实现原理
对于框架,可以使用MFC中的对话框来实现;对于检测结果显示区域,则需要将MFC中的静态文本采用子类化技术来完成;对于浮动区域,则仍需要使用对话框来实现。
检测结果的可视化分为两部分:扩展CStatic类形成一个能够自我重绘的子类,在该子类中完成坐标系及相应检测数据的绘制工作;MFC中的CStatic控件与该扩展子类进行关联以实现子类化,从而完成检测结果的显示及绘制。
对于浮动窗口则需要解决两个问题:一是半透明;一是实时浮动显示相应内容。对于半透明,可以使用Windows提供的SetLayeredWindowAttributes函数,借助层次化来实现。对于数据的动态显示及窗口浮动,则需要建立主对话框与浮动对话框之间的数据关联及消息响应来实现[2]。
创建基于对话框的MFC应用程序,在对话框中删除原有控件,然后添加一个静态文本控件,同时添加一个新的对话框,并将其设置为无边框风格。
2.1 检测数据显示实现
将已经编写好的自定义数据显示类CDataShow类添加到项目中,并在相应的文件中添加对其头文件的引用。CDataShow类主要完成与主对话框类进行数据交换、绘制坐标系统以及曲线的实时绘制等工作,同时还需要与半透明提示窗口时行消息传递。
2.2 半透明窗口实现原理
在MFC中,可以借助user32.dll提供的SetLayeredWindowAttributes函数来实现层次化,通过层次化来创建半透明窗口。用于实现半透明窗口的对话框不能使用边框,而且应该添加一个静态文本控件用于显示数据点信息,其布局如图3所示。
2.3 半透明窗口实现
以子对话框为基础,创建一个新的对话框类CMyTextDlg,同时需要对该类添加重写虚函数OnInitDialog。在对话框初始化函数中,使用SetWindowLong函数设置子对话框窗口风格[3]为WS_EX_LAYERED(0x00080000);设置好该风格之后,就可以调用SetLayeredWindowAttributes函数来透明化窗口。透明化窗口之后,还需要将其设置为顶层窗体,同时取消其在任务栏中的图标显示。
BOOL CMyTextDlg::OnInitDialog()
{
……
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);
……
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,SWP_FRAMECHANGED);
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
……
}
为在提示窗口中动态显示提示信息,需要为CMyTextDlg类添加自定义公共函数SetText。
voidCMyTextDlg::SetText(CStringStr)
{
SetDlgItemText(IDC_INFO,Str);
}
在主对话框中使用子对话框作为提示窗口时,需要在其头文件中添加对子对话框类的引用,同时定义与之对应的对象指针和标志量。
CMyTextDlg *m_pDlgAlpha;
BOOL m_bIsCap;
因用户感兴趣的数据均处于检测结果的绘制区域,当鼠标不在该区域内时不应显示提示窗口。所以需要捕获主对话框的鼠标按下及移动事件,并添加相应的消息响应函数。
voidCmyTestDlg::OnLButtonDown(UINT nFlags,CPoint point)
{
m_bIsCap=TRUE;
if(!m_pDlgAlpha)
{
m_pDlgAlpha=new CMyTextDlg;
m_pDlgAlpha->Create(CMyTextDlg::IDD,CWnd::FromHandle(::GetDesktopWindow()));
}
CDialog::OnLButtonDown(nFlags, point);
}
voidCmyTestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_pDlgAlpha)
{
m_pDlgAlpha->ShowWindow(SW_HIDE);
deletem_pDlgAlpha;m_pDlgAlpha=NULL;
}
m_bIsCap=FALSE;
CDialog::OnLButtonUp(nFlags, point);
}
voidCmyTestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
……
CStringstr=_T("");
str.Format(_T("坐标:(%d,%d)"),pnt.x,pnt.y);
ShowTips(color,str);
……
}
为主对话框添加公共函数void ShowTips(CStringStr),通过子对话框指针设置其中的提示文本,并根据文本的高度及宽度动态调整了对话框的大小。
voidCmyTestDlg::ShowTips(CStringStr )
{
……
HWND DeskHwnd = ::GetDesktopWindow(); //取得桌面句柄
HDC DeskDC= ::GetWindowDC(DeskHwnd);
CDC *pDC=CDC::FromHandle(DeskDC);
CSizesSize=pDC->GetTextExtent(Str);//获得文字的宽和高
m_pDlgAlpha->MoveWindow(pnt.x+10,pnt.y,sSize.cx,sSize.cy);
m_pDlgAlpha->SetText(Str);
m_pDlgAlpha->ShowWindow(SW_SHOW);
ReleaseDC(pDC);
::ReleaseDC(m_hWnd,DeskDC);
}
经实际测试,检测软件在显示检测结果曲线的同时,能够实时浮动显示用户选定的检测数据点信息,改善并提高了用户的使用体验。
[1]聂斐,殷兴辉.基于MFC的实时数据动态显示界面设计[J].电子设计工程,2013(10):136-138.
[2]杨刚.基于MFC用户界面设计主、子对话框数据的传递[J].机电产品开发与创新,2005(6):98-99.
[3]孙鑫,余安萍.Visual C++深入详解[M].北京:电子工业出版社,2006.
Designing and Implementation of Semitransparent Window Based on MFC
YING Chang-sheng
(Jilin Normal University, Siping Jilin 136000, China)
In the duration of displaying the detected industrial result, users often need to analyze some detected points and do some corresponding process according to the analysis. Detecting software should also provide information of selected detecting points, as well as showing the detecting result. The information should be displayed in a floating region and should not occupy display region. Our software displays the information of selected points in a semitransparent floating window based on MFC, which providing a kindly user interface.
real time; selected; floating; semitransparent
2016-03-29
英昌盛(1979- ),男,讲师,从事算法与图像处理研究。
TP312
A
2095-7602(2016)08-0038-04