ايران ويج

نسخه‌ی کامل: یه یوزر کنترل واقعا توپ
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام

یه یوزرکنترل توپ نوشتم که مثل یه فرم عمل می کنه. نوار عنوان و تغییر اندازه و بزرگ و کوچیک کردن فرم.
کاملا سفارشیه. خیلی باحاله.
مهمتر اینکه سورسش در اختیارتونه و هر کمبودی تو کار بود خودتون میتونید برطرفش کنید. کلی نکته آموزشی هم داره. هر چی تو این چند روز تحقیق کردم همه توی این یوزر کنترل استفاده شدن.
هنوز یه نقص هایی داره. مثلا موقعیت نوار عنوان وسط چینه که ظرف یه دقیقه میتونید امکان تراز به چپ و راست رو هم بش اضافه کنیم.

قبلا هم دیده بودم. نگید تکراریه. ولی این یکی هم سورسه هم هر سؤالی راجع به کد داشتید میتونم جواب بدم.
حاشیه کافیه. اصل مطلب ...
چیکار کنیم که مثل PictureBox وقتی ScaleMode عوض میشه اندازه آبجکت هایی که روی یوزرکنترل قرار دادیم برحسب واحد جدید اندازه گیری بشن؟
من کلی کد برا تنظیم آبجکت ها روی فرم نوشتم که بر حسب پیکسل هستند.
حالا میخوام از فرم به یوزرکنترل هجرت کنم.

کسی که بتونه این سؤال رو جواب بده کمک بزرگی کرده.

راستی حتما نظرتون رو راجع بهش بگید.

با تشکر
من برا گرفتن فرم والد از ParentControls(0) استفاده مي کردم که باعث ميشد بعضي وقتا خطا بده و برا گرفتن مختصات از GetWindowPlacement و براي اعمال مختصات از SetWindowPos استفاده مي کردم که همه اينا نياز به hWnd داشتند.
بعد فهميدم که ميشه مستقيماً با خصوصيات ParentControls(0) کار کرد و کد رو اصلاح کردم. اما همچنان وقتي که به عبارت ParentControls(0) مي رسيدم خطا ميداد و از برنامه خارج شد.
در نهايت فهميدم که فرم والد اينه: UserControl.Parent و مسئله اصلا پيچيده نيست.
برا پيدا کردن UserControl روي فرم والد هم ميشه از کد زير استفاده کرد:
کد:
Dim C As Control
For Each C In Parent.Controls
    If C.Name = Ambient.DisplayName Then Exit For
Next
به همين سادگي به همين خوشمزگي.
با دونستن اين مسائل، ميشه يه Label درست کرد که مثل Label هاي خود مايکروسافت، وقتي ترازش راست چين باشه، بتونه خاصيت Left خودش رو روي فرم والد تغيير بده.

امکانات لازم رو به يوزرکنترل MMZ_TitleBar اضافه کردم:
قابليت اينکه حاشيه يوزرکنترل Resizable يا Fixed باشد.
امکان نمايش يا عدم نمايش و فعال يا غيرفعال کردن دکمه هاي Close, Maximize, Minimize و نمايش دکمه هاي اضافي در نوارعنوان تا 5 دکمه
تغيير Caption و TooltipText دکمه هاي مذکور
تنظيم موقعيت ControlBox (مجموعه دکمه هاي بالا) در چپ يا راست
تراز متن نوار عنوان در چپ، راست يا وسط و تنظيم RightToLeft براي نمايش بهتر متن فارسي
تعيين عرض دکمه هاي ControlBox و ارتفاع کل نوار عنوان
فونت ControlBox و فونت TitleBar بصورت جداگانه
تنظيم رنگ ها شامل رنگ زمينه با دورنگ بصورت Gradient و رنگ خطوط حاشيه و رنگ زمينه و رنگ متن دکمه ها در دوحالت عادي و زمان قرار گرفتن ماوس روي دکمه.
محدوديت هاي استفاده از اين UserControl به شرح زیر:
BorderStyle فرم والد بايد None باشد.
براي شروع کار بايد متد GetOwner را فراخواني کرد.
ScaleMode فرم والد به vbPixels تغيير مي کند.

