PDA

View Full Version : سوال: مشکل فرم بدون BorderSyle



AbbasVB
پنج شنبه 24 فروردین 1391, 20:48 عصر
با سلام خدمت دوستان
دوستان همان طور که مستحضرید وقتی فرمی را در وی بیBorderSyle را Noneقرار می دهیم فرم بدون نوار عنوان وغیره نمایش داده می شود در این حالت در ویندوز XP وقتی روی Taksbar کلیک می کنیم منوی مربوط به فرم نمایش داده نمی شود (همان منوی بستن یا تغییر اندازه فرم). و در ویندوز 7 وقتی پنجره را از Taksbarمی بندیم فرم بسته نمی شود
دوستان راه حلی برای این موضوع ندارند؟

ASedJavad
جمعه 25 فروردین 1391, 00:47 صبح
سلامیه راه خیلی بد برا ویندوز سون سراغ دارم
تو فرمت یه تایمر بذار به اسم timer1 با اینتروال مثلا 10 و اینیبل False
حالا این کد رو بنویس تو فرمت:
Private Sub Form_Load()
SetHook Me.hWnd
End Sub


Private Sub Form_Unload(Cancel As Integer)
UnHook Me.hWnd
End Sub


Private Sub Timer1_Timer()
If IsClose Then End
End Sub

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

Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = -4
Private Const SC_CLOSE As Long = &HF060&
Private Const WM_SYSCOMMAND As Long = &H112
Private OldProc As Long
Public IsClose As Boolean
Public Sub SetHook(ByVal mHwnd As Long)
OldProc = SetWindowLong(mHwnd, GWL_WNDPROC, AddressOf mProc)
End Sub
Public Sub UnHook(ByVal mHwnd As Long)
SetWindowLong mHwnd, GWL_WNDPROC, OldProc
End Sub


Public Function mProc(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If wMsg = WM_SYSCOMMAND And wParam = SC_CLOSE Then
UnHook wHwnd
Form1.Timer1.Enabled = True
IsClose = True
End If
mProc = CallWindowProc(OldProc, wHwnd, wMsg, wParam, lParam)
End Function

فقط حواست باشه که قبل از اجرا، اول برنامه رو سیو کنی چون با یه اشتباه کوچیک از برنامه پرتاب میشی به بیرون.
اگه دیدی همه چی درسته ولی باز پرت میشی بیرون، اینتروال تایمرت رو یکم بیشتر کن


برا ویندوز ایکس پی هم میشه یه راه مشابه پیدا کرد که اگه کسی جواب بهتری نداشت برات پیداش میکنم.
ولی راهی که رو هر دو تا ویندوز جواب بده سراغ ندارم:متفکر:

ASedJavad
جمعه 25 فروردین 1391, 15:38 عصر
این هم یه راه دیگه که از راه قبلی بهتره و رو هر دو نوع ویندوز جواب میده:فرض کنیم Form1 شما همون فرمیه که میخواین borderstyle ش none باشه
خب اول شما خاصیت ShowInTaskbar اون رو False کن
حالا یه فرم دیگه با خاصیت ShowInTaskbar با مقدار TRue و BorderStyle با مقدار 1 به نام form2 درست کن.
حالا این کد رو تو فرم دو بنویس:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub


Private Sub Form_Unload(Cancel As Integer)
End
End Sub



و کد زیر رو تو فرم 1:
Private Sub Form_Load()
Form2.Move Screen.Width + 500, Screen.Height + 500, 0, 0
Form2.Show
End Sub