none
C#視窗跑馬燈 RRS feed

  • 問題

  • 最近開始學C#的視窗
    老師說要做一個跑馬燈在視窗中上左下右的跑(依視窗大小)
    我會做上下跟左右
    但是上左下右一直做不出來
    不知道有沒有人能幫忙?
    這個程式碼會跑上 再跑左 但是之後就卡在視窗左上角不動了
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;

    namespace cs_跑馬燈
    {
    /// <summary>
    /// Form1 的摘要描述。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    internal System.Windows.Forms.Label lblTitle;
    internal System.Windows.Forms.Label lblDirection;
    internal System.Windows.Forms.Label lblMsg;
    internal System.Windows.Forms.Label lblLocation;
    internal System.Windows.Forms.Timer timer1;
    private System.ComponentModel.IContainer components;

    public Form1()
    {
    //
    // Windows Form 設計工具支援的必要項
    //
    InitializeComponent();

    //
    // TODO: 在 InitializeComponent 呼叫之後加入任何建構函式程式碼
    //
    }

    /// <summary>
    /// 清除任何使用中的資源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// 此為設計工具支援所必需的方法 - 請勿使用程式碼編輯器修改
    /// 這個方法的內容。
    /// </summary>
    private void InitializeComponent()
    {
    this.components = new System.ComponentModel.Container();
    this.lblTitle = new System.Windows.Forms.Label();
    this.lblDirection = new System.Windows.Forms.Label();
    this.lblMsg = new System.Windows.Forms.Label();
    this.lblLocation = new System.Windows.Forms.Label();
    this.timer1 = new System.Windows.Forms.Timer(this.components);
    this.SuspendLayout();
    //
    // lblTitle
    //
    this.lblTitle.AutoSize = true;
    this.lblTitle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255)))));
    this.lblTitle.Font = new System.Drawing.Font("新細明體", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(136)));
    this.lblTitle.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255)))));
    this.lblTitle.Location = new System.Drawing.Point(56, 16);
    this.lblTitle.Name = "lblTitle";
    this.lblTitle.Size = new System.Drawing.Size(175, 32);
    this.lblTitle.TabIndex = 11;
    this.lblTitle.Text = "跑馬燈實作";
    //
    // lblDirection
    //
    this.lblDirection.AutoSize = true;
    this.lblDirection.Location = new System.Drawing.Point(160, 88);
    this.lblDirection.Name = "lblDirection";
    this.lblDirection.Size = new System.Drawing.Size(33, 12);
    this.lblDirection.TabIndex = 10;
    this.lblDirection.Text = "label3";
    //
    // lblMsg
    //
    this.lblMsg.Location = new System.Drawing.Point(96, 152);
    this.lblMsg.Name = "lblMsg";
    this.lblMsg.Size = new System.Drawing.Size(96, 32);
    this.lblMsg.TabIndex = 8;
    this.lblMsg.Text = "label1";
    //
    // lblLocation
    //
    this.lblLocation.AutoSize = true;
    this.lblLocation.Location = new System.Drawing.Point(32, 88);
    this.lblLocation.Name = "lblLocation";
    this.lblLocation.Size = new System.Drawing.Size(33, 12);
    this.lblLocation.TabIndex = 9;
    this.lblLocation.Text = "label2";
    this.lblLocation.Click += new System.EventHandler(this.lblLocation_Click);
    //
    // timer1
    //
    this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
    //
    // Form1
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 15);
    this.ClientSize = new System.Drawing.Size(292, 266);
    this.Controls.Add(this.lblDirection);
    this.Controls.Add(this.lblLocation);
    this.Controls.Add(this.lblTitle);
    this.Controls.Add(this.lblMsg);
    this.Name = "Form1";
    this.Text = "Form1";
    this.Load += new System.EventHandler(this.Form1_Load);
    this.ResumeLayout(false);
    this.PerformLayout();

    }
    #endregion

    /// <summary>
    /// 應用程式的主進入點。
    /// </summary>
    [STAThread]
    static void Main()
    {
    Application.Run(new Form1());
    }

    bool runTop = true; // 跑馬燈方向朝上
    bool runLeft = true;

    private void Form1_Load(object sender, System.EventArgs e)
    {
    lblMsg.Location = new Point(75, 75);
    lblMsg.BackColor = Color.Aqua;
    lblMsg.AutoSize = true;
    lblMsg.Font = new System.Drawing.Font("標楷體", 20, FontStyle.Bold);
    lblMsg.Text = "全OK資訊網";
    timer1.Enabled = true;
    timer1.Interval = 10;
    }

    private void timer1_Tick(object sender, System.EventArgs e)
    {
    lblLocation.Text = "跑馬燈 位置:" + lblMsg.Top.ToString();

    if (runTop) // 上移
    {
    lblMsg.Top -= 1;
    lblDirection.Text = "目前方向 : 往上移";
    if (lblMsg.Top <= 0)
    runTop = false;
    }

    else if (runLeft)
    {
    lblMsg.Left -= 1;
    lblDirection.Text = "目前方向 : 往左移";
    if (lblMsg.Left <= 0)
    runLeft = false;

    }
    else if(runLeft)
    {
    lblMsg.Left += 1;
    lblDirection.Text = "目前方向 : 往右移 ";
    if (lblMsg.Left + lblMsg.Width >= this.Width)
    runLeft = false; //下移
    }
    else if (runTop)
    {
    lblMsg.Top += 1;
    lblDirection.Text = "目前方向 : 往下移 ";
    if (lblMsg.Top + lblMsg.Height + 1 >= this.Height - 30)
    runTop = false; //下移
    }

    }


    private void lblLocation_Click(object sender, EventArgs e)
    {

    }
    }
    }
    有人能幫忙嗎?
    2010年3月20日 下午 04:30

