ورود

View Full Version : سوال: غیر فعال و فعال کردن کردن دکمه close فرم ؟



سپهر-111
سه شنبه 12 دی 1391, 11:50 صبح
سلام دوستان مهربان:قلب:
من با این کد تونستم دکمه close فرم را غیر فعال کنم


Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long

Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Const MF_BYPOSITION = &H400&



Public Sub DisableCloseWindowButton(frm As Form)
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(frm.hwnd, 0)
RemoveMenu hSysMenu, 6, MF_BYPOSITION
RemoveMenu hSysMenu, 5, MF_BYPOSITION
End Sub

Private Sub Form_Load()
DisableCloseWindowButton Me
End Sub


حالا به چه کدی میتونم از دوباره فعالش کنم؟!

البته با یخورده تغییر تونستم فعالش کنم ، ولی رنگ دکمه close که موقعه غیر فعال شدن تغییر کرده بود،بعد از فعال شدن، به رنگ قبلیش یعنی همون قرمز برنمیگرده !(میخوام بعد از فعال شدن دکمه فرم ، رنگ دکمه هم به حالت عادی برگرده )
ممنون میشم دوستان راهنمایی بفرمایند

باتشکر از حسن توجه دوستان بزرگوار

Hashemvp
سه شنبه 12 دی 1391, 14:37 عصر
خوب دوست عزیز کلی ک نوشتی برای فعال کردن دکمه close هم بذار تا بررسی بشه
موفق باشی

سپهر-111
سه شنبه 12 دی 1391, 14:56 عصر
خوب دوست عزیز کلی ک نوشتی برای فعال کردن دکمه close هم بذار تا بررسی بشه
موفق باشی
برای فعال کردنش
کافیه

hSysMenu = GetSystemMenu(frm.hwnd, 0)

را به


hSysMenu = GetSystemMenu(frm.hwnd, 1)
تغییر بدی !


Public Sub DisableCloseWindowButton(frm As Form, Active As Byte)
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(frm.hwnd, Active)
RemoveMenu hSysMenu, 6, MF_BYPOSITION
RemoveMenu hSysMenu, 5, MF_BYPOSITION
End Sub

Private Sub Command1_Click()
DisableCloseWindowButton Me, 1

End Sub

Private Sub Form_Load()
DisableCloseWindowButton Me, 0
End Sub


ولی رنگ دکمه فرم به حالت عادی بر نمیگرده . . .

Hashemvp
سه شنبه 12 دی 1391, 15:11 عصر
دوست عزیز کل شما مشکلی نداره منتها نباید دوباره از همون تابعی ک درست کردین استفاده کنید چون بعد درستور ایجاد شده اونا رو پاک میکنه توسط این دو دستور

RemoveMenu hSysMenu, 6, MF_BYPOSITION
RemoveMenu hSysMenu, 5, MF_BYPOSITION


بهتره توی رویداد کلیک دکمه فقط این دستور رو بنویسید درست انجام میشه

Dim hSysMenu As Long
hSysMenu = GetSystemMenu(Me.hwnd, 1)

موفق باشی

ashkan1234
سه شنبه 12 دی 1391, 15:28 عصر
بجای اینا میتونی از این روش هم استفاده کنی:
تو event فرم آنلود اینو بنویس:
(دقت کنید Form_Unload)
Cancel=1
خیلی ساده و کارآمد!
موفق باشید!

سپهر-111
سه شنبه 12 دی 1391, 15:29 عصر
دوست عزیز کل شما مشکلی نداره منتها نباید دوباره از همون تابعی ک درست کردین استفاده کنید چون بعد درستور ایجاد شده اونا رو پاک میکنه توسط این دو دستور

RemoveMenu hSysMenu, 6, MF_BYPOSITION
RemoveMenu hSysMenu, 5, MF_BYPOSITION


بهتره توی رویداد کلیک دکمه فقط این دستور رو بنویسید درست انجام میشه

