整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

基于对话框的C++源代码编辑器制作过程(四)-窗口类

基于对话框的C++源代码编辑器制作过程(四)-窗口类代码

、首先,在ScintillaWnd.h头文件中添加如下代码

HMODULE m_hSciLexerDll;

如下图:

2、在ScintillaWnd.cpp源文件的构造函数和析构函数中添加如下代码

ScintillaWnd::ScintillaWnd()
{
	m_hSciLexerDll=NULL;
	m_hSciLexerDll=LoadLibrary(_T("SciLexer.dll"));
	if (NULL==m_hSciLexerDll)
	{
		AfxMessageBox(_T("LoadLibrary SciLexer.dll failure..."));
	}
}

这是构造函数

ScintillaWnd::~ScintillaWnd()
{
	if (NULL !=m_hWnd)
	{
		DestroyWindow();
	}
	if (m_hSciLexerDll !=NULL)
	{
		FreeLibrary(m_hSciLexerDll);
	}
}

这是析构函数

3、为窗口类创建Create函数

打开类向导,选择“ScintillaWnd”类,找到“虚函数”,找到“Create”函数,点击“添加函数”。

Create函数

添加完“Create”函数,会自动生成一些代码,这些代码不需要改动,保持原样就好。

4、为窗口类添加Init()函数,先在ScintillaWnd.h中添加下面的代码

virtual void Init();

点击图中“小灯泡”,会提示你在ScintillaWnd.cpp文件中创建Init()函数,点击创建。

在创建的Init()函数中添加如下代码

void ScintillaWnd::Init()
{
	// clear all text styles
	SendMessage(SCI_CLEARDOCUMENTSTYLE, 0, 0);
	// set the number of styling bits to 7 - the asp/html views need a lot of styling - default is 5
	// If you leave the default you will see twiggle lines instead of ASP code
	SendMessage(SCI_SETSTYLEBITS, 7, 0);
	// set the display for indetation guides to on - this displays virtical dotted lines from the beginning of
	// a code block to the end of the block
	SendMessage(SCI_SETINDENTATIONGUIDES, TRUE, 0);
	// set tabwidth to 4
	SendMessage(SCI_SETTABWIDTH, 4, 0);
	// set indention to 4
	SendMessage(SCI_SETINDENT, 4, 0);
	// set the caret blinking time to 400 milliseconds
	SendMessage(SCI_SETCARETPERIOD, 400, 0);
	// display fold margins
	SetFold();
	// hide SelectionMargin
	SendMessage(SCI_SETMARGINWIDTHN, 1, 0);
	// set markersymbol for marker type 0 - bookmark
	SendMessage(SCI_MARKERDEFINE, 0, SC_MARK_CIRCLE);
	// set the forground color for some styles
	SendMessage(SCI_STYLESETFORE, 0, RGB(0, 0, 0));
	SendMessage(SCI_STYLESETFORE, 2, RGB(0, 64, 0));
	SendMessage(SCI_STYLESETFORE, 5, RGB(0, 0, 255));
	SendMessage(SCI_STYLESETFORE, 6, RGB(200, 20, 0));
	SendMessage(SCI_STYLESETFORE, 9, RGB(0, 0, 255));
	SendMessage(SCI_STYLESETFORE, 10, RGB(255, 0, 64));
	SendMessage(SCI_STYLESETFORE, 11, RGB(0, 0, 0));
	// set the backgroundcolor of brace highlights
	SendMessage(SCI_STYLESETBACK, STYLE_BRACELIGHT, RGB(0, 255, 0));
	// set end of line mode to CRLF
	SendMessage(SCI_CONVERTEOLS, 2, 0);
	SendMessage(SCI_SETEOLMODE, 2, 0);
	// SendMessage(SCI_SETVIEWEOL, TRUE, 0);
	//显示当前行的淡黄色背景
	SendMessage(SCI_SETCARETLINEVISIBLE, TRUE, 0);
	SendMessage(SCI_SETCARETLINEBACK, RGB(255, 255, 0), 0);
	SendMessage(SCI_SETCARETLINEBACKALPHA, 100, 0);
}

注意:要在ScintillaWnd.h头文件中包含Scintilla.h和SciLexer.h头文件

为窗口类添加InitScintillaEdit函数,在ScintillaWnd.h中添加下面的代码

void InitScintillaEdit(int nSize, const TCHAR* face);

用同样的方法,在ScintillaWnd.cpp文件中创建InitScintillaEdit函数

在创建的InitScintillaEdit函数添加如下代码

void ScintillaWnd::InitScintillaEdit(int nSize, const TCHAR * face)
{
	setCppSyntax();
	Init();
	SetDefaultColorFont(nSize, face);
	UpdateLineNumberWidth();
}

为窗口类添加SetDefaultColorFont函数

void SetDefaultColorFont(int nSize, const TCHAR* face);

在创建的SetDefaultColorFont函数添加如下代码

