首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++Builder 取得 Memo/RichEdit 游標行列位置:EM_LINEFROMCHAR 與 EM_LINEINDEX 訊息實戰

     編輯:關於C++

在編輯器類應用中,即時顯示游標所在行號與欄號是基礎需求。C++Builder 的 TMemo/TRichEdit 封裝了 Windows 編輯控件,可透過發送 EM_LINEFROMCHAR、EM_LINEINDEX 訊息快速取得行列資訊。

核心 API

訊息wParamlParam返回值
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):取得目前行首字元的全文位移
  • 兩者相減 = 行內偏移 (0-based),+1 顯示為 1-based 欄號
  • EM_LINEFROMCHAR(-1):直接取得游標所在行號 (0-based),+1 顯示

RichEdit 同樣適用

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);
}

注意事項

  • 行號/欄號均為 邏輯行 (換行符分隔),非視覺換行行
  • 超大檔案 (超過 64KB) 可能受限於 16 位元訊息參數,需用 EM_GETLINE 迭代
  • Unicode 版本 (CB2009+) 字元索引為 UTF-16 代碼單元數,非字碼點數

兩行核心 API 呼叫,即可實現專業編輯器級的游標定位顯示,展現了 Windows 原生訊息機制的強大與精簡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved