2013-02-04 65 views
1

我試圖讓我的winForm解散爲對方,如Manhole。所有窗體都在屏幕中間打開。任何幫助將不勝感激。將WinForm解散爲另一種形式

這是我如何打開和目前接近形式:

private void storyChooser_Click(object sender, EventArgs e) 
{ 
    switch (userChoice) 
    { 
     case Choice.Son: 
      this.Close(); 
      form2.Show(); 
      form2.label1.Text = "Son has been choosen."; 
      break; 
     case Choice.Dad: 
      this.Close(); 
      form2.Show(); 
      form2.label1.Text = "Dad has been choosen."; 
      break; 
     case Choice.Mom: 
      this.Close(); 
      form2.Show(); 
      form2.label1.Text = "Mom has been Choosen."; 
      break; 
     default: 
      break; 
    } 
} 

要停止逼搶我有所有的形式運行,但沒有顯示,從一開始的應用程序。我無法獲得更有效的內存工作方式,所以我現在將其用作解決方案。

+0

你的問題是什麼? –

+0

您可以通過製作自己的表單類來顯示無邊框窗體並繪製自定義邊框來實現該效果。在「淡入淡出」時,您可以減少表單自定義邊框的不透明度,並在動畫完成後將子元素轉移到目標表單並關閉淡化表單。 這是一種奇怪的做法和一個完整的黑客,它可能更容易和更一致的切換到WPF和定義用戶控件,他們會很容易淡入和淡出 –

+0

看看:https:// code.google.com/p/dot-net-transitions/易於使用的滑動和淡入淡出過渡。 –

回答

1

你想要什麼叫做交叉淡入淡出。您拍攝一張圖像並將每個像素從一個圖像插入到另一個圖像。

這是直接做的。讓我們假設時間內從0(所有的第一圖像)到1.0(所有最後一個圖像)去,然後你會做這樣的事情:

public Color Lerp(Color c1, Color c2, float t) 
{ 
    return Color.FromArgb(Lerp(c1.R, c2.R, t), Lerp(c1.G, c2.G, t), Lerp(c1.B, c2.B, t)); 
} 

public int Lerp(int a, int b, float t) 
{ 
    float tp = 1.0f - t; 
    return (int)(tp * a + t * b); 
} 

你的過程將是:

  1. Render form1 to a bitmap
  2. 渲染窗口2爲位圖
  3. 分配臨時位圖
  4. 當t從0至1,由步進,說0.1,線性插值每(X,Y)Form1中的位圖和窗口2的位圖,並設置在該像素之間刮傷CH
  5. 顯示劃痕

現在,你可以寫這樣的代碼,你應該確保它的工作原理。如果表現足夠好,就讓它成爲。

我不認爲你實際上不想使用這段代碼(我寫的圖像處理代碼爲生)。在.NET中完成所有像素的開銷可能會讓你失望。你最好從位圖獲取原始字節字節,並對它們做lerp而不是get/get/set像素。此外,每個顏色分量的這三個浮點運算也會拖延你的操作,所以如果是我,我會在固定點執行工作,如果我使用字節進行操作的話。

0

第一:WinForms不是創建遊戲的最佳選擇。

但是,如果你想要或不得不爲此任務使用多種形式。

您可以在一個表單中創建多個面板,然後使用計時器操縱其不透明度。

如果你創建一個大型遊戲,你將不得不動態創建屏幕。

樣品

這裏有一個例子,你如何動態地創建控件。您可以開始爲不同的場景創建自己的控件(例如爲不同的問題答案提供n個組合框的控件)。然後,您可以開始通過步驟定義您的故事,然後每一步都會創建正確的控件,如「決定步驟」,提出問題並根據答案選擇下一步。

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     var newButton = new Button { Text = "Click me", Dock = DockStyle.Top }; 
     newButton.Click += new EventHandler(newButton_Click); 
     this.panel1.Controls.Add(newButton); 
    } 

    void newButton_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("I was clicked"); 
     var button = sender as Button; 
     button.Click -= new EventHandler(newButton_Click); 
     this.panel1.Controls.Remove(button); 
    } 
} 
+0

有沒有一種方法可以根據條件在窗格中創建控件?例如,按鈕和單選按鈕根據故事所在的位置而變化。 – ZeroPhase

+0

我已將代碼示例添加到我的答案中 – Stefan