如果您用過微軟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)
本文配套源碼