به نام او که هر چه علم است از اوست
با سلام به همه دوستان
این برنامه که براتون می ذارم تو وبلاگ قبلیم بود. گذاشتم شاید به درد دوستان بخوره.
دانلود و توضیحات برنامه در ادامه مطلب هست .
حالا قسمت کد ها رو یکی یکی توضیح میدم
بخش اول – کد های مربوط به فرم
لود فرم :
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
try
{
foreach (InputLanguage language in InputLanguage.InstalledInputLanguages)
{
LanguageComboBox.Items.Add(language.Culture.Name);
}
System.Drawing.Text.InstalledFontCollection fonts = new System.Drawing.Text.InstalledFontCollection();
foreach (FontFamily font in fonts.Families)
FontMenuComboBox.Items.Add(font.Name);
string[] ColorName;
ColorName = System.Enum.GetNames(typeof(KnownColor));
FontColorMenuComboBox.Items.AddRange(ColorName);
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
توی خط اول که اسم تابع و آرگومان های ورودیش هست. توی خط 2 تایمر رو فعال میکنم . چرا ؟ چون می خوام هر 5 ثانیه یه بار پیغام ها به صورت خودکار پاک شن .میدونید هم که زمان تایمر به صورت میلی ثانیه هست یعنی برای اینکه بگم 5 ثانیه باید تو قسمت Properties تایمر Interval رو 5000 میذارم.try catch هم که سعی کنید همه جا ازش استفاده کنید چون این یه مزیت هست که برنامه حتی اگه خطا داد به کاربر بگه که چه خطایی هست و try catch این کار رو انجام میده . تو خط 4 یه foreach گرفتم که تمام زبانهای ( یا بهتر بگم فرهنگها) نصب شده تو سیستم رو توی کمبو باکس زبان اضافه میکنه. این کار برای اینه که بتونم زبون نوشتنم رو با موس عوض کنم ( با کلیک روی کمبو باکس زبان ).خط 5 هم مثه 4 فونت هایی که روی سیستم نصب هست رو توی یه کمبوباکس اضافه میکنم.خط 6 یه آرایه گرفتم و تموم رنگ هایی که سیستم میشناسه رو توی یه کمبو باکس اضافه میکنم .
کد های کلید های زده شده در فرم
قبل از هر چیز باید بگم توی Properties فرمتون KeyPreview رو true کنید تا وقتی دکمه ای زده میشه اگه واسش کدی نوشته شده اون کد اجرا شه.
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.O)
{
OpenFile();
}
if (e.Control && e.KeyCode == Keys.N)
{
NewFile();
}
if (e.Control && e.KeyCode == Keys.S)
{
SaveFile();
}
if (e.Control && e.Shift && e.KeyCode == Keys.S)
{
SaveAsFile();
}
if (e.Alt && e.KeyCode == Keys.X)
{
Application.Exit();
}
}
1- تو این خط شرط گذاشته شده که اگه کلید کنترل و ( به کلمه « و » دقت شه) کلید O با هم زده بشه تابع open file اجرا بشه. خطوط 2 و3 و4 هم به همین منوال هست.اما در مورد خط 5 نوشتم Application.Exit ؟ چرا ننوشتم this.Close ؟ به خاطر اینکه وقتی توی برنامهای توی فرمی هستیم که اگه اون فرم بسته شه کلاً از برنامه خارج میشیم باید از Application.Exit استفاده کنیم تا تمام حافظه های اسغال شده توسط برنامه آزاد شه .
کد های منو :
private void NewFile()
{
try
{
if (flagchange == 1)
{
DialogResult dr = MessageBox.Show("Do you want to save ?", "Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
if (filename == string.Empty)
{
if (SaveFileDialog.ShowDialog() == DialogResult.OK)
{
filename = SaveFileDialog.FileName;
}
}
RichTextBox.SaveFile(filename, RichTextBoxStreamType.RichText);
flagchange = -1;
RichTextBox.Text = string.Empty;
}
else if (dr == DialogResult.No)
{
flagchange = -1;
RichTextBox.Text = string.Empty;
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
این تابع که void هست (چیزی برنمیگردونه) برای باز کردن فایل جدید هست .اول باید بفهمیم این flagchange چی هست ؟این یه int هست (که البته boolean هم میشد گرفت) که نشون دهنده تغییر پیدا کردن متن هست یعنی اینکه اگه متن تغییر پیدا کرد این فلگ 1 میشه و وقتی ذخیره شد دوباره -1 میشه.چرا ؟ چون اگه یهو خواستیم فایل جدید باز کنیم یا از برنامه خارج شیم و ذخیره نکرده باشیم بهمون هشدار بده (مثله Office !)
خب حالا اگه خواستیم یه فایل جدید باز کنیم از ما میپرسه که می خوایید ذخیره کنید یا نه. اگه بله بزنید که یه پنجره باز میشه و فایلتون رو ذخیره میکنید .در غیر این صورت اگه No رو بزنید متن پاک میشه بدون اینکه ذخیره شه.
واسه اینکار که بفهمم کاربر چه دکمه ای زده نتیجه دکمه زده شده رو میبرم تو یه DialogResult و بر اساس اون تصمیم میگیرم چیکار کنم.
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
RichTextBox.Text = string.Empty;
RichTextBox.LoadFile(openFileDialog.FileName, RichTextBoxStreamType.RichText);
filename = openFileDialog.FileName;
}
}
private void SaveFile()
{
try
{
if (filename == string.Empty)
{
if (SaveFileDialog.ShowDialog() == DialogResult.OK)
{
filename = SaveFileDialog.FileName;
}
}
RichTextBox.SaveFile(filename, RichTextBoxStreamType.RichText);
StatusLabel.Text = "Save: " + filename;
flagchange = -1;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (RichTextBox.SelectedText.Length > 0)
RichTextBox.Copy();
StatusLabel.Text = "Selected text copy to clipboard";
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void cutToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (RichTextBox.SelectedText.Length > 0)
RichTextBox.Cut();
StatusLabel.Text = "Selected text cut to clipboard";
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
{
RichTextBox.Paste();
StatusLabel.Text = "pasted";
نو این تابع باید دقت بشه که جایی که متن تو حافظه می خواد الحاق شه جایی هست که کرسر داره چشمک میزنه.
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
RichTextBox.Text = string.Empty;
بدون شرح!!!!
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
RichTextBox.SelectAll();
StatusLabel.Text = "Select All";
باز هم بدون شرح!!!!
private void backgroundColorToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (colorDialog.ShowDialog() == DialogResult.OK)
RichTextBox.BackColor = colorDialog.Color;
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
تغییر رنگ زمینه متن.
private void textColorToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (colorDialog.ShowDialog() == DialogResult.OK)
RichTextBox.ForeColor = colorDialog.Color;
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
تغییر رنگ متن.
private void selectedTextColorToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
if (RichTextBox.SelectedText.Length > 0)
if (colorDialog.ShowDialog() == DialogResult.OK)
RichTextBox.SelectionColor = colorDialog.Color;
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
این تابع برای انه که اگه متنی انتخاب شده باشه رنگش عوض میشه .
private void FontMenuComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (RichTextBox.SelectedText.Length > 0)
{
if (FontMenuComboBox.SelectedIndex != -1)
RichTextBox.SelectionFont = new Font(FontMenuComboBox.SelectedItem.ToString(), RichTextBox.Font.Size);
}
else if (FontMenuComboBox.SelectedIndex != -1)
RichTextBox.Font = new Font(FontMenuComboBox.SelectedItem.ToString(), RichTextBox.Font.Size);
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
اینجا از اون جاهاییه که باید خیلی دقت کرد.نه از نطر کد نویسی بلکه از نظر منطق و سوتی ندادن.چرا ؟ عرض میکنم . اول چک میکنیم ببینیم متنی انتخاب شده یا نه .اگه شده بود میایم ببینیم کمبوباکس فونت مون فونتی انتخاب شده ؟ اگه آره میگیم متنی که انتخاب شده فونتش عوض شه .نوع فونتش بشه فونت انتخاب شده تو کمبو باکس و سایزش هم همون سایز کمبو باکس.حواستون باشه یهو برا خودتون سایز نذارید که سوتی میشه .اگه هم متنی انتخاب نشده بود که فونت کل متن عوض میشه.
private void FontSizeMenuTextBox_TextChanged(object sender, EventArgs e)
{
try
{
if (RichTextBox.SelectedText.Length > 0)
RichTextBox.SelectionFont = new Font(RichTextBox.Font.FontFamily, int.Parse(FontSizeMenuTextBox.Text));
else
RichTextBox.Font = new Font(RichTextBox.Font.FontFamily, int.Parse(FontSizeMenuTextBox.Text));
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
اینجا هم مثه تایع قبل هست با این تفاوت که بهش میگیم فونت همون فونت قبلی اما اندازش تغییر کنه.
private void rightToolStripMenuItem_Click(object sender, EventArgs e)
{
RichTextBox.RightToLeft = RightToLeft.Yes;
StatusLabel.Text = "Right to left";
}
private void lTRToolStripMenuItem_Click(object sender, EventArgs e)
{
RichTextBox.RightToLeft = RightToLeft.No;
StatusLabel.Text = "Left to right";
ابن توابع بالا هم که برای راست چین و چپ چین کردن متن هست. اگه بخوایم راست چین باشه true و اگه بخوایم چپ چین باشه false میگیریمش.
private void FontColorMenuComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (RichTextBox.SelectedText.Length > 0)
RichTextBox.SelectionColor = ColorTranslator.FromHtml(FontColorMenuComboBox.Text);
else
RichTextBox.ForeColor = ColorTranslator.FromHtml(FontColorMenuComboBox.Text);
StatusLabel.Text = "Text color changed to: " + FontColorMenuComboBox.Text;
اینجا اگه قسمتی از متن رو انتخاب کرده باشیم با انتخاب رنگ از کمبوباکس رنگش تغییر میکنه اگه نه که کل متن تغییر رنگ میده.اینجا مخصوصاً از colordialog استفاده نکردم که متوجه شید که چجوری رنگ عوض میشه.
private void LanguageComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (LanguageComboBox.SelectedIndex != -1)
{
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(System.Globalization.CultureInfo.CreateSpecificCulture(LanguageComboBox.SelectedItem.ToString().Substring(0, 2)));
RichTextBox.Focus();
StatusLabel.Text = "Language changed to: " + LanguageComboBox.SelectedItem.ToString();
}
}
catch (Exception ex)
{
MessageBox.Show("Error!", ex.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}
این قسمت رو خیلی دقت کنید.این تیکه دقیقاً شبیه ویندوز هست.شما می تونید با کلیک کردن رو نوار ابزار پایین صفحه زبان نوشتار رو عوض کنید.اینجام من سعی کردم با عوض کردن آیتم کمبو باکس زبان نوشتار رو عوض کنم . پس اومدم گفتم اگه آیتم کمبو باکس عوض شد بیاد اون آیتم رو بذاره به عنوان زبان نوشتار. اون Sunstring هم به خاطر اینه که فکر کنم تو ویندوز 7 که ویندوز منه باید به صورت fa بهش بفهمونیم که کدوم زبان رو می خوایم که متن کمبوباکس به صورت fa-IR هست.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
if (flagchange == 1)
{
DialogResult dr = MessageBox.Show("Do you want to save ?", "Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
if (filename == string.Empty)
{
if (SaveFileDialog.ShowDialog() == DialogResult.OK)
{
filename = SaveFileDialog.FileName;
}
}
RichTextBox.SaveFile(filename, RichTextBoxStreamType.RichText);
StatusLabel.Text = "Save: " + filename;
flagchange = -1;
}
else if (dr == DialogResult.Cancel)
e.Cancel = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
اینجا هم موقع بسته شدن چک میکنم که ببینم نیاز به ذخیره داره یا نه