Alıntı:
VB6\'da .NET te olduğu gibi alternatif kontroller bulunmuyor. Bu kontrollerin VB\'de nasıl hazırlandığını merak edenler icin bol acıklamalı bir dokuman.
".NET te bu tip kontroller hazır olarak var" diyeceksiniz.
Fakat ben biraz eski kafalı olduğumdan bu kontrollerin VB6'da
nasıl oluşturulduğunu anlatmak istiyorum. Ayrıca bu kontrolu
OCX olarak derleyip .NET te de kullanabilirsiniz.

- Bu dokuman ve ornekte, VB6.0 da UserControl nesnesi kullanılarak
ProgressBar kontrolunun nasıl hazırlandığı incelenecek.
- ProgressBar'a ozellikler ekleyip, on ve arka plan renklerini
bu ozellikler vasıtasıyla değiştireceğiz.
- Ayrıca event kullanımlarına ilişkin olarak, yapmakta olacağımız
kontrol nesnesine Click, MouseDown, MouseUp ve MouseMove olaylarını
ekleyeceğiz.

[IMG]http://img23.**************/img23/2316/screenshotium.jpg[/IMG]
--------Figur-1--------

Hazırlık

Yapacağımız kontrol nesnesini EXE projesi icinde kullacağız.
Dilerseniz yeni bir ActiveControl projesinde OCX olarak
hazırlayabilirsiniz.

Oncelikle yeni bir EXE projesi acıp, projeye bir tane UserControl
ve iki tane Modul ekleyin. Ben, projede kullandığım objelere
aşağıdaki isimleri verdim. Dokuman anlatımı suresince bu isimlerle
kullanacağım.

Alıntı:
Form: Form1
UserControl: GBProgressBar
Module: mdlDrawing
Module: mdlRGBHSL
UserControl: GBProgressBar

UserControl nesnesinin ismini "GBProgressBar" olarak kullandık.
Bu kontrol nesnesi, Toolbar bolumunde varsayılan icon resmi [IMG]http://img23.**************/img23/3732/defaulttbb.jpg[/IMG]
ile gozukecektir. Biz bu ikonu kendi hazırladığımız resimle [IMG]http://img23.**************/img23/5099/tbbf.jpg[/IMG]
değiştireceğiz.

UserControl'un ScaleMode ozelliğini pixel olarak tanımlayın ve AutoRedraw
ozelliğini ise True yapın.

Mouse, Toolbardaki bu kontrol uzerine geldiğinde, hatırlatma
balonu cıkacak ve vermiş olduğunuz "GBProgressBar" ismi gozukecektir.

Toolbar'daki iconu değiştirmek icin, UserControl nesnesinin "ToolboxBitmap"
ozelliğine kendi hazırladığımız resmi sececeğiz. Bu resim 16x15 pixel
boyutlarında olmalı ve "1, 15" koordinatlarındaki renk değeri maskeleme icin
kullanılacaktır. Yani "x=1, y=15" koordinatlarındaki renk değeri siyah ise
bu resim icinde kullandığınız tum siyah renkler maskelenecektir.

UserControl nesnesinin kod bolumune gecelim ve bu kontrol icinde kullanacağımız
ozellikleri saklayan değişkenleri tanımlayalım. Bu alanda "eProgressScrolling"
isimli bir enum olusturuyoruz. Enum ile ilgili acıklama dokumanın ilerleyen
bolumlerinde verilecektir.
Alıntı:
' ProgressBar'ın gorunum değerleri
Public Enum eProgressScrolling
pbScrollingStandard = 0
pbScrollingSmooth = 1
End Enum

Dim m_nFaceColor As OLE_COLOR ' onplan rengi
Dim m_nBackColor As OLE_COLOR ' arkaplan rengi
Dim m_nMax As Long ' maximum progress değeri
Dim m_nMin As Long ' minimum progress değeri
Dim m_nValue As Long ' progress in calışma anındaki değeri
Dim m_bEnabled As Boolean ' progress'in kullanılabilirlik değeri
Dim m_nScrolling As eProgressScrolling ' gorunumu
İlk olarak, hazırladığımız UserControl'u formunuza eklediğinizde
varsayılan değerleri "UserControl_Initialize" bolumunde belirtiyoruz.

Alıntı:
Private Sub UserControl_Initialize()
m_nMax = 100
m_nFaceColor = vbGreen
m_nBackColor = vbButtonFace
m_nValue = 0
m_nScrolling = pbScrollingStandard
End Sub
Bir de "UserControl_InitProperties" olayı vardır.
Bu olay "UserControl_Initialize" dan sonra calışır ve "Ambient" kullanımına
izin verir. Sadece yazmakta olduğumuz "UserControl" nesnesi herhangi bir
forma eklendiğinde calışır.

orn: Kontrolu forma eklediğimizde, kontrolun arkaplan renginin, form ile
aynı olmasını istiyorsak. Bu bolume aşağıdaki kodlar eklenebilir.

Alıntı:
Private Sub UserControl_InitProperties()
'Bu işlem UserControl_Initialize da yapılamaz.
m_nBackColor = Ambient.BackColor
End Sub
Yukarıda tanımlanan değişkenleri UserControl dışından kullanabilmemiz icin
kontrole ozellikler eklememiz gerekmektedir.

Alıntı:
Public Property Get FaceColor() As OLE_COLOR
FaceColor = m_nFaceColor
End Property
Public Property Let FaceColor(ByVal newVal As OLE_COLOR)
m_nFaceColor = newVal
Call DrawProgress
End Property

