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

C++Builder 獲取 Memo/RichEdit 光標行列號:SendMessage 實戰

     編輯:VC 教學

在 C++Builder 中,TMemo 與 TRichEdit 均封裝了 Windows 編輯控件,可直接發送底層消息獲取光標所在**行號**與**列號**。本文提供最精簡的實現代碼,雙擊按鈕即可測試。

界面佈局

  • Memo1:多行文本編輯區;
  • Button1:獲取**行號** → 顯示於 Label1;
  • Button2:獲取**列號** → 顯示於 Label2。

核心代碼

// 獲取當前行號 (基於 0 的行索引 + 1)
void __fastcall TForm1::Button1Click(TObject *Sender) {
    int line = SendMessage(Memo1->Handle, EM_LINEFROMCHAR, -1, 0) + 1;
    Label1->Caption = line;
}

// 獲取當前列號 (光標位置 - 行首字符索引 + 1)
void __fastcall TForm1::Button2Click(TObject *Sender) {
    int col = Memo1->SelStart - SendMessage(Memo1->Handle, EM_LINEINDEX, -1, 0) + 1;
    Label2->Caption = col;
}

關鍵消息常量

消息含義wParamlParam
EM_LINEFROMCHAR字符索引轉行號-1 (當前光標)0
EM_LINEINDEX行號轉行首字符索引-1 (當前行)0

原理解析

  1. SelStart 為光標在全文本中的**字符偏移量** (0-based);
  2. EM_LINEFROMCHAR(-1) 返回光標所在**行索引** (0-based);
  3. EM_LINEINDEX(-1) 返回當前行**首字符的全文偏移量**;
  4. 列號 = SelStart - 行首偏移 + 1 (視覺上 1-based)。

適用範圍

✅ TMemo、TRichEdit、TEdit (單行時列號即 SelStart+1);
✅ 所有封裝 Windows EDIT 控件的 VCL/FMX 組件。

進階:即時顯示行列號

在 Memo1 的 OnClick、OnKeyUp 事件中調用上述邏輯,可實現狀態欄實時顯示「行:列」,類似 IDE 編輯器體驗。

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