PDA

View Full Version : form Maximum



aminvb
دوشنبه 07 دی 1388, 16:57 عصر
آقا من تنظیمات فرم رو ماکسیممش رو False کردم

start position رو روی maximum گذاشتم که فرمم اندازه مانیتور باز شه مشکل اینجاست که وقتی روی نوار فرم دابل کلیک میکنیم فرم به اندازه قبلی ( اندازه ی موقع کدنویسی و طراحی ) بر میگرده چه خاکی توو سر کنم :عصبانی++::گریه:

سوال دوم چطور close فرم رو از کار بندازم فقط میخوام minimaiz داشته باشه

aminvb
دوشنبه 07 دی 1388, 19:06 عصر
دوستان یک دستی برسونن

هم اکنون نیازمند یاری سبزتان هستیم

Help Meeeeeeeeeeeeeeee:گریه::گریه:

Navid Asadi
دوشنبه 07 دی 1388, 19:34 عصر
تو SizeChanged فرمت هر دستوری دوسداری بنویس...

Computer.Programmer
دوشنبه 07 دی 1388, 20:19 عصر
دوست عزیز منم همین مشکل رو دارم و فکر نکنم راهی درست و درمون براش وجود داشته باشه. من این مشکل رو در دات نت 2 داشتم و امیدم این بود که این مشکل در نسخه های بعدی حل بشه که متاسفانه اینجوری نشد.

البته شاید با استفاده از توابع API بشه این کارو انجام داد ولی ما که نتونستیم.

منم منتظر نظر بقیه دوستان هستم.

موفق باشید

aminvb
سه شنبه 08 دی 1388, 00:22 صبح
دوستان دیگه با این مشکل چه کار کردن ؟

کسی راه کاری نداره؟؟؟؟؟؟؟؟؟؟

بقیه چه می کنند پس ؟

mortezamhd
سه شنبه 08 دی 1388, 02:12 صبح
سلام
با اینکه بارها در مورد ازکار انداختن close صحبت شده ولی :

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
e.Cancel = True
End Sub
موفق باشید

arsalansalar
سه شنبه 08 دی 1388, 08:42 صبح
در قسمت proprties فرمت اين تنظيم انجام بده:
Autosizemode=GrowAndShrink

f.nabavi
سه شنبه 08 دی 1388, 08:51 صبح
سلام. لینک زیر یک مثال از مشکل شماست که با c# نوشته شده. من دارم سعی میکنم یه نمونه از این کد با Vb رو بسازم.
http://www.codeproject.com/KB/cs/DisableClose.aspx

f.nabavi
سه شنبه 08 دی 1388, 09:08 صبح
من موفق شدم کد رو پیدا کنم. از API استفاده شده:
تصویر نتیجه هم است:

ابتدا توابع و متغیر های زیر رو تعریف میکنیم:

Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Long) As IntPtr
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As IntPtr) As Integer
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As IntPtr) As Boolean
Private Const MF_BYPOSITION = &H400
Private Const MF_REMOVE = &H1000
Private Const MF_DISABLED = &H2
تابع پنهان کننده دکمه کد زیر رو داره:

Public Sub DisableCloseButton(ByVal hwnd As IntPtr)
Dim hMenu As IntPtr
Dim menuItemCount As Integer
hMenu = GetSystemMenu(hwnd, False)
menuItemCount = GetMenuItemCount(hMenu)
Call RemoveMenu(hMenu, menuItemCount - 1, MF_DISABLED Or MF_BYPOSITION)
Call RemoveMenu(hMenu, menuItemCount - 2, MF_DISABLED Or MF_BYPOSITION)
Call DrawMenuBar(hwnd)
End Subو به صورت زیر فراخوانی میشه:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DisableCloseButton(Me.Handle)
End Sub

Computer.Programmer
سه شنبه 08 دی 1388, 11:04 صبح
سلام.
ظاهراً هیچکدوم از دوستان منظور جناب aminvb رو متوجه نشدن. موضوع اصلاً سر غیر فعال کردن دکمۀ Close نیست. من برای واضح تر شدن دوباره مشکل رو مطرح می کنم.

شما اگر خاصیت WindowsState یک فرم رو برابر با Maximized قرار بدید و همچنین خاصیت MaximizeBox مربوط به همون فرم رو هم False کنید (به منظور جلوگیری از کوچک کردن فرم توسط کاربر در زمان اجرای فرم) به نظر بنده اینجا دات نت مشکلی داره و اون از این قراره: زمانی که کاربر فرم رو باز می کنه با پنجره ای روبرو میشه که حالت Maximize هستش و دکمۀ Maximize اون غیر فعاله ولی اگر روی نوار عنوان همون فرم دوبل کلیک کنه میبینه که فرم از حالت Maximize خارج می شده.

