Search This Blog

2011-04-22

C#: How to detect cursor position in RichTextBox (RichTextBox той ажиллаж байхдаа курсорын байрлалаыг яаж мэдэх вэ?)

RichTextBox той ажиллаж байхад шийдэх ёстой гол зүйлүүдийн нэг нь курсорын байрлалыг олох, мөн мөрийн тоог олох хэрэгцээтэй байдаг явдал юм. Энэ удаад яаж курсорын байрлалыг олох талаар олж авсан мэдлэгээ хуваалцъяа. Дараагийн удаа хэрхэн мөрийн тоог олох талаар бичлэг оруулна аа.

Доор үзүүлсэн property болон method -ийг ашиглана:
RichTextBox.SelectionStart болон RichTextBox.GetLineFromCharIndex()
Гэхдээ анхаарах нэг зүйл нь RichTextBox классын обьектоор дамжуулан ашиглана гэдгээ санаж байх хэрэгтэй юм. Илүү дэлгэрэнгүй мэдээлийг
энэ 2 хаягаар орж үзээрэй :GetLineFromCharIndex[^] болон GetLineFromCharIndex[^]
    
private static int EM_LINEINDEX = 0xbb;

int index, line, col;

[DllImport("user32.dll")]

extern static int SendMessage(IntPtr hwnd, int message, int wparam, int lparam);   


[DllImport("user32.dll")]
Энэ мөр кодыг ямар нэг функцийн дотор бичиж болохгүй.
Илүү дэлгэрэнгүй тайлбарыг доорхи хаягаар орж аваарай:
 DllImportAttribute[^]

Энэ хэсэг код нь курсорын хаана явааг олох болно.
void detectCursorPos(){
index = richTextBox1.SelectionStart;
line = richTextBox1.GetLineFromCharIndex(index);
col = index - SendMessage(richTextBox1.Handle, EM_LINEINDEX, -1, 0);

this.label_column.Text = (++col).ToString();
this.label_row.Text = (++line).ToString(); }

Одоо энэ функцээ яль нэг event -ийн ард бичиж өгөөд бүх юм болох нь тэр, key press event - р жишээ авъя.
private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e){
        detectCursorPos();
}

Event -ээ системдээ бүртгүүлэх хэрэгтэй юм.
this.richTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.richTextBox1_KeyPress);

За амжилт хүсье.
Буруу зөрүү тайлбарласан юм байвал залруулж өгнө үү!
Монгол маань програмчлалын тогтсон стандарттай болсон эсэхийг мэдэхгүй байгаа болохоор зарим нэг нэр томъёог өөрийнхөөрөө орчуулсан болно.

2 comments:

J.IT09D049 said...

aygu hereg bolloo. daan ch sendmessage der alda garad bn. [DllImport("user32.dll")] -iig bichij uguh estoi yu.

Anonymous said...

Заавал оруулж өгөх хэрэгтэй. sendmessage бол системийн функц учраас түүнийг агуулж буй файлыг бас оруулж өгнө.

Зурхай