PDA

View Full Version : سوال: تغییر رنگ نوشته در تکست باکس و ذخیره به صورت اکس ام ال



bigknight
پنج شنبه 05 فروردین 1389, 10:51 صبح
سلام
سال نو مبارک .
توی یه textbox هر خط از نوشته رو می خوام به یه رنگ مشخص بنویسم. مثلا رنگ سبز رو انتخاب کنم و هر چی می نویسم سبز نوشته بشه. بعد اینکه چند خط نوشتم رنگش تغییر بدم ، بعد تغییر رنگ هر چی می نویسم به رنگ انتخاب شده نوشته بشه.
آخر سرم xml ذخیره کنم با همون رنگهای که نوشتم. اگه بتونین کمکم کنید ممنون میشم .

hamidreza20
پنج شنبه 05 فروردین 1389, 14:37 عصر
سلام دوست عزیز

برای این کار شما باید از کنترل RichTextBox استفاده کنید زیرا textbox قابلیت استفاده از چند خط را ندارد.

Himalaya
پنج شنبه 05 فروردین 1389, 14:51 عصر
برای این کار شما باید از کنترل RichTextBox استفاده کنید زیرا textbox قابلیت استفاده از چند خط را ندارد
textbox1.multiline :متفکر:

hamidreza20
پنج شنبه 05 فروردین 1389, 14:58 عصر
textbox1.multiline :متفکر:

منظور این است که هنگان نمایش کنترل فقط یه خط جاری نمایش داده می شود.
دوست عزیزمون خواسته بودند که رنگ اون ها را هنگام نمایش عوض کنند.

alireza_s_84
پنج شنبه 05 فروردین 1389, 18:38 عصر
سلام
سال نو مبارک .
توی یه textbox هر خط از نوشته رو می خوام به یه رنگ مشخص بنویسم. مثلا رنگ سبز رو انتخاب کنم و هر چی می نویسم سبز نوشته بشه. بعد اینکه چند خط نوشتم رنگش تغییر بدم ، بعد تغییر رنگ هر چی می نویسم به رنگ انتخاب شده نوشته بشه.
آخر سرم xml ذخیره کنم با همون رنگهای که نوشتم. اگه بتونین کمکم کنید ممنون میشم .
سلام شما توی رویداد wndproc هنگام ترسیم تکست باکس یک هندل میگیری بعد با استفاده از رویدادهای خود textbox متن انتخاب شده رو بدست میاری بعد با گرافیک GDI رنگش رو ست میکنی:
نحوه گرفت هندل برای ترسیمات از هر نوع کنترلی اینجوریه:


private static int WM_NCPAINT = 0x0085;
private static int WM_ERASEBKGND = 0x0014;
private static int WM_PAINT = 0x000F;

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCPAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_PAINT)
{
IntPtr hdc = GetDCEx(m.HWnd, (IntPtr)1, 1 | 0x0020);

if (hdc != IntPtr.Zero)
{
using (Graphics graphics = Graphics.FromHdc(hdc))
{
Color borderColor = _BorderColor;
Rectangle rectangle = new Rectangle(0, 0, this.Width, this.Height);
ControlPaint.DrawBorder(graphics, rectangle, borderColor, _BorderStyle);
m.Result = (IntPtr)1;
ReleaseDC(m.HWnd, hdc);
}
}
}
}

[DllImport("user32.dll")]
static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgnclip, uint fdwOptions);

[DllImport("user32.dll")]
static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);

اینکار خیلی آسونه فقط یه خورده حوصله میخواد
موفق باشید

Himalaya
پنج شنبه 05 فروردین 1389, 19:15 عصر
منظور این است که هنگان نمایش کنترل فقط یه خط جاری نمایش داده می شود
فکر نمیکنم زیاد کردن ارتفاع یه تکست باکس که multiline هستش اینقدر کار مشکلی باشه


توی یه textbox هر خط از نوشته رو می خوام به یه رنگ مشخص بنویسم

از این واضح تر چه جوری بگه بنده خدا
این حرفام سر تعداد خطوط توی تکست باکس بود نه استایل خطوط
واسه چیزی هم که میخواید خوب آره از همون RichTextBox استفاده کنید راحتتره



