من این کدی که در
www.dreamincode.net نوشته شده را توصیه نمی کنم، چون طوری کل فرم را تغییر اندازه می ده
که انگار کل فرم، یک تصویر گرافیکی است. ما به روتینی احتیاج داریم که با توجه به نظر ما شیوه تغییر اندازه و موقعیت
هر کنترل را بصورت جداگانه تعیین کنیم. مثل Anchor در VB.Net
من دقیقا همین کار رو کردم، یک کلاس به نام ClassResizeForm ساختم که مشخصات کامل هر کنترل را بصورت جداگانه
ذخیره می کنه و عملیات تغییر اندازه رو به سادگی انجام می ده.
مساله اینجا بود که کنترلهای استاندارد VB مشخصه ای به نام Anchor نداشتند، من این مشکل را با استفاده از مشخصه
Tag حل کردم. چون تمامی کنترلهای VB مشخصه Tag را دارند و در اکثر برنامه ها هیچ استفاده ای از این مشخصه نمیشه.
تعریف من از Anchor اینه :
در هر کنترل شما می توانید در مشخصه Tag یکی یا چند تا از عبارتهای زیر را با هر ترتیبی که دوست دارید، بنویسید :
Left
Right
Top
Bottom
کسانی که با VS.NET برنامه نویسی کرده اند با مفهوم Anchor و نحوه کار با آن آشنا هستند، در مورد Tag شما مابین
این عبارتها می توانید از هر کاراکتری که خواستید استفاده کنید و یا آنها را بدون فاصله به هم بچسبانید، بزرگی و کوچکی
حروف هم اصلا مهم نیست. چون مقدار پیشفرض Top,Left است، می توانید آنرا ننویسید. این همان حالت اصلی VB است.
مثلا کنترلی که در Tag آن نوشته شده Top,Right ، همواره از سمت راست فرم فاصله ثابتی خواهد داشت و طول و عرض
آن ثابت خواهد بود.
یا کنترلی که در Tag آن Top,Left,Right نوشته شده، با تغییر طول فرم، طولش تغییر می کند و عرض آن ثابت است.
کنترلی که در Tag آن Left,Right,Top,Bottom نوشته شده طول و عرض آن با تغییر اندازه فرم تغییر خواهد کرد تا فاصله از
حاشیه افقی و عمودی فرم همواره ثابت باشد.
این کلاس با انواع حالت های ScaleMode و انواع کنترلهای استاندارد سازگار است و اگر تنظیم حالت خطا
را به درستی انجام داده باشید (Break on Unhandled Errors) برای موارد غیر استاندارد هم عملکرد مناسبی دارد.
روتینهای برنامه ایندو هستند :
کد:
Public Sub SaveLocations(ByRef Form As Object)
Public Sub Resize(ByRef Form As Object)
اولی مشخصات و موقعیت کنترلهای یک فرم را می خواند و ذخیره می کند.
دومی اندازه یک فرم را با توجه به مشخصات ذخیره شده برای تغییر ظاهر فرم بکار می گیرد.
نیازی به فراخوانی روتین اول نیست، مگر آنکه در حالت اجرای برنامه، شخصا تغییری در فرم ایجاد کرده باشید.
روتین اول در اولین فراخوانی روتین دوم به صورت خودکار صورت می گیرد. شما کافی است که این کد ها را به فرم اضافه کنید :
کد:
Private ResizeData As New ClassResizeForm
Private Sub Form_Resize()
ResizeData.Resize Me
End Sub
علاوه بر این دو پارامتر MinWidth و MinHeight را هم به کلاس اضافه کردم تا طول و عرض فرم از فلان مقدار معین کمتر نشود،
مقدار پیشفرض این دو پارامتر صفر است. (واحد این دو پارامتر Twip است)
مثلا این کدها را به فرم اضافه می کنم تا طول و عرض فرم از 300 در 200 پیکسل کمتر نشود :
کد:
Private Sub Form_Load()
ResizeData.MinWidth = 300 * Screen.TwipsPerPixelX
ResizeData.MinHeight = 200 * Screen.TwipsPerPixelY
End Sub
برای جلوگیری از پرش تصویر فرم در هنگامی که سعی در کوچکتر کردن فرم از این محدوده مشخص شده را دارید، بایستی
از WindowProc و بررسی WM_SIZING می کردم، ولی با توجه به مشکلاتی که در هنگام Debug کردن برنامه ها پیش می آید،
بهتر دیدم که از اینکار صرف نظر کنم.
پس اولین ایراد این برنامه این است که اگر سعی کنید فرم را از دو مقدار MinWidth و MinHeight کوچکتر کنید، صفحه فرم
پرش خواهد داشت.
من برای نمونه، ظاهر یک فرم را طراحی کردم که در Tag های کنترلها مقادیر Anchor مناسب نوشته شده است.
هیچکدام از کنترلهای برنامه کار خاصی انجام نمی دهند و این نمونه فقط ظاهر یک برنامه است.
همان کدهایی که قبلا اشاره کردم برای تغییر اندازه متناسب کنترلهای این فرم کفایت می کنند.