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