如何设置控件的宽度

My_first 2005-08-05 02:00:42
知道某控件的句柄,如何设置控件的宽度 
例如:
Var hwd:Thandle
Begin
hwd:=Panel1.Handle;


不通过(Panel1.width=50)来直接设置宽度。 
而是通过HWD这个参数来设置。 有哪个函数可以做到
end;
...全文
305 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzlingaaa 2005-08-06
  • 打赏
  • 举报
回复
帮顶
hqhhh 2005-08-06
  • 打赏
  • 举报
回复
关注:
My_first 2005-08-06
  • 打赏
  • 举报
回复
还是无法修改另外一个控件的属性。

我要实现的是修改任务栏系统托盘的宽度. 让托盘的宽度=panel1.width;

procedure TForm1.WmSetWidth(var Msg: TMessage);
Var
wnd:thandle;
begin
wnd:=findwindow('Shell_TrayWnd',nil);
wnd:=findwindowex(wnd,0,'TrayNotifyWnd',nil);
FindControl(wnd).Width:=Msg.WParam
end;

procedure TForm1.Button2Click(Sender: TObject);
var
wnd,wnd1:thandle;
Begin
wnd:=findwindow('Shell_TrayWnd',nil);
wnd:=findwindowex(wnd,0,'TrayNotifyWnd',nil);
windows.SetParent(panel1.Handle,wnd);
SendMessage(wnd,WM_SetWidth, panel1.handle , 50);
end;
//调用该语句根本没执行 WmSetWidth. 
你告诉我
//其中edtParentHdl为Control的Parent的Handle, edtControlHdl为控件的Handle;

可是不能得到control的parent的handle;该怎样做.


问题 解决另送上200分.
linzhengqun 2005-08-06
  • 打赏
  • 举报
回复
似乎这个托盘区的大小由系统内部维护,所以你强行去改变它,系统又会把它恢复过来。
今天找到很多资料,没有办法
给你一个网址吧,希望能从中看出些什么:
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=648
cncharles 2005-08-06
  • 打赏
  • 举报
回复
我想那你可能不实现不了. 我也帮不了你了
My_first 2005-08-06
  • 打赏
  • 举报
回复
to linzhengqun ,看你写的代码,的确对Windows api比较了解。
windows2000下,托盘区图标 是ToolbarWindow32.



你上面的代码执行后只闪两下, 拉一拉任务栏一会又恢复回去了。
我想要的效果是真正把panel放到TrayNotifyWnd. 而不是画上去的,而且不覆盖了托盘区其它软件的图标。
thx
My_first 2005-08-06
  • 打赏
  • 举报
回复
To cncharles(旺仔)
你写的代码效果覆盖了托盘区其它软件的图标,
我要的效果不是这样子的,我要的是让托盘区(TrayNotifyWnd) 宽度增大, 在空出来的地方放一个panel,
cncharles 2005-08-06
  • 打赏
  • 举报
回复
linzhengqun:对Windows API了解得还是比较透的,但是在XP下总是看不效果
我想楼主要想的效果可能无法实现.必须明白Panel1的Parent不可能真正的是Shell_TrayWnd
它的Parent总会是Form1的,虽然用了Windows.SetParent(pnl1.Handle, PHwnd);
cncharles 2005-08-06
  • 打赏
  • 举报
回复
//只能做这样的效果了不知道楼主满意不.
procedure TForm1.btn3Click(Sender: TObject);
var
PHwnd, TrayHwnd: THandle;
r: TRect;
pnl:TPanel;
begin
PHwnd:=findwindow('Shell_TrayWnd',nil);
TrayHwnd:=findwindowex(PHwnd, 0,'TrayNotifyWnd',nil);
if TrayHwnd <> 0 then
begin
Windows.GetWindowRect(TrayHwnd, r);
MapWindowPoints(0, PHWnd, r, 2);
end;
pnl:=TPanel.Create(nil);
Windows.SetParent(pnl1.Handle, PHwnd);
pnl1.Width:=50;
pnl1.Top:=R.Top+2;
pnl1.Left:=R.Left;

end;
linzhengqun 2005-08-06
  • 打赏
  • 举报
回复
如果:托盘区的宽小于100,的确是看不出效果,因为都到任务栏之外去了。
用下面的代码再试试:
procedure TForm1.Button1Click(Sender: TObject);
var
PHwnd, TrayHwnd, ClockHwnd, TBHwnd: THandle;
r, Cr, Tr: TRect;
w: Integer;
begin
PHwnd:=FindWindow('Shell_TrayWnd',nil);
TrayHwnd := FindWindowEx(PHwnd, 0, 'TrayNotifyWnd', nil);
TBHwnd := FindWindowEx(TrayHwnd, 0, 'ToolbarWindow32', nil);
ClockHwnd := FindWindowEx(TrayHwnd, 0, 'TrayClockWClass', nil);
if (TrayHwnd <> 0) and (TBHwnd <> 0) and (ClockHwnd <> 0) then
begin
Windows.GetWindowRect(TrayHwnd, r);
MapWindowPoints(0, PHwnd, r, 2);

Windows.GetWindowRect(ClockHwnd, Cr);
MapWindowPoints(0, TrayHwnd, Cr, 2);

Windows.GetWindowRect(TBHwnd, Tr);
MapWindowPoints(0, TrayHwnd, Tr, 2);

MoveWindow(TrayHwnd, r.Left - (Panel1.Width - (r.Right - r.Left)),
r.Top, Panel1.Width, r.Bottom - r.Top, True);

end;

end;
linzhengqun 2005-08-06
  • 打赏
  • 举报
回复
在2000下试验可以,
不过这终归是一个失败的试验,呵呵。
cncharles 2005-08-06
  • 打赏
  • 举报
回复
To: linzhengqun 在XP下面没有任何反应.
cncharles 2005-08-06
  • 打赏
  • 举报
回复
在XP下面没有任何反应.
linzhengqun 2005-08-06
  • 打赏
  • 举报
回复
如下:
procedure TForm1.Button1Click(Sender: TObject);
var
PHwnd, TrayHwnd: THandle;
r: TRect;
begin
PHwnd:=findwindow('Shell_TrayWnd',nil);
TrayHwnd:=findwindowex(PHwnd, 0,'TrayNotifyWnd',nil);

if TrayHwnd <> 0 then
begin
Windows.GetWindowRect(TrayHwnd, r);
MapWindowPoints(0, PHWnd, r, 2);
if MoveWindow(TrayHwnd, r.Left, r.Top, 100, r.Bottom - r.Top, True) then
ShowMessage('ok');
end;
end;

不过一个问题是过一段时间后,托盘区还是会自动恢复过来。
cncharles 2005-08-06
  • 打赏
  • 举报
回复
你要用代码调整通知区域的宽度好你不可能,因为它的最大宽度
是通知区域上的图标宽度之和的,再说WM_SetWidth是自己定义的消息的
因此要自己在主进程编号对应的消息处理过程.
linzhengqun 2005-08-05
  • 打赏
  • 举报
回复
更简单的用这个:
MoveWindow(ControlHandle, 1, 2, 100, 100, True);

看一下API帮助
cdsgajxlp 2005-08-05
  • 打赏
  • 举报
回复
SetWindowPos
cncharles 2005-08-05
  • 打赏
  • 举报
回复
//如果你在另外一进程向另外一进程发送此消息还要用另FindControl(hwd).Parent.Handle作为
SendMessage的对应的Handle参数.如果在同一进程则不用了.
const WM_SetWidth=WM_User+100;//自定义的消息
type
TForm1 = class(TForm)
btn1: TButton;
edt1: TEdit;
btn2: TButton;
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
procedure WmSetWidth(var Msg:TMessage);message WM_SetWidth;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WmSetWidth(var Msg: TMessage);
begin
btn1.Width:=Msg.WParam; //改成FindControl(hwd).Width:=Msg.WParam
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
SendMessage(Handle, WM_SetWidth,50, 0); //如果在另外一进程, 这个进程发送消息则用
//SendMessage(StrToInt(edtParentHdl.Text),WM_SetWidth, StrToInt(edtContrlHdl.Text) , 50);
//其中edtParentHdl为Control的Parent的Handle, edtControlHdl为控件的Handle;
end;
xixuemao 2005-08-05
  • 打赏
  • 举报
回复
这里有,哈哈
http://www.yesky.com/20011023/201889.shtml
蓝色光芒 2005-08-05
  • 打赏
  • 举报
回复
SetWindowPos

参数都很简单
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND;
X, Y, cx, cy: Integer; uFlags: UINT): BOOL; stdcall;

SetWindowPos(Panel1.Handle,0,0,0,100,100,0);
加载更多回复(6)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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