cyycoish 发表于 2015-12-17 23:26:55

【VB】【开源】AG ADV-Edit

一个开源文本编辑控件。
相应设置过后,按下[F2]就可以显示Intelisence:

当然是可以定制颜色的:

拥有NP++的判断磁盘文件是否已经修改的实用功能,
而且经过了特别处理,不会增加资源占用:

如果自定义了程序语言,可以添加删除注释:

其他功能形同Notepad:


不足之处:加载文本速度略显慢。。。。
遗憾,遗憾,遗憾......没有语法高亮。
着仅仅是个Demo,大家可以一起加入开发。

内部附带一个用PB开发的IW控件,用于显示Intelisence
以下是IW控件的开发文档:
AG Computing IntelliSence Dialog Window Library Specification
《AGC代码提示控件 - 使用说明》
零、导读:
        必读:一。
        有win32经验的开发者:四(1)。
        普通开发者:四(1)、四(3)。
        想要全部掌握的开发者:四(1)、四(2)、四(3)、五。
        针对使用者:四(2)。
        闲来无事者:六。
        看来你是对我有意思:七。
一、声明:
        本程序发行使用遵循《AGC自由软件授权协议》。若您不同意该协议,请不要使用本程序。
二、基本信息:
        作者:cyycoish
        网站:http://www.0xaa55.com
        当前版本:1.0.0 (Beta) 。日期:2015年12月17日19:13
        平台:win32。
        编译:PowerBasic(R) for Windows(R) 10.
三、介绍:
        "AG Computing IntelliSence Dialog Window Library",简称“IW”,提供一系列API用来显示IntelliSence窗口,供代码编辑器一类的软件使用。
四、详细信息:

(1) 开发者篇:
注意:以下导出函数为VisualBasic 6.0的声明方式

导出函数:
Declare Function IWShow Lib "IW.DLL" (ByVal hParent As Long, ByVal hControl As Long, ByVal X As Long, ByVal Y As Long, ByVal w As Long, ByVal h As Long) As Long
作用:显示IW窗口。
参数说明:
参数   用途
hParentIW的父窗体句柄,该父窗体包含hControl句柄所指的控件(即编辑器控件)和IW控件窗体的父窗体。
hControl IW控件作用的文本编辑控件句柄,如Win32下的Edit/TextBox控件的句柄。
X      设置IW控件显示的左上角X坐标(Left),该坐标相对于hParent所指的父窗体左上角:坐标(0,0)处。
Y      设置IW控件显示的左上角Y坐标(Top),该坐标相对于hParent所指的父窗体左上角:坐标(0,0)处。
w      设置IW控件显示宽度(Width)。
h      设置IW控件显示高度(Height)。
返回值:IWSHow函数返回IWShow的窗体回调函数返回值。
其他:所有窗体大小参数均以像素为单位。其中X,Y属性在IWShow函数执行完毕后可以使用IWMove过程修改。w,h属性可以使用IWSize过程修改。IWShow与IWMove必须使用在IW窗体关闭/销毁以前。若IW窗体未被关闭(IWGetHwnd函数返回值不为0),则执行IWShow函数会首先调用IWClose函数关闭/销毁IW窗体。

导出函数:
Declare Function IWGetHwnd Lib "IW.DLL" () As Long
作用:返回IW控件窗体句柄。
其他:若IW窗体被关闭,则返回0。

导出函数:
Declare Function IWClose Lib "IW.DLL" () As Long
作用:正常关闭/销毁IW窗口。
返回值:IWSHow函数返回IWShow的窗体回调函数返回值。
其他:使用IWShow函数创建IW窗体200毫秒以内使用该函数无效。要在IW窗体创建后200毫秒以内销毁IW窗口,请使用IWDestroyImmediately函数。这个原因主要是因为IW回调函数处理文本编辑控件消息延迟所致。

导出函数:
Declare Function IWDestroyImmediately Lib "IW.DLL" () As Long
作用:强制关闭/销毁IW窗口。
返回值:IWSHow函数返回IWShow的窗体回调函数返回值。
其他:通常情况下使用IWClose函数而不要使用IWDestroyImmediately函数关闭窗体。因为使用IWDestroyImmediately函数会导致IW窗体闪退。(例如使用IWClose函数同时发送了两次间隔时间很短的WM_KEYDOWN消息,而父文本编辑器控件未处理第二个WM_KEYDOWN消息而是在IW窗体被关闭前将消息投递给了IW窗体,IW窗体将会出现闪退现象。)IWClose函数保证了IW窗体在创建200毫秒以后才能被销毁。若想立即关闭IW窗体(在使用IWShow函数后200毫秒以内关闭窗体),请使用IWDestroyImmediately函数。

