none
窗體的大小在win7下特效的開啟和關閉下不一致,代碼能解決這個問題嗎? RRS feed

  • 问题

  • 在WIN7下或者VISTA下打開窗體的特效時,和關閉特效(類似2000的經典界面)時,窗體的大小不一致,請問怎麼樣解決這個問題呢?

    2011年1月25日 16:29

答案

  • 你好 Brantx,

    在C#代码中调用win api需要一点p/invoke的知识,所以如果你不懂p/invoke技术的话,我建议你可以先看看下面的文档。

     

    在 C# 中通过 P/Invoke 调用Win32 DLL

     

    下面的代码只是一个简单的实现,希望可以给你一些灵感。

     

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          RECT rect = new RECT(50, 50, 850, 650);
          AdjustWindowRectEx(ref rect, WS_BORDER, true, 0);
          this.Left = rect._Left;
          this.Top = rect._Top;
          this.Width = rect._Right - rect._Left;
          this.Height = rect._Bottom - rect._Top;
        }
    
        const uint WS_BORDER = 0x00800000;
        [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool AdjustWindowRectEx(ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle);
    
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct RECT
        {
          public int _Left;
          public int _Top;
          public int _Right;
          public int _Bottom;
    
          public RECT(int _Left, int _Top, int _Right, int _Bottom)
          {
            this._Left = _Left;
            this._Top = _Top;
            this._Right = _Right;
            this._Bottom = _Bottom;
          }
        }
      }
    }
    

    AdjustWindowRectEx Function

    Window Styles

     


     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Brantx 2011年2月2日 8:15
    2011年2月2日 4:23
    版主

全部回复

  • 当然不一样,有边框呀,计算大小用ClientSize
    http://feiyun0112.cnblogs.com/
    2011年1月26日 6:41
    版主
  • 對,特效打開和關閉的時候有個邊框的差值,怎麼解決這個差值呢.

    或者說有沒有辦法判斷是否開了特效,我就能手動的設置.


    我是外星人.
    2011年1月26日 7:02
  • dear
    不同的OS会有不同的主题风格,所以窗体及控件的显示都会有些不同,比如说颜色,大小等等,如果你的软体要发布,总不能要求客户都要用相同的主题风格吧,如果不要套用主题风格,视窗画面又很醜,所以目前我尚未找到解决之道。
    http://Files.Dotblogs.com.tw/yc421206/1101/20111271160254.png
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年1月27日 3:07
  • 是,所以現在等於是說,如果我要在每個OS下每個theme下都要做到size合理的顯示的話,我要麼自己做個界面,否則是沒辦法了?


    我是外星人.
    2011年1月27日 3:59
  • 用这个windows api:http://msdn.microsoft.com/en-us/library/ms632667(v=VS.85).aspx

    输入想要的客户区大小,返回实际应该的窗口大小。

    2011年1月27日 16:41
  • 沒錯,就是這個了,但是我不會很具體的實現,請問有demo之類的嗎?


    我是外星人.
    2011年1月27日 17:07
  • 你好 Brantx,

    在C#代码中调用win api需要一点p/invoke的知识,所以如果你不懂p/invoke技术的话,我建议你可以先看看下面的文档。

     

    在 C# 中通过 P/Invoke 调用Win32 DLL

     

    下面的代码只是一个简单的实现,希望可以给你一些灵感。

     

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          RECT rect = new RECT(50, 50, 850, 650);
          AdjustWindowRectEx(ref rect, WS_BORDER, true, 0);
          this.Left = rect._Left;
          this.Top = rect._Top;
          this.Width = rect._Right - rect._Left;
          this.Height = rect._Bottom - rect._Top;
        }
    
        const uint WS_BORDER = 0x00800000;
        [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool AdjustWindowRectEx(ref RECT lpRect, uint dwStyle, bool bMenu, uint dwExStyle);
    
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct RECT
        {
          public int _Left;
          public int _Top;
          public int _Right;
          public int _Bottom;
    
          public RECT(int _Left, int _Top, int _Right, int _Bottom)
          {
            this._Left = _Left;
            this._Top = _Top;
            this._Right = _Right;
            this._Bottom = _Bottom;
          }
        }
      }
    }
    

    AdjustWindowRectEx Function

    Window Styles

     


     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Brantx 2011年2月2日 8:15
    2011年2月2日 4:23
    版主
  • ThanX so much...
    我是外星人.
    2011年2月2日 8:15
  • You're welcome!

     

    Have a nice day!

     

     


    Mike [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年2月4日 2:31
    版主