393上位机VC MFC实现动态文字窗口效果
实现动态文字窗口效果
功能展示
定位设备初始运行时都要进行回原点操作,以便建立设备坐标参考点,软件才能正常运行。这段时间内程序不显示界面不够友好,我们当前例程实现动态的欢迎窗口界面,在程序回原点等初始化操作时,动态的显示操作过程,效果如图。程序一运行时就会显示“回原点中…..”我们可等计时时间到显示出主窗口,也可按钮ESC键显示主窗口;
要点提示
文字形状的窗口主要是通过函数SetWindowRgn()来实现,函数用于将窗口的区域设置为指定的形状;
函数原型为 int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw); hWnd要改形状的窗口句柄, hRgn指定的形状, bRedraw指定设置后是否重绘窗口;
其中hRgn在例程中由函数PathToRegion()创建,函数的返回值就是一个我们想在的HRGN类型句柄;此函数原型为HRGN PathToRegion( HDC hdc); hdc为设备上下文句柄;我们只要在设备上下文的两函数BeginPath(); EndPath();之间调用输出文字的函数TextOut()就可以创建我们想要的字形窗口;
实现功能
1.新建基于对话框的应用程序
2.新建一对话框资源,去除边框属性,再关联类CWelcomDlg,例程通过简单处理这个类就实现动态字体窗口的特效;
3.在此类中添加3变量及1函数CFont m_TextFont; CString m_sText; UINT m_nIndex; void ShowText();并初始化,也就是在函数OnInitDialog()(没有自己添加)添加代码
m_nIndex = 0;
m_sText ="设备回原点中......";
CDC* pDC = GetDC();
m_TextFont.CreatePointFont(800,"宋体",pDC);
pDC->SelectObject(&m_TextFont);
CSize sz = pDC->GetTextExtent(m_sText);
MoveWindow(0,0,sz.cx,sz.cy);//设置窗口大小
CenterWindow();//窗口居中
ReleaseDC(pDC);
ShowText();
//<>
SetTimer(1,500,NULL);
SetTimer(2,40000,NULL);//窗口消失条件
4.可以看到初始化时设定了定时器及调用了自定义的函数,所以我们再添加计时器处理函数及这个自定义函数
void CWelcomDlg::OnTimer(UINT nIDEvent)
{
if(1 == nIDEvent)
ShowText();
else if(2 == nIDEvent)
PostMessage(WM_CLOSE,0,0);
CDialog::OnTimer(nIDEvent);
}
void CWelcomDlg::ShowText()
{
UINT nIndex = m_nIndex%6;
switch(nIndex)
{
case 0:m_sText = "设备回原点中.";
break;
case 1:m_sText = "设备回原点中..";
break;
case 2:m_sText = "设备回原点中...";
break;
case 3:m_sText = "设备回原点中....";
break;
case 4:m_sText = "设备回原点中.....";
break;
case 5:m_sText = "设备回原点中......";
break;
}
m_nIndex++;
//<>
CDC* pDC = GetDC();
pDC->SelectObject(&m_TextFont);
pDC->BeginPath();
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(0,0,m_sText);
pDC->EndPath();
//
HRGN rgn;
rgn = PathToRegion(pDC->m_hDC);
SetWindowRgn(rgn,TRUE);
pDC->StrokePath();
//
ReleaseDC(pDC);
}
5.最后是对话框背景的处理,及窗口拖动功能的实现。添加OnCtlColor()函数及鼠标点击函数OnLButtonDown(),就可调用类的DoModal()函数显示字体窗口了
HBRUSH CWelcomDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch(nCtlColor) //所有的控件统一设置
{
case CTLCOLOR_DLG: //对话框
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
pDC->SetTextColor(RGB(0,0,255)); //设置字体颜色
HBRUSH B = CreateSolidBrush(RGB(0,0,255)); //创建画刷
return (HBRUSH) B; //返回画刷句柄
}
case CTLCOLOR_STATIC: //对所有静态文本控件的设置
{
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色
HBRUSH B = CreateSolidBrush(RGB(125,125,255)); //创建画刷
return (HBRUSH) B; //返回画刷句柄
}
case CTLCOLOR_EDIT: //对所有编辑框的设置
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,0));
HBRUSH B = CreateSolidBrush(RGB(125,125,255));
return (HBRUSH) B;
}
case CTLCOLOR_BTN: //按钮控件
case CTLCOLOR_LISTBOX: //列表框
case CTLCOLOR_MSGBOX: //消息框
case CTLCOLOR_SCROLLBAR: //滚动条
default:
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);;
}
}
我们来演示下功能实现的整个过程
|