前言:

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

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

win32进阶之路:给锁屏软件增加一个超链接按钮的更多相关文章

  1. win32进阶之路:程序托盘图标+右键弹出菜单

     开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...

  2. Android 锁屏软件MemoryDebris测试报告

    目 录 项目基本信息 第1章         引言 1.1        编写目的 1.2        项目背景 1.3        参考资料 1.4        术语和缩略语 第2章      ...

  3. Android锁屏软件

    需求描述:锁屏软件就是点击应用然后直接锁屏,不会弹出任何界面 设计思路:应用启动以后通过getSystemService获取系统的服务,调用安卓系统的DevicePolicyManager和Compo ...

  4. 自选项目--手机锁屏软件--NABC分析

    N(Need 需求) 关键字:利用碎片时间加强对想记的事物的记忆.备忘.一般来说,锁屏目的大致有三点: 1.保护手机隐私 2.防止误操作手机 3.在不关闭系统软件的情况下节省电量 对于市面上已有的锁屏 ...

  5. 用swift开发自己的MacOS锁屏软件(3)

    前两篇中实现了MacOS端的锁屏软件,现在需要再实现一个移动端的app用来实现和mac的通信,以后的文章可能就会两个项目来回穿插了. 写完MacOS的软件又回来接着写iOS真的是享受,看着堆积如山的各 ...

  6. android锁屏软件制作

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mingyue_1128/article/details/33726515 转载请标明出处http:/ ...

  7. 用swift开发自己的MacOS锁屏软件(二)

    上一篇中尝试写了hello world,这一篇中,开始尝试锁屏功能 1.尝试查找swift有没有相关的函数,可以控制系统锁屏之类的,结果并没有找到 2.尝试查找cocoa有没有相关的接口,结果仍然没有 ...

  8. 【WIN32进阶之路】:线程同步技术纲要

    前面博客讲了互斥量(MUTEX)和关键段(CRITICAL SECTION)的使用,想来总觉不妥,就如盲人摸象一般,窥其一脚而言象,难免以偏概全,追加一篇博客查遗补漏. win32下的线程同步技术分为 ...

  9. 【WIN32进阶之路】:内存映射文件

    第一章:源起  遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决 ...

随机推荐

  1. 去除windows的Shift+Space 全角半角切换

    windows7下的输入法,有一个“全/半角切换”的快捷方式“Shift+Space”,我们可以通过以下方式查看到: “开始”->“控制面板”->“区域和语言”->“键盘和语言”-& ...

  2. js快速打印一个五分制(五颗星)的评分情况

    1.函数 下面这个函数实现了在html页面中快速打印一个五分制(五颗星)的评分情况: function getRating(rating) { if(rating > 5 || rating & ...

  3. centos 如何用 rsyslog 搭建本地日志服务

    一.问题背景 最近项目遇到一个问题,服务器响应很慢,team中的两个有经验的工程师找了一台服务器分析了一下,发现问题出在磁盘写入过于频繁.这里大概介绍一下背景,我们的服务器上面主要是跑各种PHP接口, ...

  4. zoj 3351 Bloodsucker(概率 dp)

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 dp[i]表示现在存在i个吸血鬼要达成目标(全为吸血鬼)天数的数学 ...

  5. Jquery动画第一部分

    效果图: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.asp ...

  6. android MIPI屏 导航栏丢失

    /**************************************************************************** * android MIPI屏 导航栏丢失 ...

  7. 【转】特斯拉CEO马斯克:关于创业的几件重要事情

    特斯拉电动汽车联合创始人兼CEO,私人太空发射公司SpaceX CEO伊隆马斯克(Elon Musk)于5月16日在南加大商学院毕业典礼上发表演讲,他谈到了关于创业的几件重要的事情:一是努力工作;二是 ...

  8. nopcommerce商城系统--源代码结构和架构

    这个文档是让开发者了解nopcommerce解决方案结构的指南.这是新的nopcommerce开发者学习nopcommerce代码的相关文档.首先,nopCommerce源代码是很容易得到的.它是一个 ...

  9. HttpListener supports SSL only for localhost? install certificate

    1.Start-All Programs - 2.execute below lines on that ‘Developer Command Prompt..’ tool makecert -n & ...

  10. HDU 1251-统计难题(Trie)

    题意: 给一组单词 开始提问每次给一个串求该串是上面几个单词的前缀 分析: 没给数据规模,但用链表写ME好几次,又用数组写开小RE了,试了几次才过了,真是醉了... #include <map& ...