这里的人气真是不旺啊,我来添一把柴,希望能够带动大家的编程热情。这是我第一次写教程,不足之处大家多包涵。打算分两次写成一个列于桌面右侧的sidebar(中文名不知道叫什么,好像应该算是任务栏,因为主要灵感来自于Desktop Sidebar)程序,可以从网上读取天气预报,可以显示当前的时钟等基本功能(你可以加入自己的功能)。我的编程环境是Windows 2003 + Delphi 7,其他版本的delphi和windows我想都是没有问题的,演示请看附件。我想读者应该会一点Delphi,分两次主要是照顾一些初学者。OK, Let's go!
//-----------正文开始-------------------
不知到大家注意到没有?其实桌面(Desktop)和form1一样都是窗体(Window),区别在于桌面是在所有窗口的后面,我们完全可以是使我们自己的窗体具有这种性质。
procedure TForm1.FormCreate(Sender: TObject);
var
hDeskTop:THandle;
begin
hDeskTop:=FindWindow('Progman', 'Program Manager');
windows.SetParent(handle,hDeskTop);
end;
按照上面的代码试一试,看看win+D会不会让这个Form1窗体最小化到任务栏?答案当然是否定的,因为它已经具有了和桌面一样的属性。这就是这次教程的技巧之一。
Sidebar应当靠在桌面的右边或者其他什么地方,这在Delphi里是十分简单的。在Object Inspector中设置Form1的BorderStyle为bsNone;Width为195;在FormCreate中加入如下:
procedure TForm1.FormCreate(Sender: TObject);
var
hDeskTop:THandle;
r: Trect;
begin
r:= Screen.DesktopRect; //读取桌面分辨率
Self.Top := 0;
Self.Left := r.Right-r.Left-Self.Width ; //靠右侧
Self.Height := r.Bottom-r.Top; //与桌面等高
hDeskTop:=FindWindow('Progman', 'Program Manager');
windows.SetParent(handle,hDeskTop);
end;
就会建立一个靠右侧的Sidebar(退出时按Alt+F2),很好玩吧。这次就到这里,下次再见。
对于初学者来说,定义系统热键(hotkey)好像是一项很难的技术,实际上在Delphi里,可以很轻松的完成。依本例来说,声明两个atom类型全局变量aF9与aF10。
var
aF9,aF10 : ATOM;
在Form1上拖放一个WebBrowser控件(在InterNet中),名字为Web1。在form的create事件加入如下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
aF9:=GlobalAddAtom('MyhotkeyF9'); //定义元素
aF10:=GlobalAddAtom('MyhotkeyF10');
RegisterHotKey(Handle,aF9,MOD_SHIFT,vk_F9); //注册热键 Shift + F9
RegisterHotKey(Handle,aF10,MOD_SHIFT,vk_F10); //注册热键 Shift + F10
end;
这样就定义好了热键,还需要相应热键的函数。windows的消息传递机制请参阅相关书籍,我这里只是讲对应于Delphi的手段。在form的public处加入以下
public
procedure WMhotkeyhandle(var msg:Tmessage);message wm_hotkey; //响应敏感键按键消息
在{$R *.dfm}后加入:
procedure TForm1.Wmhotkeyhandle(var msg:Tmessage);
begin
if (msg.LParamHi=vk_F9) and (msg.LparamLo=MOD_SHIFT) then
Web1.Navigate('http://appnews.qq.com/cgi-bin/news_qq_search?city=长春')
else if (msg.LParamHi=vk_F10) and (msg.LparamLo=MOD_SHIFT) then
Self.Close ;
end;
运行一下试试,按Shift+F9就会连接到天气预报;Shift+F10就会退出。
这样我们的SideBar已经具有雏形了,所欠的还有那个漂亮的时钟。那个bmpclock控件是国人作的,很好的,只是比较费资源,在网上很容易就找到。你也可以用其他的什么时钟或者是LED形式显示数字时钟。
最后一点比较重要的就是需要安装一个透明控件,把它放在Web1的上面,这样才不会有那些讨厌的右键菜单出现。透明控件的源代码如下(我在CSDN中的名字就是yuzhan):
{
欢迎使用透明控件V1.0 Developed by yuzhan(CSDN)
继承自TWinControl,主要功能是用来挡住一些不想让别人碰的东西,但是仍然会保持原样。
}
unit Transparent;
interface
uses
SysUtils, Classes, Controls, Windows;
type
TTransparent = class(TWinControl)
private
{ Private declarations }
protected
public
Constructor Create(AOwner: TComponent);override;
procedure CreateParams(var Params: TCreateParams);override;
published
{ Published declarations }
end;
procedure Register;
implementation
constructor TTransparent.Create(AOwner: TComponent);
begin
ControlStyle := ControlStyle - [csOpaque];
inherited;
end;
procedure TTransparent.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
{ 完全重画 }
Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;
{ 增加透明 }
ExStyle := ExStyle or WS_EX_TRANSPARENT;
end;
end;
procedure Register;
begin
RegisterComponents('Win32', [TTransparent]);
end;
end.