Dim hSysMenu As Long
hSysMenu = GetSystemMenu(Me.hwnd, 1)

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

Hashemvp
سه شنبه 12 دی 1391, 15:59 عصر
دوست من بار ها تست کردم مشکلی نداشت.
این عکس زمانیکه کد غیر فعال کردن دکمه close اجرا شده

http://upload.tehran98.com/img1/wxd3iql5jd118gtkjr3c.jpg

و این هم زمانیکه روی فرم کلیک شده و کد فعال شدن اجرا شده
http://upload.tehran98.com/img1/je1kazpop0tkzuubm7mk.jpg


این هم کد ها دقیقا همون کد ها رو توی ی پروژه جدید درست کن و بذار ببین باز هم همون مشکل پیش میاد؟

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Const MF_BYPOSITION = &H400&
Public Sub DisableCloseWindowButton(frm As Form, Active As Byte)
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(frm.hwnd, Active)
RemoveMenu hSysMenu, 6, MF_BYPOSITION
RemoveMenu hSysMenu, 5, MF_BYPOSITION
End Sub
Private Sub Form_Click()
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(Me.hwnd, 1)
End Sub
Private Sub Form_Load()
DisableCloseWindowButton Me, 0
End Sub

سپهر-111
سه شنبه 12 دی 1391, 17:07 عصر
دوست من بار ها تست کردم مشکلی نداشت.
این عکس زمانیکه کد غیر فعال کردن دکمه close اجرا شده

http://upload.tehran98.com/img1/wxd3iql5jd118gtkjr3c.jpg

و این هم زمانیکه روی فرم کلیک شده و کد فعال شدن اجرا شده
http://upload.tehran98.com/img1/je1kazpop0tkzuubm7mk.jpg


این هم کد ها دقیقا همون کد ها رو توی ی پروژه جدید درست کن و بذار ببین باز هم همون مشکل پیش میاد؟

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Const MF_BYPOSITION = &H400&
Public Sub DisableCloseWindowButton(frm As Form, Active As Byte)
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(frm.hwnd, Active)
RemoveMenu hSysMenu, 6, MF_BYPOSITION
RemoveMenu hSysMenu, 5, MF_BYPOSITION
End Sub
Private Sub Form_Click()
Dim hSysMenu As Long
hSysMenu = GetSystemMenu(Me.hwnd, 1)
End Sub
Private Sub Form_Load()
DisableCloseWindowButton Me, 0
End Sub

سلام دوست ممنون زحمت کشیدی
ولی شوربختانه تو سیستم من کار نمیکنه!(همون مشکل همچنان باقیست . . .)
ویندوز من سون 7600 هستش
شما روی کدام ورژن ویندوز سون اجرا کردید ..؟

Hashemvp
سه شنبه 12 دی 1391, 17:42 عصر
پس دوست عزیز مشکل از سیستم عامل شماست ممکنه ی فایل اپدیت یا اینکه حتی تم ویندوزتون این اشکال رو ب وجود بیاره.

7600 رو نمیدونم توی ویندوز سون چی هست؟

مال من Windows 7 Ultimate تا همین امروز هم اپدیته اپدیت

موفق باشی

ashkan1234
سه شنبه 12 دی 1391, 18:44 عصر
بعید میدونم ربطی به ویندوز داشته باشه!
چون شما حالت ویو X Button رو کلا Remove میکنی،فکر نمیکنم شدنی باشه از این روش!(شایدم بشه)
ولی دوتا راه به نظرم رسید!
اول اینکه فرم رو Reload کنی!
روش دوم هم اینه که بیخیال افکت بشی(اون کاری رو که شما میخواهید انجام بدید با این کد ممکنه)
Private Const SC_CLOSE As Long = &HF060&
Private Const MIIM_STATE As Long = &H1&
Private Const MIIM_ID As Long = &H2&
Private Const MFS_GRAYED As Long = &H3&
Private Const WM_NCACTIVATE As Long = &H86

