با سلام به همه دوستان
راستش بچه ها قبلا از من آموزش ساخت ActiveX Control رو خواسته بودن ولی یه ایده خوب برای نوشتنش به ذهنم نرسید و گفتم الان یه آموزش کامل کامل رو بزارم تا اونایی که تا حالا با این قسمت کار نکردن بتونن کارشون رو شروع کنن
پیش نیازهای آموزش :
- برنامه نویسی ویژوال بیسیک یا VBscript
- آشنایی مقدماتی در حد بسیار کم با API ها
خوب اول به تعریف کلی و کاربردی که این نوع برنامه ها در ویژوال بیسیک دارن میپردازم
کنترول های ActiveX به کنترول هایی میگن که معمولا با پسوند
OCX در کامپیوتر شناخته شده هستن و میتونن به عنوان یک شیئ در زبان های مختلف مورد استفاده قرار بگیرن
کابرد اول این کنترولها زمانی هست که ما بخواییم یک شیئ با ویژگیهای خاص ایجاد کنیم تا بتوانیم از آن در تمام زبان های برنامه نویسی استفاده کنیم
(البته زبانهایی که ActiveX رو ساپورت کنن)
کاربرد دیگه اینه که بخواهیم یک قطعه کد مثل یک تابع رو خارج از برنامه ایجاد کنیم تا بتونیم از خارج از برنامه به اون تابع دسترسی پیدا کنیم
(قسمت دوم کاربرد تقریبا مثل فایلهای Dll یا (Dynamic link library) هست)
اول قسمت نخست کاربرد این نوع پروژه های ویژوال بیسیک رو بررسی میکنیم
بهتره برای این کار از یک مثال استفاده کنیم تا راحتتر قابل درک باشه
مثال:فرض کنید میخواییم یک دکمه طراحی کنیم که زمانی که موس از روی اون دکمه کنار رفت رویداد MouseLeaved اتفاق بیفته
خوب میدونیم که خود
CommandButton معمولی ویژوال بیسیک همچین قابلیتی رو در اختیار شما قرار نمیده پس ما خودمون یه دونشو طراحی میکنیم که قابلیت این کارو داشته باشه
خوب برای شروع وقتی که ویژوال بیسیک رو باز میکنیم از پنجره New Project گزینه ActiveX Control رو انتخاب میکنیم
در قسمت بعد یک پنجره بدون نوار عنوان جلوتون ظاهر میشه که باید عملیات روی این قسمت انجام بدیم
برای این کار میاییم یک
CommandButton معمولی به فرم اضافه میکنیم تا بتونیم از ویژگیهای قدیمی استفاده ببریم و اسم
UserControl1 رو به
CButton تغییر میدیم
////////////////////////////////////////////
نکته1: وقتی
Cbutton رو به عنوان نام انتخاب کنید این نام نام پیش فرض شیئ شما میشود یعنی وقتی از فایل کمپایل شده OCX استفاده کنید به صورت پیشفرض نام شیئ شما
CButton1 در نظر گرفته میشود دقیقا مثل زمانی که شما یک
CommandButton به پروژه اضافه میکنید و نام آن به صورت پیشفرض برابر
Command1 در نظر گرفته میشود
////////////////////////////////////////////
////////////////////////////////////////////
نکته2: همچنین وقتی شما اسم فرمتون رو
Cbutton میزارید در قسمت کدنویسی این نام وجود خارجی نداره و برای دسترسی به توابع و رویدادهای فرمتون باید از شیئ
UserControl استفاده کنید
(البته فقط در قسمتی هست که داریم شیئ مون رو طراحی میکنیم)
////////////////////////////////////////////
حالا بیایید به قسمت کدنویسی برنامه یه سر بزنیم
وقتی که روی فرم اصلی کنترولمون دبلکلیک کنیم به قسمت کدنویسی میریم در این قسمت یه رویداد با نام
UserControl_Initialize مشاهد میکنیم که خیلی میشه از این رویداد استفاده برد
////////////////////////////////////////////
نکته3:وقتی شما از کنترولتون حتی توی محیط برنامه نویسی استفاده کنید اولین رویدادی که اجرا میشه همینه
(UserControl_Initialize)
////////////////////////////////////////////
در این قسمت مییاییم یه سری کد رو در این قسمت قرار میدیم که در زیر مشاهده میکنید
(مراجعه به نکته 2)
کد:
Private Sub UserControl_Initialize()
UserControl.Height = 450
UserControl.Width = 1500
Command1.Top = 0
Command1.Left = 0
Command1.Height = UserControl.Height
Command1.Width = UserControl.Width
End Sub
در قسمت بالا ما اومدیم اندازه اولیه CButton مون رو مشخص کردیم
حالا برای اینکه وقتی ما شیئ مون رو Resize میکنیم بتونیم CButton مون هم Resize کنیم از کد زیر استفاده میکنیم
کد:
Private Sub UserControl_Resize()
Command1.Height = UserControl.Height
Command1.Width = UserControl.Width
End Sub
در مرحله بعدی و مهمترین مرحله ایجاد اون رویداد هست(یعنی باید یه همچین کدی رو در قسمت Declaration تعریف کنیم):
کد:
Public Event MouseLeaved()
این رویداد فقط یک بار اجرا میشه و اونم زمانی هست که موس از روی دکمه کنار بره
////////////////////////////////////////////
نکته4: وقتی که از شیئ جدید استفاده میکنید در قسمت رویدادها رویدادهای
MouseMove یا
KeyPress یا
MouseDown یا …. از بین رفتن و باید دوباره تعریف بشه یعنی در حال حاضر اکثر اون رویداد ها وجود ندارن و فقط رویداد جدید
MouseLeaved وجود داره که ما هم فقط با همین رویداد کار داریم
////////////////////////////////////////////
الان باید دنبال تابعی بگردیم که وقتی که Mouse از روی کنترولمون کنار رفت اونو تشخیص بده
برای این کار یک Module ایجاد میکنیم و توابع زیر و تایپ های زیر رو توش تعریف میکنیم
کد:
Public Type POINTAPI
X As Long
Y As Long
End Type
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, ByRef lpRect As RECT) As Long
Public Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
////////////////////////////////////////////
نکته5:راجع به کد بالا
POINTAPI و
RECT هر در از نوع Type هستند که ما در زبان C به اونا Structure میگیم و معمولا
POINTAPI مکان موس رو توی خودش ذخیره میکنه و
RECT هم مکان یک شیئ رو در صفحه نمایش درون خودش ذخیره میکنه خوب در مورد توابع هم تابع
GetWindowRect مکان پنجره یا یک شیئ رو به ما میده و
GetCursorPos هم مکان موس رو در صفحه نمایش به ما میده
////////////////////////////////////////////
و در قسمت کدنویسی UserControl مون هم تابع زیر رو پست میکنیم که این تابع همون تابعی هست که تشخیص میده که موس روی دکمه هست یا نه
کد:
Public Function MouseOnButton() As Boolean
Dim MousePos As POINTAPI
Dim ButtonPos As RECT
GetWindowRect Command1.hwnd, ButtonPos
GetCursorPos MousePos
If (MousePos.X > ButtonPos.Left) And _
(MousePos.X < ButtonPos.Right) And _
(MousePos.Y > ButtonPos.Top) And _
(MousePos.Y < ButtonPos.Bottom) _
Then
MouseOnButton = True
Else
MouseOnButton = False
End If
End Function
در آخر هم یک تایمر ایجاد میکنیم که از این تابع برای ما خروجی بگیره که بتونیم رویداد رو تولید کنیم در کد تایمر این کد رو وارد میکنیم
کد:
Private Sub TmrCheck_Timer()
If MouseOnButton = False Then
RaiseEvent MouseLeaved
TmrCheck = False
End If
End Sub
اگه دقت کنید معنی این کد اینه که اگه موس روی دکمه نبود رویداد
MouseLeaved رو اجرا کن و برای اینکه این رویداد یک بار اجرا بشه ما تایمر رو غیر فعال میکنیم
فرض میکنیم برای اولین بار این رویداد یکبار رخ داد و تایمر از کار افتاد حالا برای اینکه بتونیم دوباره انو راه بندازیم باید چکار کنیم
از این کد استفاده میکنیم
کد:
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
TmrCheck = True
End Sub
درست حدس زدید ما دوباره اینجا تعریف میکنیم که اگه موس به داخل Cbutton مون برگشت دوباره
تایمر رو راه بنداز که بتونه دوباره رویداد MouseLeaved رو تشخیص بده
اما دلیل اینکه اینجا از Command1 استفاده کردیم اینه که ما در محیط طراحی شیئ تمامی رویدادهای Command1 مون رو در اختیار داریم اما از رویدادهای CButton اصلا خبری نیست
خوب ظاهرا برنامه آماده استفاده هست اونو کمپایل کنید و در یک پروژه دیگه از اون استفاده کنید و نتایج رو ببینید
////////////////////////////////////////////
اینم لینک برنامه حتما دانلود کنین(حجم 8KB) لینک دانلود
////////////////////////////////////////////
نظرها و انتقادها و سوالها هم یادتون نره