Spesifikasi:
Ukuran: 14x21 cm
Tebal: 158 hlm
Harga: Rp 24.800
Terbit pertama: April 2005
Sinopsis singkat:
Dengan memperkenalkan metode-metode pembuatan kontrol ActiveX melalui contoh-contoh
program, buku ini akan memandu Anda hingga mampu membuat kontrol ActiveX secara
profesional. Sekalipun kontrol-kontrol ActiveX yang ditampilkan dalam buku ini bertujuan
memandu penggunanya untuk membuat kontrol ActiveX, sebenarnya kontrol ActiveX di
dalam buku ini dapat digunakan untuk membangun suatu aplikasi yang menarik dan penuh
animasi, contohnya kontrol ActiveX Picturebox Slideshow yang mampu menampilkan
animasi slideshow. Anda juga diajak membuat kontrol ActiveX Form Asimetris yang
memungkinkan Anda memiliki form yang bentuknya beraneka ragam dan dapat diganti-ganti
sesuai dengan selera. Bersama buku ini Anda juga akan dilatih untuk mengembangkan daya
pikir Anda untuk membuat kontrol ActiveX 3 dimensi dan menarik, seperti tombol gambar,
label 3 dimensi ataupun kontrol pendukung form sehingga anda mampu membuat aplikasi
yang indah dan menawan.
Buku ini adalah buku yang tepat untuk dijadikan pegangan untuk mulai berkelana di dunia
ActiveX Visual Basic, bahkan bagi Anda yang baru saja berkenalan dengan dunia
BAB 8
KONTROL ACTIVEX FORM
Jenis kontrol terakhir yang kita bahas adalah kontrol form, yaitu
kontrol-kontrol yang berfungsi mengubah tampilan form, antara
lain form untuk mengubah bentuk form, memberi warna pada
form, dan kontrol untuk memberi skin seperti halnya program
WinAmp yang dapat diganti-ganti skin-nya. Selamat
mempe-lajarinya dan semoga yang diberikan dalam buku ini bermanfaat.
8.1 Form Berbentuk Elips
Langkah awal yang akan penulis tunjukkan dari manipulasi form
menggunakan kontrol ActiveX adalah membuat form menjadi
berbentuk elips. Di sini kita akan menggunakan 4 fungsi dari API
Windows, yaitu:
CreateEllipticRgn untuk membentuk objek baru berbentuk
elips/bulat.
SetWindowRgn untuk mengubah bentuk form sesuai objek
yang telah kita bentuk sebelumnya.
DeleteObject untuk menghapus objek yang telah kita bentuk
dari fungsi pertama.
CreateRectRgn untuk membentuk objek sesuai bentuk form
semula.
Cara penulisan CreateEllipticRgn dan CreateRectRgn adalah
sebagai berikut:
Variabel (bertype long) = CreateEllipticRgn(x1, y1, x2, y2)
Variabel (bertype long) = CreateRectRgn(x1, y1, x2, y2)
Keterangan:
x1
= koordinat x pojok kiri atas lingkaran
y1
= koordinat y pojok kiri atas lingkaran
x2
= koordinat x pojok kanan bawah lingkaran
y2
= koordinat y pojok kanan bawah lingkaran
Cara penulisan SetWindowRgn adalah sebagai berikut:
SetWindowRgn(handle, variabel, True)
Handle di sini maksudnya adalah handle dari form ataupun
kontrol lainnya yang akan diubah atau disesuaikan bentuknya
(untuk form yaitu Form.hwnd).
Sintaks untuk DeleteObject adalah:
DeleteObject(variabel).
Oleh karena form kita berubah bentuk menjadi elips, kita akan
kehilangan bar caption dari form sehingga akan menyulitkan kita
untuk menggeser form kita yang tidak memiliki bar caption. Oleh
sebab itu supaya dapat menggesernya maka kita menggunakan 2
fungsi API, yaitu SendMessage untuk mengirim pesan tertentu ke
window untuk suatu memanggil proses tertentu dari Windows dan
fungsi kedua, yaitu ReleaseCapture untuk menimbulkan proses
tombol mouse.
Keuntungan penggunaan ActiveX di sini adalah saat perancangan
program setelah ActiveX ini dimasukkan ke dalam form program
kita maka form sudah dapat terlihat berbentuk elips sehingga kita
dapat mengatur letak kontrol-kontrol yang lain di dalam form kita
tersebut dalam rangka membuat program EXE seperti gambar
berikut ini.
Gambar 8.1 Kontrol form berbentuk ellips
Adapun cara membuat kontrol ini sangat sederhana sekali. Kita
tidak memerlukan kontrol dari toolbox sama sekali. Di ActiveX
Wizard, buatlah Property baru bernama elips dengan jenis data
Boolean bernilai False.
Masukkan kode-kode berikut ini di jendela kode:
1.
Di bagian General, masukkan keempat fungsi API, yaitu:
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As _
Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) _ As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, _
ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As _
Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As _
Long) As Long
Private Declare Function SendMessage Lib "User32" Alias_ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1 Const HTCAPTION = 2
2.
Di bagian Get Elips(), tambahkan:
Atur
sehingga kode selengkapnya menjadi:
Public Property Get Elips() As Boolean Elips = m_Elips
Atur End Property
3.
Di bagian UserControl_InitProperties tambahkan juga:
Atur
sehingga kode selengkapnya menjadi:
Private Sub UserControl_InitProperties() m_Elips = m_def_Elips
Atur End Sub
4.
Masukkan prosedur-prosedur berikut:
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer,_
X As Single, Y As Single) If Button = 1 Then ReleaseCapture
SendMessage Parent.hWnd, WM_NCLBUTTONDOWN, _ HTCAPTION, 0&
End If End Sub
Private Sub UserControl_AmbientChanged(PropertyName As String)
UserControl.BackColor = Ambient.BackColor End Sub
Private Sub UserControl_Show() Atur
End Sub
Sub Atur()
Dim var As Long Parent.ScaleMode = 3 If m_Elips = True Then Parent.BorderStyle = 0
var = CreateEllipticRgn(30, 30, Parent.ScaleWidth, Parent.ScaleHeight)
Else
Parent.BorderStyle = 2
var = CreateRectRgn(0, 0, Parent.Width, Parent.Height)
End If
DeleteObject (var) End Sub
5.
Silakan kompilasi. Untuk menggerakkannya, tahan mouse
pada kontrol dan pindahkan ke mana saja.
8.2 Form Bumi dan Bulan
Pengembangan teknik selanjutnya dari teknik di atas adalah
membuat kontrol yang menyebabkan form kita berbentuk seperti
tampilan berikut ini:
Gambar 8.2 Kontrol form berbentuk bumi dan bulan
Untuk membuatnya, kita memerlukan satu lagi fungsi API, yaitu
CombineRgn yang berfungsi menggabungkan region-region yang
telah terbentuk sebelumnya berdasarkan pola tertentu. Aturan
penggunaannya adalah sebagai berikut:
CombineRgn(h, r1, r2, pola)
Keterangan:
h
= region hasil penggabungan yang harus sudah ada
sebelumnya (bisa r1 atau r2)
r1
= region pertama untuk digabungkan
r2
= region kedua untuk digabungkan
pola = mode yang digunakan dalam operasi penggabungan
dan merupakan suatu konstanta, yaitu:
Konstanta Pola Keterangan (jika r1 menjadi h)
1 RGN_AND Daerah perpotongan antara r1 dan r2
2 RGN_OR Daerah gabungan antara r1 dan r2
3 RGN_XOR Daerah r1 dan r2 yang tidak berpotongan
4 RGN_DIFF Daerah r1 yang tidak berpotongan dengan r2
Untuk lebih jelasnya, lihat ilustrasi berikut ini:
Gambar 8.3 Macam-macam pola proses dalam fungsi CombineRgn
Kembali ke kontrol ActiveX kita, yaitu kontrol form bumi dan
bulan. Cara membuatnya sama dengan yang sebelumnya, yaitu
kontrol form berbentuk elips, hanya saja Property yang baru
dibentuk bernama bulan bukan elips dan di bagian General, kode
yang ditambahkan adalah:
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Prosedur Atur-nya berisi kode sebagai berikut:
Sub Atur()
Dim tengah As Long Dim pinggir1 As Long Dim pinggir2 As Long Dim sat As Long Dim satb As Long
Parent.ScaleMode = 3 If m_bulan = True Then
r1 = CreateEllipticRgn(80, 20, 160, 100) r2 = CreateEllipticRgn(50, 40, 130, 120) sat = CombineRgn(r1, r1, r2, 4)
satb = CombineRgn(bumi, bumi, r1, 2) Else
Parent.BorderStyle = 2
bumi = CreateRectRgn(0, 0, Parent.Width, Parent.Height) End If
SetWindowRgn Parent.hWnd, bumi, True DeleteObject (bumi)
End sub
Keterangan:
Variabel bumi berguna untuk membentuk object bumi, sedangkan
variabel r1 berguna untuk membentuk object bulan berbentuk
bulat. Varibel r2 akan berfungsi membentuk object berbentuk
bulat pula untuk menghilangkan sebagian region (daerah) object
r1 dengan pola Rgn_Diff sehingga object r1 akan berbentuk sabit
dan hasil perpotongannya dimasukkan kembali ke dalam object
r1. Region r1 tersebut kemudian digabungkan dengan region bumi
menggunakan pola Rgn_Or.
8.3 Form Asimetris
Setelah di atas kita bermain-main dengan form yang simetris, kita
akan mengembangkan teknik kita untuk membuat suatu kontrol
yang dapat membuat form kita berbentuk seperti contoh berikut
ini:
Dengan kontrol ini, kita dapat membuat form kita diganti-ganti
bentuknya. Fasilitas Properties-nya adalah adanya pilihan untuk
mengganti skin form sewaktu diperlukan.
Prinsipnya, setelah gambar dimasukkan ke dalam kontrol maka
kontrol akan mengambil satu titik di gambar yang akan dijadikan
titik transparan, kemudian berdasarkan data tersebut kontrol akan
mengambil titik-titik bukan transparan dan menggabungkannya
menggunakan fungsi CombineRgn pola Rgn_Or dan membentuk
suatu objek. Selanjutnya bentuk parent (form program EXE kita)
akan disesuaikan dengan bentuk tersebut. Contoh gambar
(sebaiknya tipe BMP) yang dimasukkan adalah sebagai berikut:
Gambar 8.5 Gambar yang dimasukkan ke kontrol form asimetris
Adapun acara membuatnya adalah sebagai berikut:
1.
Masukkan 1 Picturebox ke dalam lembar kerja kita. Properties
yang perlu diubah setting-nya adalah sebagai berikut:
Kontrol Properti Setting
UserControl BackStyle 0-Transparant
ScaleMode 3-Pixel
Picture1 BorderStyle 0-None
Picture (Gambar yang akan dijadikan skin)
2.
Masukkan kode-kode berikut ini:
Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, _
ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _
As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As _
Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) _ As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _
As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _ ByVal nCombineMode As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As _
Long) As Long
Private Declare Function SendMessage Lib "User32" Alias_ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" () Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Public Property Get Picture() As Picture Set Picture = Picture1.Picture Atur
End Property
Public Property Set Picture(ByVal New_Picture As Picture) Set Picture1.Picture = New_Picture
PropertyChanged "Picture" Atur
End Property
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Set Picture = PropBag.ReadProperty("Picture", Nothing) Atur
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("Picture", Picture, Nothing) Atur
End Sub
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer,_
X As Single, Y As Single) If Button = 1 Then ReleaseCapture
SendMessage Parent.hWnd, WM_NCLBUTTONDOWN, _ HTCAPTION, 0&
End If End Sub
Sub Atur()
Parent.Width = Picture1.Width * 15 Parent.Height = Picture1.Height * 15 Parent.BorderStyle = 0
WindowRegion = MakeRegion(Picture1)
SetWindowRgn Parent.hwnd, WindowRegion, True Parent.Refresh
Parent.Picture = Picture1.Picture Parent.Refresh
Parent.Move 0, 0 End Sub
Private Function MakeRegion(Bentuk As PictureBox) As Long Dim X As Long, Y As Long, StartX As Long
Dim Penuh As Long, Garis As Long Dim Transparan As Long
Dim AturReg As Boolean, AturGaris As Boolean Dim hDC As Long
Dim Lebar As Long, Tinggi As Long
‘Thanks to Mr Black Tornado
hDC = Bentuk.hDC
Lebar = Bentuk.ScaleWidth Tinggi = Bentuk.ScaleHeight
AturReg = True: AturGaris = False X = Y = StartX = 0 Transparan = GetPixel(hDC, 0, 0) For Y = 0 To Tinggi - 1 For X = 0 To Lebar - 1
If GetPixel(hDC, X, Y) = Transparan Or X = Lebar Then If AturGaris Then AturGaris = False Garis = CreateRectRgn(StartX, Y, X, Y + 1) If AturReg Then Penuh = Garis AturReg = False Else
CombineRgn Penuh, Penuh, Garis, 2 DeleteObject Garis
End If End If Else
If Not AturGaris Then AturGaris = True StartX = X End If End If Next Next MakeRegion = Penuh End Function
8.4 Form Gradien
Kita akan membuat kontrol untuk menimbulkan gradiasi warna
pada form, tentu saja dengan banyak pilihan warna, tidak seperti
label gradien yang hanya mempunyai 3 pilihan warna. Tampilan
form setelah diberi kontrol tersebut adalah seperti gambar berikut
ini:
Gambar 8.6 Kontrol form gradien
Pada gambar tersebut terlihat bahwa kontrol ini pun mampu
membuat gradiasi warna secara diagonal. Adapun cara
membuatnya adalah sebagai berikut:
1.
Ubah properti Usercontrol, yaitu agar Autoredraw bernilai True
dan Backstyle bernilai 0 (Transparan).
2.
Jalankan ActiveX Control Interface Wizard:
Buat 3 Properties baru di bagian Create Custom Interface
Members, yaitu awal, akhir dan jenis.
Di bagian Set Attributes, atur agar awal bertipe data
OLE_Color dengan nilai Default VbRed, akhir bertipe data
OLE_Color dengan nilai Default VbBlue dan jenis bertipe
data variant.
4.
Masukkan kode-kode berikut ini:
Di bagian General:
Enum arah Horizontal Vertikal Diagonal End EnumDi bagian Get awal, tambahkan kode:
Atur
sehingga kodenya menjadi:
Public Property Get awal() As OLE_COLOR awal = m_Awal
Atur End Property
Di bagian Get akhir, tambahkan kode:
Atur
sehingga kodenya menjadi:
Public Property Get akhir() As OLE_COLOR akhir = m_Akhir
Atur End Property
Di bagian Get jenis, tambahkan kode:
Atur
sehingga kodenya menjadi:
Public Property Get jenis() As arah jenis = m_Jenis
Atur End Property
Di bagian UserControl_InitProperties, tambahkan kode:
Atur
Parent.AutoRedraw = True
sehingga kodenya menjadi:
Private Sub UserControl_InitProperties() m_Awal = m_def_Awal m_Akhir = m_def_Akhir m_Jenis = m_def_Jenis Atur Parent.AutoRedraw = True End Sub
Di bagian UserControl_ReadProperties dan UserControl_
WriteProperties, tambahkan perintah ini di bagian
ak-hirnya:
Atur
5.
Buat prosedur baru yaitu:
Private Sub UserControl_AmbientChanged(PropertyName As String)
Atur End Sub
Private Sub UserControl_Resize() Atur
End Sub
Private Sub UserControl_Show() Atur
End Sub
Sub Atur()
Dim pembagi As Integer
Dim awal As OLE_COLOR, akhir As OLE_COLOR
Dim ared As Single, agreen As Single, ablue As Single Dim red0 As Integer, green0 As Integer, blue0 As Integer Dim red1 As Integer, green1 As Integer, blue1 As Integer Dim I As Integer
Dim baru As Single
Dim x As Integer, y As Integer awal = m_Awal
akhir = m_Akhir
Parent.Cls
If m_Jenis = Horizontal Then pembagi = Parent.ScaleHeight If m_Jenis = Vertikal Then pembagi = Parent.ScaleWidth If m_Jenis = diagonal Then pembagi =
Sqr(Parent.ScaleHeight ^ 2 _ + Parent.ScaleWidth ^ 2) * 1.4
red0 = awal Mod 256 red1 = akhir Mod 256
ared = (red1 - red0) / pembagi
green0 = (awal And &HFF00FF00) / 256 green1 = (akhir And &HFF00FF00) / 256 agreen = (green1 - green0) / pembagi
blue0 = (awal And &HFFFF0000) / (256 ^ 2) blue1 = (akhir And &HFFFF0000) / (256 ^ 2) ablue = (blue1 - blue0) / pembagi
x = 0 y = 0
For I = 0 To pembagi
baru = RGB(red0 + I * ared, green0 + I * agreen, blue0 + I * ablue)
If m_Jenis = Horizontal Then Parent.Line (0, I)-(Parent.ScaleWidth,_
I), baru
If m_Jenis = Vertikal Then Parent.Line (I, 0)-(I, Parent.ScaleHeight),_
baru
If m_Jenis = diagonal Then
Parent.Line (0, x)-(y, 0), baru x = x + 1
y = y + 1 End If Next End Sub
Public Sub Refresh() UserControl.Refresh Atur
End Sub
8.5 Form ScreenMate
Pernahkah Anda menemukan program yang form-nya berukuran
kecil dan berpindah-pindah tempatnya secara otomatis di layar
monitar Anda. Terkadang program ini disertai suara dan
terkadang mengganggu pengguna komputer yang tidak tahu cara
mematikan program tersebut karena seringkali program tersebut
tidak mempunyai tampilan di taskbar (Properties Form, yaitu
ShowInTaskbar diset bernilaiFalse). Itulah program ScreenMate.
Adapun cara membuatnya adalah sebagai berikut:
1.
Masukkan 1 timer ke dalam lembar kerja. Properties yang
diubah di dalamnya adalah sebagai berikut:
Kontrol/Usercontrol
Properti
Setting
Usercontrol
BackStyle
0-Transparant
Timer
Enabled
True
Interval
1000
2.
Masukkan kode berikut:
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long Const m_def_Kecepatan = "1000"
Dim m_Kecepatan As String Dim m_Bergerak As Boolean
Public Property Get Kecepatan() As String Kecepatan = m_Kecepatan
Timer1.Interval = m_Kecepatan End Property
Public Property Let Kecepatan(ByVal New_Kecepatan As String) m_Kecepatan = New_Kecepatan
PropertyChanged "Kecepatan" End Property
Public Property Get Bergerak() As Boolean Bergerak = m_Bergerak
pewaktu End Property
Public Property Let Bergerak(ByVal New_Bergerak As Boolean) m_Bergerak = New_Bergerak
PropertyChanged "Bergerak" End Property
Private Sub Timer1_Timer() Atur
End Sub
Private Sub UserControl_InitProperties() m_Kecepatan = m_def_Kecepatan m_Bergerak = m_def_Bergerak pewaktu
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag) m_Kecepatan = PropBag.ReadProperty("Kecepatan", m_def_Kecepatan) m_Bergerak = PropBag.ReadProperty("Bergerak", m_def_Bergerak) pewaktu End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("Kecepatan", m_Kecepatan,_ m_def_Kecepatan)
Call PropBag.WriteProperty("Bergerak", m_Bergerak, m_def_Bergerak)
pewaktu Atur End Sub
Sub Atur()
Dim proc As Long
If m_Bergerak = True Then proc = MoveWindow(Parent.hwnd, _
Rnd * Screen.Width / 15, Rnd * Screen.Height / 15, 300, 200, 1)
End Sub
If m_Bergerak = True Then Timer1.Enabled = True Else Timer1.Enabled = False End If End Sub