gz
解决方案 »
- 救命,简单问题
- 用一个QUERY类的控件查出来的数据,怎样用SQL再查呢或再用一个QUERY查也可以
- 快速录入批量数据
- 在dbgrid中动态设置字段的问题
- 谁能给讲一下:ApplicationEvents控件,DELPHI6->Additional标签里那个。什么情况下用它,及怎么用?
- 如何确定SendMessage()函数发送的目的地?
- 有关Tuxedo......高手请进
- 怎样在视图中或SQL语句中使用变量?(并且不要弹出窗口请求赋值)
- 怎样在dbgrid中动态显示table中的内容?
- 想问一下关于BDE和ADO组件的对应关系
- 招聘.NET,delphi程序员
- DBgrid 的怎么不能实现这个功能??? 不会是真的吧
将下面的控件装上就可以实现了unit appba;{
FILE: APPBAR.PAS by Eric Janssen ([email protected]) DESCRIPTION: Encapsuling of SHAppBarMessage
}interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShellApi;const
WM_APPBAR = WM_USER +1;type
TEdge = (abeLeft, abeTop, abeRight, abeBottom); TQuerySizeEvent = procedure(Sender: TObject; Edge: TEdge; var Width, Height: Integer) of object; TAppBar = class(TComponent)
private
{ Private declarations }
m_ABD: TAppBarData;
m_WndProc: TWndMethod;
m_Edge: TEdge;
m_QuerySize: TQuerySizeEvent;
procedure SetEdge(const Value: TEdge);
procedure WndProc(var Msg: TMessage);
protected
{ Protected declarations }
procedure ABRegister; virtual;
procedure ABUnregister; virtual;
procedure ABSetPos; virtual;
procedure ABPosChanged; virtual;
procedure ABFullScreenApp(Enabled: Boolean); virtual;
procedure ABSetAutoHide(Enabled: Boolean); virtual;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override; procedure Loaded; override;
published
{ Published declarations }
property Edge: TEdge read m_Edge write SetEdge;
property QuerySize: TQuerySizeEvent read m_QuerySize write m_QuerySize;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Libertel', [TAppBar]);
end;
//------------------------------------------------------------------------------
procedure TAppBar.ABRegister;
begin
// check if we are not in the Delphi IDE
if not (csDesigning in ComponentState) then
begin
// make sure we get the notification messages
m_WndProc:= TWinControl(Owner).WindowProc;
TWinControl(Owner).WindowProc:= WndProc; m_ABD.cbSize:= SizeOf(TAppBarData);
m_ABD.hWnd:= TWinControl(Owner).Handle;
m_ABD.uCallbackMessage:= WM_APPBAR; // register the application bar within the system
if SHAppBarMessage(ABM_NEW, m_ABD) = 0 then
raise Exception.Create(SysErrorMessage(GetLastError())); // make it a toolwindow with no caption
if SetWindowLong(m_ABD.hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW or WS_EX_DLGMODALFRAME) = 0 then
raise Exception.Create(SysErrorMessage(GetLastError())); if SetWindowLong(m_ABD.hWnd, GWL_STYLE, 0) = 0 then
raise Exception.Create(SysErrorMessage(GetLastError())); SetWindowPos(m_ABD.hWnd, m_ABD.hWnd, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOACTIVATE or SWP_NOSIZE or SWP_SHOWWINDOW);
end;
end;
//------------------------------------------------------------------------------
procedure TAppBar.ABSetPos;
var Height, Width: Integer;
begin
if not (csDesigning in ComponentState) then
begin
// default size
Width:= TWinControl(Owner).Width;
Height:= TWinControl(Owner).Height; // request the new size
if Assigned(m_QuerySize) then
m_QuerySize(Self, m_Edge, Width, Height); m_ABD.rc.Right:= GetSystemMetrics(SM_CXSCREEN);
m_ABD.rc.Bottom:= GetSystemMetrics(SM_CYSCREEN); if (m_ABD.uEdge = ABE_LEFT) or (m_ABD.uEdge = ABE_RIGHT) then
begin
if m_ABD.uEdge = ABE_LEFT then m_ABD.rc.Left:= 0
else m_ABD.rc.Left:= GetSystemMetrics(SM_CXSCREEN) - Width;
m_ABD.rc.Top:= 0;
end else
begin
if m_ABD.uEdge = ABE_TOP then m_ABD.rc.Top:= 0
else m_ABD.rc.Top:= GetSystemMetrics(SM_CYSCREEN) - Height;
m_ABD.rc.Left:= 0;
end; // query the new position
if SHAppBarMessage(ABM_QUERYPOS, m_ABD) = 0 then
raise Exception.Create(SysErrorMessage(GetLastError())); // calculate the size
case m_ABD.uEdge of
ABE_LEFT:
m_ABD.rc.Right:= m_ABD.rc.Left + Width;
ABE_RIGHT:
m_ABD.rc.Left:= m_ABD.rc.Right - Width;
ABE_TOP:
m_ABD.rc.Bottom:= m_ABD.rc.Top + Height;
ABE_BOTTOM:
m_ABD.rc.Top:= m_ABD.rc.Bottom - Height;
end; // set the new size
if SHAppBarMessage(ABM_SETPOS, m_ABD) = 0 then
raise Exception.Create(SysErrorMessage(GetLastError())); // move the form
MoveWindow(m_ABD.hWnd, m_ABD.rc.Left, m_ABD.rc.Top,
m_ABD.rc.Right - m_ABD.rc.Left,
m_ABD.rc.Bottom - m_ABD.rc.Top, TRUE); end;
end;
//------------------------------------------------------------------------------
procedure TAppBar.ABUnregister;
begin
// check if the form is not being destroyed and not in the Delphi IDE
if not (csDesigning in ComponentState) then
begin
if not (csDestroying in ComponentState) then
TWinControl(Owner).WindowProc:= m_WndProc; // remove the application bar
if SHAppBarMessage(ABM_REMOVE, m_ABD) = 0 then
raise Exception.Create(SysErrorMessage(GetLastError()));
end;
end;
//------------------------------------------------------------------------------
var I: Cardinal;
begin
inherited Create(AOwner); // check if we have an owner
if Assigned(AOwner) then
begin
// we could turn everything with a handle into a application-bar, but for
// for Delphi we only use descendants of TCustomForm
if (AOwner is TCustomForm) then
begin
// make sure we are the only one
for I:=0 to AOwner.ComponentCount -1 do
begin
if (AOwner.Components[I] is TAppBar) and (AOwner.Components[I] <> Self) then
raise Exception.Create('Ooops, you need only *ONE* of these');
end;
end else
raise Exception.Create('Sorry, can''t do this only with TCustomForms'); end else
raise Exception.Create('Sorry, can''t do this without an owner');
end;
//------------------------------------------------------------------------------
destructor TAppBar.Destroy;
begin
ABUnregister(); inherited Destroy();
end;
//------------------------------------------------------------------------------
procedure TAppBar.Loaded;
begin
inherited Loaded(); ABRegister();
ABSetPos();
end;
//------------------------------------------------------------------------------
procedure TAppBar.SetEdge(const Value: TEdge);
begin
if (m_Edge <> Value) then
begin
m_Edge:= Value;
case m_Edge of
abeLeft:
m_ABD.uEdge:= ABE_LEFT;
abeTop:
m_ABD.uEdge:= ABE_TOP;
abeBottom:
m_ABD.uEdge:= ABE_BOTTOM;
abeRight:
m_ABD.uEdge:= ABE_RIGHT;
end; ABSetPos();
end;
end;
//------------------------------------------------------------------------------
procedure TAppBar.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_APPBAR) then
begin
case Msg.wParam of
ABN_STATECHANGE, ABN_POSCHANGED:
ABPosChanged(); ABN_FULLSCREENAPP:
ABFullScreenApp(Msg.lParam <> 0);
end;
end; if (Msg.Msg = WM_WINDOWPOSCHANGED) then
begin
SHAppBarMessage(ABM_WINDOWPOSCHANGED, m_ABD);
end; if (Msg.Msg = WM_ACTIVATE) then
begin
SHAppBarMessage(ABM_ACTIVATE, m_ABD);
end; // call the original WndProc
if Assigned(m_WndProc) then
m_WndProc(Msg);
end;
//------------------------------------------------------------------------------
procedure TAppBar.ABPosChanged;
var rc, rcWindow: TRect;
Height, Width: Integer;
begin
rc.Top:= 0;
rc.Left:= 0;
rc.Right:= GetSystemMetrics(SM_CXSCREEN);
rc.Bottom:= GetSystemMetrics(SM_CYSCREEN); GetWindowRect(m_ABD.hWnd, rcWindow); Height:= rcWindow.Top - rcWindow.Bottom;
Width:= rcWindow.Right - rcWindow.Left; case m_ABD.uEdge of
ABE_TOP:
rc.Bottom:= rc.Top + Height; ABE_BOTTOM:
rc.Top:= rc.Bottom - Height; ABE_LEFT:
rc.Right:= rc.Left + Width; ABE_RIGHT:
rc.Left:= rc.Right - Width;
end; ABSetPos();
end;
//------------------------------------------------------------------------------
procedure TAppBar.ABFullScreenApp(Enabled: Boolean);
var State: Integer;
Flags: HWND;
begin
State:= SHAppBarMessage(ABM_GETSTATE, m_ABD); if Enabled then
begin
if (State and ABS_ALWAYSONTOP) <> 0 then
Flags:= HWND_TOPMOST
else
Flags:= HWND_BOTTOM; SetWindowPos(m_ABD.hWnd, Flags, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end else
begin
if (State and ABS_ALWAYSONTOP) <> 0 then
SetWindowPos(m_ABD.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;
end;
//------------------------------------------------------------------------------
procedure TAppBar.ABSetAutoHide(Enabled: Boolean);
begin
if not (csDesigning in ComponentState) then
begin
if Enabled then m_ABD.lParam:= -1
else m_ABD.lParam:= 0; if SHAppBarMessage(ABM_SETAUTOHIDEBAR, m_ABD) <> 0 then
raise Exception.Create(SysErrorMessage(GetLastError()));
end;
end;
//------------------------------------------------------------------------------end.