void ScintillaWnd::SetDefaultColorFont(int nSize, const TCHAR * face)
{
	SendMessage(SCI_SETSELFORE, TRUE, RGB(255, 255, 255));
	//选中行的颜色
	SendMessage(SCI_SETSELBACK, TRUE, RGB(10, 36, 106));
	//默认文本颜色
	SendMessage(SCI_STYLESETFORE, STYLE_DEFAULT, RGB(0x00, 0x00, 0x00));
	SendMessage(SCI_STYLESETBACK, STYLE_DEFAULT, RGB(0xff, 0xff, 0xff));
	SendMessage(SCI_STYLESETSIZE, STYLE_DEFAULT, nSize);
	SendMessage(SCI_STYLESETFONT, STYLE_DEFAULT, reinterpret_cast<LPARAM>(face));
}

为窗口类添加SetFold函数

void SetFold(BOOL bFold=TRUE);

在创建的SetFold函数添加如下代码

void ScintillaWnd::SetFold(BOOL bFold)
{
	if (bFold)
	{
		// source folding section
		// tell the lexer that we want folding information - the lexer supplies "folding levels"
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold.html", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold.html.preprocessor", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold.comment", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold.at.else", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold.flags", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "fold.preprocessor", (LPARAM)"1");
		SendMessage(SCI_SETPROPERTY, (WPARAM) "styling.within.preprocessor", (LPARAM)"1");
		SetMarginWidthN(2, 16); //SendMessage( SCI_SETMARGINWIDTHN, 2, 16 ); // FoldMargin
		SendMessage(SCI_SETMARGINTYPEN, 2, SC_MARGIN_SYMBOL);//页边类型
		SendMessage(SCI_SETMARGINMASKN, 2, SC_MASK_FOLDERS); //页边掩码
		SendMessage(SCI_SETMARGINWIDTHN, 2, 16); //页边宽度
		SendMessage(SCI_SETMARGINSENSITIVEN, 2, TRUE); //响应鼠标消息
		// 折叠标签样式
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDER, SC_MARK_CIRCLEPLUS);
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPEN, SC_MARK_CIRCLEMINUS);
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEREND, SC_MARK_CIRCLEPLUSCONNECTED);
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDEROPENMID, SC_MARK_CIRCLEMINUSCONNECTED);
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_TCORNERCURVE);
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERSUB, SC_MARK_VLINE);
		SendMessage(SCI_MARKERDEFINE, SC_MARKNUM_FOLDERTAIL, SC_MARK_LCORNERCURVE);
		// 折叠标签线颜色
		SendMessage(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERSUB, 0xff0000); //蓝色
		SendMessage(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERMIDTAIL, 0xff0000);
		SendMessage(SCI_MARKERSETBACK, SC_MARKNUM_FOLDERTAIL, 0xff0000);
		SendMessage(SCI_SETFOLDFLAGS, 16 | 4, 0); //如果折叠就在折叠行的上下各画一条横线
	}
	else
	{
		SetMarginWidthN(2, 0); //SendMessage( SCI_SETMARGINWIDTHN, 2, 0 ); // FoldMargin
	}
}

为窗口类添加ToggleFold函数

void ToggleFold(long line);

在创建的SetFold函数添加如下代码

void ScintillaWnd::ToggleFold(long line)
{
	SendMessage(SCI_TOGGLEFOLD, static_cast<WPARAM>(line), 0);
}

为窗口类添加GetMarginWidthN函数

int GetMarginWidthN(int margin);

在创建的GetMarginWidthN函数添加如下代码

int ScintillaWnd::GetMarginWidthN(int margin)
{
	return SendMessage(SCI_GETMARGINWIDTHN, static_cast<WPARAM>(margin), 0);
}

为窗口类添加SetMarginWidthN函数

void SetMarginWidthN(int margin, int mask);

在创建的SetMarginWidthN函数添加如下代码

void ScintillaWnd::SetMarginWidthN(int margin, int mask)
{
	SendMessage(SCI_SETMARGINWIDTHN, static_cast<WPARAM>(margin), static_cast<LPARAM>(mask));
}

为窗口类添加UpdateLineNumberWidth函数

void UpdateLineNumberWidth(void);

在创建的UpdateLineNumberWidth函数添加如下代码

void ScintillaWnd::UpdateLineNumberWidth(void)
{
	//start 显示行号
	long iLineMarginWidthNow;
	long iLineMarginWidthFit;
	long iLineNum=SendMessage(SCI_GETLINECOUNT, 0, 0);
	long iLineNumCount=1;
	while (iLineNum !=0)
	{
		++iLineNumCount;
		iLineNum /=10;
	}
	iLineMarginWidthNow=SendMessage(SCI_GETMARGINWIDTHN, 0, 0);
	long charWidth=SendMessage(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)("9"));
	iLineMarginWidthFit=charWidth * iLineNumCount;
	if (iLineMarginWidthNow !=iLineMarginWidthFit)
	{
		SendMessage(SCI_SETMARGINWIDTHN, 0, iLineMarginWidthFit);
	}
	//end of 显示行号
}