Private Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type

Private Declare Function GetSystemMenu Lib "user32" ( _
ByVal hWnd As Long, ByVal bRevert As Long) As Long

Private Declare Function GetMenuItemInfo Lib "user32" Alias _
"GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, _
ByVal b As Boolean, lpMenuItemInfo As MENUITEMINFO) As Long

Private Declare Function SetMenuItemInfo Lib "user32" Alias _
"SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, _
ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long

Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Declare Function IsWindow Lib "user32" _
(ByVal hWnd As Long) As Long

Public Function EnableCloseButton(ByVal hWnd As Long, Enable As Boolean) As Integer
Const xSC_CLOSE As Long = -10
' Check that the window handle passed is valid
EnableCloseButton = -1
If IsWindow(hWnd) = 0 Then Exit Function
' Retrieve a handle to the window's system menu
Dim hMenu As Long
hMenu = GetSystemMenu(hWnd, 0)
' Retrieve the menu item information for the close menu item/button
Dim MII As MENUITEMINFO
MII.cbSize = Len(MII)
MII.dwTypeData = String(80, 0)
MII.cch = Len(MII.dwTypeData)
MII.fMask = MIIM_STATE

If Enable Then
MII.wID = xSC_CLOSE
Else
MII.wID = SC_CLOSE
End If

EnableCloseButton = -0
If GetMenuItemInfo(hMenu, MII.wID, False, MII) = 0 Then Exit Function
' Switch the ID of the menu item so that VB can not undo the action itself
Dim lngMenuID As Long
lngMenuID = MII.wID

If Enable Then
MII.wID = SC_CLOSE
Else
MII.wID = xSC_CLOSE
End If

MII.fMask = MIIM_ID
EnableCloseButton = -2
If SetMenuItemInfo(hMenu, lngMenuID, False, MII) = 0 Then Exit Function
' Set the enabled / disabled state of the menu item
If Enable Then
MII.fState = (MII.fState Or MFS_GRAYED)
MII.fState = MII.fState - MFS_GRAYED
Else
MII.fState = (MII.fState Or MFS_GRAYED)
End If

MII.fMask = MIIM_STATE
EnableCloseButton = -3
If SetMenuItemInfo(hMenu, MII.wID, False, MII) = 0 Then Exit Function
SendMessage hWnd, WM_NCACTIVATE, True, 0
EnableCloseButton = 0
End Function


Private Sub Form_Load()
EnableCloseButton Me.hWnd, False
End Sub

Private Sub Command1_Click()
EnableCloseButton Me.hWnd, True
End Sub

سپهر-111
سه شنبه 12 دی 1391, 21:17 عصر
بعید میدونم ربطی به ویندوز داشته باشه!
چون شما حالت ویو X Button رو کلا Remove میکنی،فکر نمیکنم شدنی باشه از این روش!(شایدم بشه)
ولی دوتا راه به نظرم رسید!
اول اینکه فرم رو Reload کنی!
روش دوم هم اینه که بیخیال افکت بشی(اون کاری رو که شما میخواهید انجام بدید با این کد ممکنه)
Private Const SC_CLOSE As Long = &HF060&
Private Const MIIM_STATE As Long = &H1&
Private Const MIIM_ID As Long = &H2&
Private Const MFS_GRAYED As Long = &H3&
Private Const WM_NCACTIVATE As Long = &H86

Private Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type

Private Declare Function GetSystemMenu Lib "user32" ( _
ByVal hWnd As Long, ByVal bRevert As Long) As Long

Private Declare Function GetMenuItemInfo Lib "user32" Alias _
"GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, _
ByVal b As Boolean, lpMenuItemInfo As MENUITEMINFO) As Long

Private Declare Function SetMenuItemInfo Lib "user32" Alias _
"SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, _
ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long

Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Declare Function IsWindow Lib "user32" _
(ByVal hWnd As Long) As Long

