在任务栏创建一个跟google 快速搜索 类似的按钮?

大肚肥肥 2009-11-04 05:10:42
如题,找到以前的一篇老贴,http://topic.csdn.net/t/20030114/18/1358329.html
我现在能创建,但是按钮位置始终不能正常排序。

代码贴上 ,望高手指点一二


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
btnNew: TButton;
btnRestore: TButton;
procedure FormCreate(Sender: TObject);
procedure btnNewClick(Sender: TObject);
procedure btnRestoreClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FNewButton: Boolean; // Check whether new start button had been created.
procedure NewButtonMsg(var Msg: TMessage); // new button events.
public
{ Public declarations }
end;

var
Form1: TForm1;
OldProc, NewProc: Pointer;
StartBtnHwnd, TrayHwnd, ReplaceBtnHwnd: Hwnd;

implementation

{$R *.DFM}

function ButtonWndProc(CtlHandle: Hwnd; uMsg: Uint; AWParam: Wparam; ALparam: Lparam): HResult; stdcall;
var
Rct: TRect;
pt: TPoint;
begin
if uMsg = WM_LBUTTONUP then
begin
GetCursorPos(pt);
GetClientRect(CtlHandle, Rct);
MapWindowPoints(0, ctlHandle, pt, 1);
if PtInRect(Rct, pt) then
Showmessage('You had clicked the new button !')
end;
Result := CallWindowProc(OldProc, CtlHandle, uMsg, AWParam, ALParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
TrayHwnd := FindWindow('Shell_TrayWnd', nil);
StartBtnHwnd := FindWindowEx(TrayHwnd, 0, 'Button', nil);
end;

procedure TForm1.btnNewClick(Sender: TObject);
var
Rct: TRect;
fnt: HFont;
begin
if FNewButton then Exit;
Windows.GetWindowRect(StartBtnHwnd, Rct);
ReplaceBtnHwnd := CreateWindowEx(WS_EX_WINDOWEDGE,
'Button', 'btnStartButton', WS_Child or WS_Visible,
100, 1, rct.right - rct.left, Rct.bottom - Rct.top, TrayHwnd, 0, 0, nil); // Create a button, which parent is windows's Tray.
if ReplaceBtnHwnd > 0 then
begin //HWND_TOPMOST

SetWindowPos(StartBtnHwnd, HWND_TOPMOST, Rct.left+100, rct.top, rct.right - rct.left, Rct.bottom - Rct.top, SWP_HIDEWINDOW {OR SWP_NOREDRAW}); // Hide old Start button.

SetWindowText(ReplaceBtnHwnd, '开始2'); // Set New button's font and caption.
fnt := CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 'Time New Romans');
SendMessage(ReplaceBtnHwnd, WM_SETFONT, fnt, MAKELPARAM(0, 0));


// Show New start button.
SetWindowPos(ReplaceBtnHwnd, HWND_TOPMOST, Rct.left, rct.top, rct.right - rct.left, Rct.bottom - Rct.top,
SWP_SHOWWINDOW);
ShowWindow(ReplaceBtnHwnd, SW_ShowNormal);
UpdateWindow(ReplaceBtnHwnd);
// To handle the new messages.
NewProc := Pointer(LongInt(MakeObjectInstance(NewButtonMsg)));
OldProc := Pointer(SetWindowLong(ReplaceBtnHwnd, GWL_WNDPROC, LongInt(NewProc)));
if NewProc = nil then
begin
Showmessage('Can not grab new button''s message!');
Exit;
end;
FNewButton := True;
end;

end;

procedure TForm1.btnRestoreClick(Sender: TObject);
begin
if FNewButton then // Restore Old Start button.
begin
SetWindowLong(ReplaceBtnHwnd, GWL_WNDPROC, LongInt(OldProc));
DestroyWindow(ReplaceBtnHwnd);
ReplaceBtnHwnd := 0;
ShowWindow(StartBtnHwnd, SW_ShowNormal);
SetWindowPos(StartBtnHwnd, HWND_TOPMOST, 0, 0, 50, 30, SWP_SHOWWINDOW);
FNewButton := False;
end;
end;

procedure TForm1.NewButtonMsg(var Msg: TMessage);
begin
if Msg.Msg = WM_LBUTTONUP then
showMessage('You had click the new start button')
else
Msg.Result := CallWindowProc(OldProc, ReplaceBtnHwnd, Msg.msg, msg.wParam, msg.lParam);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if FNewButton then
btnRestoreClick(self); // Restore button when form exiting.

end;

end.


...全文
261 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjkto 2009-11-06
  • 打赏
  • 举报
回复
mark
大肚肥肥 2009-11-05
  • 打赏
  • 举报
回复
呼唤高手。。。
大肚肥肥 2009-11-04
  • 打赏
  • 举报
回复
不该使用 SetWindowPos 函数?

我感觉是 窗体样式的选择 不对。 有类似于delphi alLeft 的样式么?
gyk120 2009-11-04
  • 打赏
  • 举报