Public Property Get BackColor() As OLE_COLOR
BackColor = m_nBackColor
End Property
Public Property Let BackColor(ByVal newVal As OLE_COLOR)
m_nBackColor = newVal
Call DrawProgress
End Property
*
*
*
Her ozelliği değiştirdiğiminde kontrolu "DrawProgress" alt programı
ile tekrar ciziyoruz.
Alıntı:

Private Sub DrawProgress()
Dim nVal As Long

UserControl.Cls
nVal = (UserControl.ScaleWidth - 4)
UserControl.BackColor = m_nBackColor
If Ambient.UserMode Then
nVal = ((UserControl.ScaleWidth - 4) / (m_nMax - m_nMin)) * (m_nValue - m_nMin)
End If
Call DrawDegrade(UserControl.hdc, 2, 2, nVal, (UserControl.ScaleHeight - 4), (UserControl.ScaleWidth - 4), m_nFaceColor, m_nScrolling)
Call DrawEdgeEx(UserControl.hdc, 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight)
If UserControl.AutoRedraw Then UserControl.Refresh
End Sub
Yukarıdaki kodda "Ambient.UserMode" değeri, uygulama calıştırıldığında
"True" olur. Normalde kontrol forma eklendiğinde "Value" değerini maximum
olarak gosterip, progress'in tamamını cizerek kullanıcıya gostermek
amacıyla kullanılmıştır. Kodu kullanırken daha net anlayacaksınız.

UserControl'un tum kodları aşağıda sunulmuştur.

' Author: Gokhan ERDOĞDU
' Date : 03.06.2009
' mail : [email protected]
' Copyright © 2009 GBSoftware

Option Explicit

Public Enum eProgressScrolling
pbScrollingStandard = 0
pbScrollingSmooth = 1
End Enum

Dim m_nFaceColor As OLE_COLOR
Dim m_nBackColor As OLE_COLOR
Dim m_nMax As Long
Dim m_nMin As Long
Dim m_nValue As Long
Dim m_bEnabled As Boolean
Dim m_nScrolling As eProgressScrolling

Public Event Click()
Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

Private Sub DrawProgress()
Dim nVal As Long

UserControl.Cls
nVal = (UserControl.ScaleWidth - 4)
UserControl.BackColor = m_nBackColor
If Ambient.UserMode Then
nVal = ((UserControl.ScaleWidth - 4) / (m_nMax - m_nMin)) * (m_nValue - m_nMin)
End If
Call DrawDegrade(UserControl.hdc, 2, 2, nVal, (UserControl.ScaleHeight - 4), (UserControl.ScaleWidth - 4), m_nFaceColor, m_nScrolling)
Call DrawEdgeEx(UserControl.hdc, 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight)
If UserControl.AutoRedraw Then UserControl.Refresh
End Sub

Private Sub UserControl_Click()
If Not m_bEnabled Then Exit Sub
RaiseEvent Click
End Sub

Private Sub UserControl_InitProperties()
m_nBackColor = Ambient.BackColor
End Sub

Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Not m_bEnabled Then Exit Sub
RaiseEvent MouseDown(Button, Shift, x, y)
End Sub
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If Not m_bEnabled Then Exit Sub
RaiseEvent MouseMove(Button, Shift, x, y)
End Sub
Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
If Not m_bEnabled Then Exit Sub
RaiseEvent MouseUp(Button, Shift, x, y)
End Sub

Private Sub UserControl_Initialize()
m_nMax = 100
m_nFaceColor = vbGreen
m_nBackColor = vbButtonFace
m_nValue = 0
m_nScrolling = pbScrollingStandard
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
m_nFaceColor = PropBag.ReadProperty("FaceColor", vbGreen)
m_nBackColor = PropBag.ReadProperty("BackColor", vbButtonFace)
m_nMax = PropBag.ReadProperty("Max", 100)
m_nMin = PropBag.ReadProperty("Min", 0)
m_nValue = m_nMin
m_nScrolling = PropBag.ReadProperty("Scrolling", pbScrollingStandard)
m_bEnabled = PropBag.ReadProperty("Enabled", True)
Call DrawProgress
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("FaceColor", m_nFaceColor)
Call PropBag.WriteProperty("BackColor", m_nBackColor)
Call PropBag.WriteProperty("Max", m_nMax)
Call PropBag.WriteProperty("Min", m_nMin)
Call PropBag.WriteProperty("Scrolling", m_nScrolling)
Call PropBag.WriteProperty("Enabled", m_bEnabled)
End Sub

Private Sub UserControl_Resize()
Call DrawProgress
End Sub

Public Property Get FaceColor() As OLE_COLOR
FaceColor = m_nFaceColor
End Property
Public Property Let FaceColor(ByVal newVal As OLE_COLOR)
m_nFaceColor = newVal
Call DrawProgress
End Property

Public Property Get BackColor() As OLE_COLOR
BackColor = m_nBackColor
End Property
Public Property Let BackColor(ByVal newVal As OLE_COLOR)
m_nBackColor = newVal
Call DrawProgress
End Property

Public Property Get Max() As Long
Max = m_nMax
End Property
Public Property Let Max(ByVal newVal As Long)
If newVal > m_nMin Then
m_nMax = newVal
If m_nValue > m_nMax Then m_nValue = m_nMax
Call DrawProgress
Else
VBA.Err.Raise 380, , "Invalid property value"
End If
End Property

Public Property Get Min() As Long
Min = m_nMin
End Property
Public Property Let Min(ByVal newVal As Long)
If newVal < m_nMax Then
m_nMin = newVal
If m_nValue < m_nMin Then m_nValue = m_nMin
Call DrawProgress
Else
VBA.Err.Raise 380, , "Invalid property value"
End If
End Property

Public Property Get Value() As Long
Value = m_nValue
End Property
Public Property Let Value(ByVal newVal As Long)
If newVal >= m_nMin And newVal