Visual Studio 2008 SP1 RTM sudah keluar bisa di download di link ini:
untuk lebih jelasnya dapat dibaca di blog
Visual Studio 2008 SP1 RTM sudah keluar bisa di download di link ini:
untuk lebih jelasnya dapat dibaca di blog
Graphic Class Method
Draw Method
Digunakan untuk menggambar garis, rectangle, dan ellipse
Drawing Lines
Method DrawLine digunakan untuk menggambar garis yang menghubungkan dua titik.
Contoh2_4 Menggambar Garis
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen redPen = new Pen(Color.Red, 1); Pen bluePen = new Pen(Color.Blue, 2); Pen greenPen = new Pen(Color.Green, 3); Pen blackPen = new Pen(Color.Black, 4); // Draw line using float coordinates float x1 = 20.0F, y1 = 20.0F; float x2 = 200.0F, y2 = 20.0F; g.DrawLine(redPen, x1, y1, x2, y2); // Draw line using Point structure Point pt1 = new Point(20, 20); Point pt2 = new Point(20, 200); g.DrawLine(greenPen, pt1, pt2); // Draw line using PointF structure PointF ptf1 = new PointF(20.0F, 20.0F); PointF ptf2 = new PointF(200.0F, 200.0F); g.DrawLine(bluePen, ptf1, ptf2); // Draw line using integer coordinates int X1 = 60, Y1 = 40, X2 = 250, Y2 = 100; g.DrawLine(blackPen, X1, Y1, X2, Y2); // Dispose of objects redPen.Dispose(); bluePen.Dispose(); greenPen.Dispose(); blackPen.Dispose(); }
Contoh2_5 Menggambar Garis yang Terhubung
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen redPen = new Pen(Color.Red, 1); PointF[] ptsArray ={ new PointF( 20.0F, 20.0F), new PointF( 20.0F, 200.0F), new PointF(200.0F, 200.0F), new PointF(20.0F, 20.0F)}; g.DrawLines(redPen, ptsArray); }
Drawing Rectangle
Bentuk dasar selanjutnya adalah rectangle. Jika anda ingin menggambar rectangle maka yang harus diperhatikan adalah titik awal / starting point, width, dan height-nya.
Contoh2_6 Menggambar Rectangle
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create pens and points Pen redPen = new Pen(Color.Red, 1); Pen bluePen = new Pen(Color.Blue, 2); Pen greenPen = new Pen(Color.Green, 3); float x = 5.0F, y = 5.0F; float width = 100.0F; float height = 200.0F; // Create a rectangle Rectangle rect = new Rectangle(20, 20, 80, 40); // Draw rectangles g.DrawRectangle(bluePen, x, y, width, height); g.DrawRectangle(redPen, 60, 80, 140, 50); g.DrawRectangle(greenPen, rect); // Dispose of objects redPen.Dispose(); bluePen.Dispose(); greenPen.Dispose(); }
Contoh 2_7 Menggambar Rectangle Berurutan / Series Mode
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen greenPen = new Pen(Color.Green, 4); RectangleF[] rectArray = { new RectangleF( 5.0F, 5.0F, 100.0F, 200.0F), new RectangleF(20.0F, 20.0F, 80.0F, 40.0F), new RectangleF(60.0F, 80.0F, 140.0F, 50.0F) }; g.DrawRectangles(greenPen, rectArray); greenPen.Dispose(); }
Drawing Ellipses dan Circle
Bentuk ellipses adalah bentuk circular didalam bentuk rectangle. Bentuk ellipses mempunyai titik tengah / center point.
Contoh2_8 Menggambar Ellipses
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create pens Pen redPen = new Pen(Color.Red, 6); Pen bluePen = new Pen(Color.Blue, 4); Pen greenPen = new Pen(Color.Green, 2); // Create a rectangle Rectangle rect = new Rectangle(80, 80, 50, 50); // Draw ellipses g.DrawEllipse(greenPen, 100.0F, 100.0F, 10.0F, 10.0F); g.DrawEllipse(redPen, rect); g.DrawEllipse(bluePen, 60, 60, 90, 90); g.DrawEllipse(greenPen, 40.0F, 40.0F, 130.0F, 130.0F); // Dispose of objects redPen.Dispose(); greenPen.Dispose(); bluePen.Dispose(); }
Drawing Text
Digunakan untuk menggambar text string dalam graphic surfaces
Contoh2_9 Menggambar String
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create brushes SolidBrush blueBrush = new SolidBrush(Color.Blue); SolidBrush redBrush = new SolidBrush(Color.Red); SolidBrush greenBrush = new SolidBrush(Color.Green); // Create a rectangle Rectangle rect = new Rectangle(20, 20, 200, 100); // The text to be drawn String drawString = "Hello GDI+ World!"; // Create a Font object Font drawFont = new Font("Verdana", 14); float x = 100.0F; float y = 100.0F; // String format StringFormat drawFormat = new StringFormat(); // Set string format flag to direction vertical, // which draws text vertically drawFormat.FormatFlags = StringFormatFlags.DirectionVertical; // Draw string g.DrawString("Drawing text", new Font("Tahoma", 14), greenBrush, rect); g.DrawString(drawString, new Font("Arial", 12), redBrush, 120, 140); g.DrawString(drawString, drawFont, blueBrush, x, y, drawFormat); // Dispose of objects blueBrush.Dispose(); redBrush.Dispose(); greenBrush.Dispose(); drawFont.Dispose(); }
Drawing Arc
Arc adalah bagian dari ellipse, yang dibentuk dari area rectangle, start angle, dan sweep angle. Cara penggunaan Arc adalah sebagai berikut:
Contoh2_11 Menggambar Arc
Buat design form sebagai berikut:
Buat variabel awal untuk deklarasi awal start dan sweep angle
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen redPen = new Pen(Color.Red, 3); Rectangle rect = new Rectangle(20, 20, 200, 200); g.DrawArc(redPen, rect, startAngle, sweepAngle); redPen.Dispose(); } private void btnReset_Click(object sender, EventArgs e) { startAngle =(float)Convert.ToDouble(txtStart.Text); sweepAngle =(float)Convert.ToDouble(txtSweep.Text); Invalidate(); }
Drawing Curves
Curve terdiri dari dua macam yaitu open dan close curve
Contoh2_12 Drawing Curves
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create a pen Pen bluePen = new Pen(Color.Blue, 1); // Create an array of points PointF pt1 = new PointF(40.0F, 50.0F); PointF pt2 = new PointF(50.0F, 75.0F); PointF pt3 = new PointF(100.0F, 115.0F); PointF pt4 = new PointF(200.0F, 180.0F); PointF pt5 = new PointF(200.0F, 90.0F); PointF[] ptsArray = { pt1, pt2, pt3, pt4, pt5 }; // Draw curve g.DrawCurve(bluePen, ptsArray); // Dispose of object bluePen.Dispose(); }
Contoh2_13 Drawing Curves dengan Tension
private float tension = 0.5F; private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create a pen Pen bluePen = new Pen(Color.Blue, 1); // Create an array of points PointF pt1 = new PointF(40.0F, 50.0F); PointF pt2 = new PointF(50.0F, 75.0F); PointF pt3 = new PointF(100.0F, 115.0F); PointF pt4 = new PointF(200.0F, 180.0F); PointF pt5 = new PointF(200.0F, 90.0F); PointF[] ptsArray = { pt1, pt2, pt3, pt4, pt5 }; // Draw curve g.DrawCurve(bluePen, ptsArray,tension); // Dispose of object bluePen.Dispose(); } private void btnApply_Click(object sender, EventArgs e) { tension = (float)Convert.ToDouble(txtTension.Text); Invalidate(); }
Contoh2_14 Drawing Closed Curve
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create a pen Pen bluePen = new Pen(Color.Blue, 1); // Create an array of points PointF pt1 = new PointF(40.0F, 50.0F); PointF pt2 = new PointF(50.0F, 75.0F); PointF pt3 = new PointF(100.0F, 115.0F); PointF pt4 = new PointF(200.0F, 180.0F); PointF pt5 = new PointF(200.0F, 90.0F); PointF[] ptsArray = { pt1, pt2, pt3, pt4, pt5 }; // Draw curve g.DrawClosedCurve(bluePen, ptsArray); // Dispose of object bluePen.Dispose(); }
Drawing Polygon
Polygon adalah bentuk yang terdiri dari tiga atau lebih garis, misal: segitiga, dan kotak.
Contoh2_15 Drawing Polygon
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create pens Pen greenPen = new Pen(Color.Green, 2); Pen redPen = new Pen(Color.Red, 2); // Create points for polygon PointF p1 = new PointF(40.0F, 50.0F); PointF p2 = new PointF(60.0F, 70.0F); PointF p3 = new PointF(80.0F, 34.0F); PointF p4 = new PointF(120.0F, 180.0F); PointF p5 = new PointF(200.0F, 150.0F); PointF[] ptsArray = { p1, p2, p3, p4, p5 }; // Draw polygon g.DrawPolygon(greenPen, ptsArray); // Dispose of objects greenPen.Dispose(); redPen.Dispose(); }
Drawing Graphic Path
Graphic Path menghubungkan beberapa objek drawing seperti line, rectable, circle, dll.
Contoh2_16 Drawing Graphic Path
using System.Drawing; using System.Drawing.Drawing2D; private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // Create a pen Pen greenPen = new Pen(Color.Green, 1); // Create a graphics path GraphicsPath path = new GraphicsPath(); // Add a line to the path path.AddLine(20, 20, 103, 80); // Add an ellipse to the path path.AddEllipse(100, 50, 100, 100); // Add three more lines path.AddLine(195, 80, 300, 80); path.AddLine(200, 100, 300, 100); path.AddLine(195, 120, 300, 120); // Create a rectangle and call // AddRectangle Rectangle rect = new Rectangle(50, 150, 300, 50); path.AddRectangle(rect); // Draw path g.DrawPath(greenPen, path); // Dispose of object greenPen.Dispose(); }
Drawing Pie Shapes
Contoh2_17 Drawing Pie Chart
private void btnDraw_Click(object sender, EventArgs e) { // Create a Graphics object Graphics g = this.CreateGraphics(); g.Clear(this.BackColor); // Get the current value of start and sweep // angles float startAngle = (float)Convert.ToDouble(textBox1.Text); float sweepAngle = (float)Convert.ToDouble(textBox2.Text); // Create a pen Pen bluePen = new Pen(Color.Blue, 1); // Draw pie g.DrawPie(bluePen, 20, 20, 100, 100, startAngle, sweepAngle); // Dispose of objects bluePen.Dispose(); g.Dispose(); }
bersambung Part 3…..
Apa itu GDI+?
GDI+ adalah library pada .NET yang digunakan untuk membuat aplikasi grafis berbasis Windows dan Web yang dapat berinteraksi dengan perangkat grafis berupa printer atau monitor.
Graphical User Interface (GUI) berinteraksi dengan perangkat hardware seperti monitor, printer, atau scanner untuk menampilkan format yang dapat dibaca oleh manusia, tetapi tidak ada program yang dapat mengakses perangkat hardware tersebut secara langsung, maka dibuat user interface agar pengguna dapat berinteraksi dengan perangkat-perangkat tersebut.
Untuk membuat user interface tersebut harus digunakan third component sebagai jembatan antara program dan perangkat keras, maka dibuatlah komponen GDI+ library, dengan komponen tersebut anda dapat menampilkan output berupa text dan gambar ke perangkat hardware.
Pada aplikasi .NET anda dapat menggunakan GDI+ untuk membuat aplikasi grafis baik untuk aplikasi berbasi windows maupun aplikasi web. Library GDI+ sudah tersinstall secara default pada sistem operasi Windows XP, Vista, dan Windows 2003 yang berlokasi di class library dengan nama Gdiplus.dll. Gdiplus.dll.
Apa saja fitur GDI+?
Fitur GDI+ dapat kategorikan dalam 3 fungsi utama yaitu:
2D Vector Graphics Programming
Vector Graphic merupakan komponen pembentuk bentuk gambar mis (kotak, lingkaran) yang dibentuk dari kumpulan titik pada sistem koordinat.
Pada .NET Framework library 2D vector graphic programming dibagi menjadi dua kategori yaitu general dan advanced. General 2D vector graphic didefinisikan dalam library System.Drawing namespace dan advance function didefinisikan dalam library System.Drawing.Drawing2D namespace.
Imaging
Imaging digunakan untuk memanipulasi image. Image file yang dapat dimanipulasi misalnya .bmp, .jpg, .gif, dan .png. Fungsi-fungsi untuk memanipulasi images ada dalam Image class yang digunakan untuk create, save, dan load images.
Typography
Typography digunakan untuk mendesign dan merepresentasikan text. GDI+ menyediakan class untuk membuat dan menggunakan font.
GDI+ Namespaces dan Class dalam .NET
Area Drawing
Setiap aplikasi drawing paling tidak terdiri dari tiga komponen yaitu canvas, brush, pen, dan process
Setiap area drawing memiliki empat property utama yaitu: weight, height, resolution dan color depth.
Definisi dari pixel adalah: elemen terkecil pada proses drawing untuk menampilkan graphic object atau images pada layar. Pixel density sering direpresentasikan dengan nilai dpi (dot per inch).
Struktur color pada GDI+ mempunyai empat komponen warna yaitu: alpha, red, green, dan blue. Red green blue (RGB) komponen mewakili kombinasi warna yang akan muncul. Setiap komponen dalam RGB mempunyai 256 (28) color combination, sehingga kombinasi tiga komponen RGB tersebut mempunyai kemungkinan warna 256x256x256. Alpha komponen mewakili aspek transparan dari warna, yang akan terlihat ketika beberapa warna digabungkan.
Seperti yang terlihat pada gambar diatas, area drawing paling tidak harus mensupport 24-bit color system (8-bit untuk setiap R, G, dan B komponen).
Sistem Koordinat
Memahami sistem koordinat sangat penting untuk pemrograman graphic, sistem koordinat merepresentasikan letak graphic objet pada perangkat tampilan seperti monitor dan printer.
Sistem Koordinat Kartesian
Ini adalah koordinat umum yang anda pelajari pada pelajaran matematika dasar, terdiri dari sumbu x dan y
Posisi sitem koordinat kartesian dibagi menjadi beberapa kuadran:
Sistem Koordinat Standar GDI+
Tidak seperti sistem kartesian, pada perangkat tampilan seperti monitor sumbu (0,0) terletak pada pojok kiri atas.
Aplikasi Pertama menggunakan GDI+
Sekarang saatnya anda untuk mencoba membuat aplikasi menggunakan library GDI+ menggunakan .NET Framework.
1. Pertama buat aplikasi windows form baru pada visual studio, beri nama projectnya contoh2_1
2. Untuk menggunakan GDI+ maka anda harus menambahkan referensi library kedalam program
using System.Drawing; using System.Drawing.Drawing2D;
3. Untuk menggambar di form anda dapat menambahkan kode dalam method OnPaint.
private void Form1_Paint(object sender, PaintEventArgs e) { //membuat instan class / objek dari class graphic Graphics g = e.Graphics; }
4. Untuk menambahkan object Pen, Brush, serta Drawing Shape kedalam form tambahkan kode sebagai berikut
private void Form1_Paint(object sender, PaintEventArgs e) { //membuat instan class / objek dari class graphic Graphics g = e.Graphics; //set smothing mode pada area drawing g.SmoothingMode = SmoothingMode.AntiAlias; //membuat kotak dengan width 100 dan height 100 Rectangle rect = new Rectangle(20, 20, 100, 100); //membuat objek pen berwarna merah Pen redPen = new Pen(Color.Red, 3); Pen blackPen = Pens.Black; //membuat objek solid brush SolidBrush greenBrush = new SolidBrush(Color.Green); //menggambar shape dan line g.DrawRectangle(redPen, rect); g.FillEllipse(greenBrush, rect); g.DrawLine(blackPen, 0, 250, this.Width, 250); g.FillEllipse(Brushes.Blue, 70, 220, 30, 30); g.FillEllipse(Brushes.SkyBlue, 100, 210, 40, 40); g.FillEllipse(Brushes.Green, 140, 200, 50, 50); g.FillEllipse(Brushes.Yellow, 190, 190, 60, 60); g.FillEllipse(Brushes.Violet, 250, 180, 70, 70); g.FillEllipse(Brushes.Red, 320, 170, 80, 80); }
5.Jalankan program dengan menekan tombol F5 untuk melihat hasilnya.
Menggunakan Struktur Point dan PointF
Pada GDI+ point digunakan untuk mendefinisikan koordinat titik dua dimensi yang direpresentasikan sebagai matrix (x dan y koordinat) . ada tiga macam konstruktor yang dapat digunakan untuk membuat object point yaitu:
Point pt1 = new Point(10); Point pt2 = new Point( new Size(20, 20) ); Point pt3 = new Point(30, 30);
Struktur PointF hampir sama dengan Point hanya saja nilai sumbu x dan y-nya tidak berupa integer melainkan floating point.
PointF pt3 = new PointF(30.0f, 30.0f);
Contoh 2_2 Penggunaan Struktur Point
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; //membuat object point Point pt = new Point(50, 50); //membuat object point kosong Point newPoint = Point.Empty; newPoint.X = 100; newPoint.Y = 200; Pen pn = new Pen(Color.Blue, 4); //menggambar garis dari titik pt ke newPoint g.DrawLine(pn, pt, newPoint); pn.Dispose(); g.Dispose(); }
Menggunakan Struktur Rectangle
Struktur rectangle digunakan untuk membuat object rectangle di GDI+
Contoh2_3 Penggunaan Struktur Rectangle
private void Form1_Paint(object sender, PaintEventArgs e) { // Create a Graphics object Graphics g = this.CreateGraphics(); int x = 40; int y = 40; int height = 120; int width = 120; // Create a Point object Point pt = new Point(80, 80); // Create a Size object Size sz = new Size(100, 100); // Create a rectangle from Point and Size Rectangle rect1 = new Rectangle(pt, sz); // Create a rectangle from integers Rectangle rect2 = new Rectangle(x, y, width, height); // Create a rectangle from direct integers Rectangle rect3 = new Rectangle(10, 10, 180, 180); // Create pens and brushes Pen redPen = new Pen(Color.Red, 2); SolidBrush greenBrush = new SolidBrush(Color.Blue); SolidBrush blueBrush = new SolidBrush(Color.Green); // Draw and fill rectangles g.DrawRectangle(redPen, rect3); g.FillRectangle(blueBrush, rect2); g.FillRectangle(greenBrush, rect1); // Dispose of the objects redPen.Dispose(); blueBrush.Dispose(); greenBrush.Dispose(); g.Dispose(); }
bersambung Part 2…
Pada Turtorial keempat ini akan dibahas beberapa topik yaitu:
Abstract Class
Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan harus mempunyai method tertentu maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract.
Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.
Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.
1: //mendeklarasikan abstract class
2: public abstract class Window
3: {
4: //konstruktor
5: public Window(int top, int left)
6: {
7: this.top = top;
8: this.left = left;
9: }
10:
11: //method abstract
12: public abstract void DrawWindow();
13:
14: protected int top;
15: protected int left;
16: } // end class Window
17:
18: // ListBox diturunkan dari Window
19: public class ListBox : Window
20: {
21: // konstruktor
22: public ListBox(int top, int left, string contents)
23: : base(top, left) // memanggil konstruktor dari base class
24: {
25: listBoxContents = contents;
26: }
27:
28: //implementasi method abstract pada class anak
29: public override void DrawWindow()
30: {
31: Console.WriteLine("Writing string to the listbox: {0}",
32: listBoxContents);
33: }
34: private string listBoxContents; // member variable yang baru
35: } // end class ListBox
36:
37: public class Button : Window
38: {
39: public Button(
40: int top,
41: int left)
42: : base(top, left) { }
43:
44: // implementasi abstract method
45: public override void DrawWindow()
46: {
47: Console.WriteLine("Drawing a button at {0}, {1}\n",
48: top, left);
49: }
50: } // end class Button
51:
52: public class Tester
53: {
54: static void Main()
55: {
56: Window[] winArray = new Window[3];
57: winArray[0] = new ListBox(1, 2, "First List Box");
58: winArray[1] = new ListBox(3, 4, "Second List Box");
59: winArray[2] = new Button(5, 6);
60:
61: for (int i = 0; i < 3; i++)
62: {
63: winArray[i].DrawWindow();
64: } // end for loop
65: } // end main
66: } // end class Tester
Sealed Class
Ini merupakan kebalikan dari abstract class, jika sebuah class dideklarasikan sebagai sebagai sealed class maka class tersebut tidak dapat diturunkan.
Object Root dari semua class
Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.
Beberapa method yang ada pada class object adalah:
Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.
1: public class Dog
2: {
3: private int weight;
4:
5: // konstruktor
6: public Dog(int weight)
7: {
8: this.weight = weight;
9: }
10:
11: // override dari Object.ToString
12: public override string ToString()
13: {
14: return weight.ToString();
15: }
16: }
17:
18: public class Tester
19: {
20: static void Main()
21: {
22: int i = 5;
23: Console.WriteLine("The value of i is: {0}", i.ToString());
24:
25: Dog milo = new Dog(62);
26: Console.WriteLine("My dog Milo weighs {0} pounds", milo);
27: }
28: }
Boxing dan Unboxing Types
Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.
Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.
1: int myIntegerValue = 5;
2: object myObject = myIntegerValue; // cast to an object
3: myObject.ToString();
Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.
1: int myIntegerVariable = 123;
2:
3: //Boxing
4: object myObjectVariable = myIntegerVariable;
5: Console.WriteLine( "myObjectVariable: {0}",
6: myObjectVariable.ToString( ) );
7:
8: // unboxing (harus explicit)
9: int anotherIntegerVariable = (int)myObjectVariable;
10: Console.WriteLine( "anotherIntegerVariable: {0}",
11: anotherIntegerVariable );
12:
13: Output:
14: myObjectVariable: 123
15: anotherIntegerVariable: 123
Menghindari Boxing dengan Generic
Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.
Interfaces
Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.
Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan fasilitas ini maka anda harus mengimplementasi method, dan property-nya”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.
Perbedaan Interface dan Abstract Class
Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:
1: //deklarasi interface
2: interface IStorable
3: {
4: void Read();
5: void Write(object obj);
6: int Status { get; set; }
7:
8: }
9:
10: public class Document : IStorable
11: {
12: // implementasi dari member variabel yang dideklarasikan di interface
13: private int status = 0;
14:
15: public Document(string s)
16: {
17: Console.WriteLine("Creating document with: {0}", s);
18: }
19:
20:
21: //implementasi method yang ada pada interface
22: public void Read()
23: {
24: Console.WriteLine(
25: "Implementing the Read Method for IStorable");
26: }
27:
28: public void Write(object o)
29: {
30: Console.WriteLine(
31: "Implementing the Write Method for IStorable");
32: }
33:
34: public int Status
35: {
36: get { return status; }
37: set { status = value; }
38: }
39:
40:
41: }
42:
43: class Tester
44: {
45: public void Run()
46: {
47: Document doc = new Document("Test Document");
48: doc.Status = -1;
49: doc.Read();
50: Console.WriteLine("Document Status: {0}", doc.Status);
51: }
52:
53: static void Main()
54: {
55: Tester t = new Tester();
56: t.Run();
57: }
58: }
59:
60: Output:
61: Creating document with: Test Document
62: Implementing the Read Method for IStorable
63: Document Status: -1
Mengimplementasikan lebih dari satu Interface
Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat tidak menggunakannya, menggunakan satu interface saja, atau menggunakan lebih dari satu interface.
1: interface IStorable
2: {
3: void Read();
4: void Write(object obj);
5: int Status { get; set; }
6:
7: }
8:
9: // lebih dari satu interface
10: interface ICompressible
11: {
12: void Compress();
13: void Decompress();
14: }
15:
16:
17: public class Document : IStorable, ICompressible
18: {
19: private int status = 0;
20:
21: public Document(string s)
22: {
23: Console.WriteLine("Creating document with: {0}", s);
24: }
25:
26: #region IStorable
27:
28: public void Read()
29: {
30: Console.WriteLine(
31: "Implementing the Read Method for IStorable");
32: }
33:
34: public void Write(object o)
35: {
36: Console.WriteLine(
37: "Implementing the Write Method for IStorable");
38: }
39:
40: public int Status
41: {
42: get { return status; }
43: set { status = value; }
44: }
45:
46: #endregion // IStorable
47:
48: #region ICompressible
49:
50: public void Compress()
51: {
52: Console.WriteLine("Implementing Compress");
53: }
54:
55: public void Decompress()
56: {
57: Console.WriteLine("Implementing Decompress");
58: }
59:
60: #endregion // ICompressible
61: }
62:
63:
64: class Tester
65: {
66: public void Run()
67: {
68: Document doc = new Document("Test Document");
69: doc.Status = -1;
70: doc.Read(); // dipanggil dari method IStorable
71: doc.Compress(); // dipanggil dari method ICompressible
72: Console.WriteLine("Document Status: {0}", doc.Status);
73: }
74:
75: static void Main()
76: {
77: Tester t = new Tester();
78: t.Run();
79: }
80: }
81:
82: Output:
83: Creating document with: Test Document
84: Implementing the Read Method for IStorable
85: Implementing Compress
86: Document Status: -1
pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006
Pada Turtorial ketiga ini akan dibahas beberapa topik yaitu:
Specialization dan Generalization
Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian pula pada OOP.
Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.
Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.
Misal gambar dibawah akan menunjukan hirarki antara class window, button, dan listbox
Gambar diatas menunjukan relasi antara window, button, dan listbox. Button dan listbox sama-sama memiliki karakteristik yang dimiliki oleh window, tetapi button dan listbox juga memiliki ciri-ciri spesifik khas mereka sendiri. Contoh lain yang lebih rinci untuk menggambarkan spesialisasi dan generalisasi dapat digambarkan sebagai berikut:
Inheritance
Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut
public class ListBox : Window
Kode diatas berarti class ListBox adalah turunan dari class Window
Penggunaan inheritance dapat dilihat pada program dibawah ini
1: public class Window
2: {
3: //objek konstruktor
4: public Window(int top, int left)
5: {
6: this.top = top;
7: this.left = left;
8: }
9:
10: // simulasi menggambar pada windows
11: public void DrawWindow()
12: {
13: Console.WriteLine("Drawing Window at {0}, {1}",
14: top, left);
15: }
16:
17: //variabel didefinisikan private sehingga
18: //tidak dapat digunakan pada kelas turunannya
19: private int top;
20: private int left;
21: }
22:
23: // ListBox diturunkan dari class Window
24: public class ListBox : Window
25: {
26: // menambahkan parameter pada konstruktor
27: public ListBox(int top, int left, string theContents) :
28: base(top, left) // call base constructor
29: {
30: mListBoxContents = theContents;
31: }
32:
33: // new version (new keyword) karena
34: // pada method di kelas turunan dirubah isinya
35: public new void DrawWindow()
36: {
37: base.DrawWindow(); // memanggil dari base class
38: Console.WriteLine("Writing string to the listbox: {0}",
39: mListBoxContents);
40: }
41: private string mListBoxContents; // member variabel baru
42: }
43:
44: public class Tester
45: {
46: public static void Main()
47: {
48: // membuat instan class baru
49: Window w = new Window(5, 10);
50: w.DrawWindow();
51:
52: // membuat instan dari class turunan
53: ListBox lb = new ListBox(20, 30, "Hello world");
54: lb.DrawWindow();
55: }
56: }
Memanggil Base Class Constructor
Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)
public ListBox(int top, int left, string theContents):base(top, left)
Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.
Polymorphism
Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window
Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.
Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:
Penggunaan prinsip polymorphism dapat dilihat pada contoh program dibawah ini
1: public class Window
2: {
3: //deklarasi konstruktor dengan dua parameter
4: public Window(int top, int left)
5: {
6: this.top = top;
7: this.left = left;
8: }
9:
10: //method untuk draw window
11: public virtual void DrawWindow()
12: {
13: Console.WriteLine("Window: drawing Window at {0}, {1}",
14: top, left);
15: }
16:
17: //member variabel dideklarasikan protected
18: //berarti dapat diakses dari class turunannya
19: protected int top;
20: protected int left;
21:
22: } // end Window
23:
24: // class ListBox diturunkan dari class Window
25: public class ListBox : Window
26: {
27: //konstruktor yang menmanggil konstruktor dari base class nya
28: public ListBox(int top,int left,string contents): base(top, left)
29: {
30: listBoxContents = contents;
31: }
32:
33: //method yang di override dari base class-nya
34: //karena mempunyai implementasi yang berbeda
35: public override void DrawWindow()
36: {
37: base.DrawWindow(); // invoke the base method
38: Console.WriteLine("Writing string to the listbox: {0}",
39: listBoxContents);
40: }
41:
42: private string listBoxContents; // member variabel baru
43: } // end ListBox
44:
45: public class Button : Window
46: {
47: public Button(
48: int top,
49: int left)
50: : base(top, left)
51: { }
52:
53: // an overridden version (note keyword) because in the
54: // derived method we change the behavior
55: public override void DrawWindow()
56: {
57: Console.WriteLine("Drawing a button at {0}, {1}\n",
58: top, left);
59: }
60: } // end Button
61:
62: public class Tester
63: {
64: static void Main()
65: {
66: Window win = new Window(1, 2);
67: ListBox lb = new ListBox(3, 4, "Stand alone list box");
68: Button b = new Button(5, 6);
69: win.DrawWindow();
70: lb.DrawWindow();
71: b.DrawWindow();
72:
73: Window[] winArray = new Window[3];
74: winArray[0] = new Window(1, 2);
75: winArray[1] = new ListBox(3, 4, "List box in array");
76: winArray[2] = new Button(5, 6);
77:
78: for (int i = 0; i < 3; i++)
79: {
80: winArray[i].DrawWindow();
81: } // end for
82: } // end Main
83: } // end Tester
Jika dijalankan akan diperoleh output sebagai berikut:
1: Window: drawing Window at 1, 2
2: Window: drawing Window at 3, 4
3: Writing string to the listbox: Stand alone list box
4: Drawing a button at 5, 6
5:
6: Window: drawing Window at 1, 2
7: Window: drawing Window at 3, 4
8: Writing string to the listbox: List box in array
9: Drawing a button at 5, 6
Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.
bersambung ke Object Oriented Programming in C# (Part 4)
pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006
Pada Turtorial kedua ini akan dibahas beberapa topik yaitu:
Destroy Object
Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:
1: ~MyClass( )
2: {
3: // perintah disini
4: }
Sintaks diatas akan diterjemahkan oleh compiler sebagai berikut
1: protected override void Finalize()
2: {
3: try
4: {
5: // do work here
6: }
7: finally
8: {
9: base.Finalize();
10: }
11: }
Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface Idisposable
1: using System;
2: class Testing : Idisposable //menggunakan interface IDisposable
3: {
4: bool is_disposed = false;
5: protected virtual void Dispose( bool disposing )
6: {
7: if ( !is_disposed ) // hanya mendispose objek sekali!
8: {
9: if ( disposing )
10: {
11: Console.WriteLine( "Not in destructor,
12: OK to reference other objects" );
13: }
14: Console.WriteLine( "Disposing..." );
15: }
16: this.is_disposed = true;
17: }
18:
19: public void Dispose( )
20: {
21: Dispose( true );
22: // memanggil Garbage Collector
23: GC.SuppressFinalize( this );
24: }
25:
26: ~Testing( )
27: {
28: Dispose( false );
29: Console.WriteLine( "In destructor." );
30: }
31: }
Overloading Method
Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor
1: public class Time
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11: // public accessor methods
12: public void DisplayCurrentTime()
13: {
14: System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
15: Month, Date, Year, Hour, Minute, Second);
16: }
17:
18: // constructors
19: public Time(System.DateTime dt)
20: {
21: Year = dt.Year;
22: Month = dt.Month;
23: Date = dt.Day;
24: Hour = dt.Hour;
25: Minute = dt.Minute;
26: Second = dt.Second;
27: }
28:
29: public Time(string strTime) // overloading konstruktor
30: {
31: Console.WriteLine(strTime);
32: }
33:
34: public Time(int Year, int Month, int Date,
35: int Hour, int Minute, int Second) // overloading konstruktor
36: {
37: this.Year = Year;
38: this.Month = Month;
39: this.Date = Date;
40: this.Hour = Hour;
41: this.Minute = Minute;
42: this.Second = Second;
43: }
44: }
45:
46: class Tester
47: {
48: public void Run()
49: {
50: System.DateTime currentTime = System.DateTime.Now;
51: Time time1 = new Time(currentTime);
52: time1.DisplayCurrentTime();
53: Time time2 = new Time(2000, 11, 18, 11, 03, 30);
54: time2.DisplayCurrentTime();
55: }
56:
57: static void Main()
58: {
59: Tester t = new Tester();
60: t.Run();
61: }
62: }
Selain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:
1: void MyMethod(int p1);
2: void MyMethod(int p1, int p2); // beda banyak parameter
3: void MyMethod(int p1, string s1); // beda tipe data
Enkapsulasi data dengan Property
Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut ?.
Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:
1: // private member variables
2: private int Year;
3:
4: public int getYear() //get method
5: {
6: return this.Year;
7: }
8:
9: public void setYear(int Year) //set method
10: {
11: this.Year = Year;
12: }
Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.
1: public class Time
2: {
3:
4: // private member variables
5: private int year;
6: private int month;
7: private int date;
8: private int hour;
9: private int minute;
10: private int second;
11:
12: // membuat property
13: public int Hour
14: {
15: get // mengambil nilai variable Hour
16: {
17: return hour;
18: }
19:
20: set // memberi nilai variable Hour
21: {
22: hour = value;
23: }
24: }
25:
26: // public methods
27: public void DisplayCurrentTime( )
28: {
29: System.Console.WriteLine(
30: "Time: {0}/{1}/{2} {3}:{4}:{5}",
31: month, date, year, hour, minute, second );
32: }
33:
34:
35: // constructors
36: public Time( System.DateTime dt )
37: {
38: year = dt.Year;
39: month = dt.Month;
40: date = dt.Day;
41: hour = dt.Hour;
42: minute = dt.Minute;
43: second = dt.Second;
44: }
45:
46:
47: }
48: class Tester
49: {
50: public void Run()
51: {
52: System.DateTime currentTime = System.DateTime.Now;
53: Time t = new Time(currentTime);
54: t.DisplayCurrentTime();
55:
56: // mengambil nilai variable Hour, get dijalankan
57: int theHour = t.Hour;
58:
59: // menampilkan isi variable Hour
60: System.Console.WriteLine("Retrieved the hour: {0}",
61: theHour);
62:
63: // increment
64: theHour++;
65:
66: // memberi nilai variabel Hour dengan nilai baru
67: // set dijalankan
68: t.Hour = theHour;
69:
70: // menampilkan isi variabel Hour setelah di-increament
71: System.Console.WriteLine("Updated the hour: {0}", t.Hour);
72: }
73:
74:
75: static void Main()
76: {
77: Tester t = new Tester();
78: t.Run();
79: }
80: }
Passing Value Type By Reference
Secara default di C# pengiriman nilai ke method menggunakan pass by value atau hanya mengirimkan nilai saja ke method seperti contoh dibawah ini
1: public class Time
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11:
12: // public accessor methods
13: public void DisplayCurrentTime()
14: {
15: System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
16: Month, Date, Year, Hour, Minute, Second);
17: }
18:
19: public void GetTime(int theHour, int theMinute, int theSecond)
20: {
21: theHour = Hour;
22: theMinute = Minute;
23: theSecond = Second;
24: }
25:
26: // constructor
27: public Time(System.DateTime dt)
28: {
29:
30: Year = dt.Year;
31: Month = dt.Month;
32: Date = dt.Day;
33: Hour = dt.Hour;
34: Minute = dt.Minute;
35: Second = dt.Second;
36: }
37:
38:
39: }
40:
41: class Tester
42: {
43: public void Run()
44: {
45: System.DateTime currentTime = System.DateTime.Now;
46: Time t = new Time(currentTime);
47: t.DisplayCurrentTime();
48:
49: int theHour = 0;
50: int theMinute = 0;
51: int theSecond = 0;
52: t.GetTime(theHour, theMinute, theSecond);
53: System.Console.WriteLine("Current time: {0}:{1}:{2}",
54: theHour, theMinute, theSecond);
55:
56: }
57:
58: static void Main()
59: {
60: Tester t = new Tester();
61: t.Run();
62: }
63: }
Jika kode diatas dijalankan hasilnya adalah
1: 7/1/2008 12:22:19
2: Current time: 0:0:0
Anda dapat melihat bahwa method t.GetTime(theHour, theMinute, theSecond); mencetak output 0:0:0 ini menandakan bahwa nilai yang dikirimkan ke method tersebut tidak dikembalikan ke variabel pemanggil methodnya (theHour, theMinute, theSecond). Jika anda ingin mengembalikan nilai ke variabel pemanggilnya maka anda harus menggunakan keyword ref. Penggunaan pass by ref pada method dapat dilihat pada contoh dibawah ini
1: public class Time
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11:
12: // public accessor methods
13: public void DisplayCurrentTime()
14: {
15: System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
16: Month, Date, Year, Hour, Minute, Second);
17: }
18:
19: // menggunakan references pada parameter
20: public void GetTime(
21: ref int theHour,
22: ref int theMinute,
23: ref int theSecond)
24: {
25: theHour = Hour;
26: theMinute = Minute;
27: theSecond = Second;
28: }
29: // constructor
30: public Time(System.DateTime dt)
31: {
32:
33: Year = dt.Year;
34: Month = dt.Month;
35: Date = dt.Day;
36: Hour = dt.Hour;
37: Minute = dt.Minute;
38: Second = dt.Second;
39: }
40:
41:
42: }
43:
44: class Tester
45: {
46: public void Run()
47: {
48: System.DateTime currentTime = System.DateTime.Now;
49: Time t = new Time(currentTime);
50: t.DisplayCurrentTime();
51:
52: int theHour = 0;
53: int theMinute = 0;
54: int theSecond = 0;
55:
56: // pass integer by reference
57: t.GetTime(ref theHour, ref theMinute, ref theSecond);
58:
59: System.Console.WriteLine("Current time: {0}:{1}:{2}",
60: theHour, theMinute, theSecond);
61:
62: }
63:
64: static void Main()
65: {
66: Tester t = new Tester();
67: t.Run();
68: }
69: }
Jika program diatas dijalankan maka hasilnya
1: 7/1/2008 12:25:41
2: Current time: 12:25:41
bersambung ke Object Oriented Programming in C# (Part3)
pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006
Apa itu WPF?
WPF (Windows Presentation Foundation) adalah teknologi baru yang dirilis oleh Microsoft bersamaan dengan .NET Framework 3.0 (versi sekarang adalah 3.5). Selain WPF .NET 3.0 juga menyertakan beberapa teknologi baru yaitu WF (Workflow Foundation) untuk pemodelan dan WCF (Windows Communication Foundation) yang merupakan pengembangan dari Web Services.
WPF merupakan next generation graphic platform yang memungkinkan anda membuat advance UI (User Interface) yang memadukan document, media, 2D dan 3D, dan animation yang memiliki kemiripan dengan pemrograman web. WPF dapat digunakan pada platform windows seperti Win XP, Vista, dan Windows Server 2003 / 2008.
Sebelum ada teknologi WPF untuk mengembangkan aplikasi windows anda harus menggunakan beberapa teknologi yang berbeda, misalnya untuk menambahkan form user control seperti button kedalam aplikasi anda harus menggunakan komponen Windows Form, untuk menambahkan 2D Graphic anda harus menggunakan library GDI+, untuk 3D Graphic anda harus menggunakan library DirectX atau OpenGL.
WPF didesain untuk menyediakan solusi yang utuh untuk pengembangan aplikasi, WPF menyediakan integrasi dari teknologi yang berbeda, dengan WPF anda dapat menggabungkan komponen vector graphic, complex animation, dan media kedalam aplikasi. Fitur yang baru dalam WPF (.NET 3.5) adalah fitur 3D Graphic yang sudah built-in berbasis pada teknologi DirectX.
Apa saja yang harus diinstall?
Untuk menggunakan teknologi ini anda memerlukan beberapa software yang harus diinstall yaitu:
· Visual Studio 2008 / Visual C# Express 2008 (bagi pengguna C#) / Visual Basic 2008 Express (bagi pengguna vb). Visual Studio 2008 menggunakan .NET Framework 3.5 yang sudah support WPF yang terbaru saat ini. Vesi express edition dapat anda download di http://www.microsoft.com/express/download
· Microsoft Expression Blend 2.5 June 2008 Preview, anda juga dapat mendownload preview edition secara gratis.
XAML (Extensible Application Markup Language)
WPF menggunakan XAML untuk merepresentasikan UI dan user interaction. XAML dibangun dari XML dan penulisanya mirip dengan XHTML yang sering anda gunakan dalam membuat aplikasi berbasis web. XAML juga mendukung prinsip code-behind seperti pada aplikasi ASP.NET. Dengan menggunakan XAML, designer dan programmer dapat bekerja bersama dalam mengembangkan aplikasi, pertama designer membuat design UI kemudian programmer melanjutkan dengan menambah kodenya dalam bahasa yang disupport oleh .NET seperti C# / VB.NET.
Program sederhana menggunakan WPF
Setelah mengenal sekilas apa itu teknologi WPF, pada sesi ini anda akan mencoba membuat aplikasi sederhana menggunakan WPF. Anda dapat membuat aplikasi WPF langsung dari Visual Studio 2008, namun untuk membuat kreasi graphic yang lebih menarik anda dapat menggunakan Microsoft Expression Blend untuk membuat tampilan graphicnya baru kemudian diteruskan dengan menambahkan kode C# / VB.NET menggunakan Visual Studio 2008.
Langkah pertama buka Microsoft Blend Expression, klik File – New Project – Pilih WPF Application – beri nama projectnya “Kalkulator”, pilih bahasa pemrograman sesuai selera anda (C# atau VB).
Design tampilannya sesuai dengan selera anda, karena saya bukan seorang graphic designer maka saya kurang bisa membuat tampilan yang menarik, contoh ini hanya menunjukan kepada anda bahwa anda bisa mendesign tampilan dengan lebih leluasa dengan menggunakan Expression Blend sama sepert anda menggunakan Macromedia Flash atau Adobe Photoshop.
Tampilan yang anda design akan secara otomatis dikonversi kedalam format XAML, jika anda ingin melihat kode XAML klik di tab XAML disebelah kanan, maka akan tampak kode sebagai berikut (kode yang saya tulis pada listing dibawah ini hanya sebagian).
1: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3: x:Class="Kalkulator.Window1" x:Name="Window" Title="Window1" Width="362" Height="416">
4: <Grid x:Name="LayoutRoot">
5: <Image Margin="105.577,17,97.68,0" Source="actuallogo.png" Stretch="Fill" Height="60.66" VerticalAlignment="Top"/>
6: <Image Margin="21,17,0,0" Source="erick.jpg" Stretch="Fill" Height="77.621" VerticalAlignment="Top" Width="79.333" HorizontalAlignment="Left"/>
7: <Label Margin="21,111,57.107,0" VerticalAlignment="Top" Height="34" Content="SAMPLE KALKULATOR " FontSize="24" FontWeight="Bold">
8: <Label.Foreground>
9: <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
10: <GradientStop Color="#FF2662CA" Offset="0"/>
11: <GradientStop Color="#FFF81717" Offset="1"/>
12: </LinearGradientBrush>
13: </Label.Foreground>
14: </Label>
15: </Grid>
16: </Window>
Jika anda perhatikan kode XAML yang digenerate oleh Expression Blend hampir mirip dengan XHTML yang biasa anda gunakan dalam membangun websites.
Setelah selesai mendesign tampilan di Expression Blend sekarang saatnya untuk menambahkan code-behind pada Visual Studio 2008. Buka aplikasi yang barusan anda buat dengan menggunakan Visual Studio, pilih New – Open Project – Kalkulator – kemudian isi property Name dari masing-masing property yang ada.
Kemudian tambahkan kode pada saat tombol diklik (event onClick). Tambahkan kode sebagai berikut:
1: private void btnHitung_Click(object sender, RoutedEventArgs e)
2: {
3: int intBil1 = 0, intBil2 = 0, intHasil = 0;
4: intBil1 = Convert.ToInt32(txtBil1.Text);
5: intBil2 = Convert.ToInt32(txtBil2.Text);
6:
7: if (rdTambah.IsChecked == true)
8: {
9: intHasil = intBil1 + intBil2;
10: MessageBox.Show("Hasil Penjumlahannya :" + intHasil.ToString());
11: }
12: else
13: {
14: intHasil = intBil1 + intBil2;
15: MessageBox.Show("Hasil Pengurangan : " + intHasil.ToString());
16: }
17: }
Untuk mencoba menjalankan aplikasinya tekan Ctrl+F5.
Contoh aplikasi diatas hanya merupakan contoh aplikasi yang sangat sederhana yang bisa dibangun menggunakan WPF. Aplikasi WPF juga dapat digunakan untuk mengembangkan aplikasi 3D graphic dan game.
LINQ (Language Integrated Query) adalah feature baru pada .NET 3.5 yang cukup banyak mendapat perhatian dari para developer saat ini. Apa saja yang bisa dilakukan dengan LINQ? Jika anda ingin mengetahuinya lebih jauh anda dapat mendownload presentation dari Luca Bolognese, LINQ Lead Program Manager dan
Michael Pizzo Software Architect Data Programmability, Microsoft Corporation. slide presentasi mereka dapat di download pada link dibawah ini: