如何让子窗体只能最大化和最小化! ( 积分: 20 )

  • 主题发起人 主题发起人 新来的菜鸟
  • 开始时间 开始时间

新来的菜鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
如何让子窗体只能最大化和最小化!
 
WindowState := wsMaximized 最大化
WindowState := wsMinimized 最下化

根据需要控制窗体最大化最小化按钮
 
to xiaxia421
呵,我的意思是只能让窗体最大化和最小化,也就是说不能让窗体的既不是最大化也不是最小化的状态出现
 
设计状态
窗体属性
WindowState置为wsMaximized
BorderIcons置为[biSystemMenu,biMinimize]
 
to 银雨辰
不好意思我忘了说,那个窗体是动态创建的子窗体,也就是说当子窗体最最大化和最小化的时候能把哪个恢复的按钮屏蔽掉,就可以了,但如何屏蔽请大哥们告知!!
 
窗体动态创建后
对窗体属性赋值
WindowState:=wsMaximized
BorderIcons:=[biSystemMenu,biMinimize]
 
to 银雨辰
还是有恢复的按钮呀!麻烦再帮看看!
 
procedure TForm1.FormPaint(Sender: TObject);
begin
if WindowState <> wsMinimized then
WindowState := wsMaximized;
Refresh;
end;
 
to 银雨辰
呵按照你说的
窗体动态创建后
对窗体属性赋值
WindowState:=wsMaximized
BorderIcons:=[biSystemMenu,biMinimize]
并在dll子窗体里加上
procedure TForm1.FormPaint(Sender: TObject);
begin
if WindowState <> wsMinimized then
WindowState := wsMaximized;
Refresh;
end;

但还是有恢复的按钮呀!!
 
你动态创建窗口 是怎么个创建法?
 
BorderStyle -> bsSingle
是不是这个?
 
是调用dll窗体的
调用代码
function TForm1.Dllfrmshow(frm:integer;dllname:string):boolean;
type
Windowmax= function :boolean;stdcall;
openform =function (pbase:basemsg):Thandle;
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
Tf:Windowmax;
Tf2:openform;
Tp,Tp2:TFarProc;
begin

if DllHandle_rk[frm] = 0 then
begin


DllHandle_rk[frm] :=LoadLibrary(PChar(extractfilepath(application.ExeName)+'dll/'+dllname));
if DllHandle_rk[frm] = 0 then
begin
showmessage('调入失败!');
exit;
end;
Windowsid:=frm;
//////////////////////载入函数


//////////////////////载入函数

//DllHandle_rk[frm]:= DLLHandle;
try
if DllHandle_rk[frm] <> 0 then
begin
@DLLSub := GetProcAddress(DllHandle_rk[frm], 'CreateDLLForm');
if Assigned(DLLSub) then
DLLForm := DLLSub(Application, Screen);



////////////////////传递pbase类给dll
Tp2:=GetProcAddress(DllHandle_rk[frm],PChar('openform')); /////open dll函数
Pbase.userid :='yzl';
Pbase.phandle:=Handle;
Pbase.Windowsid:=frm;
if Tp2<>nil
then
begin
Tf2:=openform(Tp2);
Tf2(pbase);
end;
////////////////////传递pbase类给dll
end;
except
FreeLibrary(DllHandle_rk[frm]);
end;



end
else
begin
Windowsid:=frm;
Tp:=GetProcAddress(DllHandle_rk[frm],PChar('Windowmax')); ////窗口最大化函数
if Tp<>nil
then
begin
Tf:=Windowmax(Tp);
Tf();
end;
end;
end;
 
那要看DLL内 Form了
 
这是dll
library prjDLL;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Forms,
Windows,
Messages,
Classes,
DLLFormUnit in 'DLLFormUnit.pas' {frmDLLForm},
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
DLLApp: TApplication;
DLLScr: TScreen;


function CreateDLLForm(App: TApplication; Scr: TScreen):TForm;
var
ptr:PLongInt;
begin
Application := App;
Screen := Scr;
Application.CreateForm(TfrmDLLForm, frmDLLForm);
Application.CreateForm(TForm1, Form1);
result:=frmDLLForm;
end;

procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
end;
end;


exports
CreateDLLForm,save,Windowmax,openform;

begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;

end.


这是dll调用时候所触发的函数
function openform(pbase:basemsg):Thandle;
begin
fhandle:=pbase.phandle;
puserid:=pbase.userid;
Windowsid:=pbase.Windowsid;
BitBtn_Control:='11111111111';
SendMessage(fhandle,WM_ModifyAB,0,Integer(BitBtn_Control));
{frmDLLForm.WindowState:=wsMaximized;
frmDLLForm.BorderIcons:=[biSystemMenu,biMinimize]; }
end;
 
对DLL内 TfrmDLLForm
在设计期间进行设置:

WindowState置为wsMaximized
BorderIcons置为[biSystemMenu,biMinimize]

procedure TfrmDLLForm.FormPaint(Sender: TObject);
begin
if WindowState <> wsMinimized then
WindowState := wsMaximized;
Refresh;
end;
 
to 银雨辰
呵,你说的我已经试过了,好象还是不行

但我在dll里的最大化和最小化的事件里写了个付值
procedure TfrmDLLForm.WMSysCommand(var Msg: TMessage);
begin
case Msg.WParam of
SC_MINIMIZE:frmDLLForm.BorderIcons:=[biSystemMenu,biMaximize]; //最小化时候只让他有最大化按钮,这个已经成功了
SC_MAXIMIZE: frmDLLForm.BorderIcons:=[biSystemMenu,biMinimize];//最大化时候只让他有最小化按钮,这个没成功,为啥最大化时窗体的恢复按钮总是屏蔽不掉呢?
inherited;
end;
 
恢复按钮 和 最大化按钮 是一对啊
当最大化时,在最大化按钮位置显示的是恢复按钮
当非最大化(最小化)时 最大化按钮 位置显示的是 最大化按钮

要达到你说的效果可能不太容易...
 
to 银雨辰
呵,这个我知道,所以在窗体最大化的时候我只复了最小化的值给窗体呀,但为什么恢复按钮还在呢(最大化按钮变成恢复按钮这个我知道)?最小化时我只把最大化复给了窗体但这个又成功了,他把恢复按钮变成灰色了!这是为何,不解!!
 
接管消息,然后把不想要的扔掉就可以了。
 
你不要赋值试试!
 

Similar threads

后退
顶部