2009-08-29 53 views
2

我爲我的安裝項目創建了一個自定義操作,併成功實現了一個窗體,顯示我的安裝中的下載步驟的進度條(我在自定義操作代碼中使用了WebClient)。所以我有兩個相互關聯的問題。設置應用程序中的進度條

  1. 有什麼辦法,以顯示在主設置窗口下載進度條,而不是創建一個單獨的表格,我顯示爲我做了什麼?我更喜歡這個。

  2. 如果不是,那麼當我調用form.ShowDialog()時,我能做些什麼來使窗體顯示在實際設置窗口的前面?我還在它上面調用了BringToFront(),它也不起作用。它在那裏,但它總是在主設置窗口後面。似乎必須有一些方法來獲得正確的Z順序。

感謝您的幫助。

回答

0

因此,我放棄了將進度條集成到實際安裝程序屏幕的想法,但是讓Windows窗體顯示在頂部所需要的只是簡單的荒謬。我必須得到安裝程序窗口的句柄並將其發送到後臺,因爲向前移動進度條窗口根本不起作用。我現在已經轉向Mac開發,所以回到這只是令人沮喪。我記得認爲C#.NET非常酷。它沒有Cocoa/Objective-C。

真氣生氣,有一種叫做BringToFront()的方法,它簡單地忽略了你。爲什麼我必須下載到Windows API代碼才能完成像管理Z-Order一樣基本的GUI? Z順序?真的嗎?

如果你想知道,這是我落得這樣做(通過谷歌):

[DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
public static extern bool SetWindowPos(
     IntPtr hWnd, // window handle 
     IntPtr hWndInsertAfter, // placement-order handle 
     int X, // horizontal position 
     int Y, // vertical position 
     int cx, // width 
     int cy, // height 
     uint uFlags); // window positioning flags 

public const uint SWP_NOSIZE = 0x1; 
public const uint SWP_NOMOVE = 0x2; 
public const uint SWP_SHOWWINDOW = 0x40; 
public const uint SWP_NOACTIVATE = 0x10; 

[DllImport("user32.dll", EntryPoint = "GetWindow")] 
public static extern IntPtr GetWindow(
     IntPtr hWnd, 
     uint wCmd); 

public const uint GW_HWNDFIRST = 0; 
public const uint GW_HWNDLAST = 1; 
public const uint GW_HWNDNEXT = 2; 
public const uint GW_HWNDPREV = 3; 

public static void ControlSendToBack(IntPtr control) 
{ 
    bool s = SetWindowPos(
      control, 
      GetWindow(control, GW_HWNDLAST), 
      0, 0, 0, 0, 
      SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 
} 

我得到一個處理安裝程序窗口,然後調用ControlSendToBack()就可以了。它的工作原理,但它發送到後面。我嘗試了另一種方法,將它發回一個位置,但這也不起作用。 Windows編程 - 和1995年一樣好。很酷。