امیدوارم دوستان متوجه مشکل شده باشن.

منتظر کمکتون هستیم.
موفق باشید.

arsalansalar
سه شنبه 08 دی 1388, 11:13 صبح
راه حلي كه من پيشنهاد دادم و امتحان كنيد درست ميشه

f.nabavi
سه شنبه 08 دی 1388, 11:24 صبح
سوال دوم چطور close فرم رو از کار بندازم فقط میخوام minimaiz داشته باشه
جناب computer.programmer اگر متن سوال رو دوباره بخونید متوجه میشید که دوتا سوال مطرحه بعضی ها سوال اول رو جواب دادن بعضی ها دومی رو که همون غیر فعال کردن دکمه close هست

Computer.Programmer
سه شنبه 08 دی 1388, 11:35 صبح
جناب computer.programmer اگر متن سوال رو دوباره بخونید متوجه میشید که دوتا سوال مطرحه بعضی ها سوال اول رو جواب دادن بعضی ها دومی رو که همون غیر فعال کردن دکمه close هست

:اشتباه: بله دوست عزیز حق با شماست ظاهراً من خودم خوب سوال رو نخوندوم :گیج:


در قسمت proprties فرمت اين تنظيم انجام بده:
Autosizemode=GrowAndShrink


راه حلي كه من پيشنهاد دادم و امتحان كنيد درست ميشه

اگر منظور شما حل مشکل غیر فعال کردن Maximize هست من امتحان کردم ولی نشد. اگه میشه با یک مثال خودتون زحمتشو بکشید ببینم مشکل کار من کجاست.

موفق باشید.

aminvb
سه شنبه 08 دی 1388, 15:54 عصر
از همه دوستان ممنونم که زحمت کشیدن مشکله من با close حل شد

اما maximum رو هنوز مشکل دارم با غیر فعال کردنش از propertis غیر فعال میشه

اما با دابل کلیک روی نوار فرم سایزش تغییر میکنه

من یک تازه کارم فکر میکردم شما با این مشکل خیلی وقته توو پروژه هاتون مواجه شدین و راهکاری براش دارین

اما الان تعجب کردم .

آیا واقعا با این مشکل روبه رو نشده بودید ؟
یا مواجه شدین اما به نتیجه نرسیدین.؟
با این اساتیدی که من توو این سایت میبینم بعید میدونم این مشکل بدونه پاسخ مونده باشه

درسته ؟؟؟؟؟؟؟؟

امیدوارم غیر از این نباشه

از همکاری همه دوستان ممنونم که کمک و همیاری میکنند.

aminvb
سه شنبه 08 دی 1388, 16:01 عصر
سلام
با اینکه بارها در مورد ازکار انداختن close صحبت شده ولی :

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
e.Cancel = True
End Subموفق باشید


دوسته من close از کار افتاد می خوام icon اون هم enable اون false باشه که غیر فعال دیده بشه چون الان آیکونش روشن اما کار نمیکنه آیکونشم false بشه enablesh

Thnx

aminvb
سه شنبه 08 دی 1388, 22:25 عصر
دوستان خبری نیست ؟

ما با این مشکل بسازیم یعنی ؟:افسرده:

aminvb
پنج شنبه 10 دی 1388, 00:20 صبح
مثله اینکه از کسی کاری بر نمیاد
نه ؟

mortezamhd
پنج شنبه 10 دی 1388, 00:51 صبح
دوسته من close از کار افتاد می خوام icon اون هم enable اون false باشه که غیر فعال دیده بشه چون الان آیکونش روشن اما کار نمیکنه آیکونشم false بشه enablesh

Thnx
اگر close نمیخواین باید کلا Borderstyle = none بکنی و اگر هم میخوای باشه ولی غیر فعال بشه باید خودت یک style برای فرمت بسازی که خودت ماکسیمایز و مینیمایز و ... براش تعریف کنی
اگر روش دیگه ای هم باشه من نمیدونم !
موفق باشید

aminvb
پنج شنبه 10 دی 1388, 15:02 عصر
مرسی رفیق مشکلم حل شد

برای maximum کسی نظری نداره یعنی ؟

Computer.Programmer
پنج شنبه 10 دی 1388, 15:49 عصر
منم که عرض کردم خیلی وقت دنبالش بودم ولی راحی پیدا نکردم.

من حتی بسیاری از راه های غیر متعارف رو هم چک کردم ولی بی فایده بود. شاید فقط با توابع API حل بشه. منم از دوستان می خوام که در این زمینه راهنمایی کنن

