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);             //使关闭按钮可用
        }

举一反三

根据本实例,读者可以:

隐藏/显示标题栏上的各个按钮;

绘制标题栏按钮。