前言:
windows下一切皆窗口,我們看到的超鏈接也是窗口,效果圖如下:
鼠標放在趙大哥博客園主頁和關於軟件兩個按鈕上,按鈕上的字體會從綠色變成紅色,同時鼠標指針變為手型,點下鼠標左鍵就會調用默認浏覽器打開設置好的網頁。
PS:想要和我們常見的超鏈接完全一致,還需要一些按鈕自繪的知識,讓按鈕與背景渾然一體。
實現剖析:
1.創建一個按鈕窗口,windows自定義的有button窗口類,創建窗口時指定類別和風格即可。
2.捕獲以及處理獲得與失去鼠標的消息,成功的話就可以實現鼠標劃過按鈕改變按鈕顏色和鼠標形狀。
3.處理按鈕點擊消息,點下鼠標按鈕就調用浏覽器打開指定的頁面。
過程詳解:
1.創建按鈕用windows提供的button類比較好,調用該類再指定窗口風格就可以創建類似於MFC中的按鈕,此處我希望做一個沒有明顯按壓痕跡,也不會鼠標懸停改變形狀的按鈕,采用BS_OWNDRAW風格實現。
m_hInfoButton = CreateWindowEx(WS_EX_NOACTIVATE,
TEXT("button"),
TEXT("infobutton"),
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
30,
50,
100,
50,
hWnd,
(HMENU)SUBWND_INFO_BUTTON,
((LPCREATESTRUCT)lParam)->hInstance,
NULL);
if ( !m_hInfoButton )
{
MessageBox(NULL, TEXT("create Info Button fail"), TEXT("notify"), MB_ICONEXCLAMATION);
}關鍵的兩個參數已做標紅處理,button類的其他風格可以F12+F1來查看,用過VS的人都懂。
2.獲得與失去鼠標的消息統一由線程主窗口處理,有多層子窗口關系時該消息仍會發送給線程的主窗口,捕獲到該消息進行按鈕文本顏色和鼠標形狀的變更。
case WM_SETCURSOR:
if ( (HWND)wParam == m_hADHandle )
{
SetCursor(LoadCursor(NULL, IDC_HAND));
HDC hSubdc = GetDC((HWND)wParam);
SetTextColor(hSubdc, RGB(255, 0, 0));
TextOut(hSubdc, 0, 0, TEXT("趙大哥博客園主頁"), sizeof(TEXT("趙大哥博客園主頁")));
ReleaseDC( m_hADHandle, hSubdc);
return TRUE;
}
//所有的獲得與失去鼠標的消息都由線程main窗口處理
else if ( (HWND)wParam == m_hCopyRightButton )
{
SetCursor(LoadCursor(NULL, IDC_HAND));
HDC hSubdc = GetDC((HWND)wParam);
SetTextColor(hSubdc, RGB(255, 0, 0));
TextOut(hSubdc, 0, 0, TEXT("關於軟件"), sizeof(TEXT("關於軟件")));
ReleaseDC( m_hCopyRightButton, hSubdc);
return TRUE;
}
else
{
HDC hSubdc = GetDC(m_hADHandle);
SetTextColor(hSubdc, RGB(0, 255, 0));
TextOut(hSubdc, 0, 0, TEXT("趙大哥博客園主頁"), sizeof(TEXT("趙大哥博客園主頁")));
ReleaseDC(m_hADHandle, hSubdc);
HDC hCopyRightdc = GetDC(m_hCopyRightButton);
SetTextColor(hCopyRightdc, RGB(0, 255, 0));
TextOut(hCopyRightdc, 0, 0, TEXT("關於軟件"), sizeof(TEXT("關於軟件")));
}
break;想要鼠標改變形狀,要手動屏蔽掉DefWindowProc,要不然鼠標閃變手型再變回來,屏蔽掉DefWindowProc的方式如代碼,設置鼠標形狀以後return TRUE即可。
3.按鈕點擊一下就調用浏覽器並打開指定頁面,這個好簡單吶,處理左鍵單擊消息並調用API打開頁面。
case WM_COMMAND:
switch( LOWORD(wParam))
{
case SUBWND_COPYRIGHT_BUTTON:
switch (HIWORD(wParam))
{
case BN_CLICKED:
ShellExecute(hWnd, TEXT("open"), TEXT("http://www.cnblogs.com/learn-my-life/"), TEXT(""), TEXT(""), SW_SHOWNORMAL);
break;
default:
break;
}
}
break;按鈕單擊的消息由按鈕對應的父窗口進行處理,不是線程主窗口了。打開浏覽器指定頁面可以調用API-ShellExecute來完成,代碼已經很詳細。
至此,鎖屏軟件又加了一個功能,配置界面線程實現超鏈接,後續會繼續增加windows典型控件和xml文件解析處理,有興趣的朋友請加下關注或粉絲。
完整代碼晚些時候上傳並貼上鏈接,敬請期待。