VC++ 单文档的状态栏编程、CEditView类实现编辑器功能、编辑框显示行号列号
Win10 企業版;VC6;
新建一個單文檔工程;默認的視圖類的基類是CView;選擇CEditView類作為,看一下生成的效果;
構建一下;運行;以CEditView作為基類,生成的應用程序具有編輯器功能;可編輯,打開,保存,打印等;查找和替換要自己編一下程才有;還有編輯框默認的右鍵菜單;可在此基礎上進一步編程實現自己的功能;
下面來添加顯示當前光標位置行號列號的功能;將行號列號顯示到狀態欄;狀態欄默認有4個窗格;添加自己的第五個,ID_rowcol,在主框架類CPP文件;
資源文件,字符串表,添加上ID_rowcol;
為了能在視圖類設置狀態欄窗格的文本,需要如下代碼;
CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd(); ?
CString str1;
....
pFrame->m_wndStatusBar.SetPaneText(4, str1);
? ? 視圖View類的CPP文件需要包含?#include "MainFrm.h" ;
然后主框架類的m_wndStatusBar成員本來是保護屬性;需要改為public;才能在視圖類中訪問到;
// Attributes
public:
?? ?CStatusBar ?m_wndStatusBar;
在視圖類的哪個消息的處理函數中來實現顯示行號列號的功能代碼呢?
先看OnScroll消息;試了不行,此消息是當滾動條出現時響應的;
再看編輯框的消息,EN_xxx;EN_VSCROLL,不行;
EN_CHANGE,編輯框文本改變時響應;多數情況可以響應,有時不行;想要實現的是,每當有內容輸入后,或按下上下左右光標鍵,顯示行號列號;
響應WM_CHAR消息,多數情況可以;但是此消息對光標鍵似乎無反應;
代碼如下;
void CTestviewView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call defaultCMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd(); CPoint pt1 = this->GetCaretPos();//CFont* pfont=this->GetFont();//LOGFONT lf; //::ZeroMemory(&lf,sizeof(lf);//memset(&lf, 0x00, sizeof(LOGFONT));//LOGFONT * plf = &lf;//pfont->GetLogFont(plf);CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);int row=pt1.y / tm.tmHeight + 1;int col=pt1.x / tm.tmAveCharWidth + 1;CString str1;str1.Format("%d, %d", row, col);//AfxMessageBox(str1);pFrame->m_wndStatusBar.SetPaneText(4, str1);CEditView::OnKeyDown(nChar, nRepCnt, nFlags); }CPoint pt1 = this->GetCaretPos();
? ? 這是獲取當前光標位置;獲取到的是像素的坐標;需要進行計算,才能得到行號和列號;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
? ? 獲取當前字體信息,填充TEXTMETRIC結構體就可以了;填充LOGFONT結構體也行,但是麻煩;
int row=pt1.y / tm.tmHeight + 1;
int col=pt1.x / tm.tmAveCharWidth + 1;?
? ? 光標y坐標除以字體高度,加1,結果計為當前行號;x坐標除以字符平均寬度,加1,計為列號;
CString str1;
str1.Format("%d, %d", row, col);
pFrame->m_wndStatusBar.SetPaneText(4, str1);
? ?把行號列號顯示在狀態欄第五個窗格;設置第一個則使用?SetPaneText(0, str1);
看一下效果;
?
?
初看了一下;行號是準確的;列號不太準確;TEXTMETRIC結構體包含好多字段,有時間可以試;
看一下響應WM_KEYDOWN消息可能比WM_CHAR消息更好;
如果要實現一個自己的編輯器,能完整顯示代碼的行列號,還有工作要做;有時間再繼續;
?
總結
以上是生活随笔為你收集整理的VC++ 单文档的状态栏编程、CEditView类实现编辑器功能、编辑框显示行号列号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库外键示例 - 使用sqlite演示
- 下一篇: ArcGIS桌面基本操作 和 ArcSD