页边(Margins)和标记(Markers)

 页边(Margins)和标记(Markers)

来自http://www.cppprog.com/2009/1111/176.html

代码折叠是现代IDE和代码编辑器的必备功能,如果现在推出一个不支持折叠的编辑器,那是要被BS地~~。为了不被BS,很有必要先“研究”一下Scintilla的页边(Margins)和标记(Markers)功能。

  • 页 边(Margins):页边是位于文本显示区左边的一竖条区域,它可以用于显示行号、书签、断点标记等东东。Scintilla最多可以有5个页边(从左 到右的编号为0~4),每个页边可以使用SCI_SETMARGINTYPEN命令确定是用于显示行号还是符号。我们可以用 SCI_SETMARGINWIDTHN命令控制一个页边的宽度,如果设置为0,则表示不显示该页边。默认是只显示宽度为16的1号页边。
  • 标 记(Markers):标记,不用说也知道是用来标记文本位置(确切地说,是文本行)的。我们可以使用32种标记(编号0~31),我们可以自由决定这 32种标记的意义,如标记0用来表示断点、标记1~10表示书签、标记20表示语法错误行等等。不过,如果编辑器要支持代码折叠功能,我们得把标记 25~31留出来,把这7个标记作为代码折叠专用标记(后面还会讲到)。

告诉页边显示哪些标记

当页边不是设定为显示行号时(由SCI_SETMARGINTYPEN命令设置),那么它就会显示标记。刚才说过Scintilla有32种标记,一般来说不会让一个页边来显示所有的标记,而是只显示部分标记。

在一个页边里可以显示哪几种标记由SCI_SETMARGINMASKN命令设置,它的参数是一个32位掩码(mask)值,掩码值的第n位为1时表示该页边可显示n号标记。

所有页边相关的命令以SCI_SETMARGIN或SCI_GETMARGIN作为前缀,如:

  • SCI_SETMARGINTYPEN(int margin, int type)  设置页边显示行号还是符号,type可以是SC_MARGIN_SYMBOL或SC_MARGIN_NUMBER
  • SCI_SETMARGINWIDTHN(int margin, int pixelWidth)  设置页边宽度
  • SCI_SETMARGINMASKN(int margin, int mask)  设置页边掩码
  • SCI_SETMARGINSENSITIVEN(int margin, bool sensitive)  设置页边是否接受鼠标点击事件

所有标记相关的命令以SCI_MARKER作为前缀,如:

  • SCI_MARKERADD(int line, int markerNumber)  在指定行加入一个markerNumber号标记
  • SCI_MARKERDEFINE(int markerNumber, int markerSymbols)  定义markerNumber号标记的样式
  • SCI_MARKERDELETE(int line, int markerNumber) 在指定行上的删除markerNumber号标记
  • SCI_MARKERDELETEALL(int markerNumber) 删除文本中所有markerNumber号标记
  • SCI_MARKERSETFORE(int markerNumber, int colour) 为markerNumber号标记指定前景色
  • SCI_MARKERSETBACK(int markerNumber, int colour) 为markerNumber号标记指定背景色

演示代码

  1. // 标记和页边演示
  2. void TForm1::example()
  3. {
  4.     // 先写10行文本上去
  5.     for(int i=0; i<10; i++)
  6.         SendEditor(SCI_APPENDTEXT, 12, (sptr_t)"hello world ");
  7.     // 0号页边,宽度为9,显示0号标记(0..0001B)
  8.     SendEditor(SCI_SETMARGINTYPEN,0,SC_MARGIN_SYMBOL);
  9.     SendEditor(SCI_SETMARGINWIDTHN,0, 9);
  10.     SendEditor(SCI_SETMARGINMASKN,0, 0x01);
  11.     // 1号页边,宽度为9,显示1,2号标记(0..0110B)
  12.     SendEditor(SCI_SETMARGINTYPEN,1, SC_MARGIN_SYMBOL);
  13.     SendEditor(SCI_SETMARGINWIDTHN,1, 9);
  14.     SendEditor(SCI_SETMARGINMASKN,1, 0x06);
  15.     // 2号页边,宽度为20,显示行号
  16.     SendEditor(SCI_SETMARGINTYPEN,2, SC_MARGIN_NUMBER);
  17.     SendEditor(SCI_SETMARGINWIDTHN,2, 20);
  18.  
  19.     for(int i=0; i<10; i++)
  20.     {
  21.         // 前10行分别加入0~2号标记
  22.         SendEditor(SCI_MARKERADD, i, i%3);
  23.     }
  24.  
  25.     // 设置标记的前景色
  26.     SendEditor(SCI_MARKERSETFORE,0,0x0000ff);//0-红色
  27.     SendEditor(SCI_MARKERSETFORE,1,0x00ff00);//1-绿色
  28.     SendEditor(SCI_MARKERSETFORE,2,0xff0000);//2-蓝色
  29. }
