程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> win32進階之路:給鎖屏軟件增加一個超鏈接按鈕

win32進階之路:給鎖屏軟件增加一個超鏈接按鈕

編輯:關於C語言

前言:

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文件解析處理,有興趣的朋友請加下關注或粉絲。

完整代碼晚些時候上傳並貼上鏈接,敬請期待。

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