سلام دوستان
همه ی دوستان میدونند که بعداز RightToLeft کردن Formها و یا کنترل ها .. کلیدهای {LEFT / RIGHT} .. برعکس عمل میکنند .. یعنی با زدن کلید {LEFT} مکان نما به راست .. وبا زدن کلید {RIGHT} مکان نما به چپ حرکت میکنه
سلام دوستان
همه ی دوستان میدونند که بعداز RightToLeft کردن Formها و یا کنترل ها .. کلیدهای {LEFT / RIGHT} .. برعکس عمل میکنند .. یعنی با زدن کلید {LEFT} مکان نما به راست .. وبا زدن کلید {RIGHT} مکان نما به چپ حرکت میکنه
خوب میتونی وقتی کلید چپ رو زد کلید سمت راستو صدا کنی و برعکس
تو رویداد KeyPress کنترلتون اینو بنویس
if (e.KeyChar == (char)Keys.Left)
{
e.Handled = true;
SendKeys.Send("{Right}");
}
کسی نیست جواب ما رو بده
اینجا اقای the king پاسخ دادن ولی من تو vb هم تست کردم نشد
بزارید تو رویداد KeyDown
به این صورت
private bool flag;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (flag)
{
flag = false;
return;
}
if (e.KeyCode == Keys.Left)
{
e.Handled = true;
SendKeys.Send("{Right}");
flag = true;
}
else if (e.KeyCode == Keys.Right)
{
e.Handled = true;
SendKeys.Send("{Left}");
flag = true;
}
}
اون متغییر فلگ رو باید عمومی تعریف کنید
البته به یاد داشته باشید که کار اصولی نمی تونه باشه
ضمنا یه چک هم بکنید که اگه RTL بود این عمل انجام بشه
اقای the king گفتند که این روش اصولی نیست
لطفا یه نفر روشی را که اقای the king گفتند را با سی شارپ توضیح بدن
اینم کد ایشون در سی شارپ
ولی برا خودمم کار نکرد
protected override bool ProcessKeyMessage(ref Message m)
{
if (RightToLeft != RightToLeft.Yes) return base.ProcessKeyMessage(ref m);
switch ((Keys)m.WParam)
{
case Keys.Left:
m.WParam = (IntPtr)Keys.Right;
break;
case Keys.Right:
m.WParam = (IntPtr)Keys.Left;
break;
}
return base.ProcessKeyMessage(ref m);
}
فکر کنم یه تغییر کوچولو لازم باشه
آخرین ویرایش به وسیله hojjatshariffam : شنبه 12 مرداد 1392 در 19:46 عصر
این تغییر کوچولو این بود
یه کلاس بسازید که از تکست باکس ارث ببره
و کد رو تو اون بنویسید .
internal class Class3 : TextBox
{
protected override bool ProcessKeyMessage(ref Message m)
{
if (RightToLeft != RightToLeft.Yes) return base.ProcessKeyMessage(ref m);
switch ((Keys)m.WParam)
{
case Keys.Left:
m.WParam = (IntPtr)Keys.Right;
m.LParam = (IntPtr)Keys.Right;
break;
case Keys.Right:
m.WParam = (IntPtr)Keys.Left;
break;
}
return base.ProcessKeyMessage(ref m);
}
}
تو هر فرمی که خواستین اونو از تولباکس بندازین توش تا این کارو براتون بکنه
آخرین ویرایش به وسیله hojjatshariffam : شنبه 12 مرداد 1392 در 19:47 عصر دلیل: تصحیح کد
باسلام.
بهترین راه این است که به محض دریافت پیغام کیبورد توسط فرم، و قبل از اینکه این پیغام توسط فرم پردازش شده و رویدادهای متناظر فایر شوند، کلیدهای چپ و راست با یکدیگر جا به جا شوند.
برای این کار می توان متود wndproc مربوط به فرم را بازنویسی کرد و قبل از اینکه پیغام به کلاس فرم پاس داده شود باید مقدار WParam چک شود. در صورتی که این مقدار برابر با کلید چپ بود آن را به Keys.Right تغییر داد و بر عکس.
در نمونه کد زیر این عمل انجام شده، البته فقط در مورد رویداد KeyDown. بقیه رویدادهای کیبورد هم به همین ترتیب خواهد بود:
//in the name of god
//صل الله علی محمد و آله
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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
const Int32 WM_KEYDOWN = 0x0100;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
if(((Keys)m.WParam)==Keys.Right)
m.WParam=(IntPtr)Keys.Left;
else if (((Keys)m.WParam)==Keys.Left)
m.WParam=(IntPtr)Keys.Right;
}
base.WndProc(ref m);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if((e.KeyCode==Keys.Left )||(e.KeyCode==Keys.Right))
MessageBox.Show(e.KeyCode.ToString());
}
}
}
آخرین ویرایش به وسیله مهرداد صفا : یک شنبه 13 مرداد 1392 در 16:21 عصر
چشم ظاهر گر نبیند عیب نیست چشم دل گر ننگرد باید گریست**********اَلسَّلامُ عَلَى الْحُسَيْنِ وَ عَلى عَلِىِّ بْنِ الْحُسَيْنِ وَ عَلى اَوْلادِ الْحُسَيْنِ وَ عَلى اَصْحابِ الْحُسَيْنِ