回复
应该是SetWindowPos的问题吧
大肚肥肥 2009-11-04
  • 打赏
  • 举报
回复
是开始菜单的任务栏,非IE。
《计算机应用基础》实验指导 "实验名 "实验1 Windows基本操作 " "称 " " "目的和 "1、掌握窗口的基本操作,例如:移动、大小等。 " "要求 "2、掌握查找文件、文件夹的方法。 " "实验仪 "安装windows2000(或XP)系统的计算机 " "器 " " "实验内 "(1)鼠标双击"我的电脑"图标,打开"我的电脑"窗口。 (2)将鼠标指针移" "容 "动到窗口最上面的标题栏内,按住鼠标左键拖动到另一个新位置. (3)单击 " " "窗口右上角的【最大化/还原】按钮后,再按一次,观察窗口有什么变化。 " " "单击窗口右上角的【最小化】按钮后,"我的电脑"窗口缩小成图标,并置于 " " "任务栏 " " "(4)在任务栏上单击【我的电脑】任务按钮,桌面上再显示"我的电脑"窗口" " ". (5)用鼠标单击任务栏上的【开始】按钮,打开【开始】 【程序】 【 " " "附件】中的【写字板】、【画图】命令,打开"写字板"、"画图"窗口。 " " "(6)用鼠标右击任务栏上的空白区,弹出快捷菜单,选择其中的【层叠窗口" " "】命令,观察其变化. (7)单击【关闭】按钮,退出"我的电脑"窗口。 (8)在 " " "桌面上新建文件夹AA。(9)单击【开始】 【搜索】 【文件或文件夹】选项," " "打开"搜索结果"窗口。 " " "在左窗"要搜索的文件或文件夹名为"文本框中,键入"*。doc",在"搜索范围" " ""下拉列表框中选择"本机硬盘驱动器C:;D:;……"。 " " "(11)单击"立即搜索"按钮,将在指定的范围内搜索符合条件的文件和文件夹 " " ",当搜索完毕后,在右窗格显示出结果。 " " "(12)将搜索的结果复制到AA文件夹中. (13)关闭搜索结果对话框。 " "实验步 " " "骤 " " "注意事 "1、注意鼠标的操作 " "项 "2、在使用搜索功能时,注意对象、类型、位置等的确定。 " "实验名 "实验2文件及文件夹的操作、控制面板的使用及系统管理 " "称 " " "目的和 "实验目的:掌握资源管理器的使用,以及文件与文件夹的操作。 " "要求 "实验要求:学会使用"资源管理器"对文件进行管理。 " "实验仪 "windows2000(或XP)系统的计算机 " "器 " " "实验内 "一、资源管理器的使用 " "容 "(1)单击"开始"菜单的右键,调出快捷菜单,从中选择"资源管理器"命令,打" " "开"资源管理器"对话框。 (2)在"资源管理器"中查看C盘中的内容。 " " "(3)将C盘中的文件分别采用"小图标"、"列表"、"详细资料"三种显示格式来 " " "查看其内容。观察其变化。 (4)在"资源管理器"窗口中,单击"我的文档"图 " " "标。在窗口的右侧将显示"我的文档"中的文件。 (5)在"我的文档"窗口中 " " "创建下列文件夹结构。 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "(6)在A文件夹下建立新文件H。 " " "(7)将文件夹D改名为"tree"。 " " "(8)将文件G复制到文件夹F中 " " "(9)删除文件C。 " " "(10)查找扩展名为"doc"的文件,任选两个复制到 H文件夹中。 " " "(11)关闭"资源管理器"窗口。 二、掌握控制面板的使用 (1)单击【开始" " "】 【控制面板】 【日期/时间】选项,调整正确的系统日期与时间。 " " "(2)单击【区域选项】调整日期与时间的格式。 " " "(3)单击【显示】,设置自己喜欢的墙纸。 " " "(4)单击【系统】,查看系统设置。 " " "(5)关闭"控制面板"对话框。 " "实验步 " " "骤 " " "注意事 "1、实验过程中要认真领会资源管理器的功能及作用 " "项 "2、文件及文件夹的操作要熟练,并能按要求完成操作 " " "3、控制面板的使用设置要基本熟练,部分功能需逐步理解 " "实验名 "实验3 Internet Explorer 的使用 " "称 " " "目的和 "熟悉浏览器的界面,掌握使用浏览器浏览网页的基本方法 " "要求 " " "实验仪 "安装windows2000(或XP)系统、能够上网的计算机 " "器 " " "实验内 "(1)登陆学院网站,浏览学院网站内容,将其首页设置为主页。 " "容 "(2)通过整理收藏夹,创建名为CJXY的文件夹,并将学院网址存入该文件夹 " " "中. " " "(3)通过IE文件菜单中新建窗口后,输入http://www.263.net进入263 " " "在线。 " " "(4)通过IE文件菜单的另存为将263在线存到桌面上。 " " "(5

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