win32进阶之路:给锁屏软件增加一个超链接按钮
前言:
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进阶之路:给锁屏软件增加一个超链接按钮的更多相关文章
- win32进阶之路:程序托盘图标+右键弹出菜单
开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...
- Android 锁屏软件MemoryDebris测试报告
目 录 项目基本信息 第1章 引言 1.1 编写目的 1.2 项目背景 1.3 参考资料 1.4 术语和缩略语 第2章 ...
- Android锁屏软件
需求描述:锁屏软件就是点击应用然后直接锁屏,不会弹出任何界面 设计思路:应用启动以后通过getSystemService获取系统的服务,调用安卓系统的DevicePolicyManager和Compo ...
- 自选项目--手机锁屏软件--NABC分析
N(Need 需求) 关键字:利用碎片时间加强对想记的事物的记忆.备忘.一般来说,锁屏目的大致有三点: 1.保护手机隐私 2.防止误操作手机 3.在不关闭系统软件的情况下节省电量 对于市面上已有的锁屏 ...
- 用swift开发自己的MacOS锁屏软件(3)
前两篇中实现了MacOS端的锁屏软件,现在需要再实现一个移动端的app用来实现和mac的通信,以后的文章可能就会两个项目来回穿插了. 写完MacOS的软件又回来接着写iOS真的是享受,看着堆积如山的各 ...
- android锁屏软件制作
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mingyue_1128/article/details/33726515 转载请标明出处http:/ ...
- 用swift开发自己的MacOS锁屏软件(二)
上一篇中尝试写了hello world,这一篇中,开始尝试锁屏功能 1.尝试查找swift有没有相关的函数,可以控制系统锁屏之类的,结果并没有找到 2.尝试查找cocoa有没有相关的接口,结果仍然没有 ...
- 【WIN32进阶之路】:线程同步技术纲要
前面博客讲了互斥量(MUTEX)和关键段(CRITICAL SECTION)的使用,想来总觉不妥,就如盲人摸象一般,窥其一脚而言象,难免以偏概全,追加一篇博客查遗补漏. win32下的线程同步技术分为 ...
- 【WIN32进阶之路】:内存映射文件
第一章:源起 遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决 ...
随机推荐
- Git教程之标签管理
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照.Git的 ...
- JS中的自执行函数
本来规划的是2013年,狠狠的将JS学习下,谁知计划赶不上变化,计划泡汤了.13年的我对JS来说可以说是属于跟风,对它的理解和认识也仅仅是皮毛而已,也是因为要完成<ArcGIS API for ...
- python学习笔记三--字典
一.字典: 1. 不是序列,是一种映射, 键 :值的映射关系. 2. 没有顺序和位置的概念,只是把值存到对应的键里面. 3. 通过健而不是通过偏移量来读取 4. 任意对象的无序集合 5. 可变长,异构 ...
- 约瑟夫环问题-循环链表VS数组
2013-08-18 21:27:50 循环链表.数组解决约瑟夫环问题的比较 注意几点: 循环链表的建立不难,在删除循环链表中元素时,用pCur->next != pCur判断结束: 每一轮计数 ...
- Android开源滤镜 仿instagram
前段时间做一个项目的时候发现一个不错的滤镜库,是仿Instagram效果的,能够实现Lomo在内的十几种滤镜效果,git地址是: https://github.com/beartung/insta-f ...
- NFC(11)MifareUltralight格式规范及读写示例
注意 MifareUltralight 不支三种过滤方式之一,只支持第四种(用代码,activity singleTop ) 见 NFC(4)响应NFC设备时启动activity的四重过滤机制 Mi ...
- [原]Unity3D深入浅出 - 常见三维软件与Unity3D的单位比例
Unity3d系统默认单位是米 Maya:Unity3D 1M:100M 3DMax:Unity3D 100M:1M Cinema 4D:Unity3D 1M:100M Lightwavew:Uni ...
- POJ (线段相交 最短路) The Doors
题意: 一个正方形中有n道竖直的墙,每道墙上开两个门.求从左边中点走到右边中点的最短距离. 分析: 以起点终点和每个门的两个端点建图,如果两个点可以直接相连(即不会被墙挡住),则权值为两点间的欧几里得 ...
- hdu4177:Super Mario
主席树+离散化.给一段区间.多次询问[l,r]中有多少个数小于k.啊主席树用指针版写出来优美多了QAQ... #include<cstdio> #include<cstring> ...
- linux下判断网络是否连接
本文改写自网上的一个程序,原始程序中为阻塞式调用,而且有现成创建的过程,非常不利于集成到自己程序中,因此对原始程序进行改造,使其可以完成发送一个imcp包的方式来判断网络连通,只需要调用改进后的 bo ...
