TO LiChaoHui:
问题继续,我用下面的过程想实现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是怎么处理的?
我得自己处理了,像最大化,最小化等...
另,我加上的菜单项前面没有系统默认的图标,像关闭前有个×的图标,应该怎么加来着?