کامل بود؟

نه! هنوز بايد روي رويدادهاش کار کنم. رويداد ResizeEnd تو حرکات سريع ماوس کم مياره.

نکته: چند وقت پيش راجع به ToolboxBitmap بحث بود. دوستان گفتند که ابعادش بايد 16 در 15 باشه ولي نگفته بودن که بايد بيتمپ 256 رنگ باشه. اگه بيتمپ 24 بيت استفاده کنيد خودش رنگها رو دستکاري مي کنه و عکستون توي نوار ابزار يه جور ديگه ظاهر ميشه.
اون دفعه گفتم که فرم والد رو میشه از خاصیت Parent بدست آورد و برای پیدا کردن UserControl روی فرم والد باید از یه حلقه For استفاده کرد.
بازم یه مطلب دیگه متوجه شدم: برای بدست آوردن UserControl روی فرم والد کافیه از خاصیت Extender استفاده کنیم.
پس شد Parent و Extender
نقل قول: هنوز بايد روي رويدادهاش کار کنم. رويداد ResizeEnd تو حرکات سريع ماوس کم مياره.
ردیف شد. با خیال راحت میتونید توی رویداد ResizeEnd کدنویسی کنید.
نقل قول: با دونستن اين مسائل، ميشه يه Label درست کرد که مثل Label هاي خود مايکروسافت، وقتي ترازش راست چين باشه، بتونه خاصيت Left خودش رو روي فرم والد تغيير بده.
Label هم آماده شد.
پس فایل ضمیمه علاوه بر TtitleBar تکمیل شده، حاوی یه Label هم هست.
نقل قول: چیکار کنیم که مثل PictureBox وقتی ScaleMode عوض میشه اندازه آبجکت هایی که روی یوزرکنترل قرار دادیم برحسب واحد جدید اندازه گیری بشن؟
ظاهراً باید میونبر بزنیم و یه PictureBox روی یوزرکنترلمون بذاریم و همه چی رو توی اون PictureBox قرار بدیم.
یه سؤال داشتم که یادم رفت ولی سؤالات تمومی ندارند. یکی دیگه می پرسم:
یه SpinButton درست کردم که برای اتصالش به جعبه متن باید از یه خط کد استفاده بشه:
کد:
Set SpinButton1.OBJ = Text1
میشه مثل DateGride که لیست شیءهای Data ی روی فرم رو نشون میده، من هم برا خاصیت OBJ لیست TextBox های روی فرم رو داشته باشم؟
پس اینو هم به فایل ضمیمه اضافه می کنم.
یه سؤال دیگه:
فرض کنید میخوایم یه جعبه متن با یوزرکنترل درست کنیم. چطور تعیین کنیم زمانی که خاصیت Text به صورت Multiline میشه داده ها توی چند خط از کابر گرفته بشن.
تو رویداد UserControl_MouseMove بعد از تعریف متغیرها 10 خط پایین تر از ElseIf استفاده شده. اون خط دهم باید اصلاح بشه تا زمان Maximize بود درست کار کنه.
قبل از اصلاح:
کد:
ElseIf Button = 1 And HasOwner Then
بعد از اصلاح:
کد:
ElseIf Button = 1 And HasOwner And Not Maximized Then
از اینجور خطاها اگه دیدین لطفا بگین تا اصلاح کنم.
از دوستانی که دانلود کردن تشکر می کنم.

راستی کسی نیست حداقل یدونه از سؤال های بالا رو جواب بده؟

شماهایی که از XP Manifest Theme تو برنامه هاتون استفاده می کنید، بدانید و آگاه باشید که خاصیت ForeColor کنترل های Option Button یا همون دکمه رادیویی رو نمیشه تغییر داد و همیشه رنگ متنش سیاهه. تو برنامه هایی که امکان تعویض رنگ ها رو به کاربر میدین و اتفاقاً از Option Button هم استفاده کردید نباید از XP Manifest استفاده کنید. در نتیجه TextBox ها و ComboBox هامون رو خودمون باید با یوزرکنترل نویسی درست کنیم چون بدون Theme ویندوز XP خیلی بی ریخت هستند..