สร้าง Custom Control ที่สืบทอดจาก Button
ผู้เขียนสร้าง Project เป็น Windows Forms Application ขึ้นมาแล้วทำการเพิ่มไฟล์ Custom Control เข้าใน Solution Explorer
คลิ๊กเมาส์ขวาที่ Project เลือก Add > New Item... |
เลือก Custom Control ในที่นี้ผู้เขียนตั้งชื่อเป็น myButton |
Class เริ่มต้นที่ Visual Studio สร้างขึ้น |
คลาสที่สร้างให้เมื่อเพิ่มไฟล์ Custom Control จะเป็นคลาสที่สืบทอด (Inheritance) มาจากคลาสพื้นฐานของคือคลาส Control หากเราต้องการจะสร้าง Control ใหม่ขึ้นมาก็สามารถ Implement ได้เลย แต่ในที่นี้ผู้เขียนไม่ต้องการสร้าง Control ใหม่ แต่ต้องการนำ Control เดิมมาเพิ่มเติมความสามารถ ผู้เขียนจึงเปลี่ยนในส่วนของการสืบทอด แทนที่จะสืบทอดมาจาก Control ก็เปลี่ยนเป็นให้สืบทอดจาก Button
public partial class myButton : Button
{
//method Constructor
public myButton()
{
InitializeComponent();
}
//method ในการวาด Control ที่ทำการ Override เพิ่มเติม แต่ยังใช้ความสามารถของ base class ด้วย
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
ผู้เขียนจะทำให้ myButton เป็นปุ่มที่เหมือนมีไฟติดเวลานำเมาส์ไปวาง
ในที่นี้ผู้เขียนอยากแนะนำให้เน้นความสำคัญไปที่ method OnPaint ซึ่งจะทำงานอยู่ตลอดเวลาในโปรแกรมแบบ GUI
คำสั่งในการทำงานทั้งหมด
public enum isEvent { move, none } //สร้างชนิดข้อมูลเพื่ออ้างอิงสถานะ
public partial class myButton : Button
{
private isEvent IE = isEvent.none; //ตัวแปรเก็บค่าสถานะ
public myButton()
{
InitializeComponent();
}
//ปรับปรุงความสามารถการวาดที่สืบทอดมา
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe); //สืบทอดรูปแบบจากคลาสแม่
this.RePaint(pe); //method ในการระบายสี เมื่อสถานะปุ่มเปลี่ยนไป
}
//ปรับปรุงความสามารถของ Event เมื่อนำเมาส์เคลื่อนออกจากปุ่ม
protected override void OnMouseLeave(EventArgs e)
{
this.IE = isEvent.none; //กำหนดให้สถานะเป็น none
base.OnMouseLeave(e); //สืบทอดความสามารถเดิม
}
//ปรับปรุงความสามารถของ Event เมื่อเคลื่อนเมาส์บนปุ่ม
protected override void OnMouseMove(MouseEventArgs mevent)
{
this.IE = isEvent.move; //กำหนดให้สถานะเป็น move
base.OnMouseMove(mevent); //สืบทอดความสามารถเดิม
}
//เปลี่ยนค่าสีตามสถานะ
private void setGradientColor(PaintEventArgs e)
{
Color? c1 = null;
Color? c2 = null;
//ตรวจสอบสถานะและเก็บค่าสี
switch (this.IE)
{
case isEvent.move:
c1 = Color.FromArgb(130, Color.Yellow);
c2 = Color.FromArgb(70, Color.Black);
break;
default:
c1 = Color.FromArgb(50, Color.White);
c2 = Color.FromArgb(100, Color.Black);
break;
}
//วาดสี่เหลี่ยมและระบายสีเป็นแบบ Gradient
Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, (Color)c1, (Color)c2, 90);
e.Graphics.FillRectangle(b, this.ClientRectangle);
b.Dispose();
}
//วาดรูปแบบที่ต้องการ
private void RePaint(PaintEventArgs e)
{
this.Cursor = Cursors.Hand; //ให้ปุ่มมีเคอเซอร์เป็นรูปมือเสมอ
this.setGradientColor(e); //วาดและระบายสีลงไปที่ปุ่ม
//ปรับเปลี่ยนรูปแบบตัวอักษรตามสถานะ
switch (this.IE)
{
case isEvent.move:
this.ForeColor = Color.Black;
this.Font = new Font(this.Font.FontFamily, 12, FontStyle.Bold);
break;
default:
this.ForeColor = Color.Black;
this.Font = new Font(this.Font.FontFamily, (float)9.5, FontStyle.Regular);
break;
}
}
}
เป็นอันเสร็จสิ้นกับการสร้าง Control ให้ Compile และ Build ได้เลย จะพบว่าใน ToolBox จะปรากฎ Control ใหม่ขึ้นมา
Control "myButton" |
ลักษณะปุ่มเมื่อเปิดโปรแกรม |
เมื่อนำเมาส์วางบนปุ่ม จะมีสีเหมือนปุ่มไฟ |
โหลดแบบexpressมาแล้วกะว่าจะลองลอกดูซักหน่อย 555
ตอบลบ