plus控件实现手写签名板
By
nod32
at 2022-03-27 • 0人收藏 • 1101人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=904;bottom=602)
winform.add(
button={cls="button";text="清空";left=289;top=489;right=571;bottom=558;z=1};
button2={cls="button";text="保存";left=598;top=490;right=808;bottom=558;z=3};
plus={cls="plus";left=66;top=49;right=821;bottom=447;bgcolor=16777215;notify=1;z=2};
plus2={cls="plus";left=71;top=473;right=254;bottom=577;foreRepeat="scale";z=4}
)
/*}}*/
import gdip;
import gdip.bitmap
import gdip.snap;
//图形对象graphics(可以看作是画板)
var graphics = gdip.graphics( winform.plus )
//加上抗锯齿功能
graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ;
var penColor = 0xFF000000;//线颜色
var penWidth = 8;//线宽
var startcap = 2;//起点线帽,指定线帽后画笔宽度为线帽宽度
var endcap = 2;//终端线帽,指定线帽后画笔宽度为线帽宽度
var drawData; //点坐标数组
var undoArr = {};//存放每一次鼠标弹起后的点坐标信息
winform.button.oncommand = function(id,event){
//winform.redraw()
graphics.clear(0xFFFFFFFF) ;//清空画板,并填充指定颜色
undoArr = {};
}
//定义鼠标初始坐标
var x1 = 0
var y1 = 0
winform.plus.onMouseDown = function(wParam,lParam){
x1,y1 = win.getMessagePos(lParam);
drawData = {::POINTF(x1,y1)}
}
winform.plus.onMouseMove = function(wParam,lParam){
if( wParam & 0x1/*_MK_LBUTTON*/ ){
var x2,y2 = win.getMessagePos(lParam);
table.push(drawData,::POINTF(x2,y2) )
var pen = gdip.pen( penColor, penWidth,2/*_GdipUnitPixel*/);
pen.startCap = startcap
pen.endCap = endcap
graphics.drawLine( pen, x1, y1, x2, y2)
x1 = x2;
y1 = y2;
pen.delete()
}
}
winform.plus.onMouseUp = function(wParam,lParam){
//var x,y = win.getMessagePos(lParam);
table.push(undoArr,drawData);
drawData = null;
}
//winform.plus.modifyStyle(, 0x2000000/*_WS_CLIPCHILDREN*/)
//winform.modifyStyle(, 0x2000000/*_WS_CLIPCHILDREN*/ )
winform.button2.oncommand = function(id,event){
var bitmap = gdip.snap(winform.plus.hwnd)
var old = winform.plus2.setForeground(bitmap,,true) //显示到plus2上
if( old ) old.dispose();
bitmap.save("c:\截图.jpg",80) //保存位图
}
//重绘
winform.plus.onDrawForegroundEnd = function(graphics,rc){
var pen = gdip.pen( penColor, penWidth,2/*_GdipUnitPixel*/);
pen.startCap = startcap
pen.endCap = endcap
if(#undoArr>0){
for(i=1;#undoArr;1){
for(j=2;#undoArr[i];1){
graphics.drawLine(pen,undoArr[i][j-1].x,undoArr[i][j-1].y,undoArr[i][j].x,undoArr[i][j].y);
}
}
}
pen.delete()
}
winform.show();
win.loopMessage();
实现了在plus上签名并保存成位图,但有个问题,当窗体尺寸调整或最小化恢复后,plus上的graphics会丢失,这个怎么解决??
↑↑↑↑↑ 上面的问题,参考官方的画板解决了
2 个回复 | 最后更新于 2022-03-20
登录后方可回帖
重绘啊
新建工程里有小画板, 自己看代码