
资料整理:影子 VB爱好者乐园
主题:用VB6.0制作画图板
作者:哈尔滨 张许国
Windows中的画笔,恐怕观众不会不知道吧?其绘图功能虽能够与的绘图工具相提并论,但也马马虎虎能够应付客户日常制图的需求。其实,利用Visual Basic我们也能开发出如“画笔”一样的硬件,甚至比它更完善,更优异。我就此制作一例,希望与大家VB的爱好者们交流VB编程的技巧与感受。
程序界面制作篇。
一、启动VB,创建一个“VB企业版控件”文件。
二、添加窗体:一个MDI窗体(MDIPaint)、一个子窗体:绘图操作区(Paintwin)、七个自由窗体,包括一个版本信息窗体(About1)、一个画笔大小调节窗体(BrushSroll)、一个启动界面(Cover)、一个滤镜信息框(Filterwin)、一个帮助窗体(Helpwin)、一个登陆提示框(password)、一个文本输入框(Textpaint)。设置MDIPaint为开启窗体图1。
三、 在字段中添加控件
1. 在MDIPaint窗体中先制作菜单:就像你看到的所有Windows程序一样,包括:文件(新建、打开、清屏、存储、另存为、关闭、打印、退出)、编辑(复制、粘贴等)、变换(垂直、水平、旋转、缩放)、滤镜(浮雕)、工具栏(隐藏、显示)、视图(颜色、字体、画笔、设置桌面)、帮助(版本信息)……并配置快捷键。然后vb画图板,设置一个通用对话框控件(Commondialog1)、两个图片列表控件(ImageList1&ImageList2)、两个工具栏(Toolbar1&Toolbar2)、一个状态条(StatusBar1)。抓取按钮,将常用的工具栏中的界面加入到ImageList1中,制作各类图像代表图标14个加入到ImageList2中,将截图列表控件与工具栏连在一起。在状况条中加入时间、X轴和Y轴坐标显示。完成图标如图2所示。其中,Toolbar1是工具栏,类似于Word中位于菜单栏下的工具栏快捷键,可按照其所含图标属性设置功能。Toolbar2是图像栏,是绘制固定图像的快捷键vb画图板,有直线、普通圆形、填充圆等,其填充模式均按按钮属性修改。
2. 在Paintwin窗体中,主要包含有两个图片框(Picture1& Pictureback),将Picture1嵌套在Pictureback中以推动才能显示任意尺寸的场景,添加两个滚动条(imagescroll1& imagescroll2)配合察看大尺寸照片。另外,还必须一个标签(forecolor1)显示前景色,一个标签(backcolor1)显示背景色,一个按钮交换前景色与背景色,一个复选框(toolbar2c1)切换MDIPaint中的图像栏与工具栏。完成图标如图2所示。
3. BrushSroll窗体主要功能是借助滚动条滑动任意调节画笔的大小,包括一个滚动条(BrushHScroll1)、画笔数值显示区(blabel2)及确定、取消按钮。
4. Cover窗体装入启动场景(施展你的戏剧才华吧),启动时间可自行设置。例如:
技巧篇
在编程中把握重要手段,灵活运用方法,往往能事半功倍。
一、像“画笔”一样,在绘图区的任意地方输入文本。
几乎所有的制图工具都提供了文字输入的功能,有的(如Photoshop)甚至还能做一些简单的文本编辑的工作。此程序也推动了这一特定用途。首先,设置Commondialog1和Picture1关于字体的所有属性,如:“Picture1.FontName = CommonDialog1.FontName”。通常“新手上路”的同事会碰到:当执行程序时,会出现一个信息框:“控制面板中未安装图标”,解决它需要首先声明两个变量:Screenfonts=&H1、Printerfonts=&H2。并写出如下代码:“CommonDialog1.Flags = Screenfonts + Printerfonts”。同时在VB的属性窗口中修改Flags的值为1。接下来需要完成在Picture1中右键左键的哪个位置输入文本这一功能,因此必须得到单击左键处的坐标,即在Picture1_Click()中将startx、satrty的值传给CurrentX、CurrentY。这样,问题就解决了。

