程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> XP風格復活節彩蛋的實現

XP風格復活節彩蛋的實現

編輯:關於VC++

如果您用過微軟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;
}

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();
}

以上部分代碼具體實現的細節問題,可在下載實例代碼後,仔細查看源碼既可(內有詳細注釋)。

聯系方式:

地址:陝西省西安市勞動路2號院六單元

郵編:710082

作者EMAIL:[email protected]

未來工作室(Future Studio)

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved