在編輯器類應用中,即時顯示游標所在行號與欄號是基礎需求。C++Builder 的 TMemo/TRichEdit 封裝了 Windows 編輯控件,可透過發送 EM_LINEFROMCHAR、EM_LINEINDEX 訊息快速取得行列資訊。
| 訊息 | wParam | lParam | 返回值 |
|---|---|---|---|
| EM_LINEFROMCHAR | 字元索引 (-1 = 目前游標) | 0 | 以 0 為基底的行號 |
| EM_LINEINDEX | 行號 (-1 = 目前游標所在行) | 0 | 該行首字元在全文中的字元索引 |
// 取得行號 (1-based 顯示)
void __fastcall TForm1::Button1Click(TObject *Sender) {
int line = SendMessage(Memo1->Handle, EM_LINEFROMCHAR, -1, 0) + 1;
Label1->Caption = line;
}
// 取得欄號 (1-based 顯示)
void __fastcall TForm1::Button2Click(TObject *Sender) {
int lineStart = SendMessage(Memo1->Handle, EM_LINEINDEX, -1, 0);
int col = Memo1->SelStart - lineStart + 1;
Label2->Caption = col;
}
SelStart:游標在全文中的 0-based 字元位移EM_LINEINDEX(-1):取得目前行首字元的全文位移EM_LINEFROMCHAR(-1):直接取得游標所在行號 (0-based),+1 顯示TRichEdit 繼承自 TCustomMemo,同樣支援上述訊息,程式碼無需修改即可複用。
// OnClick / OnKeyUp / OnMouseUp 事件中更新
void __fastcall TForm1::Memo1Click(TObject *Sender) {
int line = SendMessage(Memo1->Handle, EM_LINEFROMCHAR, -1, 0) + 1;
int lineStart = SendMessage(Memo1->Handle, EM_LINEINDEX, -1, 0);
int col = Memo1->SelStart - lineStart + 1;
StatusBar1->Panels->Items[0]->Text = "行: " + IntToStr(line);
StatusBar1->Panels->Items[1]->Text = "列: " + IntToStr(col);
}
EM_GETLINE 迭代兩行核心 API 呼叫,即可實現專業編輯器級的游標定位顯示,展現了 Windows 原生訊息機制的強大與精簡。