Font fBold = new Font("Tahoma", 8, FontStyle.Bold);
rtResults.SelectionFont = fBold;
rtResults.SelectionColor = Color.Red;
rtResults.SelectedText = "Text output";

FastCode
پنج شنبه 05 فروردین 1389, 23:18 عصر
در تایید alireza:
System.Windows.Forms.TextBox:

[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x201:
{
MouseButtons mouseButtons = Control.MouseButtons;
bool validationCancelled = base.ValidationCancelled;
this.FocusInternal();
if ((mouseButtons != Control.MouseButtons) || (base.ValidationCancelled && !validationCancelled))
{
break;
}
base.WndProc(ref m);
return;
}
case 0x202:
base.WndProc(ref m);
return;

case 0x317:
this.WmPrint(ref m);
return;

default:
base.WndProc(ref m);
break;
}
}


System.Windows.Forms.TextBoxBase:
private void WmPrint(ref Message m)
{
base.WndProc(ref m);
if ((((2 & ((int) m.LParam)) != 0) && Application.RenderWithVisualStyles) && (base.BorderStyle == BorderStyle.Fixed3D))
{
IntSecurity.UnmanagedCode.Assert();
try
{
using (Graphics graphics = Graphics.FromHdc(m.WParam))
{
Rectangle rect = new Rectangle(0, 0, base.Size.Width - 1, base.Size.Height - 1);
graphics.DrawRectangle(new Pen(VisualStyleInformation.TextControlBorder), rect);
rect.Inflate(-1, -1);
graphics.DrawRectangle(SystemPens.Window, rect);
}
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
}


System.Windows.Forms.TextBoxBase:


[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x87:
this.WmGetDlgCode(ref m);
return;

case 0x203:
this.doubleClickFired = true;
base.WndProc(ref m);
return;

case 0x2111:
this.WmReflectCommand(ref m);
return;

case 0x30:
this.WmSetFont(ref m);
return;

case 0x7b:
if (this.ShortcutsEnabled)
{
base.WndProc(ref m);
return;
}
this.WmTextBoxContextMenu(ref m);
return;
}
base.WndProc(ref m);
}

bigknight
شنبه 07 فروردین 1389, 12:27 عصر
با تشکر از همه دوستان به خاطر کمکشون
به خصوص کرجی 333
من با همون کدی که دوستمون کرجی داده تونستم نوشتم تو ریچ تکست به رنگهای مختلف بنویسم
ولی توی ذخیره کردن نوشته هارو با همون رنگهایی که دارند نمی تونم ذخیره کنم.



saveFileDialog1.DefaultExt = "txt";
saveFileDialog1.FileName = strFileName;
saveFileDialog1.Filter ="Text files (*.txt) |*.txt| xml files (*.xml) |*.xml| All files (*.*) |*.*";
saveFileDialog1.FilterIndex = 2;
saveFileDialog1.OverwritePrompt = true;
saveFileDialog1.Title = "Save File Dialog";
// Show the Save file dialog and if the user clicks the Save button, save the file
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
// Save the file name
strFileName = saveFileDialog1.FileName;
// Write the contents of the text box in file
System.IO.File.WriteAllText(strFileName, txtEdit.Text);
}و از این کد برای ذخیره استفاده کرده ام.
بهش چی اضافه کنم تا رنگهارم ذخیره کنه
هر خطی رو با هرنگی مینویسم با همون رنگ ذخیره و سپس به همون شکل بتونم باز کنم
و تغییرات لازم رو در آن بدم.
با تشکر

bigknight
شنبه 07 فروردین 1389, 12:30 عصر
ضمنا کد فست کد و علیرضا رو متوجه نشدم میشه یکم توضیح بدین به چه دردی می خوره و چه جوری می تونم استفاده کنم .

alireza_s_84
شنبه 07 فروردین 1389, 15:09 عصر
ضمنا کد فست کد و علیرضا رو متوجه نشدم میشه یکم توضیح بدین به چه دردی می خوره و چه جوری می تونم استفاده کنم .
دوست عزیز کدی که من گفتم یعنی قلب GDI++ شما اگر اینو فهمیدی از شر کنترلهای زشت پیش فرض هم راحت میشی خیلی هم روونه و نیاز به توضیح نداره
موفق باشید