二、灵活利用PaintPicture。
用PaintPicture方法来实现图像的翻转,比较易于(需要API——StretchBlt的支持)。其语法规则为:object.PaintPicture Picture, x1, y1, width1, height1, x2, y2, width2, height2, (opcode)。只要熟练把握其中变量的使用,那么图像变换任你选择。
以下是几个简单变换的举例:
水平翻转:Picture1.PaintPicture Picture1.Picture, Picture1.ScaleWidth, 0, -1 * Picture1.ScaleWidth, Picture1.ScaleHeight
垂直翻转:Picture1.PaintPicture Picture1.Picture, 0, Picture1.ScaleHeight, Picture1.ScaleWidth, -1 * Picture1.ScaleHeight
旋转180度:Picture1.PaintPicture Picture1.Picture, Picture1.ScaleWidth, Picture1.ScaleHeight, -1 * Picture1.ScaleWidth, -1 * Picture1.ScaleHeight
缩 小:Picture1.PaintPicture Picture1, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, -Picture1.ScaleWidth, -Picture1.ScaleHeight
放 大:Picture1.PaintPicture Picture1, Picture1.ScaleWidth, Picture1.ScaleHeight, -2 * Picture1.ScaleWidth, -2 * Picture1.ScaleHeight
三、对Toolbar中某一按键状态的控制。
通常,需对Toolbar中某一按键进行程序编制:“Select case1 case2 case3 ……” 。
当必须对一按键的状况进行控制,比如要在某一时刻让第5个按键手动按下,则只应该说出代码:“Toolbar1.Buttons(5).Value = 1”即可。
四、关于固定图形的绘制。
“画笔”能够在图纸的任意地方画出直线、虚线、空心圆、实心圆、矩形、多边形等。我在此程序中也加入了这一功能。你看见MDIPaint窗体上那一排(共14个)小图标吗?它们就是为画固定图形而设定的。例如:当我单击任一类型的填充圆后,在Picture1中左键按下的坐标会被记录出来:startx、starty。然后按住左键挪动光标,这时程序会监测左键的状况,一旦左键按住,便将此刻新的坐标值写入endx及endy。程序又转到绘图函数中,以(startx,starty)为圆心,以(sqr((startx-endx)^2+(starty-endy)^2))为半径,以预先设置的填充状态(FillStyle)及颜色(如前景色)画出一个你所期望受到的填充圆。其它固定图形的绘制方式皆大同小异。
五、借用API函数。
是不是还有许多用VB无法推动的功能?让API函数帮帮忙吧!查查你的API文本浏览器就可以了。建议你说说Visual C++,不过很也许你之后就不会用 VB写程序了。
代码篇

(限于篇幅,只列举比较重要的个别源代码)
一、文本输入:
'弹出字体对话框
If MDIPaint.Toolbar1.Buttons(11).Value = tbrPressed Then
'调用对话框弹出图标对话框
MDIPaint.CommonDialog1.FontName = “Times New Roman"
MDIPaint.CommonDialog1.Flags = Screenfonts + Printerfonts + FEffects
MDIPaint.CommonDialog1.Action = 4
Textpaint.PaintText.FontName = MDIPaint.CommonDialog1.FontName
Textpaint.PaintText.FontBold = MDIPaint.CommonDialog1.FontBold
Textpaint.PaintText.FontItalic = MDIPaint.CommonDialog1.FontItalic
Textpaint.PaintText.FontUnderline = MDIPaint.CommonDialog1.FontUnderline
Textpaint.PaintText.FontSize = MDIPaint.CommonDialog1.FontSize
Textpaint.PaintText.ForeColor = MDIPaint.CommonDialog1.Color
Cancle:
'Show(1)为模态窗体,即弹出本窗体后,不能响应其它窗体

Textpaint.Show (1)
End If
Private Sub OKc_Click()
'将文本中的内容放到图片框中
Paintwin.Picture1.CurrentX = startx
Paintwin.Picture1.CurrentY = starty
Paintwin.Picture1.FontName = PaintText.FontName
Paintwin.Picture1.FontBold = PaintText.FontBold
Paintwin.Picture1.FontItalic = PaintText.FontItalic
Paintwin.Picture1.FontUnderline = PaintText.FontUnderline
Paintwin.Picture1.FontSize = PaintText.FontSize
Paintwin.Picture1.ForeColor = PaintText.ForeColor
Paintwin.Picture1.Print (PaintText)
Unload Me
'将字体层转换为图像层
Call MDIPaint.copy_Click

Call MDIPaint.prasy_Click
End Sub
二、绘制固定图形:
Picture1.FillColor = backcolor1.BackColor '设置填充物为背景色
If MDIPaint.Toolbar2.Buttons(16).Value = tbrPressed Then
Picture1.FillStyle = 6
Picture1.Circle (starX, starY), Sqr((endX - starX) ^ 2 + (endY - starY) ^ 2), forecolor1.BackColor
Picture1.FillStyle = 1
End If
If MDIPaint.Toolbar2.Buttons(17).Value = tbrPressed Then
Picture1.FillStyle = 7
Picture1.Circle (starX, starY), Sqr((endX - starX) ^ 2 + (endY - starY) ^ 2), forecolor1.BackColor
Picture1.FillStyle = 1
End If
小结
至此,程序大功告成,而VB中关于绘图编程的方法也远不止这些,更多未完成的功能期待着聪明的你来为它完善。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-128598-1.html
不申请通过就构成入侵中国领海
有道理