กรกฎาคม 18, 2018, 06:00:44 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: Getting Started with GDI+(Plus) in C++ Builder XE  (อ่าน 3484 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« เมื่อ: กรกฎาคม 19, 2013, 04:43:16 pm »

Getting Started with GDI+(Plus) in C++ Builder XE
สำหรับคนที่เล่น 2D Graphics คงรู้จักกับ GDI เป็นอย่างดี และทราบดีว่า GDI ให้คุณภาพของการแสดงผลออกมาไม่ค่อยน่าประทับใจ
ยกตัวอย่างเช่นรูปด้านล่างนี้ เป็นการวาดวงกลม ด้วย GDIPlus และ GDI


จะเห็นได้ว่าเส้นที่วาดด้วย GDIPlus จะ Smooth กว่าเส่นที่วาดด้วย GDI อย่างเห็นได้ชัด
อย่างไรก็ตาม ไม่ได้หมายความว่า GDI จะวาดเส้นแบบ Smooth แบบ GDIPlus ไม่ได้
GDI ก็ทำได้เช่นกัน แต่ต้องใช้วามรู้ความเข้าใจในเรื่องของ Pen และ Brush Types รวมถึงรายละเอียดปรึกย่อยต่างๆ อย่างละเอียด ทำให้ Programmer ต้องเสียเวลาไม่น้อยทีเดียว
นี่เป็นเพียงจุดเล็กๆ จุดเดียวที่ใช้ในการสร้างแรงดึงดูดเพื่อนำเข้าสู่การใช้งาน GDIPlus


GDIPlus สามารถนำไปใช้กับภาษาคอมพิวเตอร์ได้แทบทุกภาษา ทุก Platform เพราะได้ถูก Compile เพื่อให้นำมาใช้ได้ง่ายๆ ในรูปแบบของ Library Files
ในบทความนี้จะแนะนำขั้นตอนการใช้งานบน C++ Builder XE (สำหรับ C++ Builder เวอร์ชั่น 5, 6 ให้ค้นหาจากกระทู้ก่อนๆ ส่วนเวอร์ชั่น 2007, 2009, 2010 ผมไม่แน่ใจว่าจะมีขั้นตอนเหมือนเวอร์ชั่น 5,6 หรือเหมือน XE ส่วนนี้ฝากให้ไปหาข้อมูลเพิ่มเติมครับ แล้วกลับมาบอกผมด้วย จะขอบคุณยิ่ง)
เข้าเรื่องกันเลยครับ


1) หลังจากสร้าง VCL Application ใหม่ขึ้นมาแล้ว ให้เพิ่ม code ต่อไปนี้ไว้ที่ส่วนหัวของ source file (*.cpp)
Code: (c)
#include <gdiplus.h>
using namespace Gdiplus;
ULONG_PTR gdiplusToken;
GdiplusStartupInput startupInput;

ไม่มีอะไรมากกว่า include ขอใช้ namespace และประกาศตัวแปร

2) ที่ FormCreate() ให้เพิ่ม GdiplusStartup() เพื่อทำการกำหนดค่าเริ่มต้นของ GDIPlus Library
Code: (c)
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   GdiplusStartup(&gdiplusToken, &startupInput, 0); //<--- Add this line
}


3) สุดท้ายที่ FormClose() ให้เพิ่ม GdiplusShutdown() ลงไปเพื่อทำการคืนหน่วยความจำ และสิ้นสุดการใช้งาน  GDIPlus Library
Code: (c)
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   GdiplusShutdown(gdiplusToken);
}


เพียงเท่านี่ก็เรียบร้อย พร้อมใช้งานได้แล้ว



ตัวอย่างโปรแกรม

Code: (c)
HDC hdc = pBBF->Canvas->Handle;
Gdiplus::Graphics *g = new Gdiplus::Graphics(hdc);
g->SetSmoothingMode(SmoothingModeHighQuality);

Gdiplus::SolidBrush *sb =
   new Gdiplus::SolidBrush(Gdiplus::Color(0xFFFF0000));
Gdiplus::Pen *pn = new Gdiplus::Pen(Gdiplus::Color(0xFF0000FF));
Gdiplus::RectF rec = Gdiplus::RectF(10, 10, pBBF->Width / 2,
   pBBF->Height / 2);

g->DrawRectangle(pn, rec);
g->FillRectangle(sb, rec);


Gdiplus::Color gc1 = Gdiplus::Color(0x800000FF);
Gdiplus::Color gc2 = Gdiplus::Color(0x8000FF00);
Gdiplus::LinearGradientBrush *lbr = new Gdiplus::LinearGradientBrush(rec, gc1,
                           gc2, LinearGradientModeHorizontal);
g->FillEllipse ( lbr, rec );
Swap();

delete sb;
delete pn;
delete g;


ตัวอย่างนี้ไม่มีอะไรแปลกใหม่ในโลแกของ GDIPlus นอกจาก
Code: (c)
HDC hdc = pBBF->Canvas->Handle; 

ตัวนี้เป็นการเลือก Device Context ของตัวแปรชนิด Bitmap ที่ชื่อ pBBF (pointer to Bitmap Back Buffering)

และ
Code: (c)
Swap();

เป็นการ Copy สิ่งที่วาดลงไปใน pBBF ไปยัง PaintBox เพื่อแสดงผล โดยใช้
Code: (c)
pTPB->Canvas->Draw(0, 0, pBBF);

pTPB คือ Pointer ชนิด TPaintBox ที่ใช้ไปยัง PaintBox เป้าหมาย
กระบวนการนี้สามารถใช้ความสามารถของ Standard Function ของ Windows ได้ เช่น BitBlt() เป็นต้น
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: