轻
轻舞肥羊
Unregistered / Unconfirmed
GUEST, unregistred user!
//发现DELPHI的窗体ShowModal有很多不尽人意的地方,
//功力太浅,改VCL源码也没有实现我想达到的效果.
//用其它方法也试了,总是达不到完美,看有没有哪位已经做到了
//覆盖TCustomForm的ShowModal方法
//可能还要覆盖CreateParams方法
function ShowModal:Integer;override;
function TBaseForm.ShowModal: Integer;
begin
//
end;
//要求达到的效果:
//1.ShowModal后,点击任务栏上的应用程序按钮可以把应用程序最小化
//2.ShowModal后,ShowModal窗口有最小化按钮,按下可以最小化整个应用程序
//3.不影响正常使用,尽量不用其它地方配合,只在一个基类中完成
//4.最重要的一点,分数不是问题~呵呵
上面的问题解决,但还有些不近人意的地方...请看
ShowModal后,我用下面的过程想实现Application的菜单与当前活动窗体的菜单一致.
procedure TFrmBase.UpdateApplicationMenu;
var
i : Integer;
iCount : Integer;
hMenu : HWND;
psMenu : array[0..MAXBYTE] of char;
uFlags : Integer;
begin
hMenu := GetSystemMenu(Application.Handle,False);
iCount := GetMenuItemCount(hMenu);
for i := 0 to iCount - 1 do
DeleteMenu(hMenu,0,MF_BYPOSITION);
hMenu := GetSystemMenu(Handle,False);
iCount := GetMenuItemCount(hMenu);
for i := 0 to iCount - 1 do
begin
GetMenuString(hMenu,i,psMenu,MAXBYTE,MF_BYPOSITION);
if StrPas(psMenu) = '' then
uFlags := MF_SEPARATOR
else
uFlags := MF_BYCOMMAND;
AppendMenu(
GetSystemMenu(Application.Handle,False),
uFlags,
GetMenuItemID(hMenu,i),
psMenu);
end;
end;
另,syAppHandler单元的主过程改为成如下
function NewWndProc(
Handle : HWND;
Msg : Integer;
wParam : Longint;
lParam : Longint
):Longint
stdcall;
begin
Result := 0;
if Msg = WM_SYSCOMMAND then
begin
case wParam of
SC_MINIMIZE : //最小化消息
begin
if Assigned(Screen.ActiveForm) then
SetWindowPos(
Application.Handle,
Screen.ActiveForm.Handle,
Screen.ActiveForm.Left,
Screen.ActiveForm.Top,
Screen.ActiveForm.Width,
0,SWP_SHOWWINDOW);
DefWindowProc(Application.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
end;
SC_RESTORE : //还原消息
begin
if Assigned(Screen.ActiveForm) then
SetWindowPos(
Application.Handle,
Screen.ActiveForm.Handle,
Screen.ActiveForm.Left,
Screen.ActiveForm.Top,
Screen.ActiveForm.Width,
0,SWP_SHOWWINDOW);
DefWindowProc(Application.Handle,WM_SYSCOMMAND,SC_RESTORE,0);
end;
SC_CLOSE : //关闭消息
if (Application.MainForm = nil) and Assigned(Screen.ActiveForm) then
Screen.ActiveForm.Close
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
else //其它默认消息
if Assigned(Screen.ActiveForm) then
if Screen.ActiveForm.FormStyle <> fsMDIChild then
Result := DefWindowProc(
Screen.ActiveForm.Handle,WM_SYSCOMMAND,wParam,lParam)
else
Result := DefWindowProc(
Application.MainForm.Handle,WM_SYSCOMMAND,wParam,lParam)
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end
//case
end
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;
我在工程中MDI主窗体建立之前SHOW了一个登录窗体,所有动作都正常,也自动更新
但建立了主窗体(MDI)后,菜单的Enabled不更新了.
现在我想知道,更新系统菜单的Enabled是什么消息?TApplication是怎么处理的?
我得自己处理了,像最大化,最小化等...
另,我加上的菜单项前面没有系统默认的图标,像关闭前有个×的图标,应该怎么加来着?
//功力太浅,改VCL源码也没有实现我想达到的效果.
//用其它方法也试了,总是达不到完美,看有没有哪位已经做到了
//覆盖TCustomForm的ShowModal方法
//可能还要覆盖CreateParams方法
function ShowModal:Integer;override;
function TBaseForm.ShowModal: Integer;
begin
//
end;
//要求达到的效果:
//1.ShowModal后,点击任务栏上的应用程序按钮可以把应用程序最小化
//2.ShowModal后,ShowModal窗口有最小化按钮,按下可以最小化整个应用程序
//3.不影响正常使用,尽量不用其它地方配合,只在一个基类中完成
//4.最重要的一点,分数不是问题~呵呵
上面的问题解决,但还有些不近人意的地方...请看
ShowModal后,我用下面的过程想实现Application的菜单与当前活动窗体的菜单一致.
procedure TFrmBase.UpdateApplicationMenu;
var
i : Integer;
iCount : Integer;
hMenu : HWND;
psMenu : array[0..MAXBYTE] of char;
uFlags : Integer;
begin
hMenu := GetSystemMenu(Application.Handle,False);
iCount := GetMenuItemCount(hMenu);
for i := 0 to iCount - 1 do
DeleteMenu(hMenu,0,MF_BYPOSITION);
hMenu := GetSystemMenu(Handle,False);
iCount := GetMenuItemCount(hMenu);
for i := 0 to iCount - 1 do
begin
GetMenuString(hMenu,i,psMenu,MAXBYTE,MF_BYPOSITION);
if StrPas(psMenu) = '' then
uFlags := MF_SEPARATOR
else
uFlags := MF_BYCOMMAND;
AppendMenu(
GetSystemMenu(Application.Handle,False),
uFlags,
GetMenuItemID(hMenu,i),
psMenu);
end;
end;
另,syAppHandler单元的主过程改为成如下
function NewWndProc(
Handle : HWND;
Msg : Integer;
wParam : Longint;
lParam : Longint
):Longint
stdcall;
begin
Result := 0;
if Msg = WM_SYSCOMMAND then
begin
case wParam of
SC_MINIMIZE : //最小化消息
begin
if Assigned(Screen.ActiveForm) then
SetWindowPos(
Application.Handle,
Screen.ActiveForm.Handle,
Screen.ActiveForm.Left,
Screen.ActiveForm.Top,
Screen.ActiveForm.Width,
0,SWP_SHOWWINDOW);
DefWindowProc(Application.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
end;
SC_RESTORE : //还原消息
begin
if Assigned(Screen.ActiveForm) then
SetWindowPos(
Application.Handle,
Screen.ActiveForm.Handle,
Screen.ActiveForm.Left,
Screen.ActiveForm.Top,
Screen.ActiveForm.Width,
0,SWP_SHOWWINDOW);
DefWindowProc(Application.Handle,WM_SYSCOMMAND,SC_RESTORE,0);
end;
SC_CLOSE : //关闭消息
if (Application.MainForm = nil) and Assigned(Screen.ActiveForm) then
Screen.ActiveForm.Close
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
else //其它默认消息
if Assigned(Screen.ActiveForm) then
if Screen.ActiveForm.FormStyle <> fsMDIChild then
Result := DefWindowProc(
Screen.ActiveForm.Handle,WM_SYSCOMMAND,wParam,lParam)
else
Result := DefWindowProc(
Application.MainForm.Handle,WM_SYSCOMMAND,wParam,lParam)
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end
//case
end
else
Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;
我在工程中MDI主窗体建立之前SHOW了一个登录窗体,所有动作都正常,也自动更新
但建立了主窗体(MDI)后,菜单的Enabled不更新了.
现在我想知道,更新系统菜单的Enabled是什么消息?TApplication是怎么处理的?
我得自己处理了,像最大化,最小化等...
另,我加上的菜单项前面没有系统默认的图标,像关闭前有个×的图标,应该怎么加来着?