2014-12-31 63 views
2

我想添加一個面板,當一個按鈕單擊。我的代碼在下面,我做到了。但現在我試圖把我的面板上的其他按鈕等,當你點擊第一個按鈕和麪板幻燈片中沒有任何我的新按鈕。在C中的動畫面板#

//Constants 
    const int AW_SLIDE = 0X40000; 
    const int AW_HOR_POSITIVE = 0X1; 
    const int AW_HOR_NEGATIVE = 0X2; 
    const int AW_BLEND = 0X80000; 

     [DllImport("user32")] 

     static extern bool AnimateWindow(IntPtr hwnd, int time, int flags); 
     photosflag=0; 

private void photosbutton_Click(object sender, EventArgs e) 
     { 
      if (photosflag == 0) 
      { 
       object O = Controller.Properties.Resources.ResourceManager.GetObject("photospressed"); 
       photosbutton.Image = (System.Drawing.Image)O; 
       photosflag = 1; 
       int ylocation = photosbutton.Location.Y; 
       //Set the Location 
       photospanel.Location = new Point(101, ylocation); 

       //Animate form 
       AnimateWindow(photospanel.Handle, 500, AW_SLIDE | AW_HOR_POSITIVE); 


      } 
      else 
      { 
       object O = Controller.Properties.Resources.ResourceManager.GetObject("photos"); 
       photosbutton.Image = (System.Drawing.Image)O; 
       photosflag = 0; 
       photospanel.Visible = false; 

      } 


     } 

在photospanel中,我有三個圖片框。但是當面板顯示(滑入)圖片框時,不存在。

+0

我不跟着你完全 - 你說,該小組已經在設計器中創建,但只有在您點擊按鈕之前不可見?如果是這樣,你確定其他控件是否真的包含在面板中? - 如果您在設計師中移動面板,那麼子控件是否隨其移動? –

+0

是的。子控件隨面板一起移動。當我啓動應用程序時,可見面板爲false ...當您單擊按鈕時面板可見,但子控件不可見(帶動畫面板)。如果我只寫panel.Visible = true沒有動畫,它顯示我的子控件 – NickName

+0

有趣。我對AnimateWindow api沒有什麼瞭解,但它似乎對WinForms不太好。你的動畫只是將它推入位置?如果是這樣,你不能寫你自己的.NET代碼來做到這一點嗎?你可以使用一個計時器來遞增地移動它的位置 - 對嗎? –

回答

5

好 - 在這裏是不依賴於AnimateWindow API函數一個非常簡單的例子:

添加一個Timer控件到窗體。在我的,我設置的時間間隔爲10(毫秒)。你可以用這個值發揮理順必要動畫

我有形式

我聲明的形式對下列私有成員上的按鈕和麪板(不可見) - 他們是開始X位置面板,端部位置,並且像素到每增量移動的數量 - 再次,調整以影響速度/平滑度/等

private int _startLeft = -200; // start position of the panel 
private int _endLeft = 10;  // end position of the panel 
private int _stepSize = 10;  // pixels to move 

然後點擊按鈕,啓用定時器:

animationTimer.Enabled = true; 

最後,在計時器滴答事件的代碼,使面板可見,它的動作到位,並在完成後自行禁用:

private void animationTimer_Tick(object sender, EventArgs e) 
{ 
    // if just starting, move to start location and make visible 
    if (!photosPanel.Visible) 
    { 
     photosPanel.Left = _startLeft; 
     photosPanel.Visible = true; 
    } 

    // incrementally move 
    photosPanel.Left += _stepSize; 
    // make sure we didn't over shoot 
    if (photosPanel.Left > _endLeft) photosPanel.Left = _endLeft; 

    // have we arrived? 
    if (photosPanel.Left == _endLeft) 
    { 
     animationTimer.Enabled = false; 
    }    
}