为窗口类添加LineFromPosition函数

long LineFromPosition(long pos);

在创建的LineFromPosition函数添加如下代码

long ScintillaWnd::LineFromPosition(long pos)
{
	return SendMessage(SCI_LINEFROMPOSITION, static_cast<WPARAM>(pos), 0);
}

ScintillaWnd窗口类的大部分代码已经添加完成,后续还要添加一些代码,下一章会讲在CCppEditorDlg类中添加代码,给CCppEditorDlg类添加完代码后,项目就可以编译运行了,但这只是一个简单的版本,我还会添加功能,到时候再为大家讲解。

(未完待续)

源:https://www.oschina.net/news/117827/jboot-3-3-4-released

Jboot 是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架,帮助开发者降低微服务开发门槛。同时完美支持在 idea、eclipse 下多 maven 模块,对 java 代码、html、css、js 等资源文件进行热加载。爽爽开发,快乐生活。

Jboot 3.3.4 主要新增了一个新的特性,Jboot 新增了 JbootActionReporter 用于代替 JFinal 的 ActionReporter ,这样更加方便的对 Controller (包括拦截器)方法进行定位,如下图:

当有这个功能以后,我们点击此 控制台 链接,可以直接跳转到对应的方法,这样我们在开发的时候,更加方便我们对请求信息进行快速定位,更加急速的开发。

目前已经开源超过了 3 年的时间,迭代了 100+ 个版本,已经被超过 1000+ 公司在使用。

Jboot 主要有以下特征:

  • 1、基于 JFinal 的 MVC + ORM 快速开发。
  • 2、基于 ShardingSphere + Seata 分布式事务 和 分库分表。
  • 3、基于 Dubbo 或 Motan 的 RPC 实现
  • 4、基于 Sentinel 的分布式限流和降级
  • 5、基于 Apollo 和 Nacos 的分布式配置中心
  • 6、基于 EhCache 和 Redis 的分布式二级缓存

Jboot v3.3.4 更新内容如下:

  • 新增:新增 JbootActionReporter 用于代替 JFinal 的 ActionReporter,更精准的地位方法
  • 优化:重命名 ParaValidateInterceptor 为 ValidateInterceptor
  • 优化:升级 nacos 和 Apollo 客户端到最新版本
  • 优化:JbootHttpImpl Post 提交数据资源可能存在不正常关闭的情况
  • 修复:@EmptyValidate @RegexValidate 的 message 在 ajax 上提示不正确的问题

maven 依赖:

<dependency>
    <groupId>io.jboot</groupId>
    <artifactId>jboot</artifactId>
    <version>3.3.4</version>
</dependency>

Hello World:


关注本头条号,每天坚持更新原创干货技术文章。

如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习

1. 前言

在编写shell脚本或c程序时,如何显示vi / vim文本编辑器行号?如何在Linux、Apple OS X/macOS或类unix操作系统上打开或关闭此功能?如何让vi文本编辑器显示或隐藏行号?如何通过编辑~/.vimrc配置文件使得vim启动时启用行号。

在vi / vim下显示行号对于调试程序错误和提高程序或脚本的整体可读性非常有用。Vim在软件开发人员、系统管理员和Linux/Unix/macOS用户中非常流行,但是默认情况下不显示行。在本教程中,您将了解如何在基于Linux/Unix的系统上运行的Vim / Vi文本编辑器中显示或隐藏行号。

如何使vi编辑器显示或隐藏行号


2. vim怎么显示行号

要使vi显示行号,需要设置数字标志。这样做:

  1. 如果您当前处于插入或追加模式,请按Esc键。
  2. 按:(冒号)。光标应该重新出现在屏幕的左下角:提示符旁边。
  3. 输入以下命令:
set?number

或者

set?nu

vim怎么显示行号


vi编辑器正在显示行号,设置成功


  1. 一列连续的行号将出现在屏幕的左侧。每个行号都引用直接位于右侧的文本。

要关闭行号,请再次按照前面的说明进行操作,但这次要在:提示符处输入以下行:

set?nonumber

通常,一旦离开编辑器,vi将忘记所选择的设置。但是,您可以在特定帐户上使用vi时使其中任何一个设置自动生效。为此,将适当的set语句作为行放在名为.exrc的主目录的文件中。

对于所有当前设置的列表,在:提示符处,输入:

set?all

对于您已经设置的所有内容的列表,在:提示符处,输入:

set

vi行号显示设置方法


3. 结论

通过本文,您应该可以知道如何在vi编辑器中设置行号了吗?

本文已同步至博客站,尊重原创,转载时请在正文中附带以下链接:
https://www.linuxrumen.com/rmxx/1564.html

点击了解更多,快速查看更多的技术文章列表。