窗体的怪问题,百思不解(35分)

  • 主题发起人 主题发起人 笑面虎
  • 开始时间 开始时间

笑面虎

Unregistered / Unconfirmed
GUEST, unregistred user!
怪了,我一程序,有一个main窗体和一个一般窗体,但我最小化一般窗体时main也
最小化了.(反之仍如此)
解决了就给分!
 
是不是你的把另一个窗体设成MainForm了?
 
在要最小话的窗体上放上这个控件。然后看看。[:)]
{*******************************************************}
{ }
{ 程序的最小化控件 }
{ }
{ 编制: Zecos Software team }
{ http://www.zecos.com }
{ support@zecos.com }
{ }
{ 收集人:yzhshi 收集日期:2002-06-07 }
{ }
{ }
{*******************************************************}


unit MinModal;


interface

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

type
TMinModal = class(TComponent)
private
Form: TForm;
OldModalWndProc: Pointer;
InstanceModalWndProc: Pointer;
FOnMinimize: TNotifyEvent;
protected
procedure ModalWndProc(var Message: TMessage); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnMinimize: TNotifyEvent read FOnMinimize write FOnMinimize;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Custom', [TMinModal]);
end;

{ TMinModal }

constructor TMinModal.Create(AOwner: TComponent);
var
Component: TComponent;
begin
inherited Create(AOwner);

if not (csDesigning in ComponentState) then
begin
Component := Owner;
while Assigned(Component) and not (Component is TForm) do
Component := Component.Owner;
if not Assigned(Component) then
Exit;
Form := Component as TForm;

if (not (csDesigning in ComponentState)) then
begin
InstanceModalWndProc := MakeObjectInstance(ModalWndProc);
OldModalWndProc := Pointer(GetWindowLong(Form.Handle, GWL_WNDPROC));
SetWindowLong(Form.Handle, GWL_WNDPROC, Longint(InstanceModalWndProc));
end;
end;
end;

destructor TMinModal.Destroy;
begin
if Assigned(InstanceModalWndProc) then
begin
SetWindowLong(Form.Handle, GWL_WNDPROC, Longint(OldModalWndProc));
FreeObjectInstance(InstanceModalWndProc);
InstanceModalWndProc := nil;
end;
inherited Destroy;
end;

procedure TMinModal.ModalWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_SYSCOMMAND:
begin
if Message.WParam = SC_MINIMIZE then
begin
if Assigned(FOnMinimize) then
FOnMinimize(Self);
ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
Exit;
end;
end;
WM_DESTROY:
begin
if Assigned(InstanceModalWndProc) then
begin
SetWindowLong(Form.Handle, GWL_WNDPROC, Longint(OldModalWndProc));
FreeObjectInstance(InstanceModalWndProc);
InstanceModalWndProc := nil;
end;
end;
WM_ACTIVATE:
begin
if Message.WParamLo <> WA_INACTIVE then
begin
ShowWindow(Application.Handle, SW_SHOWNORMAL);
// Exit;
end;
end;
end;

Message.Result := CallWindowProc(OldModalWndProc, Form.Handle, Message.Msg, Message.WParam, Message.LParam);
end;

end.
 
你那一般窗体是Alwaystop?
 
一般来说是你自己哪里设置出了问题,仔细再看看
 
你看看你的dpr文件,是不是把mainform和另一个form的顺序搞反了?application认为先
create的是mainform。
 
我的一般窗体最小化不是到任务栏,而缩为只剩标题栏.
谁先解决就给分![?]
 
急!谁解决了就给,不够再加!!
 
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent:=GetDesktopWindow;
end;一般窗体
 
你再编一个简单的试试,根本就不象的说的那样。
但我最小化一般窗体时主窗体根本不最小化,并且就是按你要求的
一般窗体最小化不是到任务栏,而缩为只剩标题栏.

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Show;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
form2.WindowState :=wsMinimized;
end;

 
to 笑面虎。说实话。俺没有看懂你的需求。
>>怪了,我一程序,有一个main窗体和一个一般窗体,但我最小化一般窗体时main也
>>最小化了.(反之仍如此)
你是要实现Main窗体和其他窗体同时最小化还是要能够单独最小化?目前是什么样子的?

>>我的一般窗体最小化不是到任务栏,而缩为只剩标题栏.
你说的意思是目前一般窗体(非主窗体)最小化的实际情况吧,这个很正常。

如果你要实现最小化其中一个,那么就将整个程序最小化,那么你可以看一下我上面提供的控件,那个很好用的。
比如你有Form1和Form2两个窗体,其中Form1为主窗体,你在 form2上放置一个MinModal控件,
然后你最小化任何一个窗体,那么真个程序都最小化到任务栏上了。
 
可能我的意思没说清楚.我指的是使main窗体最小化时那个非mainform不跟着最小化.
 
mainform.hide;
 
就像超级解霸一样.视频窗体和主窗体都可单独最小化,我就是想实现这样的功能.
大家帮帮!分不够再加!!
 
仔细看看,肯定是设置问题
 
ShowWindow(Application.Handle,SW_MINIMIZE);
Form2.Show;
最小化整个程序用Application.Handle
 
示例如下:

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := 0; //不随主窗体的最小化而最小化
end;

procedure TForm2.FormCreate(Sender: TObject);
var
ExtendedStyle: Integer;
begin
ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW
and not WS_EX_APPWINDOW); //不在任务栏显示
end;
 
超级结巴没有最小花,是使用了hide
 
后退
顶部