解答

  •         int intDir = 1;
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                this.textBox1.Text = "跑馬燈 位置:" + label1.Top.ToString() + "," + label1.Left.ToString();
    
                switch   (intDir )
                    {
                        case 1:
                            this.label1.Top -= 1;
                            this.textBox2.Text = "目前方向 : 往上移";
                            if (label1.Top <= 0)
                                intDir = 2;
                            break; 
    
                        case 2:
                            label1.Left -= 1;
                            textBox2.Text = "目前方向 : 往左移";
                            if (label1.Left <= 0)
                                intDir = 3;
                            break; 
    
                        case 3:
                            label1.Top += 1;
                            textBox2.Text = "目前方向 : 往下移 ";
                            if (label1.Top + label1.Height + 1 >= this.Height - 30)
                                intDir = 4;
                            break; 
    
                        case 4:
                            label1.Left += 1;
                            textBox2.Text = "目前方向 : 往右移 ";
                            if (label1.Left + label1.Width >= this.Width)
                                intDir = 1;
                            break; 
                    }
         
                }

    • 已標示為解答 楓紅葉 2010年3月22日 上午 08:24
    2010年3月21日 上午 01:11
  • if-else (C# 參考)

    http://msdn.microsoft.com/zh-tw/library/5011f09h.aspx

    switch (C# 參考)

    http://msdn.microsoft.com/zh-tw/library/06tc147t.aspx

    還是沒看懂喔,重點是四個方向狀態,if else if其實和switch意思一樣,請自行修改...

    • 已標示為解答 楓紅葉 2010年3月22日 上午 08:24
    2010年3月21日 下午 02:17

所有回覆

  • 1. if (runTop) // 上移

    2. else if (runLeft)

    3. else if(runLeft)

    4. else if (runTop)

     

    這樣看起來 1和4, 2和3的條件不是一樣的嗎 ? 4應該調整為 (runTop == flase) , 3應該調整為 (runLeft == false) 這樣吧 ?
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月20日 下午 05:06
    版主
  • 還是沒辦法耶~?

    是改這樣~

                if (runTop) // 上移
                {
                    lblMsg.Top -= 1;
                    lblDirection.Text = "目前方向 : 往上移";
                    if (lblMsg.Top <= 0)
                        runTop = false;
                }

                else if (runLeft)
                {
                    lblMsg.Left -= 1;
                    lblDirection.Text = "目前方向 : 往左移";
                    if (lblMsg.Left <= 0)
                        runLeft = false;

                }

                else if (runTop == false)
                {
                    lblMsg.Top += 1;
                    lblDirection.Text = "目前方向 : 往下移 ";
                    if (lblMsg.Top + lblMsg.Height + 1 >= this.Height - 30)
                        runTop = false; //下移
                }
                else if (runLeft==false)
                {
                    lblMsg.Left += 1;
                    lblDirection.Text = "目前方向 : 往右移 ";
                    if (lblMsg.Left + lblMsg.Width >= this.Width)
                        runLeft = true;            }

    這次是往上 往左 往下(跑出視窗範圍)

    感覺好像沒有讀到往右的那一段

    條件設錯嗎?

    2010年3月20日 下午 11:08
  •         int intDir = 1;
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                this.textBox1.Text = "跑馬燈 位置:" + label1.Top.ToString() + "," + label1.Left.ToString();
    
                switch   (intDir )
                    {
                        case 1:
                            this.label1.Top -= 1;
                            this.textBox2.Text = "目前方向 : 往上移";
                            if (label1.Top <= 0)
                                intDir = 2;
                            break; 
    
                        case 2:
                            label1.Left -= 1;
                            textBox2.Text = "目前方向 : 往左移";
                            if (label1.Left <= 0)
                                intDir = 3;
                            break; 
    
                        case 3:
                            label1.Top += 1;
                            textBox2.Text = "目前方向 : 往下移 ";
                            if (label1.Top + label1.Height + 1 >= this.Height - 30)
                                intDir = 4;
                            break; 
    
                        case 4:
                            label1.Left += 1;
                            textBox2.Text = "目前方向 : 往右移 ";
                            if (label1.Left + label1.Width >= this.Width)
                                intDir = 1;
                            break; 
                    }
         
                }

    • 已標示為解答 楓紅葉 2010年3月22日 上午 08:24
    2010年3月21日 上午 01:11
  • 以下是一個現成的跑馬燈範例:

    Marquee Label Host

    2010年3月21日 上午 04:43
  •         int intDir = 1;
    
    
    
            private void timer1_Tick(object sender, EventArgs e)
    
            {
    
                this.textBox1.Text = "跑馬燈 位置:" + label1.Top.ToString() + "," + label1.Left.ToString();
    
    
    
                switch   (intDir )
    
                    {
    
                        case 1:
    
                            this.label1.Top -= 1;
    
                            this.textBox2.Text = "目前方向 : 往上移";
    
                            if (label1.Top <= 0)
    
                                intDir = 2;
    
                            break; 
    
    
    
                        case 2:
    
                            label1.Left -= 1;
    
                            textBox2.Text = "目前方向 : 往左移";
    
                            if (label1.Left <= 0)
    
                                intDir = 3;
    
                            break; 
    
    
    
                        case 3:
    
                            label1.Top += 1;
    
                            textBox2.Text = "目前方向 : 往下移 ";
    
                            if (label1.Top + label1.Height + 1 >= this.Height - 30)
    
                                intDir = 4;
    
                            break; 
    
    
    
                        case 4:
    
                            label1.Left += 1;
    
                            textBox2.Text = "目前方向 : 往右移 ";
    
                            if (label1.Left + label1.Width >= this.Width)
    
                                intDir = 1;
    
                            break; 
    
                    }
    
         
    
                }
    
    


    感謝~~參考(抄)過您的程式碼之後成功執行了!!

    不過這是用 switch 下去寫的

    沒辦法用if.....else下去寫嗎?

    2010年3月21日 下午 01:55
  • if-else (C# 參考)

    http://msdn.microsoft.com/zh-tw/library/5011f09h.aspx

    switch (C# 參考)

    http://msdn.microsoft.com/zh-tw/library/06tc147t.aspx

    還是沒看懂喔,重點是四個方向狀態,if else if其實和switch意思一樣,請自行修改...

    • 已標示為解答 楓紅葉 2010年3月22日 上午 08:24
    2010年3月21日 下午 02:17
  • Hi,

    你本來用上跟左兩個變數來決定方向

    當跑到下方最頂端時

    程式把runTop設為False

        else if (runTop == false)
                {
                    lblMsg.Top += 1;
                    lblDirection.Text = "目前方向 : 往下移 ";
                    if (lblMsg.Top + lblMsg.Height + 1 >= this.Height - 30)
                        runTop = false; //下移
                }

     

    這樣還是跑在同一個if判斷式裡

    若是改為True又會進到第一個if判斷式

    最後一個判斷式會進不去


    這種需求同時間應該只有往一個方向

    用兩個變數來處理本來就很怪

    建議還是用上面大大教的

    使用一個變數來決定方向

    若是像你這樣runTop與runLeft都為True

    接手的人不看仔細應該會認為是往左上跑吧


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月21日 下午 02:56
  • 我看懂了~

    非常感謝大大們的解答~

    有機會還請各位大大再多幫忙!!

    2010年3月22日 上午 08:25