1.10 窗体标题栏应用实例
为了使程序更加人性化,可以对窗体的标题栏进行设计,本节的几个实例设计的标题栏使界面看起来更美观,并具有提醒功能。
实例031 闪烁的窗体标题栏
本实例是一个具有提醒功能的程序
实例位置:光盘\mingrisoft\01\031
实例说明
当用户运行多个程序时,为了突出显示自己开发的程序,可以设置程序窗体的标题栏闪烁,以提醒用户,使用户更多地关注该程序。
运行程序,窗体的标题栏将不停地闪烁,直到关闭程序为止,如图1.41所示。
图1.41 闪烁的窗体标题栏
技术要点
要实现窗体标题栏的闪烁,需要使用FlashWindow函数来实现,FlashWindow函数原型如下:
BOOL FlashWindow( BOOL bInvert );
参数说明:
● bInvert:为TRUE时闪烁,为FALSE时不闪烁。
实现过程
(1)新建一个基于对话框的应用程序,将窗体标题改为“闪烁的窗体标题栏”。
(2)主要程序代码如下:
void CSSdbtlDlg::OnTimer(UINT nIDEvent) { FlashWindow(true); //设置标题栏闪烁 CDialog::OnTimer(nIDEvent); }
举一反三
根据本实例,读者可以:
实现窗体标题栏广告;
实现闪烁的窗体。
实例032 禁用标题栏上的最带禁用标题栏上的最大化最小化或关闭按钮
本实例是一个提高基础技能的程序
实例位置:光盘\mingrisoft\01\032
实例说明
在窗体的标题栏上都设置了“关闭”、“最大化”、“最小化”按钮。如果需要保持窗体的状态,即不使窗体最大化、最小化或关闭,则可以将这3个按钮设置为“禁用”。运行程序,结果如图1.42所示。
技术要点
本实例使用API函数GetWindowLong和SetWindowLong改变窗口风格,设置最大化和最小化按钮是否有效,使用SetWindowPos重画标题栏,使用GetSystemMenu函数获得系统菜单,使用GetMenuItemID函数获得关闭按钮的ID,再使用EnableMenuItem函数设置关闭按钮是否有效。各函数的用法如下所示。
图1.42 禁用标题栏按钮信息的菜单
(1)GetWindowLong函数。该函数获得有关指定窗口的信息。函数原型如下:
LONG GetWindowLong(HWND hWnd, int nlndex);
参数说明:
● hWnd:窗口句柄及间接给出的窗口所属的窗口类。
● nlndex:指定要获得值的大于等于0的值的偏移量。
(2)SetWindowLong函数。该函数改变指定窗口的属性。函数原型如下:
LONG SetWindowLong(HWND hWnd, int nlndex,LONG dwNewLong);
参数说明:
● hWnd:窗口句柄及间接给出的窗口所属的类。
● nlndex:指定将要设定的大于等于0的偏移值。
● dwNewLong:指定的替换值。
(3)GetSystemMenu函数。该函数允许应用程序为复制或修改而访问窗口菜单(系统菜单或控制菜单)。函数原型如下:
CMenu* GetSystemMenu( BOOL bRevert );
参数说明:
● bRevert:指定将执行的操作。如果此参数为FALSE,GetSystemMenu返回当前使用窗口菜单的备份的句柄。该备份初始时与窗口菜单相同,但可以被修改。如果此参数为TRUE,GetSystemMenu重置窗口菜单到默认状态。如果存在先前的窗口菜单,则将被销毁。
(4)GetMenuItemID函数。该函数返回位于菜单中指定位置处的项目的菜单ID。函数原型如下:
UINT GetMenuItemID( int nPos );
参数说明:
● nPos:指定项目在菜单中的位置。
(5)EnableMenuItem函数。该函数使指定的菜单项有效、无效或变灰。函数原型如下:
UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );
参数说明:
● nIDEnableItem:指定将使其有效、无效或变灰的菜单项,按参数uEnable确定含义。此参数可指定菜单条、菜单或子菜单里的菜单项。
● uEnable:指定控制参数uIDEnableltem如何解释的标志,指示菜单项有效、无效或者变灰。此参数必须是MF_BYCOMMAND或MF_BYPOSITION,MF_ENABLED和MF_DISABLE或MF_GRAYED的组合。
实现过程
(1)新建一个基于单文档的应用程序。
(2)在ResourceView视图中展开Menu文件夹,双击IDR_MAINFRAME项为菜单资源添加菜单项。
(3)在类向导中为添加的菜单添加单击事件。
(4)主要程序代码如下:
void CMainFrame::OnMenudismin() //禁用最小化按钮 { Style=::GetWindowLong(m_hWnd,GWL_STYLE); //获得窗口风格 Style&= ~(WS_MINIMIZEBOX); ::SetWindowLong(m_hWnd,GWL_STYLE,Style); //设置新的风格 GetWindowRect(&Rect); //获得窗口区域 //重画窗口边框 ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME); } void CMainFrame::OnMenudismax() //禁用最大化按钮 { Style=::GetWindowLong(m_hWnd,GWL_STYLE); //获得窗口风格 Style&= ~(WS_MAXIMIZEBOX); ::SetWindowLong(m_hWnd,GWL_STYLE,Style); //设置新的风格 GetWindowRect(&Rect); //获得窗口区域 //重画窗口边框 ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME); } void CMainFrame::OnMenudisclose() //禁用关闭按钮 { CMenu*pMenu=GetSystemMenu(false); //获得系统菜单 UINT ID=pMenu->GetMenuItemID(pMenu->GetMenuItemCount()-1); //获得关闭按钮ID pMenu->EnableMenuItem(ID,MF_GRAYED); //使关闭按钮无效 } void CMainFrame::OnMenuablemin() //使最小化按钮有效 { // TODO: Add your command handler code here Style=::GetWindowLong(m_hWnd,GWL_STYLE); //获得窗口风格 Style |= WS_MINIMIZEBOX; ::SetWindowLong(m_hWnd,GWL_STYLE,Style); //设置新的风格 GetWindowRect(&Rect); //获得窗口区域 //重画窗口边框 ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME); } void CMainFrame::OnMenuablemax() //使最大化按钮有效 { Style=::GetWindowLong(m_hWnd,GWL_STYLE); //获得窗口风格 Style |= WS_MAXIMIZEBOX; ::SetWindowLong(m_hWnd,GWL_STYLE,Style); //设置新的风格 GetWindowRect(&Rect); //获得窗口区域 //重画窗口边框 ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME); } void CMainFrame::OnMenuableclose() //使关闭按钮有效 { CMenu*pMenu=GetSystemMenu(false); //获得系统菜单 UINT ID = pMenu->GetMenuItemID(pMenu->GetMenuItemCount()-1); //获得关闭按钮ID pMenu->EnableMenuItem(ID,MF_ENABLED); //使关闭按钮可用 }
举一反三
根据本实例,读者可以:
隐藏/显示标题栏上的各个按钮;
绘制标题栏按钮。