调用绘图版API
编辑时间:2017-05-14 作者:STM32cube中文网-admin 浏览量:5164 来源:STM32cube中文网
在carl论坛里有这么一个帖子《50行代码搞定数位板 + 画图》,原帖地址:http://bbs.aardio.org/forum.ph ... e%3D1 实际上这个帖子里包含库写了1000余行代码,分享精神难得,但是代码还是有一些问题,运行也会报错,尝试修正库路径这些错误以后,绘图板还是画不出东西。

wintab是绘图板都支持的通用接口标准,Wacom文档以及示例参考这里: http://www.wacomeng.com/windows/ 其实这个接口还是比较简单的,即使在aardio老的ansi版本中调用unicode api也用不到上千行代码,下面我把代码精简了一下大概一百行代码(支持aardio 老的ansi 版本,以及新的unicode版本)

当然运行下面的代码先得有个绘图板,先上个图看看效果(小孩在涂鸦):

import win.ui;
/*DSG{{*/
var winform = win.form(text="请使用压感笔在绘图板上画图";right=759;bottom=469)
winform.add()
/*}}*/
 
//<a href="http://www.wacomeng.com/windows/" rel="nofollow" target="_blank">http://www.wacomeng.com/windows/</a>
::Wintab32 := ..raw.loadDll("Wintab32.dll");
 
var lContext = {
    WORD lcName[40/*_LCNAMELEN*/];
    INT  lcOptions;
    INT  lcStatus;
    INT  lcLocks;
    INT  lcMsgBase;
    INT  lcDevice;
    INT  lcPktRate;
    INT  lcPktData;
    INT  lcPktMode;
    INT  lcMoveMask;
    INT  lcBtnDnMask;
    INT  lcBtnUpMask;
    int  lcInOrgX;
    int  lcInOrgY;
    int  lcInOrgZ;
    int  lcInExtX;
    int  lcInExtY;
    int  lcInExtZ;
    int  lcOutOrgX;
    int  lcOutOrgY;
    int  lcOutOrgZ;
    int  lcOutExtX;
    int  lcOutExtY;
    int  lcOutExtZ;
    INT  lcSensX;
    INT  lcSensY;
    INT  lcSensZ;
    int  lcSysMode;
    int  lcSysOrgX;
    int  lcSysOrgY;
    int  lcSysExtX;
    int  lcSysExtY;
    INT  lcSysSensX;
    INT  lcSysSensY;
}
 
::Wintab32.WTInfoW( 3/*WTI_DEFCONTEXT*/, 0, lContext);
lContext.lcOptions = 4/*_CXO_MESSAGES*/;
lContext.lcPktData =  0x40/*_PK_BUTTONS*/ 
    | 0x400/*_PK_NORMAL_PRESSURE*/ 
    | 0x80/*_PK_X*/
    | 0x100/*_PK_Y*/
    | 0x200/*_PK_Z*/;
 
//准备GDI+绘图对象
import gdip.pen;
import gdip.graphics;
var graphics = gdip.graphics(winform);
var pen = gdip.pen(0xFF000000, 1, 2);
var brush = gdip.solidBrush(0xFF000000);
winform.prevX, winform.prevY = 0, 0;
winform.prevNormalPressure = 0;
 
//响应绘图板消息
winform.wndproc = { 
    [0x7FF0/*_WT_PACKET*/] = function(hwnd, message, wParam, lParam){
        var packet = {
            INT pkButtons;
            int pkX;
            int pkY;
            int pkZ;
            INT pkNormalPressure;
        };
         
        //获取绘图板数据
        ::Wintab32.WTPacket(winform.hTablet, wParam, packet);
        var x,y,cx,cy = winform.getPos();
         
        if packet.pkNormalPressure{
            ::User32.SetCursor(null);//隐藏光标
            x = (cx * packet.pkX) / lContext.lcInExtX; //获取压感笔x坐标
            y = cy - (cy * packet.pkY) / lContext.lcInExtY; //获取压感笔y坐标
            if winform.prevNormalPressure == 0{
                winform.prevX, winform.prevY = x, y
            }
            select packet.pkButtons{
                case 1{
                    var size = packet.pkNormalPressure * 20 / 1024; //压力转换为笔尖大小
                    pen.width = size
                    brush.color = 0xFF000000
                    pen.color = brush.color
                    graphics.fillEllipse(brush, winform.prevX - size / 2, winform.prevY - size / 2, size, size)
                    graphics.drawLine(pen, x, y, winform.prevX, winform.prevY)
                }
                case 3{
                    var size = packet.pkNormalPressure * 50 / 1024 //压力转换为笔尖大小
                    pen.width = size
                    brush.color = 0xFFEEEEEE;
                    pen.color = brush.color
                    graphics.fillEllipse(brush, winform.prevX - size / 2, winform.prevY - size / 2, size, size)
                    graphics.drawLine(pen, x, y, winform.prevX, winform.prevY)
                }
            }
            winform.prevX, winform.prevY = x, y
        }
         
        winform.prevNormalPressure = packet.pkNormalPressure
        return 0;
    }
}
 
winform.show() 
 
//打开绘图板
winform.hTablet = ::Wintab32.WTOpenW(winform.hwnd, lContext, true);
win.setActive(winform.hwnd); //不然要鼠标点一下才能画
 
win.loopMessage();


来说两句吧