PDA

View Full Version : سوال: نگرفتن فوکوس توسط TextBox



rasol_afkham
دوشنبه 24 فروردین 1394, 21:18 عصر
با سلام خدمت دوستان:
وقتی بر روی یک کادر متن (TextBox) کلیک می کنیم فوکس را می پذیرد. چکار کنیم که با کلیک کردن فوکس را نپذیرد و در صورت دبل کلیک فوکس را بپذیرد

FastCode
سه شنبه 25 فروردین 1394, 05:57 صبح
میتونید رویداد Invalidate همه کنترلها رو با یک تابع کنترل کنید(با یک حلقه و تابع recursive) و در اون همیشه کنسل کنید مگر اینکه یک متغیر مثل مثلا nextControl مقدار داشته باشه.
و این متغیر رو در double click ه text box تون مقدار بدید.
خودم آزمایش نکردم.ممکنه کار نکنه ولی فکر میکنم ایده بدی نباشه.

rasol_afkham
سه شنبه 25 فروردین 1394, 16:13 عصر
داداش من از توضیحاتت هیچی نفهمیدم. میشه با یک کد توضیح بدی؟ :متفکر:

FastCode
سه شنبه 25 فروردین 1394, 22:01 عصر
یکی بیاد این چیزایی که من نوشتم رو به این آقا فارسی بگه.من نمیدونم چطوری بگم و حس و حال نوشتنش رو هم ندارم.(شاید چون خیلی داد میزنه)

rasol_afkham
سه شنبه 25 فروردین 1394, 22:33 عصر
برادر شرمنده اگه بد گفتم٬ آخه این قسمت رو (در اون همیشه کنسل کنید) نفهمیدم یعنی چی و البته این قسمت (nextControl مقدار داشته باشه) و البته خط بعدیش (و این متغیر رو در double click ه text box تون مقدار بدید)
من تابع Invalidate رو در رویداد کلیک نوشتم اما نتیجه ای نگرفتم.:گریه:
من که داد زدن رو دوست ندارم اما اگه شما اینطور برداشت کردید من رو ببخشید

pouria_bayat
چهارشنبه 26 فروردین 1394, 00:10 صبح
برادر شرمنده اگه بد گفتم٬ آخه این قسمت رو (در اون همیشه کنسل کنید) نفهمیدم یعنی چی و البته این قسمت (nextControl مقدار داشته باشه) و البته خط بعدیش (و این متغیر رو در double click ه text box تون مقدار بدید)
من تابع Invalidate رو در رویداد کلیک نوشتم اما نتیجه ای نگرفتم.:گریه:
من که داد زدن رو دوست ندارم اما اگه شما اینطور برداشت کردید من رو ببخشید

از خصوصیات MouseDoubleClick و MouseDown استفاده کن:


private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
textBox2.Focus();
}
}

private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
textBox1.Focus();
}

باید سعی کن خاصیت Focus رو روی یک شی دیگه متمرکز کنی، من در اینجا روی textbox2 گذاشتم....

rasol_afkham
چهارشنبه 26 فروردین 1394, 01:09 صبح
حالا اگر شیع دیگری نباشد چی

plus
چهارشنبه 26 فروردین 1394, 03:30 صبح
میتونید با subclass کردن از TextBox و بررسی Message ها اینکار رو بکنید.

namespace WindowsFormsApplication1 {
using System.Windows.Forms;
class TextBoxExtended : TextBox {
private const int WM_LBUTTONDOWN = 0x0201;
private const int WM_LBUTTONDBLCLK = 0x0203;
protected override void WndProc(ref Message m) {
if (m.Msg == WM_LBUTTONDOWN && !this.Focused) {
return;
}
else if (m.Msg == WM_LBUTTONDBLCLK && !this.Focused) {
this.Focus();
return;
}
base.WndProc(ref m);
}
}
}

حالا بجای TextBox از TextxBoxExtended استفاده کنید.

FastCode
چهارشنبه 26 فروردین 1394, 08:59 صبح
میتونید با subclass کردن از TextBox و بررسی Message ها اینکار رو بکنید.

namespace WindowsFormsApplication1 {
using System.Windows.Forms;
class TextBoxExtended : TextBox {
private const int WM_LBUTTONDOWN = 0x0201;
private const int WM_LBUTTONDBLCLK = 0x0203;
protected override void WndProc(ref Message m) {
if (m.Msg == WM_LBUTTONDOWN && !this.Focused) {
return;
}
else if (m.Msg == WM_LBUTTONDBLCLK && !this.Focused) {
this.Focus();
return;
}
base.WndProc(ref m);
}
}
}

حالا بجای TextBox از TextxBoxExtended استفاده کنید.
سلام. این کد رو تست کردید؟
عملیات focus توسط user32.dll انجام نمیشه؟!!!

plus
چهارشنبه 26 فروردین 1394, 17:02 عصر
سلام. این کد رو تست کردید؟
عملیات focus توسط user32.dll انجام نمیشه؟!!!
سلام. بله در دات نت 4.5 و 2 تست شده.
ما داریم WinForms کار میکنیم و عملیات Focus هم در user32 و در Window Prodecure پیشفرض مربوط به TextBox اجرا میشه ولی متد WndProc بر اون ارجحیت داره که البته ما override ش کردیم و اجازه ندادیم که WM_LBUTTONDOWN به اون برسه.
devdoc مربوط به WndProc در Control.cs:

/// Base wndProc. All messages are sent to wndProc after getting filtered
/// through the preProcessMessage function. Inheriting controls should
/// call base.wndProc for any messages that they don't handle.