XP风格复活节彩蛋的实现

    技术2022-05-11  123

     

    XP风格复活节彩蛋的实现

    作者:徐景周

    下载相关示例源码( http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=317 )

     

    如果您用过微软Office系列产品的话,一定会知道它们中很多在“关于”对话框中都隐藏了一些小功能,只有当用户点击某些特殊的键盘或鼠标按键时,这些功能才会显示出来(就象复活节彩蛋似的变出来)。您象知道类似的功能是怎么实现的么?下面,我做了个示例程序,可以告诉您它们实现的基本原理(示例中采用了整套XP风格化的界面设计)。如下图:其中图一为XP风格界面,图二为类似复活节彩蛋的实现界面。

     

     

     图一

     

     

     

    图二

     

     

    基本构成思想:

    实现原理很简单,初始时将隐藏的部分不显示出来(既限制对话框的高度,默认高度=总高度 -- 隐藏部分高度),再设定特殊的键盘或鼠标按鍵来激活它既可。本示例程序采用二种方式,键盘热键和鼠标热键,其中键盘热键为“关于”对话框中同时按下Ctrl+Alt+F3键可激活隐藏信息,鼠标热键则为,在“关于”对话框中同时按下Ctrl键,在Logo动态图像中双击鼠标右键既可激活隐藏信息。下面让我们来看看它的具体实现情况吧!

     

    关键代码实现:

    1、  默认将隐藏部分不显示出来。

    #define WM_SHOWHOTKEY WM_USER + 101        //自定义系统热键消息

    BOOL CAboutDlg::OnInitDialog()

    {

     

           //"关于"对话框中对话框可收缩效果

           CRect Rect1,Rect2;                                                                                   //对话框收缩时大小           

          

           GetDlgItem(IDC_DYCREDITS)->GetWindowRect(Rect1);

           GetDlgItem(IDC_COPYRIGHT)->GetWindowRect(Rect2);

           m_nReducedHeight = Rect1.Height()+(Rect1.top -Rect2.bottom)/2; //收缩后窗体高度

           dlgRect.bottom -= (Rect1.Height()+(Rect1.top -Rect2.bottom)/2);

           MoveWindow(&dlgRect);                                                                           //如果要显示对话框起始动态效果的话,不能使用该句

     

           m_bVertical=false;                                                                                   //默认收缩对话框

     

                 

           //注册系统热键,用来显示隐藏信息<Ctrl+Alt+F3键>

           RegisterHotKey(GetSafeHwnd(),WM_SHOWHOTKEY,MOD_ALT|MOD_CONTROL,VK_F3);

                 

           return TRUE;  // return TRUE unless you set the focus to a control

                         // EXCEPTION: OCX Property Pages should return FALSE

    }

     

    2、隐藏信息的激活或隐藏的涵数

    //功能: 是否荣誉显示

    void CAboutDlg::OnMore()

    {

           m_bVertical = !m_bVertical;

          

           if(m_bVertical == FALSE)     //不显示

           {

                  SetDlgItemText(ID_MORE,_T("更多>>"));

     

                  SizeWindow(m_nReducedHeight,true);

           }

           else                                     //显示

           {

                  SetDlgItemText(ID_MORE,_T("<<隐藏"));

     

                  SizeWindow(m_nReducedHeight,false);

           }

          

           UpdateWindow();

    }

     

    //功能: 伸展或收缩对话框   

    void CAboutDlg::SizeWindow(int ReduceHeight, bool bExtend)

    {

           CRect rc;

           GetWindowRect(&rc);

           if(bExtend)

           {

                  for (int i= 0; i < ReduceHeight; i++)

                  {

                         rc.bottom--;

                         MoveWindow(&rc);

                  }

           }

           else

           {

                  for (int i= 0; i < ReduceHeight; i++)

                  {

                         rc.bottom++;

                         MoveWindow(&rc);

                  }

           }

    }

     

    3、在特殊的键盘及鼠标热键下激隐藏信息显示

    //功能: 鼠标热键,在图片框按住Ctrl键,双击鼠标右键可显示,显示隐藏的信息。 

    void CAboutDlg::OnRButtonDblClk(UINT nFlags, CPoint point)

    {

           if(nFlags==(MK_CONTROL|MK_RBUTTON ))

           {

                  CPictureEx *pAbout =(CPictureEx *)GetDlgItem(IDC_FLAG);

                  CRect rcAbout;

                  pAbout->GetWindowRect(&rcAbout);

                 

                  CPoint pt;

                  GetCursorPos(&pt);

                  if(rcAbout.PtInRect(pt))

                         OnMore();

           }

     

           CDialog::OnLButtonDblClk(nFlags, point);                

    }

     

    //*功能:键盘热键<Ctrl+Alt+F3键>显示隐藏的信息

    LRESULT CAboutDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

    {

           if(wParam==WM_SHOWHOTKEY)

           {

                  OnMore();

           }

          

           return 0;

    }

     

    4、别忘了收尾工作,销毁已注册的系统热键

    //* 功能:程序关闭时的处理工作

    BOOL CAboutDlg::DestroyWindow()

    {

           //注销已注册的系统热键

           UnregisterHotKey(GetSafeHwnd(),WM_SHOWHOTKEY);

     

           return CDialog::DestroyWindow();                                  

    }

     

     

     

    以上部分代码具体实现的细节问题,可在下载实例代码后,仔细查看源码既可(内有详细注释)。

     

     

    联系方式:

    EMAIL:jingzhou_xu@163.com

    未来工作室(Future Studio)


    最新回复(0)