2011-11-21 41 views
5

所以,我一直在嘗試創建一個AppBar程序。現在,程序本身其實很簡單,但我不得不從CodeProject項目中借用一些代碼來使其成爲AppBar。CreateParams.Style的可能值是多少?

所以,我的代碼如下:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    [StructLayout(LayoutKind.Sequential)] 
    struct RECT 
    { 
     public int left; 
     public int top; 
     public int right; 
     public int bottom; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    struct APPBARDATA 
    { 
     public int cbSize; 
     public IntPtr hWnd; 
     public int uCallbackMessage; 
     public int uEdge; 
     public RECT rc; 
     public IntPtr lParam; 
    } 

    enum ABMsg : int 
    { 
     ABM_NEW = 0, 
     ABM_REMOVE, 
     ABM_QUERYPOS, 
     ABM_SETPOS, 
     ABM_GETSTATE, 
     ABM_GETTASKBARPOS, 
     ABM_ACTIVATE, 
     ABM_GETAUTOHIDEBAR, 
     ABM_SETAUTOHIDEBAR, 
     ABM_WINDOWPOSCHANGED, 
     ABM_SETSTATE 
    } 
    enum ABNotify : int 
    { 
     ABN_STATECHANGE = 0, 
     ABN_POSCHANGED, 
     ABN_FULLSCREENAPP, 
     ABN_WINDOWARRANGE 
    } 
    enum ABEdge : int 
    { 
     ABE_LEFT = 0, 
     ABE_TOP, 
     ABE_RIGHT, 
     ABE_BOTTOM 
    } 

    private bool fBarRegistered = false; 
    private int uCallBack; 
    private int whereToPin; 

    [DllImport("SHELL32", CallingConvention = CallingConvention.StdCall)] 
    static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData); 
    [DllImport("USER32")] 
    static extern int GetSystemMetrics(int Index); 
    [DllImport("User32.dll", ExactSpelling = true, 
     CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
    private static extern bool MoveWindow 
     (IntPtr hWnd, int x, int y, int cx, int cy, bool repaint); 
    [DllImport("User32.dll", CharSet = CharSet.Auto)] 
    private static extern int RegisterWindowMessage(string msg); 

    private void RegisterBar() 
    { 
     APPBARDATA abd = new APPBARDATA(); 
     abd.cbSize = Marshal.SizeOf(abd); 
     abd.hWnd = this.Handle; 
     if (!fBarRegistered) 
     { 
      uCallBack = RegisterWindowMessage("AppBarMessage"); 
      abd.uCallbackMessage = uCallBack; 

      uint ret = SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd); 
      fBarRegistered = true; 

      ABSetPos(); 
     } 
     else 
     { 
      SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd); 
      fBarRegistered = false; 
     } 
    } 

    private void ABSetPos() 
    { 
     APPBARDATA abd = new APPBARDATA(); 
     abd.cbSize = Marshal.SizeOf(abd); 
     abd.hWnd = this.Handle; 
     abd.uEdge = whereToPin; 

     if (abd.uEdge == (int)ABEdge.ABE_LEFT || abd.uEdge == (int)ABEdge.ABE_RIGHT) 
     { 
      abd.rc.top = 0; 
      abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height; 
      if (abd.uEdge == (int)ABEdge.ABE_LEFT) 
      { 
       abd.rc.left = 0; 
       abd.rc.right = Size.Width; 
      } 
      else 
      { 
       abd.rc.right = SystemInformation.PrimaryMonitorSize.Width; 
       abd.rc.left = abd.rc.right - Size.Width; 
      } 

     } 
     else 
     { 
      abd.rc.left = 0; 
      abd.rc.right = SystemInformation.PrimaryMonitorSize.Width; 
      if (abd.uEdge == (int)ABEdge.ABE_TOP) 
      { 
       abd.rc.top = 0; 
       abd.rc.bottom = Size.Height; 
      } 
      else 
      { 
       abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height; 
       abd.rc.top = abd.rc.bottom - Size.Height; 
      } 
     } 

     SHAppBarMessage((int)ABMsg.ABM_QUERYPOS, ref abd); 

     switch (abd.uEdge) 
     { 
      case (int)ABEdge.ABE_LEFT: 
       abd.rc.right = abd.rc.left + Size.Width; 
       break; 
      case (int)ABEdge.ABE_RIGHT: 
       abd.rc.left = abd.rc.right - Size.Width; 
       break; 
      case (int)ABEdge.ABE_TOP: 
       abd.rc.bottom = abd.rc.top + 100; 
       break; 
      case (int)ABEdge.ABE_BOTTOM: 
       abd.rc.top = abd.rc.bottom - Size.Height; 
       break; 
     } 

     SHAppBarMessage((int)ABMsg.ABM_SETPOS, ref abd); 
     MoveWindow(abd.hWnd, abd.rc.left, abd.rc.top, 
       abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, true); 
    } 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg == uCallBack) 
     { 
      switch (m.WParam.ToInt32()) 
      { 
       case (int)ABNotify.ABN_POSCHANGED: 
        ABSetPos(); 
        break; 
      } 
     } 

     base.WndProc(ref m); 
    } 

    protected override System.Windows.Forms.CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.Style &= (~0x00C00000); // WS_CAPTION 
      cp.Style &= (~0x00800000); // WS_BORDER 
      cp.ExStyle = 0x00000080 | 0x00000008; // WS_EX_TOOLWINDOW | WS_EX_TOPMOST 
      return cp; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     whereToPin = (int)ABEdge.ABE_LEFT; 
     RegisterBar(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     whereToPin = (int)ABEdge.ABE_RIGHT; 
     RegisterBar(); 
    } 
} 

我的兩個問題是: 什麼是可能的值cp.Style以及如何做這些值的效果AppBar的顯示? (我指的代碼位於System.Windows.Forms.CreateParams覆蓋)

我看到它們是值(如〜0x00C00000),但我不知道它們如何超出這些特定的值,並可以似乎沒有發現任何不同的價值。

我是一個相當新穎的自我教學程序員,他通過舉例將他們塑造成我自己的用途。預先感謝您提供的任何幫助。

回答

相關問題