?? vc中為應用程序實現超鏈接功能.txt
字號:
在VC中為應用程序添加圖形超鏈接功能
目前很多windows軟件的版權對話框中都設有超級鏈接,這些鏈接或提供公司網址,或提供電子郵件信箱,使操作者能夠非常方便地與公司和作者聯系,同時也為公司作了很好的宣傳。一般情況下,界面上某行文字下面有一行藍色的橫線,標志該字符串提供超鏈接功能,當用戶將鼠標移動到文字上時,鼠標變成手狀,如果用戶此時單擊鼠標,程序將啟動瀏覽器打開某個網頁或啟動OutLook讓用戶給指定的郵箱發送電子郵件。如果能在自己寫的軟件中實現這個功能,定會使程序大增光彩。本實例通過定義一個CmapHyperLink類實現了圖像的超鏈接功能,程序編譯運行后的界面如圖一所示:
圖一、實現圖形超鏈接功能的程序界面圖
一、 實現方法
著名的CHyperLink類只能提供文字鏈接,不能用于圖形控件的超鏈接,于是本實例在其基礎上修改了一下,定義了一個CMapHyperLink類,該類現在只對圖形控件(picture control)生效。用戶可使用成員函數void SetURL(CString strURL)設置要訪問的互聯網地址,如SetURL("http://www.google.com");使用成員函數void SetTipText(CString strURL)設置超鏈接提示條(CToolTipCtrl)的文字內容,如果不在此設置,那就默認是您設置的URL地址,如SetTipText("歡迎訪問強大的google搜索");使用成員函數void SetLinkCursor(HCURSOR hCursor)設置鼠標在超鏈接狀態的圖標,默認是手型圖標。該類還提供了HCURSOR GetLinkCursor() const、void SetAutoSize(BOOL bAutoSize = TRUE)等成員函數,提供了一些相應的輔助功能,讀者朋友可以參考代碼部分。這里主要講述三個主要的問題:一是如何實現提示功能;二是在控件上如何改變鼠標的形狀,給用戶提供另外一種暗示-當前區域提供超鏈接功能;三是如何根據網頁或信箱地址啟動超鏈接功能。
Visual C++提供了CCtoolTipCtrl類用來實現提示功能。工具提示控制是一個小窗口,在其中顯示單行文字用以描述應用程序中的工具的用途。這里的工具所指的既可以是窗口(如工具欄上的按鈕),也可以是一個固定的區域。大家都知道利用APPWIZARD生成 的應用程序中工具欄帶有提示,當你將鼠標放在工具欄某一個按鈕上時,將顯示一個小提示框告訴你按鈕的功能,這種功能方便了軟件的使用者。但是在超鏈接區如何實現提示呢?首先聲明一個CtoolTipCtrl類的變量,調用Create()成員函數創建通用工具提示,并將它附在CtoolTipCtrl對象上,然后調用CtoolTipCtrl類的AddToo()成員函數注冊工具提示控制,從而為光標放在規定的窗口或區域內時顯示工具提示做準備。該函數的原形為:
BOOL AddTool( CWnd* pWnd,LPCTSTR lpszText, LPCRECT lpRectTool,UINT nIDTOOL );
其中參數pWnd為指向包含工具提示控制的窗口指針,參數lpszText為所要在工具提示中顯示的文字,參數lpRectTool為工具書提示所對應的窗口或規定區域,參數nIDTOOL為工具提示的標志號。
在調用CtoolTipCtrl類的Active()函數激活提示后,最后要作的工作是調用CtoolTipCtrl類的RelayEvent()函數將鼠標的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP等消息傳遞給工具提示控制對象,以便控件進行提示處理。
下面的代碼實現了在應用程序的視圖區顯示對應點的坐標為例:
//在文件頭定義的全局變量
CToolTipCtrl m_ToolTip;//工具提示對象
char string[50];//用來存放提示文字
CRect rect;//用來存放工具提示所對應的窗口的尺寸
#define IDC_CONST 12345//定義的工具提示標志號,注意不要和系統沖突
void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
wsprintf(string,"%d,%d",point.x,point.y);
GetClientRect(&recty);
m_ToolTip.AddTool(this,string,&rect,IDC_CONST);
m_ToolTip.Activate(TRUE);
CView::OnMouseMove(nFlags, point);
}
LRESULT CTestView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
case WM_MOUSEMOVE:
{MSG msg;
msg.hwnd=m_hWnd;
msg.message=message;
msg.wParam=wParam;
msg.lParam=lParam;
m_ToolTip.RelayEvent(&msg);
}
}
return CView::WindowProc(message, wParam, lParam);
}
如果用戶想動態的改變提示字符串,可以調用CtoolTipCtrl類的成員函數UpdateTipText()來實現,該函數的原型為:
void UpdateTipText( LPCTSTR lpszText, CWnd* pWnd, UINT nIDTool = 0 );
該函數的參數的含義與成員函數AddTool()的參數的含義大同小異,這里不再贅述。
對于超鏈接來說,一般會在超鏈接區域改變鼠標的形狀,顯示手狀的鼠標,提示這是一個超鏈接區域。當然可以在程序中添加一個手狀的光標資源,然后使用LoadCursor()函數等加載,這種方法對廣大讀者朋友一定是耳熟能詳了,所以為了擴大讀者朋友的編程思路,這里介紹一種從Windows的winhlp32.exe文件中加載光標資源,代碼如下:
void CMapHyperLink::SetDefaultCursor()
{
if (m_hLinkCursor == NULL) // No cursor handle - load our own
{
// Get the windows directory
CString strWndDir;
GetWindowsDirectory(strWndDir.GetBuffer(MAX_PATH), MAX_PATH);
strWndDir.ReleaseBuffer();
strWndDir += _T("//winhlp32.exe");
// This retrieves cursor #106 from winhlp32.exe, which is a hand pointer
HMODULE hModule = LoadLibrary(strWndDir);
if (hModule) {
HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106));
if (hHandCursor)
m_hLinkCursor = CopyCursor(hHandCursor);
}
FreeLibrary(hModule);
}
}
為了根據網頁或信箱地址實現超鏈接功能,需要用到一個WINDOWS API函數ShellExecute(),其原型為:
HINSTANCE ShellExecute(
HWND hwnd, //窗口句柄
LPCTSTR lpOperation, //操作類型
LPCTSTR lpFile, //文件指針
LPCTSTR lpParameters, //文件可帶的參數
LPCTSTR lpDirectory, //缺省目錄
INT nShowCmd //顯示方式
);
ShellExecute()函數用于打開或執行一個文件,在調用此函數時只須指定要打開或執行的文件名,而不必管用什么程序去打開或執行文件,WINDOWS會自動根據要打開或執行的文件去判斷該如何執行文件或用什么程序去打開文件。函數中的參數lpOperation說明所要執行的操作,該值可以設置為"Open"、"Print"、"Explore",分別用來進行"打開"、"打印"、"瀏覽"操作。下面給出了ShellExecute()函數的一些使用方法:
(1)打開一個應用程序:
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或
ShellExecute(this->m_hWnd,"open","notepad.exe", "c://MyLog.log","",SW_SHOW );
?。?)打開一個同系統程序相關連的文檔
ShellExecute(this->m_hWnd,"open", "c://abc.txt","","",SW_SHOW );
?。?)打開一個網頁
ShellExecute(this->m_hWnd,"open", " http://www.google.com","","",/ SW_SHOW );
?。?)激活相關程序,發送EMAIL
ShellExecute(this->m_hWnd,"open","mailto:nishinapp@yahoo.com","","", W_SHOW );
?。?)用系統打印機打印文檔
ShellExecute(this->m_hWnd,"print", "c://abc.txt","","", SW_HIDE);
?。?)用系統查找功能來查找指定文件
ShellExecute(m_hWnd,"find","d://nish", NULL,NULL,SW_SHOW);
?。?)啟動一個程序,直到它運行結束
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c://MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c://winnt//notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
(8)顯示文件或文件夾的屬性
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c://"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
Windows還提供了一個與ShellExecuteEx()函數相類似的函數WinExec(),它相對于ShellExecuteEx()來說更簡單易用,只是功能沒有它強大而已,具體使用方法讀者朋友自行參閱MSDN。
二、編程步驟
l、啟動Visual C++6.0,生成一個基于對話框的應用程序,將該程序命名為"Test";
2、在對話框上放置一個靜態控件,并顯示一幅圖象;
3、使用Class Wizard為應用程序添加一個CMapHyperLink類,其基類為CStatic;
4、在對話框中添加一個CmapHyperLink類對象m_MapHyperLink1;
5、添加代碼,編譯運行程序。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -