ايران ويج

نسخه‌ی کامل: آموزش ساخت ActiveX Control توسط ویژوال بیسیک
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
با سلام به همه دوستان
راستش بچه ها قبلا از من آموزش ساخت 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) لینک دانلود
////////////////////////////////////////////

نظرها و انتقادها و سوالها هم یادتون نره
عالي بود دستت درد نكنه
قبلا هم يكي از دوستان اموزش خوبي گذاشته بود
كه براي تكميل اين آموزش شما من دوباره اونو آپلود مي كنم :
http://basic.persiangig.com/Archive/OCX.zip
با سلام
فقط یک نکته که فکر کنم مفید باشه.
احتمالا خصوصیاتی مثل BackStyle یا BorderStyle رو دیدید که برای کار راحت تر انتخاب هاشونو در قالب یه کومبو باکس در اختیارتون قرار میدند تا یکیشو انتخاب کنید.
برای این کار کافیه که نوع خصوصیت ها رو از نوعی که میخواید تعریف کنید.
مثلا اگه از نوع stdFont تعریف کنید پنجره انتخاب فونت رو براتون میاره و اگر از نوع StdPicture تعریف کنید. پنجره انتخاب عکس رو براتون میاره. و اگر از اون لیست ها می خواید کافیه یه Enum تعریف کنید و خصوصیتو از اون نوع تعریف کنید. مثلا:

Public Enum Colors
red = 0
blue = 1
green = 3
black = 4
white = 5
End Enum

Public Property Get color() As Colors
'codes here
End Property

Public Property Let color(ByVal Col As Colors)
'codes here
End Property

حالا این خصوصیت یه لیست شامل رنگ های تعریف شده در اختیارتون میگذاره:
[تصویر:  l1.bmp]
همین طور می تونید خصوصیت رو از نوع یکی از صدها enum تعریف شده خود ویبی تعریف کنید.تمام enum ها رو هم میتونید توی Object Browser پیدا کنید.مثل:
ShapeConstants,VbFileAttribute,KeyCodeConstants,BorderStyleConstants و غیره ...
جالب بود !
اما چطوری میشه یه اکتیوکس به شکل VBSKPro دوروست کرد ؟
avini نوشته است:جالب بود !
اما چطوری میشه یه اکتیوکس به شکل VBSKPro دوروست کرد ؟

راستش تا حالا ندیدمش مگه چجوری هست یا کارش چیه
کنترل تغییر شکل فرمه.
یه سرچ تو گوگل میزدی پیدا میکردی. ولی بازم برات میزارم->vbskpro
من فکر کنم با توابع API بشه همچین کاری کرد.
ممنون نگاهش میکنم ببینم چیه
نگاهش کردم چیز جالبی بود فقط مهمترین نکتش اینه که به صورت رانتایم کار میکنه خوب دلیلشم استفاده از رویداد هست UserControl_Initialize
فقط چند تا نکته داشت یکی اینکه هندل فرم رو از GetParent گرفته بود و در قسمت بعد هم اگه اشتباه نکنم از SetLayeredWindowAttributes استفاده کرده بود همچنین برای تنضیماتش هم یک Property Page گذاشته بود که خیلی بدرد بخور بود اگه وقت کردم حتما آموزش استفاده از Property Page در این گونه پروژها رو میزارم
avini نوشته است:جالب بود !
اما چطوری میشه یه اکتیوکس به شکل VBSKPro دوروست کرد ؟

اينم سورس اكتويكسي كه دنبالش بودي (VB Skinner Pro) . اميدوارم لذت ببري.
براي دانلود بايد از Internet Explorer استفاده كنيد . نه از Opera يا ... .

http://sepehrez.tripod.com/VBSkinner.zip
با سلام
البته تو ايران ويج يه همچين سورسي بود
نتوستم پيداش كنم خودم اپلودش كردم
http://arfaee.persiangig.com/Archive/Win...eXCode.zip
آقا سپهر فايلت دنلود نشد.
آقا حامد اين كه براي WinXP Engine ميباشه.
صفحه‌ها: 1 2