介紹
一般的系統幫助文件在顯示關於幫助信息的時候大部分采用的方法是靜態的形式將要顯示的內容顯示到界面上,由於這次擔任項目開發,我總覺得那樣太單調了,於是,在各個網站搜索後發現了一個很好的控件類(字模顯示控件類),於是我進行擴充完成了一些動態顯示的功能,完成後的各種要顯示的幫助信息能夠象放映電影一樣的進行動態顯示,效果蠻好的,現將制作過程合代碼及演示效果寫出來,希望對這個方面有研究或者尋求好方法的人有幫助。同時本文章代碼中顯示的文本信息各位可以根據需要進行自己修改。
正文
顯示幫助文件的時候我采用的是全屏的顯示方法,但是如果就VIEW全屏的方法的話我總覺得太難看了,於是我首先在全屏的基礎上貼上一個背景圖片,然後在背景圖片上加載一個功能顯示就可以了。其實簡單的方法是在背景圖片上直接動態創建一個CSTATIC控件就可以了,不過由於我的系統涉及到別的許多功能界面要處理,所以我用了一個對話框的形式,采用無模式對話框形式,然後將她創建完成後MOVEWINDOW到指定位置就可以了。
制作步驟
啟動VC,建立一個基於CVIEW的單文檔功能,其余保持默認設置就可以了。全屏的概念我沒有象傳統的那樣進行,而是將主框架MoveWindow到屏幕的分辨率大小,然後去掉標題蘭,菜單欄,工具欄,狀態欄等顯示就差不多一個全屏的效果了,然後在這個上面貼上背景圖片就可以了。也許這個根本不能算全屏的概念(^_^)。具體實現步驟如下:
修改APP的InitInstance()函數,修改的地方如下:
// The one and only window has been initialized, so show and update it.
m_pMainWnd->SetMenu(NULL); //去掉菜單
m_pMainWnd->ModifyStyle(WS_THICKFRAME|WS_CAPTION,NULL); //修改窗體屬性
m_pMainWnd->MoveWindow(CRect(0,0,::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics(SM_CYSCREEN)),TRUE); //將窗體移動到屏幕的分辨率大小地方?
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); //這個就不要解釋了
m_pMainWnd->UpdateWindow();
然後修改MainFrame類成員函數去掉工具欄合狀態欄就可以了.修改PreCreateWindow(CREATESTRUCT& cs)函數,修改如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//隱藏任務欄,不隱藏的話,這個東西總是在不適當的時候出現影響整體效果
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_HIDE);
return 0;
}
上面步驟隱藏了WINDOWS任務欄,所以我們必須在程序退出的時候進行恢復,不要程序結束了也不會見到的。由於程序退出要發送WM_CLOSE消息,所以我們截獲MainFrame的WM_CLOSE消息就可以了,在這裡恢復狀態欄,代碼如下:
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
FindWindow("Shell_TrayWnd",NULL)->ShowWindow(SW_SHOW); //恢復任務欄
CFrameWnd::OnClose();
}
到這裡,基本准備工作我們已經完成了,下面的任務是貼背景位圖和創建顯示的對話框。貼背景位圖:裝載背景位圖,映射VIEW的WM_PAITN消息,然後貼上背景位圖,同時映射WM_EARSEBKGND消息,去處屏幕的擦除工作,將返回語句修改成為 :return TRUE就可以了。
void CAboutDemoView::OnPaint()
{
// TODO: Add your message handler code here
CPaintDC dc(this); // device context for painting?
HBITMAP hbitmap;
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BACKBMP));
HDC hMenDC=::CreateCompatibleDC(NULL);
SelectObject(hMenDC,hbitmap);
::StretchBlt(dc.m_hDC,0,0,1024,768,hMenDC,0,0,1024,768,SRCCOPY);
::DeleteDC(hMenDC);
::DeleteObject(hbitmap);
// Do not call CView::OnPaint() for painting messages
}
建立一個用於顯示相關信息的對話框資源,修改對話框屬性,Style->Popup,Border->None;並建立對話框類CShowAboutDlg;然後在對話框上面放置一個CSTATIC控件,並調整位置。在VIEW中創建這個無模式的對話框然後顯示:
CShowAboutDlg *m_pAboutDlg;
CRect rect;
m_pAboutDlg = new CShowAboutDlg();
m_pAboutDlg->Create(IDD_ABOUT);
m_pAboutDlg->MoveWindow(CRect(18,18,
::GetSystemMetrics(SM_CXSCREEN)-13,
::GetSystemMetrics(SM_CYSCREEN)-16),
TRUE); //因為背景圖片有一個邊框,所以這裡應該吧那個位置留出來
m_pAboutDlg->GetClientRect(&rect);
m_pAboutDlg->m_AboutCtrl.MoveWindow(rect,TRUE); //是這個PIC控件占滿對話框客戶區域
m_pAboutDlg->ShowWindow(SW_SHOW);
下面就是加入字模顯示控件類的文件了。將ZgMemDC,ZgDraw.h,ZgDraw.cpp,TitleShow.h,TitleShow.cpp,PublicClass.cpp,PublicClass.h加入工程 ,然後加入AutoFont.h和AutoFont.cpp,這個類功能不用說了,在上篇文章中我已經介紹了。在那位提供字模顯示控件類的基礎上,我修改了其中的適量代碼 ,進行了文字顯示方面的修改,因為那個原來的類的字體不適合我們現在系統顯示的要求(^_^)。然後就是在對話框類中加載顯示消息就可以了。定義顯示CSTATIC類對象位TitleShow,然後在初始化裡面添加你的信息顯示內容: **** 其中還有一步就是截獲回車和ESC鍵對對話框的退出工作。
BOOL CShowAboutDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN:
return TRUE;
case VK_ESCAPE:
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
至此,程序基本工作已經完成了,編譯運行你的工程看看效果吧。下面是我做的模擬演示效果,貼幾張圖片上來。如果有什麼問題可以直接和我聯系:[email protected]
本文配套源碼