aminvb
پنج شنبه 10 دی 1388, 23:01 عصر
مرسی رفیق

اساتید کمک کنن لطفا

Computer.Programmer
جمعه 11 دی 1388, 11:55 صبح
مرسی رفیق

اساتید کمک کنن لطفا


من فکر کنم یا کسی تا به حال با این مشکل مواجه نشده یا هم از دوستان کسی نتونسته این مشکل رو حل کنه.

حالا که اینطوره فکر کنم باید خودمون دست به کار بشیم و با کمک هم این مشکل رو حل کنیم.
من دوباره کمی گشتم تابع API واسه این کار پیدا نکردم ولی یه چیزی به ذهنم رسید که شاید سرنخ هایی باشه.

من برای شروع کار تونستم با هزار دردسر کد WndProc زمانی که روی کلیدهای تایتل بار کلیک میشه رو بدست بیارم. کدش 161 هست . ما می تونیم این کد رو مدیریت کنیم. (امیدوارم با این بخش اشنا باشید منظور همون Overrides کردن روال DefWndProc هست)

با این کار تونستم کاری کنم که پنجره Restore نشه ولی مشکلی که هست تمام دکمه ها رو غیر فعال میکنه و باید برای این راهی پیدا کنیم.

کدشو میزارم تا ببینم در ادامه چه کار میشه کرد.




Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg <> 161 Then
MyBase.DefWndProc(m)
End If
End Sub




البته برای بستن و مینیمایز کردن فرم میشه یه باتون دیگه تعبیه کرد یا هم اینکه از طریق SystemMenu این کارها رو انجام داد.

موفق باشید

Computer.Programmer
جمعه 11 دی 1388, 12:05 عصر
کد مربوط به دابل کلیک روی TitleBar رو هم یافتم :لبخندساده:
کدش 163 هست پس در نتیجه تا اینجا کدمون به این صورت میشه:




Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg <> 163 AndAlso m.Msg <> 161 Then
MyBase.DefWndProc(m)
End If
End Sub



موفق باشید

aminvb
جمعه 11 دی 1388, 12:19 عصر
خوبه سر نخه خوبیه منم روش مانور می کنم ببینم به کجا میرسه:بوس:

Computer.Programmer
جمعه 11 دی 1388, 12:38 عصر
خوبه سر نخه خوبیه منم روش مانور می کنم ببینم به کجا میرسه:بوس:


مرسی دوست عزیز از قدیم گفتن "کس نخارد پشت من جر ناخن انگشت من" :قهقهه:

من یک کد دیگه هم پیدا کردم (133) که با اینم میشه کار کرد. این کد زمانی رخ میده که قراره باتون های تایتل بار از نو چیده بشه و از اونجایی که هر فرم برای کوچیک شدن یا همان Restor شدن نیاز به این داره که دکمه های TitleBar از نو چیده بشه در نتیجه میشه از این کد هم استفاده کرد. البته از نظر ظاهری خیلی زیبا نیست ولی امتحانش کن بدک نیست.

پس درنتیجه کد رو میشه به این صورت نوشت:




Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = 133 Then
Me.WindowState = FormWindowState.Maximized
End If
MyBase.DefWndProc(m)
End Sub



موفق باشی

Computer.Programmer
جمعه 11 دی 1388, 12:59 عصر
نتیجه گیری:

ما با استفاده از کد 163 از دابل کلیک در TitleBar جلوگیری می کنیم و سپس اگر کد Process برابر با 133 (کد مربوط به ساخت TitleBar) و همچنین فرم درحالت مینیمایز قرار نداشت فرم رو Maximized می کنیم.

فکر نکنم با استفاده از تابع WndProc بشه بهتر از این کار کرد.

کد نهایی به این صورت است: (در فرمی قرار می گیرد که قرار است همیشه به صورت Maximized نمایش داده شود)




ProtectedOverridesSub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg <> 163 Then
If m.Msg = 133 AndAlsoMe.WindowState <> FormWindowState.Minimized Then
Me.WindowState = FormWindowState.Maximized
EndIf
MyBase.WndProc(m)
EndIf
EndSub




موفق باشید

Computer.Programmer
جمعه 11 دی 1388, 19:48 عصر
دوست عزیزم جناب آقا امین اینم اون چیزی که قولشو داده بودم.

موفق باشی

aminvb
جمعه 11 دی 1388, 21:50 عصر
دوست عزیزم جناب آقا امین اینم اون چیزی که قولشو داده بودم.

موفق باشی


آقا سعید دمت گرم
بازم بچه های مشهد
ایول به این مرام

خیلی حال دادی مرسی :قلب::بوس: