PDA

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



az.heidarzadeh
دوشنبه 07 شهریور 1390, 12:38 عصر
سلام
من دکمه close فرم رو با این کد غیر فعال کردم



private const int SC_CLOSE = 0xF060;
private const int MF_GRAYED = 0x1;
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable);

private void MsgBoxForm_Load(object sender, EventArgs e)
{
if (MessageBox.status)
{
EnableMenuItem(GetSystemMenu(this.Handle, true), SC_CLOSE, MF_GRAYED);
}
else
{
EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_GRAYED);
}
}

اما دیگه نمیتونم فعالش کنم همونطور که میبینید فکر کردم شاید اون متغیر boolean تاثیر داشته باشه که نداشت پس فکر کنم باید یه ثابت برای اونم باشه، لطفا کسی چیزی میدونه باید چیکارش کنم؟...

---------------------------------------------------------------------------------------------------------------

سلام به همه دوستای گلم بالاخره مشکل من حل شد البته با تشکر مخصوص از دوست خوبم B.I.O.H.A.Z.A.R.D (http://barnamenevis.org/member.php?110603-B.I.O.H.A.Z.A.R.D) فکر کنم مشکل همون ویندوز بود ایشون درست میگفتند کدی که به من دادند بدون مشکل کار میکنه خیلی خوشحالم :لبخند:
خب این همه تلاش برای درست کردن یه messagebox فارسی بود که البته نمونه هاش زیاده اما من میخواستم دقیقا مثل خود .net باشه فقط فارسی، مثل توجه به اینکه وقتی YesNo داری نباید بتونی کنسلش کنی واسه همین میخواستم دکمه close فرمم رو ببندم (تا جایی که دیدم بقیه دوستان به این نکته توجه نکردند :چشمک:) و توی مواردی که cancel دارم دکمه close فعال باشه اینم لینک دانلودش :خجالت:
76508

B.I.O.H.A.Z.A.R.D
دوشنبه 07 شهریور 1390, 13:22 عصر
من به این سوال شما جواب دادم. ولی متاسفانه مدیر محترم خیلی راحت کل تاپیک رو پاک کرد.

اینم جواب شما:

غیر فعال کردن دکمه close

IntPtr hMenu = GetSystemMenu(this.Handle, false);

int menuItemCount = GetMenuItemCount(hMenu);

RemoveMenu(hMenu, menuItemCount - 1, MF_BYPOSITION);

فعال کردن مجدد دکمه close :

IntPtr hMenu = GetSystemMenu(this.Handle, true);

int menuItemCount = GetMenuItemCount(hMenu);

RemoveMenu(hMenu, menuItemCount - 1, MF_BYPOSITION);

az.heidarzadeh
دوشنبه 07 شهریور 1390, 13:53 عصر
خیلی ممنون که جواب دادید بله متاسفانه قبل از اینکه من پاسخ شما رو ببینیم مدیر محترم حذفش کرده بود و این در صورتیه که واقعا من نتونسته بودم این جواب و پیدا کنم
بهرحال من فکر کنم همونجا گفته بودم به ذهن خودم هم رسید که false رو true کنم اما جواب نداد یا شاید کار دیگه ای قبلش باید انجام بدم؟...

B.I.O.H.A.Z.A.R.D
دوشنبه 07 شهریور 1390, 15:02 عصر
خیلی ممنون که جواب دادید بله متاسفانه قبل از اینکه من پاسخ شما رو ببینیم مدیر محترم حذفش کرده بود و این در صورتیه که واقعا من نتونسته بودم این جواب و پیدا کنم
بهرحال من فکر کنم همونجا گفته بودم به ذهن خودم هم رسید که false رو true کنم اما جواب نداد یا شاید کار دیگه ای قبلش باید انجام بدم؟...

خب من که براتون نوشتم چطور فعال یا غیر فعال کنید. من الان از همین کد استفاده میکنم توی یه پروژه نمونه. اصلا پروژه رو میذارم ببینید.

az.heidarzadeh
دوشنبه 07 شهریور 1390, 15:41 عصر
والا نمیدونم شاید یه مشکلی تو سیستم من هست :ناراحت: آخه پروزه شما هم درست کار نمیکنه Disable دکمه close فرم رو غیر فعال میکنه اما دکمه Enable اونو به حالت اول برنمیگردونه... :عصبانی++:

B.I.O.H.A.Z.A.R.D
دوشنبه 07 شهریور 1390, 16:16 عصر
والا نمیدونم شاید یه مشکلی تو سیستم من هست :ناراحت: آخه پروزه شما هم درست کار نمیکنه Disable دکمه close فرم رو غیر فعال میکنه اما دکمه Enable اونو به حالت اول برنمیگردونه... :عصبانی++:

نمیدونم والا مشکل چیه. ویندوزتون چیه؟

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

az.heidarzadeh
سه شنبه 08 شهریور 1390, 10:03 صبح
ویندوزم 7 و vs2005 البته sample شما با vs2010 بود که هیچ کدومش کار نمیکنه... :ناراحت: please چیکار کنم خیلی میخوامش نمونه کد دیگه ای ندارید؟...

Xcalivorse
سه شنبه 08 شهریور 1390, 10:23 صبح
اگر نیازی یه دکمه های Minimize و Maximize ندارید میتونید خاصیت ControlBox فرمتون رو False کنید. در غیز این صورت از کدهایی که دوستان گذاشتن بدون مشکل میشه استفاده کرد.

B.I.O.H.A.Z.A.R.D
سه شنبه 08 شهریور 1390, 10:35 صبح
ویندوزم 7 و vs2005 البته sample شما با vs2010 بود که هیچ کدومش کار نمیکنه... :ناراحت: please چیکار کنم خیلی میخوامش نمونه کد دیگه ای ندارید؟...

خب از کد هاش توی پروژتون استفاده کنید. متاسفانه نمونه کد دیگه ندارم. هر جا رو هم میگردم همین کد رو گذاشتن

faravaghi
سه شنبه 08 شهریور 1390, 15:43 عصر
سلام،
این کد رو امتحان کن:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace DIC.Snippets
{
class FormEnabled
{
private const int SC_CLOSE = 0xF060;
private const int MF_GRAYED = 0x1;
internal const int MF_ENABLED = 0x0;
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable);
[DllImport("user32.dll")]
public static extern int RemoveMenu(int systemMenu, int itemPosition, int flag);
[DllImport("user32.dll")]
public static extern int GetMenuItemCount(int systemMenu);
[DllImport("user32.dll")]
public static extern int DrawMenuBar(IntPtr currentWindow);
public void FormCloseEnabled(Form form, bool enabled)
{
MethodInvoker method = delegate
{
int disable = 2;
int enable = 1;
IntPtr menu;
int itemCount;
if (enabled)
{
EnableMenuItem(GetSystemMenu(form.Handle, false), SC_CLOSE, MF_ENABLED);
//get the system menu of the application
menu = GetSystemMenu(form.Handle, false);
//get the count of menu items in the system menu
itemCount = GetMenuItemCount(menu.ToInt32());
//disable the "Close" command in the menu
RemoveMenu(menu.ToInt32(), itemCount - 1, enable);
//now draw the menu bar on the application
DrawMenuBar(form.Handle);
}
else
{
EnableMenuItem(GetSystemMenu(form.Handle, false), SC_CLOSE, MF_GRAYED);
//get the system menu of the application
menu = GetSystemMenu(form.Handle, false);
//get the count of menu items in the system menu
itemCount = GetMenuItemCount(menu.ToInt32());
//disable the "Close" command in the menu
RemoveMenu(menu.ToInt32(), itemCount - 1, disable);
//now draw the menu bar on the application
DrawMenuBar(form.Handle);
}
};

if (form.InvokeRequired)
form.BeginInvoke(method);
else
method.Invoke();
}
}
}


/***** FORM CODE ******/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DIC.Snippets
{
public partial class Form1 : Form
{
FormEnabled fe;
public Form1()
{
InitializeComponent();
fe = new FormEnabled();
}

private void button2_Click(object sender, EventArgs e)
{
fe.FormCloseEnabled(this, true);
}

private void button1_Click(object sender, EventArgs e)
{
fe.FormCloseEnabled(this, false);

}
}
}

az.heidarzadeh
سه شنبه 08 شهریور 1390, 20:45 عصر
اگر نیازی یه دکمه های Minimize و Maximize ندارید میتونید خاصیت ControlBox فرمتون رو False کنید. در غیز این صورت از کدهایی که دوستان گذاشتن بدون مشکل میشه استفاده کرد.
سلام
نمیدونم واقعا مشکل کدای من چیه که جواب نمیده، باید روشهای دیگه رو امتحان کنم اما متوجه منظور شما نشدم آره فرم من min, max نداره controlbox فرمم و false کنم یعنی چی یه property شاید من تا حالا دقت نکردم و ندیدمش...