利用C++Builder在Windows“开始”按钮上绘图

2016-02-19 17:59 9 1 收藏

图老师小编精心整理的利用C++Builder在Windows“开始”按钮上绘图希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】


  熟悉Windows操作系统的软件设计人员知道,在Win95/98/NT/2000中有一任务栏(Task Bar)程序,路径为:C:WINDOWSSYSTEMSYSTRAY.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;//开始绘图
  }
  
  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;//开始绘图
  }
  void __fastcall TForm1::BitBtn1Click(TObject *Sender)
  {
  if (BitBtn1-Tag == 0)
  Timer1-Enabled = True;
  BitBtn1-Caption = "结束绘图";
  BitBtn1-Tag = 1;
  else
  Close();
  }  
  

来源:http://www.tulaoshi.com/n/20160219/1616541.html

延伸阅读
本文详细解释了如何在C++Builder中使用全局变量。 作者:yifei(尹加俊) 信箱:yifei1900@163.com 如何在C++Builder中使用全局变量? (1).如果我在一个公用的头文件中定义一个变量,在其它单元中可以直接使用它吗?如下: //--------------------------------Globals.h---------------------------------- ...
UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序。UI编程体现在两个方面,一是设计精美的用户界面,再有就是符合大多数用户习惯和易于使用的操作流程,而制作出精美的、绚丽多彩的用户界面是博得最终用户喜爱的第一步。我们...
void __fastcall TForm1::BitBTn1Click(TObject *Sender) { char *ADevice, *ADriver, *APort; THandle DeviceMode; PDeviceMode DevMode; int length,width; length=1400; width=2410; //设定自定义纸张的尺寸单位为0.1毫米 !-- frame contents -- !-- /frame contents -- ADevice =new char[100...
标签: 电脑入门
短短数日之前,Windows 8.1 build 9385截图突然泄露在互联网上。尽管目前尚无网站提供这个特别的build版本下载,但我们仍然还是看到了源源不断的新截图曝光。 根据截图显示,全新的系统将增加多项新功能,可提供适用于Internet Explorer 11的开发者工具。Windows 8.1 build 9385将为开发者构建一个全新的使用界面,增加包括调试在内的多...
标签: 电脑入门
在此之前,我们并不知道关于这个开始按钮如何运作的更多消息。虽然有消息

经验教程

417

收藏

13
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部