导出函数:
Declare Sub IWMove Lib "IW.DLL" (ByRef X As Long, ByRef Y As Long, ByVal bSetupFlag As Boolean)
作用:移动IW窗口或者获取IW窗口的位置,但是不会改变IW窗口的大小。
参数说明:
参数 用途
X    获取/设置IW窗口的横坐标(Left属性)。
Y    获取/设置IW窗口的纵坐标(Top属性)。
bSetupFlag 这个布尔值如果为真,将会改变IW窗体的位置到X,Y参数所指的地方。为假则会将IW窗体的位置按引用传递给X,Y变量,而不改变IW窗体位置。
其他:X,Y参数均以父窗体(IWShow的hParent句柄所指的窗体)的左上角(0,0)处为起点。其单位均为像素。

导出函数:
Declare Sub IWSize Lib "IW.DLL" (ByRef w As Long, ByRef h As Long, ByVal bSetupFlag As Boolean)
作用:改变IW窗体大小,而“不”改变窗体位置。
参数说明:
参数 用途
w    获取/设置IW窗口的宽度(Width属性)。
h    获取/设置IW窗口的高度(Height属性)。
bSetupFlag 这个布尔值如果为真,将会改变IW窗体的大小为w,h参数所指的大小。为假则会将IW窗体的大小按引用传递给w,h变量,而不改变IW窗体大小。
其他:w,h参数单位均为像素。

导出函数:
Declare Sub IWClear Lib "IW.DLL" ()
作用:清除IW窗体内列表显示的所有内容。
其他:销毁IW窗体后,IW列表框显示内容也会被清除。下一次调用IWShow函数,先前的列表框内容不会出现了。

导出函数:
Declare Sub IWAdd Lib "IW.DLL" (ByVal szText As String, ByVal Proprety As Integer)
作用:按顺序为IW列表框添加内容。
参数说明:
参数   用途
szText   用于显示在列表框行项上的内容。该参数为一个以0结尾的ANSI字符串。
Proprety 在每行文字前显示一个16*16像素大小的图标。取值范围及图标类型如下:
         0:不显示图标(或者说显示一个空白的,露出背景(白色)的16*16像素大小图标)。
               1:显示一个黑色的问号“?”。
               2:显示一个“属性”图标(一只左手握着一张卡片)。
               3:显示一个“方法”图标(一个绿色的向右移动的方块的静态图)。
               4:显示一个“事件”图标(一个黄色的闪电)。
               5:一个立体的蓝色方块。(用来表示“数据类型关键字”)。
               6:一个立体的红色方块。
               7:一个蓝色三棱锥。(用来表示“流程控制关键字”)。
               8:一个红色三棱锥。
               9:一个蓝色球体。
                10:一个红色球体。(可以用来表示C语言预处理语句等。)
                11:一个黑色的大写拉丁字母“A”。
                12:一个黑色的简体中文汉字“字”。
                13-其他整数:相当于0(不显示图标)。
其他:IWAdd函数会在IW窗体出现后累加显示IW列表框中的内容。若想清除列表框中所有内容,请使用IWClear函数,或者调用IWShow重新显示IW窗口。不能删除IW列表框中指定的某一行内容。因为————我没写啊。。

导出函数:
Declare Sub IW_Internal_Pre_Option_1 Lib "IW.DLL" (ByVal key As Boolean)
作用:使用“特殊方式”处理IW按键事件。即不使用IW列表框的常规消息处理函数处理IW窗体/IW列表框接收的“某些”按键消息。
参数说明:
参数 用途
key如果key为真,则表明开启该功能。该函数要在IWShow使用之前使用方可有效。而且key的状态不会因为IW窗体销毁而改变。实际上key的状态会在IW.DLL调用结束后销毁。下次调用又会变成默认的False。
其他:该函数的存在是为了弥补IW消息框消息处理函数在某些时候不能接收到WM_KEYDOWN消息wParam为VK_UP等值的“无奈手段”。因为在测试某些情况时,IW列表框接受不到VK_UP、VK_DOWN等。这会导致IW不能选择列表项,或者无法正常关闭窗体。结果就是VB6的程序崩溃(在调试时连着IDE一起挂[你不设置VB6IDE的运行前保存,所有的代码都没了,当场哭晕。]因为VB6IDE有着“先天心脏病”——DLL挂了,IDE跟着一起“殉情”(非常麻烦)请看本说明附注。)。实际上IW_Internal_Pre_Option_1打开了全局键盘鼠标消息处理。从而保证能够不漏消息,当然如果你钩了R3/R0函数除外。这没什么神秘的,这里不装逼————其实在定时器中使用了GetAsyncKeyState函数接获消息。大家在能使用正常消息处理函数时就不要开启这个Option。毕竟是IW——“内部”——预先——选项——1.

