Sunday, April 21, 2013

CStatic Members

Jika ingin membuat CStatic object maka operasi(method) yang bisa dilakukan pada object tersebut. Namun sebelum melangkah lebih jauh, object tersebut harus di create dulu dengan fungsi :
virtual BOOL Create(
                                   LPCTSTR lpszText,
                                   DWORD dwStyle,
                                   const RECT& rect,
                                   CWnd* pParentWnd,
                                  UINT nID = 0xFFFF);
Pada method tersebut, lpszText berfungsi untuk menspesifikasikan text yang akan disimpan pada control, jika tidak ada maka tidak akan ada text yang muncul hehe... :D
dwStyle berguna untuk menspesifikasikan kontrol statik pada window style. Kontrol statik di sini contohnya SS_BITMAP, SS_CENTER, SS_ICON, SS_RIGHT, dsb, keterangannya lengkapnya bisa dilihat di msdn.
kemudian variabel rect menspesifikasikan posisi dan ukuran dari kontrol statik. rect ini dapat berupa RECT structure ataupun CRECT object.
pParentWnd menunjukkan CStatic parent window yang biasanya adalah CDialog. pParentWnd ini biasanya bernilai NULL.
terakhir adalah nID yang menunjukkan ID pada kontrol statiknya.

Nah setelah objectnya di create, maka method yang bisa digunakan yaitu :

  • HBITMAP GetBitmap() const; Method ini mengembalikan handle bitmap yang sebelumnya diset oleh SetBitmap method. Contohnya, misalkan dbuat program berikut,

CStatic myStatic;
/*kita create dulu*/
myStatic.Create(_T("my Static Bitmap"),WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE, CRect(10,10,150,50),NULL);
/*nah jika tidak ada bitmap yang didefinisikan untuk kontrol statik, maka buat bitmap ke system kemudian close bitmapnya*/
if(myStatic.GetBitmap() == NULL)
{ myStatic.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(OBM_CLOSE)));
}

  • HCURSOR GetCursor(); Method ini menghandle current cursor yang sebelumnya diset oleh SetCursor method. Jadi method ini akan bernilai NULL jika sebelumnya belum ada cursor yang di set, perlu diketahui bahwa method ini butuh header afxwin.h. Contoh :
