日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

VC++ 单文档的状态栏编程、CEditView类实现编辑器功能、编辑框显示行号列号

發(fā)布時(shí)間:2025/4/14 c/c++ 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++ 单文档的状态栏编程、CEditView类实现编辑器功能、编辑框显示行号列号 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。