2013年10月27日 星期日

WIN32 EditBox顯示行號

前面介紹過在.NET平台使用C#語言怎麼讓TextBox顯示行號,這篇文章則是介紹怎麼用WIN32的方式在EditBox上顯示行號。


基本概念如下:

首先,透過EM_SETMARGINS設定EditBox的LeftMargin,讓EditBox的內容往右縮排保留一定空間。接著處理WM_PAINT訊息,先透過DefWindowProc讓系統預設處理後,接著我們再疊畫上行號的部份。底下虛擬碼使用CEdit成員。
    int FirstLine = GetFirstVisibleLine();
    int FirstLineIndex = LineIndex(FirstLine);
    POINT ptBottom = {0, rcClient.bottom - GetSystemMetrics(SM_CYHSCROLL) - 1};
    int LastLineIndex = CharFromPos(ptBottom);
    int LastLine = LineFromChar(LastLineIndex);
上面的程式片段用來計算目前顯示的行號範圍。
    for (int i = FirstLine; i <= LastLine; i++) {
      int Index = LineIndex(i);
      POINT pos = PosFromChar(Index);
      if (-1 == pos.x) {
        break;
      }
      DrawText(LineNumber, Pos);
    }
知道要顯示的行號範圍後,接著再把它們畫出來。到此為止就完成的行號的顯示工作。但是,在測試時會發現當EditBox作水平捲動,或Selection變更時有重繪的問題。

一個簡單的解決辨法是,設定一個Timer。每當TextSelection變更時就作重畫動作,這樣就可以消除重繪問題。
  void OnTimer(UINT_PTR nIDEvent)
  {
    int Start, End;
    GetSel(Start, End);
    if (Start != nStartChar || End != nEndChar) {
      DrawLineNumbers();
      nStartChar = Start;
      nEndChar = End;
    }
  }

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...