CStatic myStatic;
myStatic.Create(_T("My Static lagi hehe",WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE, Crect(10,10,150,50),NULL);
/*jika blm ada image yang didefinisikan untuk static control, maka buat image ke system arrow dan question mark cursor*/
if(myStatic.GetCursor()==NULL)
{ myStatic.SetCursor(::LoadCursor(NULL,IDC_HELP));
}
  • HENMETAFILE GetEnhMetaFile() const; Method ini mengembalikan handle dari enhanced metafile yang sebelumnya diset oleh SetEnhMetaFile method. Method ini mengembalikan nilai NULL jika blm ada metafile yang telah diset. Sama seperti method sebelumnya, method ini juga butuh header afxwin.h. Contoh pemakaiannya :
CStatic myPoipo;
myPoipo.Create(_T("Poipo Clan"),WC_CHILD|WS_VISIBLE|SS_ENHMETAFILE|SS_CENTERIMAGE, CRect(10,10,150,50), NULL);
/*jika blm ada image maka definisikan image ke poipo.emf*/
if(myPoipo.GetEnhMetaFile() ==NULL)
    myPoipo.SetEnhMetaFile(::GetEnhMetafile(_T("poipo.emf")));

  • HICON GetIcon() const; Method ini mengembalikan nilai handle dari icon yang sebelumnya diset oleh SetIcon. Requirementnya afxwin.h. Ex:
CStatic poipo;
poipo.Create(_T("poipo GetIcon"),WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE, CRect(10,10,150,50), NULL);
if(poipo.GetIcon() ==  NULL)
   poipo.SetIcon(::LoadIcon(NULL,IDI_ERROR));

  • HBITMAP SetBitmap(HBITMAP hBitmap);  Method ini mengembalikan handle bitmap yang sebelumnya berhubungan dengan static control. Parameter hBitmap  pada method ini menunjukkan handle dari bitmap yang akan digambar pada static control. Bitmap akan secara otomatis digambar dari static control. Secara defult, bitmap tersebut akan ditampilkan dalam upper-left corner dan static control akan menyesuaikan ke ukuran dari bitmap. Kita dapat menggunakan berbagai macam ukuran window dan styles control static, tapi harus selalu menggunakan style SS_BITMAP dan SS_CENTERIMAGE. Ex:
CStatic hyosoka;
hyosoka.Create(_T("Hyosoka"),WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE, CRect(10,10,150,50),NULL);
if(hyosoka.GetBitmap == NULL)
   hyosoka.SetBitmap(::LoadBitmap(NULL,MAKEINTRESOURCE(OBM_CLOSE)));

  • HCURSOR SetCursor(HCURSOR hCursor); Method ini menghandle cursor yg akan digambar pada static control yang ditandai oleh parameter hCursor. Cursor akan secara otomatis digambar pada static control. Secara default, akan berbentuk upper-left corner dan akan disesuaikan dengan ukuran cursor. Kita dapat menggunakan beberapa style yang berbeda, namun harus menggunakan style SS_ICON & SS_CENTERIMAGE. Ex:
CStatic myCursor;
myCursor.Create(_T("My Poipo Cursor"),WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE, CRect(10,10,150,50),NULL);
if(myCursor.GetCursor() == NULL)
   myCursor.SetCursor(::LoadCursor(NULL,IDC_HELP));

  • HENMETAFILE SetEnhMetaFile(HENMETAFILE hMetaFile); Method ini menspesifikasikan metafile yang akan ditampilkan pada static control. Style wajib yang harus digunakan dalam method ini yaitu SS_ENHMETAFILE. Ex:
CStatic myMetaFile;
myMetaFile.Create(_T("myMetaFile"),WS_CHILD|WS_VISIBLE|SS_ENHMETAFILE|SS_CENTERIMAGE, CRect(10,10,150,50), NULL);
if (myMetaFile.GetEnhMetaFile() == NULL)
  myMetaFile.SetEnhMetaFile(::GetEnhMetaFile(_T("myemf.emf"));

  • HICON SetIcon(HICON hIcon); Method ini menunjukkan icon yang akan ditampilkan pada static control. Style window yang harus digunakan yaitu SS_ICON dan SS_CENTERIMAGE. Ex:
CStatic myIcon;
myIcon.Create(_T("My Static Icon"), WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE, CRect(10,10,150,50), NULL);
if(myIcon.GetIcon() == NULL)
  myIcon.SetIcon(::LoadIcon(NULL,IDI_ERROR));

  • virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); Method ini bersifat overridables (ada fitur virtual). Parameter lpDrawItemStruct berguna sebagai pointer ke DRAWITEMSTRUCT structure. Structure tersebut berisi informasi tentang item yang akan digambar dan tipe penggambaran yang dibutuhkan. Style window yang digunakan yaitu SS_OWNERDRAW.

Saturday, April 20, 2013

Adding JPG and GIF Images to MFC Project

1. Open the resource editor for a CDialog Window and add an MFC Picture Control
2. Change the Picture Control's "Type" property from the default "Frame" to "Bitmap"
3. Create a global pointer to a CStatic class object. Ex: CStatic * pPCView;
4. Associate the CStatic pointer with the Picture Control using the function GetDigItem() and casting to the correct data type in OnInitDialog(). We must do this before we want to try to call any methods with the pointer. Ex: pPCView = (CStatic *) GetDigItem(PC_VIEW);
5. Include the file in our globals to provide access to CImage class.
6. In our code where we want to display the image, create a CImage object and a CBitmap object. Ex:
      CImage ViewImage;
      CBitmap ViewBitmap;
7. Load the JPG or GIF file into the CImage object. Ex:
                                          ViewImage.Load(_T("View/Hyosoka.jpg"));
8. Attach the CImage object to the CBitmap Object by passing it as an argument to CBimap's Attach() method and calling detach() on the CImage. Ex: ViewBitmap.Attach(ViewImage.Detach());
9. Call the method SetBitmap() on the pointer to the picture control and pass in the CBitmap as an argument, casting it to HBITMAP. Ex: pPCView->SetBitmap((HBITMAP)ViewBitmap);
10. We will need to add ON_WM_PAINT to our MFC Message Map tags.
11. We should override the MFC OnPaint() method.
12. Call the CPaintDC method, passing in the this pointer.