Public Function EnableCloseButton(ByVal hWnd As Long, Enable As Boolean) As Integer
Const xSC_CLOSE As Long = -10
' Check that the window handle passed is valid
EnableCloseButton = -1
If IsWindow(hWnd) = 0 Then Exit Function
' Retrieve a handle to the window's system menu
Dim hMenu As Long
hMenu = GetSystemMenu(hWnd, 0)
' Retrieve the menu item information for the close menu item/button
Dim MII As MENUITEMINFO
MII.cbSize = Len(MII)
MII.dwTypeData = String(80, 0)
MII.cch = Len(MII.dwTypeData)
MII.fMask = MIIM_STATE

If Enable Then
MII.wID = xSC_CLOSE
Else
MII.wID = SC_CLOSE
End If

EnableCloseButton = -0
If GetMenuItemInfo(hMenu, MII.wID, False, MII) = 0 Then Exit Function
' Switch the ID of the menu item so that VB can not undo the action itself
Dim lngMenuID As Long
lngMenuID = MII.wID

If Enable Then
MII.wID = SC_CLOSE
Else
MII.wID = xSC_CLOSE
End If

MII.fMask = MIIM_ID
EnableCloseButton = -2
If SetMenuItemInfo(hMenu, lngMenuID, False, MII) = 0 Then Exit Function
' Set the enabled / disabled state of the menu item
If Enable Then
MII.fState = (MII.fState Or MFS_GRAYED)
MII.fState = MII.fState - MFS_GRAYED
Else
MII.fState = (MII.fState Or MFS_GRAYED)
End If

MII.fMask = MIIM_STATE
EnableCloseButton = -3
If SetMenuItemInfo(hMenu, MII.wID, False, MII) = 0 Then Exit Function
SendMessage hWnd, WM_NCACTIVATE, True, 0
EnableCloseButton = 0
End Function


Private Sub Form_Load()
EnableCloseButton Me.hWnd, False
End Sub

Private Sub Command1_Click()
EnableCloseButton Me.hWnd, True
End Sub




سلام ممنون دوست من خیلی زحمت کشیدی
ولی مزش به همون افکتشه !!
ولی اگه قرار باشه ساده باشه
بااین کد که راحت تره !


Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
End Sub

Hashemvp
سه شنبه 12 دی 1391, 21:42 عصر
دوست عزیز 2 راه هست ک این افکتو داشته باشی
اول از همه برنامه تو کامپایل کن و بده دست چند نفر و تست کنن ک ببینم ایا اتفاقی ک برای خودت می افته برای اونا هم می افته(یعنی دکمه ب همون حالت خاکستری میمونه)
اگه این اتفاق نیافتاد ک مطمئن میشی مشکل از ویندوز خودته

ولی اگه بخوای چنین حالتی توی همه ی ویندوز ها یکسان باشه توصیه میکنم ک border فرمتو یا کلا ظاهر فرمتو همه چیشو خودت درست کنی یا از اسکین های اماده ک تو نت هست استفاده کنی

موفق باشی

ashkan1234
سه شنبه 12 دی 1391, 22:01 عصر
این کلک خوبی بود که من زدم واسه اینکه هم افکت داشته باشی،هم کدت عمل کنه:
فرم رو Reload کنید!
فقط واسه یک صدم ثانیه فرم میره و برمیگرده!که اگه اینم براتون مهم نباشه!(اگه خواستید بفرمایید تا راهشو بگم!)
--------------------
آقا هاشم!تو سیستم خودم تست کردم جواب نداد!(جستجویی که بنده انجام دادم راهی نداشت که به حالت نرمال برگرده)
-------------------
ولی این روشی که آقا هاشم هم گفت خوبه:کنترل بالای فرم ات رو خودتون طراحی کنید!
شبتون خوش!پیروز باشید!