用C++Builder在Windows开始按钮上绘图制作方法
熟悉Windows操作系统的软件设计人员知道,在Win95/98/NT/2000中有一任务栏(Task Bar)程序,路径为:C:\WINDOWS\SYSTEM\SYSTRAY.EXE(假设你的Windows安装在系统默认路径C:\WINDOWS)。从系统功能角度分析,任务栏由几个不同的子区域组成,从左至右依次是:开始(Start)按钮、应用程序切换区(Application Switch Bar)、任务栏通知区(Notification Area)以及任务栏时钟。从程序编制角度分析,任务栏程序(SYSTRAY.EXE)与其它Windows应用程序相同,由几个不同的窗体组成,这些窗体具有各自窗口类名、句柄、显示方式等信息。
一.要点说明
1、任务栏、开始按钮的窗口信息:
◆Tray Bar的窗口类名:Shell_TrayWnd
◆开始按钮的窗口类名:Button
2、调用FindWindow函数获得任务栏窗口句柄。
3、调用FindWindowEx函数获得开始按钮窗口句柄。
4、调用GetDC函数获得开始按钮设备和桌面窗口上下文关系。
5、调用GetDeskTopWindow桌面窗口句柄。
6、调用GetCursorPos函数获得当前鼠标位置。
7、调用StretchBlt函数将鼠标背景绘制在开始按钮上
8、调用ReleaseDC释放开始按钮和桌面窗口上下文关系
二.实例
1、在C++ Builder 5.0 IDE 中新建工程Project1,Project1中包含Form1,窗体如下图所示:
2、定义变量
HWND wnd;
HDC hdcButton, hdcDesktop;
TPoint pt;
3、Form1的FormCreate 过程代码如下
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->MessageBox("利用C++Builder在Windows开始按钮上绘图演示程序", "特别说明", MB_OK + MB_DEFBUTTON1);
wnd = FindWindow("Shell_TrayWnd", NULL);
wnd = FindWindowEx(wnd, 0, "Button", NULL);
hdcButton = GetDC(wnd);
wnd = GetDesktopWindow();
hdcDesktop = GetDC(wnd);
Timer1->Enabled = False;
Timer1->Interval = 1;
BitBtn1->Tag = 0;//开始绘图---www.bianceng.cn
}
4、Form1的BitBtn1Click过程代码如下:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if (BitBtn1->Tag == 0)
Timer1->Enabled = True;
BitBtn1->Caption = "结束绘图";
BitBtn1->Tag = 1;
}
else
Close();
}
5、Form1的Timer1Timer过程代码如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
GetCursorPos(&pt);
StretchBlt(hdcButton, 0, 0, 60, 25, hdcDesktop, pt.x - 30, pt.y - 12, 60, 25, SRCCOPY);
}
7、按F9运行程序。以上程序在C++ Builder 5.0、Windows95/98/NT/2000简体中文版环境下调试通过。
三.程序清单
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND wnd;
HDC hdcButton, hdcDesktop;
TPoint pt;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
GetCursorPos(&pt);
StretchBlt(hdcButton, 0, 0, 60, 25, hdcDesktop, pt.x - 30, pt.y - 12, 60, 25, SRCCOPY);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->MessageBox("利用C++Builder在Windows开始按钮上绘图演示程序", "特别说明", MB_OK + MB_DEFBUTTON1);
wnd = FindWindow("Shell_TrayWnd", NULL);
wnd = FindWindowEx(wnd, 0, "Button", NULL);
hdcButton = GetDC(wnd);
wnd = GetDesktopWindow();
hdcDesktop = GetDC(wnd);
Timer1->Enabled = False;
Timer1->Interval = 1;
BitBtn1->Tag = 0;//开始绘图---www.bianceng.cn
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if (BitBtn1->Tag == 0)
Timer1->Enabled = True;
BitBtn1->Caption = "结束绘图";
BitBtn1->Tag = 1;
else
Close();
}
用C++Builder在Windows开始按钮上绘图制作方法的更多相关文章
- PSI在windows server2008服务器上的安装方法
PSI(http://www.oschina.net/p/psi-crm)是一款开源进销存软件,功能较为齐全,使用比较方便.在windows server2008系统中安装时遇到了一些问题,总结解决方 ...
- unity3d游戏无法部署到windows phone8手机上的解决方法
今天搞了个unity3d游戏,准备部署到自己的lumia 920上,数据线连接正常,操作正常,但是“build”以后,始终无法部署到手机上,也没有在选择的目录下生产任何相关文件.(你的系统必须是win ...
- Windows 10官方原版ISO制作方法
其实市面上的ISO原版都是这样的方法制作成光盘,然后再打包出来供人们下载的. 1.下载Windows 10安装程序工具: https://www.microsoft.com/zh-cn/softwar ...
- windows下ftp上传下载和一些常用命令
先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...
- 网站部署到Windows Azure Website上
使用CSDN Code将网站部署到Windows Azure Website上 在云计算时代,开发和部署应该是完全统一和集成的.在海外,开发者可以用github来管理他们的代码,并且直接部署到Wind ...
- WPF关于“在“System.Windows.Markup.StaticResourceHolder”上提供值时引发了异常。”问题解决办法
在WPF中添加样式,在MainWindow.xaml使用自定义按钮FButton时报错,报错信息如下: "System.Windows.Markup.XamlParseException&q ...
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...
- 在Windows Service 2012上安装IIS 8.0 IIS 6
我的目的是在服务器上安装IIS6 ,但是受到这边文章的启发和按照他的步骤,看到了"IIS 6管理兼容性",我的问题就决解了,我这里是因为要安装vss 2005 和u8等比较早期的软 ...
- 如何在IIS上发布网站 在阿里云服务器windows server2012r iis上部署.net网站
如何在IIS上发布网站 本片博客记录一下怎么用IIS发布一个网站,以我自己电脑上一个已经开发完成的网站为例: 1.打开项目 这是我电脑上的一个项目,现在我记录一下将这个项目发布到iis上的整个过程 ...
随机推荐
- Vue.js中的图片引用路径问题
当我们在Vue.js项目中引用图片时,关于图片路径有以下几种情形: 使用一: 在data里面定义好图片路径: /*错误写法*/ imgUrl:'../assets/logo.png' 在templat ...
- css样式高级技巧-选择器
用<div>元素为网页 在编写样式表时,我们经常要用div元素来包装内容: <div> <p>Here are two paragraphs of content& ...
- grep 的一些常用用法
打印匹配到的上下5行 grep -C 5 'root' /etc/passwd 上下5行 grep -A 5 'root' /etc/passwd afte ...
- 28-Ubuntu-远程管理命令-02-查看网卡的配置信息
命令 功能 ifconfig 查看网卡配置信息 ifconfig | grep inet 查看网卡对应的IP地址 ping 127.0.0.1 检测本地网卡是否正常 ping IP地址 检测到目标 ...
- Nginx配置web服务
Nginx配置虚拟主机 虚拟主机概述 所谓虚拟主机,在web服务里就是一个独立的网站站点,这个站点对应独立的域名(也可以是IP或者端口),具有独立的程序及资源目录,可以独立的对外提供服务,继而给用户访 ...
- RocketMQ核心技术精讲与高并发抗压实战
1:特点 比较吃内存 内存至少1g 默认8g 1:支持集群模型,强调集群无单点,负载均衡以及水平扩展能力2:亿级别的消息堆积能力3:采用零拷贝原理Consumer 消费消息过程,使用了零拷贝 顺序写盘 ...
- 《构建之法》CH5~6读书笔记 PB16110698 第九周(~5.15)
这段时间我阅读了<构建之法>的大部分章节,包括个人技能.软件测试.用户体验和需求分析等相关内容.之前的个人作业和结对作业结束后,我们的工作重心终于转向了团队项目,作为团队中前端组的组长,我 ...
- C++之constexpr
一.常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.一个对象是不是常量表达式是由它的数据类型和初始值共同决定. ;//虽然初始值是字面值常量,但是它的数据类型只是普通int. con ...
- sql中取出字符串中数字
select substring(reverse('0->星光'),PATINDEX('%[0-9]%',reverse('0->星光')),1)
- Java 多线程 - 死锁deadlock产生原因+避免方法
ref: java中产生死锁的原因及如何避免 https://blog.csdn.net/m0_38126177/article/details/78587845 java如何避免死锁 http:// ...