باسلام
کلیه مطالب MDI-Form رو در فایل فشرده پروژه اون ضمیمه میکنم
لطفا دانلود و اجرا و تکمیل تر کنید و دوباره RAR شده اونو تو برنامه نویس بذارید تا استفاده کنیم
با تشکر
چون در MDI فرم والد امکان گذاشتن باتن وجود نداره از منو استتفاده کردم برای:
1-خروج و بستن کل برنامه
2-هدف برداشتن فقط کلید اگزیت فرم والد هست به شرطی که عنوان یا کپشن فرم حذف نشود
3-بوردر یا حاشیه فرم والد که اگزیت و عنوان وکناره ای فرم راشامل میشه حذف بشن اما منو باشه
4-فقط اگزیت و پشن حذف بشه ولی با موس فرم قابل گسترش باشه
5-امکان جابجایی فرم با موس از طریق Drag حذف بشه
6-عملیات بالا خنثی بشن
7-امکان تعویض تصویر زمینه فرم والد با انتختب کاربر از داخل سیستم خودش با Brows کردن با CommonDialog
8-روش "بالای همه قراردادن یا " Always On Top کردن یکی از بچه فرمها
کدهای فرم والد: Option Explicit
Dim lStyle As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Const GWL_STYLE = (-16)
Private Const WS_BORDER = &H800000
Private Const WS_CAPTION = &HC00000
Private Sub mdiPrntFrmXMnu_Click()
Unload Me
End Sub
Private Sub thoutXMnu_Click()
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) 'Get's the WindowLong
lStyle = lStyle And Not WS_CAPTION '<--- without eXit & Caption
Call SetWindowLong(Me.hwnd, GWL_STYLE, lStyle)
End Sub
Private Sub whtoutBorderMnu_Click()
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) 'Get's the WindowLong
lStyle = lStyle And Not WS_BORDER '<--- without border
Call SetWindowLong(Me.hwnd, GWL_STYLE, lStyle)
End Sub
Private Sub wthotExtBrdrMnu_Click()
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) 'Get's the WindowLong
lStyle = lStyle And WS_BORDER And Not WS_CAPTION
Call SetWindowLong(Me.hwnd, GWL_STYLE, lStyle)
End Sub
Private Sub unMovFrmMnu_Click()
lStyle = lStyle And Not WS_BORDER '<--- Fix Place = unMovable
Call SetWindowLong(Me.hwnd, GWL_STYLE, lStyle)
End Sub
Private Sub CnclMnu_Click()
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) 'Get's the WindowLong
Call SetWindowLong(Me.hwnd, GWL_STYLE, lStyle)
End Sub
Private Sub Picture1_Resize()
Picture1.Align = 1
Picture1.Height = Me.ScaleHeight
Picture1.PaintPicture Picture1.Picture, 0, 0, Me.ScaleWidth, Me.ScaleHeight
Set Me.Picture = Picture1.Image
End Sub
Private Sub nwBkGrdMnu_Click()
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
Call Picture1_Resize
End Sub
کدهای فرم فرزند1:Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Const GWL_STYLE = (-16)
Const WS_MINIMIZEBOX = &H20000
Const WS_MAXIMIZEBOX = &H10000
Private Sub Form_Load()
Dim L As Long
L = GetWindowLong(Me.hwnd, GWL_STYLE)
L = L And Not (WS_MINIMIZEBOX)
L = L And Not (WS_MAXIMIZEBOX)
L = SetWindowLong(Me.hwnd, GWL_STYLE, L)
mdiChildFrm1.Top = 0 'MdiParentFrm.Top - 200
mdiChildFrm1.Left = 0 'MdiParentFrm.Left - 200
End Sub
Private Sub Command1_Click()
mdiChildFrm2.Top = mdiChildFrm1.Top + mdiChildFrm1.Height
mdiChildFrm2.Left = mdiChildFrm1.Left
mdiChildFrm2.Show
End Sub
کدهای فرم فرزند2:
Option Explicit
Private Sub Command1_Click()
mdiChildFrm1.Show
End Sub
9-چرا فرم فرزند دوم موقع Show شدن با باتن روی فرم فرزند1 از اندازه خودش بزرگتر میشه؟
10-چرا کدهای API که روی فرمهای ساده (غیرMDI) برای ترنسپرنت یا شفاف ردن اونا عمل میکنند روی بچه فرمهای MDI یا والد اون ار نمیکنند؟ آیا روشی موثر سراغ دارید؟
باتشکر