我要设计一个无标题窗体,且始终在最屏幕的最前面,要可以改变宽度
我的设计
1、把窗体的BorderStyle:=bsNone;然后窗体用图片做了样式,设置了窗体的透明TransparentColor:=true和TransparentColorValue的值。
2、实现始终在屏幕的最前面
procedure TFmain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
Params.WndParent := GetDesktopWindow;
end;
3、可移动。在窗体背景图片的MouseDown里面写代码
procedure TFmain.MoveForm(Sender:TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if Button = mbLeft then
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0);
end;
end;4、只可以改变宽度--我翻遍了论坛,还是没有解决方法
下面的代码是查阅到的
override窗体的CreateParams...
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams); override;
...
procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := WS_THICKFRAME or WS_POPUP or WS_BORDER or WS_SIZEBOX;//此句是关键,这里的参数可以有很多
end;
如果用这个代码,窗体会有一个灰色的边框,很难看,无法和我的图片背景相融合。======================================
偶不素懒人,也研究了好多方法,请大家赐教。算是论坛里面窗体制作的总结帖吧。
我的设计
1、把窗体的BorderStyle:=bsNone;然后窗体用图片做了样式,设置了窗体的透明TransparentColor:=true和TransparentColorValue的值。
2、实现始终在屏幕的最前面
procedure TFmain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
Params.WndParent := GetDesktopWindow;
end;
3、可移动。在窗体背景图片的MouseDown里面写代码
procedure TFmain.MoveForm(Sender:TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if Button = mbLeft then
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0);
end;
end;4、只可以改变宽度--我翻遍了论坛,还是没有解决方法
下面的代码是查阅到的
override窗体的CreateParams...
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams); override;
...
procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := WS_THICKFRAME or WS_POPUP or WS_BORDER or WS_SIZEBOX;//此句是关键,这里的参数可以有很多
end;
如果用这个代码,窗体会有一个灰色的边框,很难看,无法和我的图片背景相融合。======================================
偶不素懒人,也研究了好多方法,请大家赐教。算是论坛里面窗体制作的总结帖吧。
解决方案 »
- table 的 batchmove
- 碰碰运气吧:一个DbGridEH的问题,好像比较麻烦,但愿有解!
- IdTCPClient通讯问题【高分-100】
- 有关DLL文件的调试!
- 怎么将数据集转变成数据流
- 一台电脑,连接三个等离子显示屏,一个普通电脑显示器,如何实现录入及显示?
- 如何在一个程序中实现“当程序被人从进程列表中强行结束就执行一段特定得代码(如写错误日志)”在线等待。。。
- 老总要求我将录入控件改成Grid录入,朋友们能否帮忙劝服
- 不装客户端连接SQL-SERVER2000的问题--在线等候,谢谢
- 为什么我的动态SQL语句不能在Access 97的数据库下运行?SOS!!!
- dbgrid能不能增加一个虚拟列,用来标识这行是否选中?
- ■■请问如何对Pointer所指的内容进行修改?
begin
inherited CreateParams(Params);
Params.Style := WS_SIZEBOX or
WS_POPUP or
WS_BORDER;
end;*******************
procedure TForm1.FormCreate(Sender: TObject);
begin
borderstyle:=bsSizeable;
setwindowlong(handle,gwl_style,getwindowlong(handle,gwl_style) and not ws_caption);
clientheight:=height;
end;
************************
TForm1=class(TForm)
...
public
procedure CreateParams(var Params: TCreateParams); override;
// 加入这一行
end;
// Copy 如下代码即可
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := (Style or WS_POPUP) xor (ws_dlgframe);
///如果要凹下去的效果,则加入下面这行,否则去掉
ExStyle := ws_ex_clientedge;
end;
end;
***************
怎样可以不要Form的标题栏和边界但可以保留改变Form的大小的功能:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
private
procedure WmNCHitTest(var Msg : TWMNCHitTest); message WM_NCHITTEST; { Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest);
const v=10; //border width
var p:TPoint;
begin
p:=Point(Msg.XPos,Msg.YPos);
p:=ScreenToClient(p);
if PtInRect(Rect(0,0,v,v),p) then
Msg.Result:=HTTOPLEFT
else if PtInRect(Rect(Width-v,Height-v,Width,Height),p) then
Msg.Result:=HTBOTTOMRIGHT
else if PtInRect(Rect(Width-v,0,Width,v),p) then
Msg.Result:=HTTOPRIGHT
else if PtInRect(Rect(0,Height-v,v,Height),p) then
Msg.Result:=HTBOTTOMLEFT
else if PtInRect(Rect(v,0,Width-v,v),p) then
Msg.Result:=HTTOP
else if PtInRect(Rect(0,v,v,Height-v),p) then
Msg.Result:=HTLEFT
else if PtInRect(Rect(Width-v,v,Width,Height-v),p) then
Msg.Result:=HTRIGHT
else if PtInRect(Rect(v,Height-v,Width-v,Height),p) then
Msg.Result:=HTBOTTOM;
Inherited;
end;end.
*************************
类似网络蚂蚁的悬浮窗体
源码:protected:
virtual void __fastcall CreateParams(TCreateParams & Param);void __fastcall TForm2::CreateParams(TCreateParams & Param)
{
//调用基类
TForm::CreateParams(Param); //去掉窗口标题区
Param.Style=Param.Style & ~WS_CAPTION;
Param.Style=Param.Style | WS_POPUP;
//设为总在最上面
Param.ExStyle=Param.ExStyle | WS_EX_TOPMOST;
//设Windows Owner为Desktop Window
Param.WndParent=GetDesktopWindow();
}注意:
1、Windows Owner与Windows Parent不同,用::SetParent函数和设置Form?->Parent这能设置Windows Parent,不能设置Windows Owner,要实现FlashGet的悬浮窗必须要设置Windows Owner。
2、Form的BorderStyle要设为bsToolWindow,不然在任务栏上会显示出这个窗口的标题,将Caption设为空也没有用。
X, Y, Precision: integer);
var
SC_MANIPULATE: Word;
begin
//光标在控件的右下角**********************************************************
if (X>=Control.Width-Precision) and (Y>=Control.Height-Precision)then
begin
SC_MANIPULATE := $F008;
Control.Cursor := crSizeNWSE;
end
//光标在控件的客户区(移动整个控件)******************************************
else
if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5)then
begin
SC_MANIPULATE := $F009;
Control.Cursor := crSizeAll;
end
else begin
SC_MANIPULATE := $F000;
Control.Cursor := crDefault;
end;
if Shift=[ssLeft] then
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND,SC_MANIPULATE,0)
end;end;procedure TFmain.Img_RightMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ManipulateControl((Sender as TControl), Shift, X, Y, 10);end;
大哥,你消失了好久啦,我们的项目如何啦。