熟悉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开始按钮上绘图制作方法的更多相关文章

  1. PSI在windows server2008服务器上的安装方法

    PSI(http://www.oschina.net/p/psi-crm)是一款开源进销存软件,功能较为齐全,使用比较方便.在windows server2008系统中安装时遇到了一些问题,总结解决方 ...

  2. unity3d游戏无法部署到windows phone8手机上的解决方法

    今天搞了个unity3d游戏,准备部署到自己的lumia 920上,数据线连接正常,操作正常,但是“build”以后,始终无法部署到手机上,也没有在选择的目录下生产任何相关文件.(你的系统必须是win ...

  3. Windows 10官方原版ISO制作方法

    其实市面上的ISO原版都是这样的方法制作成光盘,然后再打包出来供人们下载的. 1.下载Windows 10安装程序工具: https://www.microsoft.com/zh-cn/softwar ...

  4. windows下ftp上传下载和一些常用命令

    先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...

  5. 网站部署到Windows Azure Website上

    使用CSDN Code将网站部署到Windows Azure Website上 在云计算时代,开发和部署应该是完全统一和集成的.在海外,开发者可以用github来管理他们的代码,并且直接部署到Wind ...

  6. WPF关于“在“System.Windows.Markup.StaticResourceHolder”上提供值时引发了异常。”问题解决办法

    在WPF中添加样式,在MainWindow.xaml使用自定义按钮FButton时报错,报错信息如下: "System.Windows.Markup.XamlParseException&q ...

  7. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  8. 在Windows Service 2012上安装IIS 8.0 IIS 6

    我的目的是在服务器上安装IIS6 ,但是受到这边文章的启发和按照他的步骤,看到了"IIS 6管理兼容性",我的问题就决解了,我这里是因为要安装vss 2005 和u8等比较早期的软 ...

  9. 如何在IIS上发布网站 在阿里云服务器windows server2012r iis上部署.net网站

    如何在IIS上发布网站   本片博客记录一下怎么用IIS发布一个网站,以我自己电脑上一个已经开发完成的网站为例: 1.打开项目 这是我电脑上的一个项目,现在我记录一下将这个项目发布到iis上的整个过程 ...

随机推荐

  1. ECMAScript1.4 对象 | 简单数据类型与复杂数据类型 | 内置对象 | 基本包装类型 | String

    对象 函数和对象的区别: 函数:封装代码 对象:封装属性和方法 创建对象的方法: 1,对象字面量{} // 模拟创建一只dog var dog = { // 属性 name: 'puppy', age ...

  2. python学习3—数据类型之整型、字符串和布尔值

    python学习3-数据类型之整型.字符串和布尔值 数据类型 python3支持的数据类型共有6种: 1 Number 2 String 3 List 4 Tuple 5 Set 6 Dictiona ...

  3. Southeastern European Regional Programming Contest 2019

    easy: I medium-easy: BDEGJ medium: F medium-hard: A A. B. 按 x 排序,\(dp[i][j][k]\) 表示考虑前 \(i\) 个物品,lev ...

  4. Soci介绍

    soci是一个用C++封装的数据库访问库,目前通过 “前端(应用程序)/核心/后端(数据库适配)”模式支持firebird,mysql,sqlite3,oracle,postgresql,odbc多种 ...

  5. 安装go环境

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~go项目运行时的依赖包安装问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~1.安装go环境 wget https://dl.goog ...

  6. MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合 1.基本数据类型 我们常见有传递 int, string, bool, double, decimal 等类型. 需要注意的是前台传递的参 ...

  7. css之页面三列布局之左右上下高度固定,中间自适应

    第一种,绝对定位 !DOCTYPE HTML> <html> <head> <meta charset="gb2312"> <tit ...

  8. Logstash2.3.4趟坑之集成Redis哨兵模式

    最新在使用Lostash2.3.4收集数据的时候,在读取redis数据的时候,报了如下的一个异常: 异常如下 Pipeline aborted due to error {:exception=> ...

  9. x25, PF_X25 - ITU-T X.25 / ISO-8208 协议接口。

    总览 #include <sys/socket.h> #include <linux/x25.h> x25_socket = socket(PF_X25, SOCK_SEQPA ...

  10. 3、docker 容器管理

    Docker容器相对于OpenStack的云主机实例,虽然他们本质上不同.我们需要基于镜像来创建容器.容器是独立运行的一个或一组应用,以及它们的运行环境.对应的,虚拟机可以理解为模拟运行的一整套操作系 ...