zoukankan      html  css  js  c++  java
  • win32进阶之路:给锁屏软件增加一个超链接按钮

    前言:

    windows下一切皆窗口,我们看到的超链接也是窗口,效果图如下:

    software

    鼠标放在赵大哥博客园主页和关于软件两个按钮上,按钮上的字体会从绿色变成红色,同时鼠标指针变为手型,点下鼠标左键就会调用默认浏览器打开设置好的网页。

    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文件解析处理,有兴趣的朋友请加下关注或粉丝。

    完整代码晚些时候上传并贴上链接,敬请期待。

  • 相关阅读:
    script Ngrinder_TestRunnerInsertMysqlSingle.groovy
    nGrinder TestRunnerInsertMysqlSingle.groovy
    列表导航栏实例(02)——精美电子商务网站赏析
    【网络编程】之九、事件选择WSAEventSelect
    注册界面设计(01)——精美电子商务网站赏析
    列表导航栏实例(04)——精美模板赏析
    【网络编程】之十、重叠IO Overlapped IO
    CSS大小设置实例——盒子模型
    常用数据验证正则表达式释义(附:正则表达式常用符号)
    【网络编程】之八、异步选择WSAAsyncSelect
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/3595578.html
Copyright © 2011-2022 走看看