主窗体以showmodal显示时,如何不在任务栏显示?(200分)

  • 主题发起人 主题发起人 lfp
  • 开始时间 开始时间
L

lfp

Unregistered / Unconfirmed
GUEST, unregistred user!
动态生成的主窗体以showmodal显示时,如何不在任务栏显示,只显示窗体?
 
应该使用一个API来设置窗体的风格,好象是SetWindowLong,
具体的参数忘记了,
 
好像不行...
 
AHandle为动态创建的窗口的句柄
SetWindowLong(AHandle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
你也可以重载窗口的CreateParams
private
; procedure CreateParams(var Params:TCreateParams);override;


procedure TForm1.CreateParams(var Params:TCreateParams);
begin
; inherited CreateParams(Params);
; Params.ExStyle:=Params.ExStyle or WS_EX_STYLE;
end;
 
同意楼上兄弟
 
AHandle为动态创建的窗口的句柄
SetWindowLong(AHandle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
你也可以重载窗口的CreateParams
private
; procedure CreateParams(var Params:TCreateParams);override;


procedure TForm1.CreateParams(var Params:TCreateParams);
begin
; inherited CreateParams(Params);
; Params.ExStyle:=Params.ExStyle or WS_EX_STYLE;
end;
 
在主窗口的OnShow事件里把Application隐藏掉就行了——

procedure TForm1.FormShow(Sender: TObject);
begin
; ShowWindow(Application.Handle, SW_HIDE);
end;
 
To: 5rain6sky
当将窗口最小化是Application Title还会出现的
 
to pcexplorer:
; ; 呵呵,确实是这样,加个补丁吧:)在主窗体上放一个TApplicationEvents,
把它的OnMinnimize(如果不放心,连OnActive等)都指向OnShow就可以了。

之所以提出不同意见是因为如果把主窗体加上工具栏的风格的话窗口的标题栏的外观就会受到影响。
实际上最好是在OnCreate里把Application加上工具栏风格——

procedure TForm1.FormCreate(Sender: TObject);
begin
; with Application do
; ; SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE)
; ; ; or WS_EX_TOOLWINDOW);
end;
 
sorry 更正一下 应该是
Params.ExStyle:=Params.ExStyle or WS_EX_TOOLWINDOW;
我把它打错了
 
我是把我的主程序放到其他程序的进程中运行,显示主窗口必须用showmodal.....所以以上方法不可行.
 
如果是这样的话,我想应该是不行的了.除非你调用的是Dll程序.
 
详细点,贴上部分辕马看看能否解决
 
就是把主程序做成DLL,然后插入其他程序中运行.
 
SetWindowLong(AHandle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
是可以的呀
AHandle是Dll中的窗口的句柄
你不会是把调用Dll的窗口的句柄传递给SetWindowLong了把
 
给你个例子这里不要SetWindowLong它自然就在任务栏没有标题
{Dll}

{
Copyright ?1998 by Delphi 4 Developer's Guide - Xavier Pacheco and Steve Teixeira
}

unit DLLFrm;

interface

uses
; SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
; Forms, Dialogs, Grids, Calendar;

type

; TDLLForm = class(TForm)
; ; calDllCalendar: TCalendar;
; ; procedure calDllCalendarDblClick(Sender: TObject);
; end;

{ Declare the export function }
function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime; StdCall;

implementation
{$R *.DFM}

function ShowCalendar(AHandle: THandle; ACaption: String): TDateTime;
var
; DLLForm: TDllForm;
begin
; // Copy application handle to DLL's TApplication object
; Application.Handle := AHandle;
; DLLForm := TDLLForm.Create(Application);
; try
; ; DLLForm.Caption := ACaption;
; ; DLLForm.ShowModal;
; ; Result := DLLForm.calDLLCalendar.CalendarDate; // Pass the date back in Result
; finally
; ; DLLForm.Free;
; end;
end;

procedure TDLLForm.calDllCalendarDblClick(Sender: TObject);
begin
; Close;
end;

end.


{Load Form}

{
Copyright ?1998 by Delphi 4 Developer's Guide - Xavier Pacheco and Steve Teixeira
}

unit MainFfm;

interface

uses
; SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
; Forms, Dialogs, StdCtrls;

type
; { First, define a procedural data type, this should reflect the
; ; procedure that is exported from the DLL. }
; TShowCalendar = function (AHandle: THandle; ACaption: String): TDateTime; StdCall;

; { Create a new exception class to refect a failed DLL load }
; EDLLLoadError = class(Exception);

; TMainForm = class(TForm)
; ; lblDate: TLabel;
; ; btnGetCalendar: TButton;
; ; procedure btnGetCalendarClick(Sender: TObject);
; end;

var
; MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.btnGetCalendarClick(Sender: TObject);
var
; LibHandle ; : THandle;
; ShowCalendar: TShowCalendar;
begin

; { Attempt to load the DLL }
; LibHandle := LoadLibrary('CALENDARLIB.DLL');
; try
; ; { If the load failed, LibHandle will be zero.
; ; ; If this occurs, raise an exception. }
; ; if LibHandle = 0 then
; ; ; raise EDLLLoadError.Create('Unable to Load DLL');
; ; { If the code makes it here, the DLL loaded successfully, now obtain
; ; ; the link to the DLL's exported function so that it can be called. }
; ; @ShowCalendar := GetProcAddress(LibHandle, 'ShowCalendar');
; ; { If the function is imported successfully, then set lblDate.Caption to reflect
; ; ; the returned date from the function. Otherwise, show the return raise
; ; ; an exception. }
; ; if not (@ShowCalendar = nil) then
; ; ; lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, Caption))
; ; else
; ; ; RaiseLastWin32Error; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; finally
; ; FreeLibrary(LibHandle); // Unload the DLL.
; end;
end;

end.
 
将Application的Handle一致就可以了,只作为一个程序了.
 
多人接受答案了。
 
多人接受答案了。
 

Similar threads

回复
0
查看
819
不得闲
回复
0
查看
995
不得闲
D
回复
0
查看
757
DelphiTeacher的专栏
D
D
回复
0
查看
731
DelphiTeacher的专栏
D
后退
顶部