显示效果是:


 

如果你不喜欢这些圆圈,可以用SCI_MARKERDEFINE命令改变标记的样式,可选的有:

SC_MARK_CIRCLE, SC_MARK_ROUNDRECT, SC_MARK_ARROW, SC_MARK_SMALLRECT,
SC_MARK_SHORTARROW, SC_MARK_EMPTY, SC_MARK_ARROWDOWN, SC_MARK_MINUS,
SC_MARK_PLUS, SC_MARK_VLINE, SC_MARK_LCORNER, SC_MARK_TCORNER, SC_MARK_BOXPLUS,
SC_MARK_BOXPLUSCONNECTED, SC_MARK_BOXMINUS, SC_MARK_BOXMINUSCONNECTED,
SC_MARK_LCORNERCURVE, SC_MARK_TCORNERCURVE, SC_MARK_CIRCLEPLUS,
SC_MARK_CIRCLEPLUSCONNECTED, SC_MARK_CIRCLEMINUS, SC_MARK_CIRCLEMINUSCONNECTED,
SC_MARK_BACKGROUND, SC_MARK_DOTDOTDOT, SC_MARK_ARROWS, SC_MARK_PIXMAP,
SC_MARK_FULLRECT, SC_MARK_LEFTRECT, SC_MARK_CHARACTER

默认是SC_MARK_CIRCLE,小圆圈。你可以试试其它的。(注意SC_MARK_CHARACTER比较特殊,它和一个ASCII码加起来决定标记显示为一个对应的ASCII字符)

有了这些基础,我们可以动手为Scintilla加入代码折叠功能了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
你可以使用`Excel`对象模型中的`PageSetup`属性来设置打印面的边距,然后将其应用于所有工作表。以下是一个示例代码,将面边距设置为“窄”: ```csharp using Excel = Microsoft.Office.Interop.Excel; // ... // 创建Excel应用程序对象 Excel.Application excelApp = new Excel.Application(); // 打开工作簿 Excel.Workbook workbook = excelApp.Workbooks.Open("Workbook1.xlsx"); // 设置面边距 Excel.PageSetup pageSetup = workbook.ActiveSheet.PageSetup; pageSetup.LeftMargin = excelApp.InchesToPoints(0.25); pageSetup.RightMargin = excelApp.InchesToPoints(0.25); pageSetup.TopMargin = excelApp.InchesToPoints(0.75); pageSetup.BottomMargin = excelApp.InchesToPoints(0.75); // 设置面方向为横向 pageSetup.Orientation = Excel.XlPageOrientation.xlLandscape; // 设置纸张尺寸为A4 pageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4; // 应用设置到所有工作表 foreach (Excel.Worksheet worksheet in workbook.Worksheets) { worksheet.PageSetup.LeftMargin = pageSetup.LeftMargin; worksheet.PageSetup.RightMargin = pageSetup.RightMargin; worksheet.PageSetup.TopMargin = pageSetup.TopMargin; worksheet.PageSetup.BottomMargin = pageSetup.BottomMargin; worksheet.PageSetup.Orientation = pageSetup.Orientation; worksheet.PageSetup.PaperSize = pageSetup.PaperSize; worksheet.PageSetup.Zoom = false; worksheet.PageSetup.PrintArea = worksheet.UsedRange; } // 关闭工作簿和Excel应用程序对象 workbook.Close(true); excelApp.Quit(); ``` 在上面的示例代码中,我们使用`PageSetup`属性设置了面边距、面方向和纸张尺寸。然后,我们使用`foreach`循环将这些设置应用于所有工作表。注意,我们还将`Zoom`属性设置为`false`,以确保打印时不缩放工作表,以及将`PrintArea`属性设置为工作表的使用范围,以确保打印的内容不会超出工作表的范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值