不知道大家有没有注意过,最大化状态的MDI子窗体切换(BringToFrot/Show)时能看到窗体边框的影子,视觉相当不舒服。
而“下一个 Ctrl+F6”切换时完全没有影子出现,非常安静。各位有没有方法解决?

解决方案 »

  1.   

    这个注意到了,我都是先把窗体属性改为正常后再切换,显示的时候窗体属性再改回来,算是权宜之计吧
    个人不太喜欢mdi方式,没啥有点!能不用就不用了
      

  2.   

    这样行不?
    LockWindowUpdate(主窗口Handle)
    ...//切换
    LockWindowUpdate(NULL)
      

  3.   

    我是這樣用的:(如果感覺這樣還達不到視覺的美觀,那麼只有將windowsupdate時lock,此時主窗體handle,當你切換後,update為null)...procedure Tsys_main_f.OpenModule(ModuleFormName: string);
    var
      iLoop: integer;
      iCount: integer;
      aHandle: THandle;
      aFormClass: TFormClass;
      aTempForm: TForm;
    begin
      iCount := 0;
      for iLoop := 0 to sys_main_f.MDIChildCount-1 do
      begin
        if UpperCase(sys_main_f.MDIChildren[iLoop].ClassName)=UpperCase(ModuleFormName) then
        begin
          inc(iCount);
          aHandle := sys_main_f.MDIChildren[iLoop].Handle;
          SendMessage(aHandle,WM_SYSCOMMAND,SC_MAXIMIZE,0);
          Break;
        end;
      end;
      if iCount=0 then
      begin
        aFormClass := TFormClass(GetClass(ModuleFormName));
        if aFormClass<>nil then
        begin
          aTempForm := aFormClass.Create(Application);
          aTempForm.WindowState := wsMaximized;
        end;
      end;
    end;
      

  4.   

    这是我根据“Ctrl+F6”想到的方法,已经很“安静”了,缺点是一般会触发两次子窗体激活事件,不过可以在第一次激活前关闭一下事件响应。
    procedure TForm1.TabControl1Change(Sender: TObject);
    var
      H: HWND;
    begin
      {获取要激活的窗体的句柄}
      H := (TabControl1.Tabs.Objects[TabControl1.TabIndex] as TForm).Handle
      FSwitch := False; {关闭事件响应}
      {激活下一个窗体}
      SendMessage(ClientHandle, WM_MDINEXT, H, 0);
      FSwitch := True;  {打开事件响应}
      {激活前一个窗体}
      SendMessage(ClientHandle, WM_MDINEXT, SendMessage(ClientHandle, WM_MDIGETACTIVE, 0, 0), 1);
      {结果激活了要激活的窗体}
    end;
      

  5.   

    发现一个更好的方法,在这里记录一下吧。procedure TForm1.TabControl1Change(Sender: TObject);
    var
      I: Integer;
      NextH: HWND;
    begin
      for I := 0 to MDIChildCount - 1 do
      begin
        if MDIChildren[I] = TabControl1.Tabs.Objects[TabControl1.TabIndex] then
        begin
          NextH := MDIChildren[(I + 1) mod MDIChildCount].Handle;
          SendMessage(ClientHandle, WM_MDINEXT, NextH, 1);
          Break;
        end;
      end;
    end;