SUB IWSetFont ALIAS "IWSetFont" (BYREF lpNewFont AS LOGFONT) EXPORT   
作用:设置IW列表框的字体。
参数说明:
参数      用途
lpNewFont 一个指向LOGFONT结构体的32位指针。
其他:关于该函数使用,我就偷懒了,会开发Win32的人都会使用,写了一段C代码,大家凑合着看(cyy太懒):
        // 设置字体参数
        LOGFONT LogFont;
        memset(&LogFont, 0, sizeof(LOGFONT));
        lstrcpy(LogFont.lfFaceName, "Courier New");
        LogFont.lfWeight = 400;
        LogFont.lfHeight = -44;
        LogFont.lfCharSet = 134;
        LogFont.lfOutPrecision = 3;
        LogFont.lfClipPrecision = 2;
        LogFont.lfOrientation = 45;
        LogFont.lfQuality = 1;
        LogFont.lfPitchAndFamily = 2;
        // 创建字体
        HFONT hFont = CreateFontIndirect(&LogFont);
        // 取得控件句柄
        HWND hWndStatic = GetDlgItem(hDlg, IDC_STATIC_INFO);
        // 设置控件字体
        ::SendMessage(hWndStatic, WM_SETFONT, (WPARAM)hFont, 0);
注意!!使用IWShow函数时候已经将字体设置为hControl句柄指向的编辑器控件(就是IW的父编辑器控件)一样的字体了。
       
反正我尽力保证低故障率,所以出现了诸如IW_Internal_Pre_Option_1,IWDestroyImmediately等函数,这是cyy本人水平低下的表现。大家请勿过多吐槽(本人小心脏受不了)。

(2) 使用者篇:
这个IW控件和其他的智能感知提示框没啥不一样,注意的是个别不同之处:1.选中列表项后按下空格键,会覆盖文本编辑控件上的输入项,然后在输入项后+空格(和Visual C++编辑器不一致)。2.选中列表项后按下回车键,会覆盖文本编辑控件上的输入项,但是不会添加回车。(和VisualC++编辑器“一致”,但是和VisualBasic编辑器不一致。)3.在IW窗体出现时按下左/右键头按键,会关闭IW窗口(和VisualBasic编辑器不一致。)

(3)其他注意事项:
IW控件仅仅提供基本信息显示,诸如窗体显示大小,位置等等,需要自己计算哒(具体在AGC的Edit工程中有例子的[下载地址www.0xaa55.com自己搜一下VB TextEditor控件])。

五、附注
开发win32标准dll供VB6调用注意事项:
0.千万不要在DLL中使用C的exit();函数。用几次崩几次,蹦嘚你没脾气。保证正常退出。即执行LIBMAIN的XXX_DETACH;
1.PB开发,勿在任何回调函数中使用MsgBox“很可能”会挂掉(不是挂起)进程。
2.单线程勿用Sleep();卡得飞起。
3.VB6数组传地址,VB6字符串传首地址。VB6传C注意字符串格式编码问题。C的DLL字符串传VB6同样注意编码。必要时自己编写ANSI 2 UTF8等(VB6没有,VBdNet就强)。但是充分利用VB6的StrConv。
4.注意啊!各位,一定要在VB6中的[“工具”菜单]-[选项]-[环境]-[程序启动时]-选择[保存改变]或者[提示保存改变]不然代码丢得不要不要的。否则自己勤按Ctrl+S咯。

六、杂项
1) 关于开源:今后Alpha版不会开源,RL版(Realse)开源。
2) cyy信奉少些注视多写标识符。宁愿去写一个Dim intLocalCounterRangeFrom0To10 As Integer 然后写:For intLocalCounterRangeFrom0To10 = 0 To 10: intArray(intLocalCounterRangeFrom0To10) = Value我也不写诸如“Fuck the array inject Value into it.”等注释。

七、其他声明。
本软件包括程序IW.DLL及其文档版权归cyycoish所有。
本人技术水平有限,文档难免出错,请见谅。
联系方式:cyycoish@热邮.com(hotmail)

cyycoish
2015年12月17日21:52

这些编辑器组件不定期更新,请期待后续版本。
下载地址:

Ps:12个图标画得好累!

cyycoish 发表于 2015-12-17 23:35:11

2楼来at重要人物:
@0xAA55
@美俪女神

0xAA55 发表于 2015-12-19 22:55:56

你这个用菜单栏显示统计的代码行数和列数,这创意不错!
另外,代码自动完成,我习惯了VB的Alt+→,而不是F2。我觉得Alt + →是个不错的组合。我的VC6就是这么设置的(虽然现在我已经抛弃了它)

大宝 发表于 2020-7-8 10:40:59

本帖最后由 china_shy_wzb 于 2020-7-20 14:03 编辑

怎样画图标,一个好的应用

imr2013 发表于 2022-11-23 22:08:09

膜拜大神代码
页: [1]
查看完整版本: 【VB】【开源】AG ADV-Edit