学习记录:用aardio软件开发上位机

一直想学习一款软件能做上位机用,
我的要求: 能生成 独立的 / 绿色的 exe
很喜欢市面上那种 只有一个 exe文件, 无需安装,直接可以运行 ,界面功能不需要很多够用就行.
不需要安装任何运行库,labvIEW和labwindows都需要NI的运行库,一个库都几百兆
vb的程序需要.net环境.
用c++编程倒是满足,可惜不会
delphi貌似生成的也很大.
 
昨天找到个国产软件 aardio,
aardio 专用于桌面软件快速开发,开发环境仅 6.5 MB, 绿色软件解压即用 -  无论个人或企业都可以永久免费使用本软件开发商用、或非商用的应用程序。使用aardio开发的软件不需要放置鸣谢链接、不需要声明使用aardio开发。  
aardio 编程语言aardio是专用于桌面软件快速开发的新一代混合型编程语言 -  具有动态语言轻便、灵活的特性,而且又可以同时支持静态类型开发,象静态语言那样使用。aardio可以直接支持原生DLL,即使是外部EXE进程中的函数,也可以使用一句代码声明为普通的aardio函数对象( 原生call支持 ),aardio支持非常多的标准调用约定,例如 stdcall,cdecl,thiscall,fastcall,regparm(n)  等调用约定都可以支持。aardio虽然小,但支持的接口很丰富、可以支持com静态动态双接口,象VBS一样原生支持com对象。
      用一个简单的代码演示一下,下面的aardio代码定义了一个结构体:

    //定义类  
   class POINT {  
       int x; int y; //静态类型   
       func = function(){ 
           //动态类型  
       } 
   }
这种全新的混合编程语言开创了一种全新的编程方式,也因为这种语言特性,aardio可以非常方便的嵌入各种第三方语言,目前aardio可以嵌入汇编机器码,C语言,Java,PHP,C#,Python,Javascript,VBScript......等等数量众多的第三方编程语言,方便的互调函数,并且这些调用第三方语言的功能模块都是使用aardio实现( 开放源码 )。

aardio可以将硬盘目录,硬盘文件一键嵌入EXE文件,将全部程序包含所有资源生成独立的绿色EXE文件,aardio制作的程序大多不需要安装程序,也不需要释放DLL运行库,可以方便的制作免安装绿色软件。
aardio支持多线程开发,复杂的多线程开发在aardio中变得非常简单,标准库也提供大量简化多线程开发的辅助支持库,为多线程软件开发带来很大的方便(请参考aardio范例 -> 多线程 )。
aardio的标准库基本使用纯aardio源码实现,并且全部开源,标准库提供了大量的简化编程的常用函数,涉及到软件开发的方方面面,极大的简化了桌面软件开发过程。
 
好了,没事的时候学习一下这个软件,开贴记录.
 

已邀请:

admin

赞同来自:

再看上面实现的皮肤代码:

namespace theme{ 
    liebiao = {    //这个可以自己定义模版名字,我用作列表
        group = "div";//给元素分个组,我用div标识
        background = { //背景
            
         default = "\res\20160929194357.png";//图片
        }
        color = {//定义初始化的字体颜色
             hover = 0xFF57c0ff; //鼠标放上去时悬停的状况 
             active = 0xFFffc057; //鼠标点击时 
        }
        checked = {  //被点击选择后
             color = {
                hover = 0xFF57c0ff; //鼠标放上去时悬停的状况 
                 active = 0xFFffc057; //鼠标点击时 
             }
             background = { 
                 default= 'GIF89a\x16\0\x0B\0\x80\x01\0\0\xC0\xFF\xFF\xFF\xFF!\xF9\x04\x01\0\0\x01\0,\0\0\0\0\x16\0\x0B\0\0\x02\x19\x8C\x8F\xA9\xCB\xED\x0B"xPR%\xE7Eys\xEB\x19]\x18\x8C\xA4\x93EM\x01\0;'
             }
        }
    }
    close = {
        color = {
            hover = 0xff57c0ff; //鼠标放上去时悬停的状况
            active = 0xff07c707; //鼠标点击时 
        } 
    }
}
winform.plus1.skin(theme.aaa);//应用元素模版
winform.plus2.skin(theme.aaa);
winform.plus3.skin(theme.aaa);
winform.plus4.skin(theme.aaa);
winform.plus5.skin(theme.aaa); 
winform.btnClose.skin(theme.close);

a:link是超级链接的初始状态
a:hover是把鼠标放上去时悬停的状况 
a:active 是鼠标点击时 
a:visited是访问过后的情况

admin

赞同来自: tinyuns

第一个例子:
串口通信: 调用Pcomm.dll,来编写一个串口调试工具
整体界面

QQ截图20160811101637.png

在[用户库]中添加一个代码文件Pcomm.aardio
//串口通讯库
namespace Pcomm;

var path = ..io.exist("/res/Pcomm.dll");
if(!path) return ..win.msgbox("Pcomm.dll文件不存在,请检查");
Pcom = ..raw.loadDll(path);

SioOpen := Pcom.api("sio_open","int(int port)");
SioClose := Pcom.api("sio_close","int(int port)" );
SioIoctl := Pcom.api("sio_ioctl","int(int port, int baud, int mode)" );
SioRead := Pcom.api("sio_read","int(int port, pointer buf, int len)");
SioWrite := Pcom.api("sio_write","int(int port, pointer buf, int len)");
SioCntIrq := Pcom.api("sio_cnt_irq","int(int port, pointer callback, int count)");
SioTermRrq := Pcom.api("sio_term_irq","int(int port,pointer callback, pointer code)" )

//通知消息
Msg = {
["0"] ="ok";
["-1"] = "无效端口";
["-2"] = "端口不兼容";
["-3"] = "无数据可读";
["-5"] = "端口被占用";
["-6"] = "端口已设置为自动";
["-7"] = "参数错误";
["-8"] = "错误代码需系统获取";
["-9"] = "端口不支持此功能";
["-11"] = "写入被终止";
["-12"] = "写入超时"
}

//波特率
Baud = {
["1"]="50";
["2"]="75";
["3"]="110";
["4"]="134";
["5"]="150";
["6"]="300";
["7"]="600";
["8"]="1200";
["9"]="1800";
["10"]="2400";
["11"]="4800";
["12"]="7200";
["13"]="9600";
["14"]="19200";
["15"]="38400";
["16"]="57600";
["17"]="115200";
["18"]="230400";
["19"]="460800";
["20"]="921600"
};

//停止位
Stop = {
["0"]="0x00";
["1"]="0x04";
};

//奇偶校验
Parity = {
["None"] = "0x00";
["Even"] = "0x18";
["Odd"] = "0x08";
["Mark"] = "0x28";
["Space"] = "0x38";
};

//数据位
Databit ={
["5"]="0x00";
["6"]="0x01";
["7"]="0x02";
["8"]="0x03"
};



/**intellisense()
Pcomm = 串口通讯支持库,调用的Pcomm.dll
Pcomm.SioOpen = 打开串口(串口号)
Pcomm.SioClose = 关闭串口(串口号)
Pcomm.SioIoctl = 配置串口参数(串口号,波特率,停止位|奇偶校验|数据位)
Pcomm.SioRead = 从输入缓冲区读取数据(串口号,数据,数据长度)
Pcomm.SioWrite = 写入数据(串口号,数据,数据长度)
Pcomm.SioCntIrq = 设置中断函数,用来在接收一定长度的数据的时候产生中断(串口号,回调函数(串口号),长度)
Pcomm.SioTermRrq = 设置中断函数,用来在接收某特定数据的时候产生中断(串口号,回调函数(串口号),字符)
Pcomm.Msg = 通知消息
Pcomm.Baud = 波特率
Pcomm.Stop = 停止位
Pcomm.Parity = 奇偶校验
Pcomm.Databit = 数据位
end intellisense**/
上面是对外部dll的调用方法,
主界面的代码:
import win.ui;
import win.ui.menu;
import win.ui.statusbar;
import thread.command;
import Pcomm;
import win.reg;
/*DSG{{*/
mainForm = win.form(text="串口通讯小例子";right=599;bottom=533;border="dialog frame";max=false)
mainForm.add(
button={cls="button";text="发送数据";left=454;top=12;right=520;bottom=37;z=3};
button2={cls="button";text="打开串口";left=385;top=12;right=452;bottom=37;z=12};
button3={cls="button";text="清空数据";left=522;top=12;right=589;bottom=37;z=13};
combobox2={cls="combobox";left=51;top=13;right=137;bottom=33;edge=1;items={};mode="dropdownlist";z=6};
combobox3={cls="combobox";left=183;top=13;right=269;bottom=33;edge=1;items={};mode="dropdownlist";z=7};
edit={cls="edit";left=2;top=45;right=587;bottom=190;autohscroll=false;autovscroll=false;border=1;color=-1;db=1;dl=1;dr=1;dt=1;edge=1;frame=1;multiline=1;vscroll=1;z=2};
edit2={cls="edit";left=1;top=220;right=588;bottom=512;border=1;color=32768;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(h=-14);frame=1;hscroll=1;multiline=1;vscroll=1;z=4};
groupbox2={cls="groupbox";left=1;top=0;right=594;bottom=43;edge=1;z=1};
radiobutton={cls="radiobutton";text="ASCII";left=281;top=15;right=325;bottom=31;z=10};
radiobutton2={cls="radiobutton";text="HEX";left=341;top=15;right=381;bottom=31;z=11};
static={cls="static";text="数据接收";left=6;top=197;right=585;bottom=215;align="center";center=1;transparent=1;z=5};
static3={cls="static";text="端口号";left=2;top=14;right=47;bottom=31;align="right";center=1;transparent=1;z=8};
static4={cls="static";text="波特率";left=134;top=14;right=179;bottom=31;align="right";center=1;transparent=1;z=9}
)
/*}}*/

//串口号
var reg = win.regReader("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\");



if(!Pcomm.Pcom) return ;

//----界面底部增加状态栏------------
status = win.ui.statusbar(mainForm)
status.addItem("端口状态:", (mainForm.right - mainForm.left)/2/*宽度*/)
status.addItem("1", (mainForm.right - mainForm.left)/2/*宽度*/)
status.setText("操作状态:",2 /*第几个分块*/)

/*
设置几个必须的变量:串口,波特率,数据位,奇偶校验,停止位,读数据,写数据,发送长度,接收长度,是否按ascii码接收
*/
var port,Baud,Databit,Parity,stop,Rxdata,Txdata,Sendcount,Rececount,ifasci;
Rxdata,Txdata,Sendcount,Rececount = raw.malloc(1000),raw.malloc(1000),0,0;
stop = Pcomm.Stop["1"];
Databit,Parity = 0x03,0x00;


if(reg)
{
for(name,value,t in reg.eachValue())
{
mainForm.combobox2.add(value);
}

if(mainForm.combobox2.count)
mainForm.combobox2.selIndex = 1;
}

//基本界面和数据的初始话
//for(i=1;9;1){
// mainForm.combobox2.add("COM"+tostring(i))
//}

for(i=1;20;1){
mainForm.combobox3.add(Pcomm.Baud[tostring(i)])
}
mainForm.combobox2.selIndex,mainForm.combobox3.selIndex = 1,14 ;
port ,Baud = 1,Pcomm.Baud["14"];
mainForm.radiobutton.checked ,ifasci = true, 1;


mainForm.combobox2.oncommand = function(id,event){
if(event != 1) return ;
port = owner.selIndex;
}

mainForm.combobox3.oncommand = function(id,event){
if(event != 1) return ;
Baud = Pcomm.Baud[tostring(owner.selIndex)];
}

mainForm.edit.text = "00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF";



//转换为HEX码
var Hex=function(data,len){
var str="";
for(i=1;len;1){
str = str++" "++string.right(string.format("X", data[ i ]),2);//默认转换成有符号字节,因此取最右边两位 HEX码
}
return str;
}


//转换成AISCII
Aiscii=function(data,len){
var str="";
for(i=1;len;1){
str ++=string.pack(data[i]);
}
return str;
}


var initif = function(data,len){
if(mainForm.radiobutton.checked = true){
return Aiscii(data,len);
}else {
return Hex(data,len);
}
}


/*写个用于接收的回调函数*/

var CntIrq = function(port){
import thread.command;
thread.command.send("Send",1)
}
var CntIrqFuc = thread.tostdcall(CntIrq,"void(int)");





mainForm.button2.oncommand = function(id,event){
if(owner.text == "打开串口"){
status.setText("端口状态:端口打开中...",1 /*第几个分块*/)
var state = Pcomm.SioOpen(port);
if(state != 0){
mainForm.msgbox(Pcomm.Msg[tostring(state)]);
status.setText("端口状态:"++Pcomm.Msg[tostring(state)],1)
return ;
}

state = Pcomm.SioIoctl(port,tostring(Baud,16),stop|Parity|Databit);
status.setText("端口状态:端口打开成功,端口号:"++port ++" 波特率:" ++ Baud ,1);
mainForm.combobox2.disabled = true;
mainForm.combobox3.disabled = true;
Pcomm.SioCntIrq(port,CntIrqFuc,1)
owner.text = "关闭串口"

}else {
Pcomm.SioClose(port);
status.setText("端口状态:端口已经关闭",1)
owner.text = "打开串口"
mainForm.combobox2.disabled = false;
mainForm.combobox3.disabled = false;
}


}


var jieshou = function(){
len1 = Pcomm.SioRead(port,Rxdata,100);
var str = ""
str = initif(Rxdata,len1 );
mainForm.edit2.log( str,'\r\n');
Rececount += len1;
status.setText("接收状态:已收到[ "+tostring(Rececount)+" ]字节数据",2 )
}






/*回调函数发来消息接收数据*/

var Msg = thread.command();
Msg.Send = function(a){
jieshou();
}



mainForm.button3.oncommand = function(id,event){
mainForm.edit2.text = "";
Rececount = 0;
Sendcount = 0;
}


mainForm.button.oncommand = function(id,event){
var strSend = mainForm.edit.text;
var str = "";
if(mainForm.radiobutton.checked == true) //ascii 模式
{
Pcomm.SioWrite(port,strSend,#strSend)
len = string.len(strSend);
}
else
{
str = string.replace(strSend,"\s","");//去除空格及换行符
for(i=1; #str;2)
{
Txdata[(i+1)/2] = eval("0X"+string.sub(str,i,i+1));
}
Pcomm.SioWrite(port,Txdata,#str/2)
len = string.len(str) / 2;
}
Sendcount += len;
status.setText("端口状态:已发送[ "+tostring(Sendcount)+" ]字节",1 );/*第1个分块*/


}







mainForm.show()
return win.loopMessage();
上面特别注意的地方是查询电脑上有的串口的操作:
//先导入电脑注册表库
import win.reg;
//通过注册表串口查找
var reg = win.regReader("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\");
//依次取出串口号到界面上
if(reg)
{
for(name,value,t in reg.eachValue())
{
mainForm.combobox2.add(value);
}
//设置界面上用于显示的列表号
if(mainForm.combobox2.count)
mainForm.combobox2.selIndex = 1;
}

 

admin

赞同来自:

从上面的代码要学会的东西有:
1.状态栏的使用
这个要用到
import win.ui.statusbar;
首先定义一个状态栏,在底部增加
//----界面底部增加状态栏------------
status = win.ui.statusbar(mainForm)
往状态栏里面添加元素块,并分别定义他们的宽度是整个窗口宽度的一半
status.addItem("端口状态:", (mainForm.right - mainForm.left)/2/*宽度*/)
status.addItem("操作状态:", (mainForm.right - mainForm.left)/2/*宽度*/)
当我们需要改变状态栏相应元素块,要用到
status.setText("端口状态:端口打开成功,端口号:"++port ++" 波特率:" ++ Baud ,1 /*第几个分块*/);
后面的 1 意思是第几个分块,这里第一个分块里面写的是端口状态,第二个分块写的是操作状态.
上面的意思就是:往第一个区块里写入:端口状态:端口打开成功,端口号.....
 
2. 字符串的操作
tostring()//转换为字符串
string.len(strSend)//获取字符串长度

这里要说一下有个地方
//通知消息
Msg = {
["0"] ="ok";
["-1"] = "无效端口";
["-2"] = "端口不兼容";
["-3"] = "无数据可读";
["-5"] = "端口被占用";
["-6"] = "端口已设置为自动";
["-7"] = "参数错误";
["-8"] = "错误代码需系统获取";
["-9"] = "端口不支持此功能";
["-11"] = "写入被终止";
["-12"] = "写入超时"
}
上面msg定义的是字符型,所以主函数调用的时候,用的是
status.setText("端口状态:"++Pcomm.Msg[tostring(state)],1)
把state的状态转换为string后取的值.!!
 
3.回调函数的使用
/*写个用于接收的回调函数*/

var CntIrq = function(port){
import thread.command;
thread.command.send("Send",1)
}
var CntIrqFuc = thread.tostdcall(CntIrq,"void(int)");

///////////////////////////////

var jieshou = function(){
len1 = Pcomm.SioRead(port,Rxdata,100);
var str = ""
str = initif(Rxdata,len1 );
mainForm.edit2.log( str,'\r\n');
Rececount += len1;
status.setText("接收状态:已收到[ "+tostring(Rececount)+" ]字节数据",2 )
}

/*回调函数发来消息接收数据*/

var Msg = thread.command();
Msg.Send = function(a){
jieshou();
}
使用的时候,是在 打开串口的一瞬间.
mainForm.button2.oncommand = function(id,event){
if(owner.text == "打开串口"){
status.setText("端口状态:端口打开中...",1 /*第几个分块*/)
var state = Pcomm.SioOpen(port);
if(state != 0){
mainForm.msgbox(Pcomm.Msg[tostring(state)]);
status.setText("端口状态:"++Pcomm.Msg[tostring(state)],1)
return ;
}

state = Pcomm.SioIoctl(port,tostring(Baud,16),stop|Parity|Databit);
status.setText("端口状态:端口打开成功,端口号:"++port ++" 波特率:" ++ Baud ,1);
mainForm.combobox2.disabled = true;
mainForm.combobox3.disabled = true;
Pcomm.SioCntIrq(port,CntIrqFuc,1)
owner.text = "关闭串口"

}else {
Pcomm.SioClose(port);
status.setText("端口状态:端口已经关闭",1)
owner.text = "打开串口"
mainForm.combobox2.disabled = false;
mainForm.combobox3.disabled = false;
}


}
打开端口,设置端口参数,然后使能接收回调
 
 
 
 

admin

赞同来自:

串口的另外一种写法: 控制台输入输出
import win;
import string;

//加载dll,声明函数
Pcom = raw.loadDll("\res\Pcomm.dll");
//var dll = ..raw.loadDll("\res\Pcomm.dll");

//打开串口,正确返回0;C代码int WINAPI sio_open(int port);
sio_open = Pcom.api("sio_open","int(int port)");
//关闭串口,正确返回0;C代码int WINAPI sio_close(int port);
sio_close = Pcom.api("sio_close","int(int port)" );
//设置串口参数,正确返回0;C代码int WINAPI sio_ioctl(int port, int baud, int mode);
sio_ioctl = Pcom.api("sio_ioctl","int(int port, int baud, int mode)" );
//读取缓冲区数据,返回数据长度,为0表示没有读到数据;C代码int WINAPI sio_read(int port, char *buf, int len);
sio_read = Pcom.api("sio_read","int(int port, pointer buf, int len)");
//写入缓冲区数据,返回数据长度;C代码int WINAPI sio_write(int port, char *buf, int len);
sio_write = Pcom.api("sio_write","int(int port, pointer buf, int len)");
//设置中断函数,用来在接收大量数据的时候产生中断;C代码int WINAPI sio_cnt_irq(int port,VOID (CALLBACK *func)(int port), int count);
sio_cnt_irq = Pcom.api("sio_cnt_irq","int(int port, func(int port), int count)");


//串口打开函数
comopen = function(port,baud,parity,stopbits,wordlength){
var ret = 0;
var i = 0;

ret = sio_open(port);//打开串口
if(ret != 0){
win.msgboxTimeout("错误码:"+ret,"串口打开错误");
return 0;
}

ret = sio_ioctl (port, baud, parity| stopbits | wordlength );//设置串口参数:波特率、奇偶校验、停止位、数据位
if(ret != 0){
win.msgboxTimeout("错误码:"+ret,"串口设置错误");
return 0;
}
}

// 串口发送数据函数

comwrite = function(port,str,buf){
str = string.replace(str,"\s","");//去除空格及换行符
for(i=1;#str;2){
buf[(i+1)/2] = eval("0X"+string.sub(str,i,i+1));
}
var len = sio_write(port,buf,#str/2)
return len;
}


//串口接收数据函数

comread = function(port,buf){
var len = sio_read(port,buf,#buf);
var str = ""
for(i=1;len;1){
str = str++" "++string.right(string.format("X", buf[ i ]),2);//默认转换成有符号字节,因此取最右边两位
}
return str,len;
}


io.open();
var port = 1;
var baud = 0x0c;//波特率9600
/*baud = (bits/sec)
0 = 50 6 = 600 12 = 9600 18 = 460800
1 = 75 7 = 1200 13 = 19200 19 = 921600
2 = 110 8 = 1800 14 = 38400
3 = 134.5 9 = 2400 15 = 57600
4 = 150 10 = 4800 16 = 115200
5 = 300 11 = 7200 17 = 230400
*/
var wordlength = 0x03;//数据位bit_8
/*bit_cnt (bit 0, 1) = 0x00 = bit_5
0x01 = bit_6
0x02 = bit_7
0x03 = bit_8
*/
var parity = 0x18; //奇偶校验EVEN
/*parity (bit 3,4 5) = 0x00 = none
0x08 = odd
0x18 = even
0x28 = mark
0x38 = space
*/
var stopbits = 0x00;//停止位stop_1
/*stop_bit (bit 2) = 0x00 = stop_1
0x04 = stop_2
*/


comopen(port,baud,parity,stopbits,wordlength);//打开串口并设置串口参数;
var cdata = raw.malloc(256); //分配内存

io.print("请输入发送指令,然后回车")
var str = io.getText();
len = comwrite(port,str,cdata); //发送
io.print("发送"+len+"字节:"+str);
win.delay(80);
str1, len1 = comread(port,cdata) //接收
io.print("接收"+len1+"字节:"+str1);
win.delay(80);

sio_close(port); //关闭串口

execute("pause") //按任意键继续
io.close();//关闭控制台

admin

赞同来自:

记录:
dll的api的使用:
例如
SioRead := Pcom.api("sio_read","int(int port, pointer buf, int len)");

原型是
int WINAPI sio_read(int port, char *buf, int len)
可以看出,int还是int,但是buf这个数组指针就要写为pointer 
然后是
SioCntIrq := Pcom.api("sio_cnt_irq","int(int port, pointer func(int port),int count");
虽然也可以写为
SioCntIrq := Pcom.api("sio_cnt_irq","int(int port, pointer callback, int count)")
但是因为函数的原型为
int WINAPI sio_cnt_irq(int port,VOID (CALLBACK *func)(int port), int count)
我还是建议利用上面那种写法,这样更容易理解.
原型为
VOID (CALLBACK *func)(int port)的指针函数要改为

pointer func(int port)
 
 

admin

赞同来自:

获取CPU序列号
可以做机器码用。
import sys.cpu;
var cpuInfo = sys.cpu.getInfo(1,{ INT eax;INT ebx;INT ecx;INT edx } )
var cpuid = string.format("%X%X",cpuInfo.edx,cpuInfo.eax )
import console;
console.log("开始")
console.log("CPU序列号",cpuid)
console.log("CPU频率",math.round(sys.cpu.getFrequence()/1000,2) + " GHz" )
console.log("CPU商标",sys.cpu.getBrand() )
console.log("CPU厂商", sys.cpu.getVender() )
console.pause(true);

admin

赞同来自:

API获取窗口滚动条位置
以前都是找内存读取滚动条位置,后来遇到一个游戏客户端的滚动条内存基址怎么也找不到,做了很多努力都失败了,因为这个内存基址已经不属于程序领空。最后感觉这个滚动条应该是系统直接控制的, 和程序本身关系不大,所以直接调用系统的API应该可以获得。本人小白, API了解的不多,网上查了查资料才会用这个API了,现在回想起来,以前真是走了很多弯路,能直接用API获取的数据,我居然那么多次都去找内存、找基址。好在这次老办法遇到困难,才知道了这个简单办法。

下面是AAU(AARDIO)中获取窗口滚动条位置的API用法:

GetScrollPos= User32.api(“GetScrollPos”,”int(int hWnd,int bar)”);

pos=GetScrollPos(hwnd,0);

第一个参数是窗口句柄,第二个参数是滚动条方向。0:横向 1:竖向

晴朗 - 智能计量研发

赞同来自: tinyuns 陈鸿

非常感谢admin,只学写c,非常想自己开发上位机软件开发测试程序,但一直不知道aardio,今天看到admin的帖子才知道,非常感谢。

admin

赞同来自: (/≧▽≦)/~┴┴

窗体中嵌入外部应用程序示例:

import win.ui;
import winex;
import process;
/*DSG{{*/
var winform = win.form(text="aardio form";right=599;bottom=399)
winform.add(
button={cls="button";text="button";left=331;top=342;right=442;bottom=379;z=1}
)
/*}}*/

winform.button.oncommand = function(id,event){

var hwnd = winex.waitActive(,,,,,process("notepad.exe").id)
win.setParent(hwnd,winform.hwnd);
win.setPos(hwnd,0,0)
}

winform.show() 
win.loopMessage();


admin

赞同来自:

blob.png


winform.button.oncommand = function(id,event){

    var hwnd = winex.waitActive(,,,,,process("calc.exe").id)
    
    win.setParent(hwnd,winform.edit.hwnd);
    //win.setPos(hwnd,0,0)
    
}
任意的控件,使用它的句柄就可以了.
 
补充:
    win.center(hwnd) 居中放置窗口,参数是窗口的句柄
 

admin

赞同来自:

操作外部窗体测试:

blob.pngblob.png

import win.ui;
/*DSG{{*/
mainForm = win.form(text="ceshi";right=379;bottom=312)
mainForm.add(
button={cls="button";text="查找";left=89;top=123;right=263;bottom=196;z=1}
)
/*}}*/

import winex;
import process;
mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );
var hwnd,theadId,processId = winex.find(,"aardio form");
winex.quit(hwnd);
//winex.setText(hwnd,"哈哈哈")
}
mainForm.show() 
return win.loopMessage();

第一步测试,先查找已经打开的第一幅图中的软件,改软件里面有个按钮,点击后弹出"你好",

在设计里面添加一个按钮,功能是先

用winex.find查找打开的软件的名字,获取到这个软件的句柄.

然后利用句柄就可以做些事情了.

比如,quit退出这个软件,settext重新设置这个软件的标题名称.blob.png

admin

赞同来自:

实现查找外部窗体中的按钮并执行点击.

blob.png

import win.ui;
/*DSG{{*/
mainForm = win.form(text="ceshi";right=379;bottom=312)
mainForm.add(
button={cls="button";text="查找";left=89;top=123;right=263;bottom=196;z=1}
)
/*}}*/

import winex;
import process;
mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );
var hwnd,theadId,processId = winex.find(,"aardio form");
var anjian_hwnd = winex.findEx(hwnd,0,,"弹出你好"); 
winex.click(anjian_hwnd);
//winex.quit(hwnd);
//winex.setText(hwnd,"哈哈哈")
}
mainForm.show() 
return win.loopMessage();

利用了winex.findex命令

findEx(.(父窗口句柄,第几个匹配,类名模式串 ,标题模式串, 控件ID )=查找子窗口,除父窗口句柄外所有参数可选\n返回值为句柄

意思是查找这个窗体中的,名字叫"弹出你好"的一个控件数组,但是只选择里面第0个使用,并获取这个控件的id句柄

获取到句柄后,直接运行了点击这个控件的操作,

所以弹出了结果.

admin

赞同来自:

数组去重复操作

blob.png

import console;
 
console.setTitle("aardio工程10");

//var str = console.getText("请输入一行文本,然后回车:");
//console.log("您输入的是" ,str );

var tab = {1;2;8;3;4;5;1;2;3;6;8;5;3;9}; 
 var tab2 = {};
 var tab3 = {};
 
 for(i=1;#tab;1){
 
 var key = tab[i] ;
 if not tab2[key]
  {
  table.push(tab3,key);
  tab2[key] = "";
  } 
 }
 console.varDump(tab3);
  
console.pause();

听说还有个更好的办法,将数值和键值交换两次...

admin

赞同来自:

这里详细介绍下上面的 数组去重的方法:

定义t3个数组,循环tab数组里面的每个元素,将每个元素值作为数组tab2的键值,如果该键值所在的元素不存在,那么就说明没有重复数字出现,于是将这个数值放入第三个数组tab3中.

这样tab3中就是剔除重复之后的数值了.

这里有个地方要注意的:tab2[key] = "";

这句话,如果是经常写C的人可能不是很理解,写单片机的话,这个就会理解为空,但是aar中却不这样理解,应理解为空字符,这个是个数值.

其实要是改写为:tab2[key] = "1"; 这样可能就更好理解了.就是将这个键值对应的数赋值为1,这样里面就有数值了,那么判断 not tab2[key] 这个就是如果键值对应的数不存在,那么........

admin

赞同来自:

blob.png

With的用法:


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio Form";right=599;bottom=399;parent=...)
winform.add()
/*}}*/

winform.show() 

//with后是名字空间
with io{
    open();
    print("打开控制台。。。。");
}

//with后table对象
with winform{
    a=1;//定义成员变量
    b=2;
}
io.print(winform.a,winform.b);

//with后是个局部变量
var tab={};
with tab{
    x=0;
    y=90;
    z=180;
}
for(k,v in tab){
    io.print(k,v);
}

import com.excel;
var excel = com.excel(false) // 先打开EXCEL
excel.Visible = true; 
var sh = excel.ActiveWorkbook.Sheets(1);// 获取sheet 对象

//with后是个表达式 
with sh.range("A1:D5"){
    Clear() 
    Value2 = 100      
    with Font {
         Bold = true
         ColorIndex = 5
         Italic = true
         Size = 22    
    }
    BorderAround(1,4,3)
    Columns.AutoFit() 
}

win.loopMessage();

引用自http://bbs.aardio.com/forum.ph ... Dwith

admin

赞同来自: rebellion51

将外部引用的文件,例如dll文件,封装到发布的exe里面:

作用:使发布的文件只有一个exe没有其他多余的文件.

blob.png

比如,前面介绍的串口调试工具,用到了pcomm.dll文件,那时候发布的程序,包含两个文件,一个exe一个dll,这样看起来不够绿色,所以,在程序的路径里面加入$符号即可.

//串口通讯库
namespace Pcomm;

/*
var path = ..io.exist("/res/Pcomm.dll");
if(!path) return ..win.msgbox("Pcomm.dll文件不存在,请检查"); 
Pcom  = ..raw.loadDll(path);
*/
//ppcom = loadcode("\res\Pcomm.dll")
Pcom = ..raw.loadDll($"\res\Pcomm.dll");

SioOpen := Pcom.api("sio_open","int(int port)");
SioClose := Pcom.api("sio_close","int(int port)" );
SioIoctl := Pcom.api("sio_ioctl","int(int port, int baud, int mode)" );
SioRead := Pcom.api("sio_read","int(int port, pointer buf, int len)");
SioWrite := Pcom.api("sio_write","int(int port, pointer buf, int len)");
SioCntIrq := Pcom.api("sio_cnt_irq","int(int port, pointer callback, int count)");
SioTermRrq := Pcom.api("sio_term_irq","int(int port,pointer callback, pointer code)" )

然后库的目录中,选择 [内嵌资源] 

blob.png

admin

赞同来自:

树形滚动条效果,利用static控件实现:

blob.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="Kxui - Kxdwn.";right=469;bottom=318;bgcolor=16777215;border="none")
winform.add(
btnClose={cls="plus";text="r";left=439;top=4;right=466;bottom=27;bgcolor=16760919;color=11765504;dr=1;dt=1;font=LOGFONT(name='Webdings';h=-19);notify=1;z=1};
navBorder={cls="static";left=90;top=5;right=91;bottom=314;bgcolor=16760832;notify=1;z=7};
plus1={cls="plus";text="常规设置";left=0;top=15;right=90;bottom=46;bkBottom=4;bkLeft=9;bkRight=11;bkTop=3;font=LOGFONT(name='微软雅黑';h=-14);notify=1;z=2};
plus2={cls="plus";text="操作习惯";left=0;top=47;right=90;bottom=78;bkBottom=4;bkLeft=9;bkRight=11;bkTop=3;font=LOGFONT(name='微软雅黑';h=-14);notify=1;z=3};
plus3={cls="plus";text="个性定制";left=0;top=79;right=90;bottom=110;bkBottom=4;bkLeft=9;bkRight=11;bkTop=3;font=LOGFONT(name='微软雅黑';h=-14);notify=1;z=4};
plus4={cls="plus";text="皮肤资源";left=0;top=112;right=90;bottom=143;bkBottom=4;bkLeft=9;bkRight=11;bkTop=3;font=LOGFONT(name='微软雅黑';h=-14);notify=1;z=5};
plus5={cls="plus";text="高级设置";left=0;top=140;right=90;bottom=171;bkBottom=4;bkLeft=9;bkRight=11;bkTop=3;font=LOGFONT(name='微软雅黑';h=-14);notify=1;z=6}
)
/*}}*/

namespace theme{ 
    radio = {
        group = "nav";
        background = {
            default = 'GIF89a\x16\0\x0B\0\x80\x01\0\0\xC0\xFF\xFF\xFF\xFF!\xF9\x04\x01\0\0\x01\0,\0\0\0\0\x16\0\x0B\0\0\x02\x0F\x8C\x8F\xA9\xCB\xED\x0F\xA3\x9C\xB4\xDA\x8B+\xD8\xBC\x15\0;'
        }
        color = {
             hover = 0xFF57c0ff; 
             active = 0xFFffc057; 
        }
        checked = {  
             color = {
                hover = 0xFF57c0ff; 
                 active = 0xFFffc057; 
             }
             background = { 
                 default= 'GIF89a\x16\0\x0B\0\x80\x01\0\0\xC0\xFF\xFF\xFF\xFF!\xF9\x04\x01\0\0\x01\0,\0\0\0\0\x16\0\x0B\0\0\x02\x19\x8C\x8F\xA9\xCB\xED\x0B"xPR%\xE7Eys\xEB\x19]\x18\x8C\xA4\x93EM\x01\0;'
             }
        }
    }
    close = {
        color = {
            hover = 0xFF57c0ff; 
            active = 0xFFffc057; 
        } 
    }
}
winform.plus1.skin(theme.radio);
winform.plus2.skin(theme.radio);
winform.plus3.skin(theme.radio);
winform.plus4.skin(theme.radio);
winform.plus5.skin(theme.radio); 
winform.btnClose.skin(theme.close); 
 
winform.btnClose.oncommand = function(id,event){
    winform.close()

 
winform.wndproc = function(hwnd,message,wParam,lParam){
    if( message == 0x201/*_WM_LBUTTONDOWN*/ ) {
         winform.hitCaption();
    }
}
 
import win.ui.minmax; 
win.ui.minmax(winform);
 
import win.ui.shadow;
win.ui.shadow(winform,70,7); 
 
winform.show();
win.loopMessage();

这里需要牢记的一个地方:

实现的功能是点击窗体的任意位置,按住鼠标不放,能够拖动窗体

代码如下:

winform.wndproc = function(hwnd,message,wParam,lParam){
    if( message == 0x201/*_WM_LBUTTONDOWN*/ ) {
         winform.hitCaption();
    }
}

这个功能以后肯定会用到

admin

赞同来自:

_WM_LBUTTONDBLCLK=@0x203/*_WM_LBUTTONDBLCLK*/
_WM_LBUTTONDOWN=@0x201/*_WM_LBUTTONDOWN*/
_WM_LBUTTONUP=@0x202/*_WM_LBUTTONUP*/

面板鼠标事件:

0x201是当光标在窗口客户区时,左键单击事件发出的消息

0x202是当光标在窗口客户区时,用户释放鼠标左键时发出的消息

0x203是当光标在窗口客户区时,左键双击事件发出的消息


admin

赞同来自: (/≧▽≦)/~┴┴

import win.ui.shadow;
win.ui.shadow(winform,70,7);

界面扁平化处理:第一个参数是应用的窗体,第二个参数是透明度(255为不透明),第三个参数是边界羽化宽度

admin

赞同来自:

托盘图标使用方法:

1,弹出托盘和提示信息

2,最小化窗体到托盘,并提示,点击托盘恢复窗体

3,右键点击托盘,弹出一个菜单

blob.png

import win.ui;
import win.ui.menu;
/*DSG{{*/
var winform = win.form(text="aardio form";left=0;top=0;right=330;bottom=156;parent=...)
winform.add(
button={cls="button";text="弹出汽泡提示";left=97;top=37;right=248;bottom=68;z=1}
)
/*}}*/

import win.util.tray;
winform.button.oncommand = function(id,event){ 
tray = win.util.tray(winform)
tray.pop("欢迎使用托盘图标","aardio")
tray.message = 0xACCF/*_WM_TRAYMESSAGE*/
tray.tip = "鼠标提示" //设置鼠标提示 标题
}
 
winform.show(true) 
winform.wndproc = function(hwnd,message,wParam,lParam){

select(message) {//判断消息类型
case( 0xACCF/*_WM_TRAYMESSAGE*/ ) { //托盘图标消息

     if( lParam = 0x205/*_WM_RBUTTONUP*/ ){//鼠标右键
     import mouse;
     x,y = mouse.getPos();
    
     //弹出托盘菜单以前,一定要前置主窗口中,不然不点击菜单不会消失
     win.setForeground(winform.hwnd)
     winform.popmenu.popup( x,y,true )//弹出菜单
     }
if( lParam = 0x201/*_WM_RBUTTONUP*/ ){//在托盘上点击左键
     winform.show(true);
     }
    

case( 0x112/*_WM_SYSCOMMAND*/ ){ //系统命令消息
if( wParam == 0xF020/*_SC_MINIMIZE*/ ){ //用户点击了最小化按钮

//import win.util.tray;
//tray = win.util.tray(winform) //创建托盘图标 
//tray.pop("我最小化并跑到托盘来了" )
//注释掉上面是因为弹出气泡后和消失前,点左键无效
             winform.show(false); //隐藏窗口
             return true;//阻击默认消息传递,取消最小化过程


}
}
}

winform.popmenu = win.ui.popmenu(winform);//创建弹出菜单
winform.popmenu.add('&open',function(id){
//在下面输入菜单响应代码

});
winform.popmenu.add();//分隔线
winform.popmenu.add('&exit',function(id){ winform.close() })
 
win.loopMessage();


admin

赞同来自: Nuclear

记录两种LED数字字体显示的办法:

blob.png

上面绿色的那个是一个led字体,Digifacewide

blob.png

这种办法貌似需要在发布的时候,把字体一起打包安装才行......

这个是它的弊端.

另外一个办法是利用plus图片实现,即第二张个黑色的数字那个.

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=759;bottom=469)
mainForm.add(
Led_A={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\1.png";group=1;repeat="scale";transparent=1;z=1};
Led_B={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\2.png";group=1;repeat="scale";transparent=1;z=2};
Led_C={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\5.png";group=1;repeat="scale";transparent=1;z=5};
Led_D={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\6.png";group=1;repeat="scale";transparent=1;z=6};
Led_E={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\7.png";group=1;repeat="scale";transparent=1;z=7};
Led_F={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\4.png";group=1;repeat="scale";transparent=1;z=4};
Led_G={cls="plus";left=388;top=260;right=479;bottom=391;background="C:\Users\Administrator\Desktop\ggggg\3.png";group=1;repeat="scale";transparent=1;z=3};
button={cls="button";text="button";left=60;top=286;right=240;bottom=350;z=8};
edit={cls="edit";text="8";left=63;top=222;right=213;bottom=246;edge=1;z=9};
static={cls="static";text="-87.65";left=439;top=49;right=687;bottom=120;clip=1;clipch=1;color=1949696;font=LOGFONT(name='DigifaceWide';h=-64;weight=700);transparent=1;z=10}
)
/*}}*/

mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );
select(tonumber(mainForm.edit.text)) {
case 0 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = false;
  mainForm.Led_F.hide = false;
  mainForm.Led_G.hide = true;
}
case 1 {
mainForm.Led_A.hide = true;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = true;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = true;
  mainForm.Led_G.hide = true;
}
case 2 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = true;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = false;
  mainForm.Led_F.hide = true;
  mainForm.Led_G.hide = false;
}
case 3 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = true;
  mainForm.Led_G.hide = false;
}
case 4 {
mainForm.Led_A.hide = true;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = true;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = false;
  mainForm.Led_G.hide = false;
}
case 5 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = true;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = false;
  mainForm.Led_G.hide = false;
}
case 6 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = true;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = false;
  mainForm.Led_F.hide = false;
  mainForm.Led_G.hide = false;
}
case 7 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = true;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = true;
  mainForm.Led_G.hide = true;
}
case 8 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = false;
  mainForm.Led_F.hide = false;
  mainForm.Led_G.hide = false;
}
case 9 {
mainForm.Led_A.hide = false;
  mainForm.Led_B.hide = false;
  mainForm.Led_C.hide = false;
  mainForm.Led_D.hide = false;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = false;
  mainForm.Led_G.hide = false;
}
else {
  mainForm.Led_A.hide = true;
  mainForm.Led_B.hide = true;
  mainForm.Led_C.hide = true;
  mainForm.Led_D.hide = true;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = true;
  mainForm.Led_G.hide = true;


}
}
//mainForm.Led_D.hide = !mainForm.Led_D.hide;
}




mainForm.show() 
return win.loopMessage();

这里面的图片是这样生成的.

  1. 先网上下载一个7段式数码图片

  2. 删除白色的底,保留黑色的字,然后魔法棒选择黑色的字体的每根线,将每根线保存城一个副本图层,然后全选,新建一个透明图片,保存为png,粘贴后,一根一根删除不用的先,分别保存之后

  3. 软件里新建plus将每个图片放入,点击顶部的排序,放置好后,就可以了.

    blob.png

admin

赞同来自:

carl有一个进程通信库

 process.command
win.sendCopyData
winform.onCopyData 

用这个通信 _WM_COPYDATA,,,我分析一个棋牌游戏找发包CALL,找了好久,原来是用_WM_COPYDATA进行通讯的

blob.png

 win.sendCopyData
winform.onCopyData

这个用法还真简单

blob.png

admin

赞同来自:

为了能够根据所输入的数值的要给长度自动的增加数码管长度,需要添加一个函数

下面的代码里面bit就是代表位数,比如-765,那么这个-号就是4-1=3位

Formadd = function(bit){
var leftpos = 547-150*bit; 
mainForm.add(
["Led_A"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\1.png";group=1;repeat="scale";transparent=1;z=1};
["Led_B"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\2.png";group=1;repeat="scale";transparent=1;z=2};
["Led_C"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\5.png";group=1;repeat="scale";transparent=1;z=5};
["Led_D"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\6.png";group=1;repeat="scale";transparent=1;z=6};
["Led_E"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\7.png";group=1;repeat="scale";transparent=1;z=7};
["Led_F"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\4.png";group=1;repeat="scale";transparent=1;z=4};
["Led_G"+bit]={cls="plus";left=leftpos;top=207;right=638;bottom=338;background="C:\Users\Administrator\Desktop\ggggg\3.png";group=1;repeat="scale";transparent=1;z=3};
)
}

而这个位数的计算通过下面的办法

mainForm.button.oncommand = function(id,event){
var show_value,N_flag = 0; 
var valuechar; 
 
 Led_value = tonumber(mainForm.edit.text);
 var tab = string.split(mainForm.edit.text); 
 var valuelength = #(mainForm.edit.text);
 
for(i=1;valuelength;1){

ShowLed(tab[i],valuelength-i);
//win.delay(200);
}

第一步取得输入值

第二步分解这个输入值

第三步取得这个输入值的字符数长度

然后根据这个字符长度取得对应位置要显示的数值.

之后就是显示的函数

ShowLed=function(value,bit){


Formadd(bit);
select(value) {
case '0' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = false;
  mainForm["Led_E"++bit].hide = false;
  mainForm["Led_F"++bit].hide = false;
  mainForm["Led_G"++bit].hide = true;
}
case '1' {
mainForm["Led_A"++bit].hide = true;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = true;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = true;
  mainForm["Led_G"++bit].hide = true;
}
case '2' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = true;
  mainForm["Led_D"++bit].hide = false;
  mainForm["Led_E"++bit].hide = false;
  mainForm["Led_F"++bit].hide = true;
  mainForm["Led_G"++bit].hide = false;
}
case '3' {
mainForm["Led_A"+bit].hide = false;
  mainForm["Led_B"+bit].hide = false;
  mainForm["Led_C"+bit].hide = false;
  mainForm["Led_D"+bit].hide = false;
  mainForm["Led_E"+bit].hide = true;
  mainForm["Led_F"+bit].hide = true;
  mainForm["Led_G"+bit].hide = false;
}
case '4' {
mainForm["Led_A"++bit].hide = true;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = true;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = false;
  mainForm["Led_G"++bit].hide = false;
}
case '5' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = true;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = false;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = false;
  mainForm["Led_G"++bit].hide = false;
}
case '6' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = true;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = false;
  mainForm["Led_E"++bit].hide = false;
  mainForm["Led_F"++bit].hide = false;
  mainForm["Led_G"++bit].hide = false;
}
case '7' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = true;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = true;
  mainForm["Led_G"++bit].hide = true;
}
case '8' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = false;
  mainForm["Led_E"++bit].hide = false;
  mainForm["Led_F"++bit].hide = false;
  mainForm["Led_G"++bit].hide = false;
}
case '9' {
mainForm["Led_A"++bit].hide = false;
  mainForm["Led_B"++bit].hide = false;
  mainForm["Led_C"++bit].hide = false;
  mainForm["Led_D"++bit].hide = false;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = false;
  mainForm["Led_G"++bit].hide = false;
}
case '-' { //显示 负号
mainForm["Led_A"++bit].hide = true;
  mainForm["Led_B"++bit].hide = true;
  mainForm["Led_C"++bit].hide = true;
  mainForm["Led_D"++bit].hide = true;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = true;
  mainForm["Led_G"++bit].hide = false;
}
/*
case '.' { //显示 负号
mainForm.Led_A.hide = true;
  mainForm.Led_B.hide = true;
  mainForm.Led_C.hide = true;
  mainForm.Led_D.hide = true;
  mainForm.Led_E.hide = true;
  mainForm.Led_F.hide = true;
  mainForm.Led_G.hide = false;
}
*/
else {
  mainForm["Led_A"++bit].hide = true;
  mainForm["Led_B"++bit].hide = true;
  mainForm["Led_C"++bit].hide = true;
  mainForm["Led_D"++bit].hide = true;
  mainForm["Led_E"++bit].hide = true;
  mainForm["Led_F"++bit].hide = true;
  mainForm["Led_G"++bit].hide = true;
}
}

}

这里要注意的是,我们平时用到的mainform.Led这样的写法,其实就是mainform[Led]的简化

ok,随意输入数值测试,得到

blob.png

但是这个还有一个问题,当我之前输入的值长度比现在输入的长度长的时候,那么只会刷新掉后面的,前面的不变,这个问题还么解决

吉米

赞同来自:

学习一下

admin

赞同来自:

控件综合案例,网卡管理小工具
http://www.mamicode.com/info-detail-1077379.html

admin

赞同来自:

http://www.cnblogs.com/yaoyue68/p/4876913.html

只有一个架子,没有功能,练习之作
import win.ui;
import inet.adapter;
import inet.conn;
/*DSG{{*/
winForm = win.form(text="网卡管理工具";right=305;bottom=521;max=false)
winForm.add(
button={cls="button";text="修改";left=79;top=447;right=219;bottom=485;z=16};
combobox={cls="combobox";left=34;top=39;right=260;bottom=65;edge=1;items={};mode="dropdownlist";z=6};
edns={cls="edit";text="8.8.8.8";left=114;top=393;right=254;bottom=411;disabled=1;edge=1;z=14};
eip={cls="edit";text="192.168.0.0";left=122;top=148;right=258;bottom=166;disabled=1;edge=1;z=10};
emac={cls="static";text="00-00-00-00";left=94;top=290;right=270;bottom=308;z=15};
ewangguan={cls="edit";text="192.168.0.1";left=121;top=219;right=258;bottom=237;disabled=1;edge=1;z=12};
eyanma={cls="edit";text="255.255.255.0";left=120;top=180;right=257;bottom=198;disabled=1;edge=1;z=11};
groupbox={cls="groupbox";text="ip地址设置";left=18;top=94;right=286;bottom=263;edge=1;z=3};
groupbox2={cls="groupbox";text="选择网卡名称";left=15;top=15;right=287;bottom=79;edge=1;z=4};
groupbox3={cls="groupbox";text="dns设置";left=21;top=333;right=286;bottom=433;edge=1;z=1};
groupbox4={cls="groupbox";text="mac地址";left=20;top=269;right=287;bottom=318;edge=1;z=2};
radiobutton={cls="radiobutton";text="自动选择";left=38;top=115;right=132;bottom=129;checked=1;z=17};
radiobutton2={cls="radiobutton";text="使用下面";left=166;top=113;right=246;bottom=127;z=18};
radiobutton3={cls="radiobutton";text="自动选择";left=38;top=357;right=132;bottom=378;checked=1;z=19};
radiobutton4={cls="radiobutton";text="使用下面";left=142;top=358;right=222;bottom=372;z=20};
sdns={cls="static";text="dns地址:";left=38;top=395;right=100;bottom=416;notify=1;transparent=1;z=13};
sip={cls="static";text="ip地址:";left=40;top=150;right=99;bottom=186;notify=1;transparent=1;z=7};
static={cls="static";text="static";left=-152;top=485;right=24;bottom=503;transparent=1;z=21};
static2={cls="static";text="static2";left=-177;top=-230;right=35;bottom=43;notify=1;transparent=1;z=5};
static3={cls="static";text="powered by aardio(www.yaoyue68.com)";left=34;top=498;right=299;bottom=516;transparent=1;z=22};
swangguan={cls="static";text="网关地址:";left=37;top=220;right=106;bottom=241;notify=1;transparent=1;z=9};
syanma={cls="static";text="子网掩码:";left=36;top=184;right=105;bottom=205;notify=1;transparent=1;z=8}
)
/*}}*/

winForm.radiobutton4.oncommand = function(id,event){
jing_mo(3)
}

winForm.radiobutton3.oncommand = function(id,event){
jing_mo(4)
}

winForm.radiobutton.oncommand = function(id,event){
jing_mo(2)
}

winForm.radiobutton2.oncommand = function(id,event){
jing_mo(1)
}
//静默文本,默认静默
jing_mo=function(y){

select(y) {
case 1 {
winForm.eip.disabled=false
winForm.eyanma.disabled=false
winForm.ewangguan.disabled=false
}
case 2{
winForm.eip.disabled=true
winForm.eyanma.disabled=true
winForm.ewangguan.disabled=true

}
case 3{
winForm.edns.disabled=false
}
else {
winForm.edns.disabled=true
}
}
}

//默认显示项设置
winForm.combobox.add("请选择网卡")
winForm.combobox.selectString("请选择")//查找并默认选中

//循环显示网卡列表
winForm.combobox.oncommand = function(id,event){

for adptInfo in inet.adapter.each() {
//去重
if(!winForm.combobox.findEx(adptInfo.description)){
winForm.combobox.add(adptInfo.description)
}
}


echo_s(winForm.combobox.selText)

}

//匹配选中项并操作信息

echo_s=function(a){

for adptInfo in inet.adapter.each() {
if(a=adptInfo.description){
winForm.eip.text=adptInfo.ipAddressList.ipAddress ;
winForm.emac.text= adptInfo.mac;
winForm.eyanma.text=adptInfo.ipAddressList.ipMask ;
winForm.ewangguan.text=adptInfo.gatewayList.ipAddress ;
winForm.edns.text =adptInfo.dhcpServer.ipAddress ;

}

}

}



winForm.show()
win.loopMessage();

admin

赞同来自:

listview控件的使用总结http://www.cnblogs.com/yaoyue68/p/4858811.html

admin

赞同来自:

我电脑里有一个通讯端口COM3  现在我用工具已经打开了这个串口,我想在aardio里在操作串口之前先检查一下这个COM端口的状态 想知道是否可用。
如果先检测到了已经占用的话 那么先关闭这个串口  如果没有占用的话 那么再执行打开操作
我想问一下是否可以通过fsys来判断呢?如果不可以的话 是否就需要用
mscomm这样的控件 或者pcomm控件来判断?import fsys.file;

var file = fsys.file("\\.\COM3")
if( file ){
    //打开了COM3
    file.close();
}

4楼的回答是正确答案  但是可能大家不知道为什么其中要按照给出代码中的格式去写COM3
具体我找了一下相关资料
大家可以看
以下的几个连接
http://www.baidu.com/s?bs=UNC%E8 ... 8%E5%AF%B9%E8%B1%A1
http://www.cnblogs.com/coderle ... .html
http://hi.baidu.com/haibin_gl/ ... 0b294
http://ar.newsmth.net/thread-b45bcc45bd6f25.html

又找了点文章
在百度搜索  CreateFile 串口
http://www.cnblogs.com/ezhong/ ... .html
然后实际测试
import fsys.file;
import win
var file = fsys.file("COM3")
io.open()
io.print(file)
if( file ){
    //打开了COM3
    file.close();
}
是可以的.
import fsys.file;
import win
var file = fsys.file("COM3:")
io.open()
io.print(file)
if( file ){
    //打开了COM3
    file.close();
}
这个也是可以的
import fsys.file;
import win
var file = fsys.file("////.//COM3")
io.open()
io.print(file)
if( file ){
    //打开了COM3
    file.close();
}
也可以

也就是说,查询问题应该先从WINAPI入手。。

admin

赞同来自:

要实现按钮点击的动作可编辑,那么按钮对应的流程就要能改,那么就需要在按钮上点击右键能够弹出一个[编辑功能]菜单,于是

先在界面上随便放三个按钮控件,程序里,导入应用窗口

import console;

然后把每个按钮的[响应命令]里面添加一个输出显示

console.log("按钮1")

这样当按任意按钮的时候,黑色应用窗口就会输出对应信息

,这个时候需要在按钮上面添加一个右键菜单功能,那么需要导入[菜单支持库]

import win.ui.menu;//必须导入菜单支持库

然后先编写一个菜单供引用

//创建弹出菜单
winform.popmenu = win.ui.popmenu(winform); 
winform.popmenu.add('编辑功能',function(id){ 
//user code
} )

菜单完成后就要再按钮上添加此功能了,我们需要使用按钮的[消息回调]功能

所谓消息回调,就是消息(message)的配合,我们需要的是右键消息(0x205/*_WM_RBUTTONUP*/)

但是按钮(botton)没有这种类似富媒体编辑控件的winform.richedit.popMenu()函数,我们只能获取此时鼠标的位置,并将这个位置作为弹出右键菜单的位置

winform.button.wndproc = function(hwnd,message,wParam,lParam){

//无返回值则继续调用默认回调函数
if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
    var x,y = win.getMessagePos();  
winform.popmenu.popup(x,y,true)
}
}

blob.png

admin

赞同来自:

上面按钮是实现了右键菜单,但是如果里面又很多按钮其他的按钮也要这么操作添加,太麻烦了.有没有简单点的办法?

经过大神指点,可以用这种方式,遍历所有的button控件,

for(name,ctrl in winform.eachControl("button") ){

}

于是我们将所有的按钮事件(oncommand)都注释掉,

for(name,ctrl in winform.eachControl("button") ){
winform[name].oncommand = function(id,event){
//winform.msgbox( winform.button3.text );
console.log(name)

}
}

这样无论你添加了多少个按钮,逗可以输出这个按钮的名称.

blob.png

admin

赞同来自:

上面显示按钮名称的实现了之后,就可以把先前写的鼠标右键事件,按照上面类似的写法添加到for里面

for(name,ctrl in winform.eachControl("button") ){
/*
winform[name].oncommand = function(id,event){
//winform.msgbox( winform.button3.text );
console.log(name)
*/
winform[name].wndproc = function(hwnd,message,wParam,lParam){

//无返回值则继续调用默认回调函数
if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
    var x,y = win.getMessagePos();  
winform.popmenu.popup(x,y,true)
}
}


}

这样做了之后确实可以点击右键的编辑,实现编辑,

但是,只是修改了其中一个按钮的名字,我要实现点击任意按钮修改任意名称,怎么做?

还是要利用这个for,让每个按钮都按照下面的流程操作

  1. 创建弹出菜单

  2. 列出此菜单功能函数

  3. 创建按钮消息回调

  4. 右键消息中加入弹出菜单

for(name,ctrl in winform.eachControl("button") ){
/*
winform[name].oncommand = function(id,event){
//winform.msgbox( winform.button3.text );
console.log(name)
*/
//创建弹出菜单
winform["pop"+name] = win.ui.popmenu(winform); 
winform["pop"+name].add('编辑功能',function(id){ 
winform[name].text =name+"按钮被修改了"
} )

winform[name].wndproc = function(hwnd,message,wParam,lParam){

//无返回值则继续调用默认回调函数
if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
    var x,y = win.getMessagePos(); 
winform["pop"+name].popup(x,y,true)
}
}


}

这里需要注意一点,上面的代码中

//创建弹出菜单
winform["pop"+name] = win.ui.popmenu(winform); 
winform["pop"+name].add('编辑功能',function(id){ 
winform[name].text =name+"按钮被修改了"
} )

为什么要用name中增加一个pop的字符呢?

这是因为如果不加的话,winform[name]相当于winform.name而这个是界面上面已经存在的控件.会导致出错,随意添加一个字符就避免了这种问题.....

还有一点也要注意,就是下面用到的

		if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
    var x,y = win.getMessagePos(); 
winform["pop"+name].popup(x,y,true)
}

这个里面要对应修改啊...

ok,功能实现完毕,

其他的控件都是类似的操作

blob.png

admin

赞同来自:

获取窗口在整个屏幕中的位置

import console;
winform.wndproc = function(hwnd,message,wParam,lParam){
    if( message == 0x201/*_WM_LBUTTONDOWN*/ ) {
         winform.hitCaption();
    }
    if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
    //获取右键点击时候的相对位置信息(相对于软件窗体)
         var x,y = win.getMessagePos(lParam); 
      //   console.log(x,y) 
      //获取软件窗体在窗口中的具体位置
         var dx,dy,dwid,dhigh=win.getPos(hwnd)
      //   console.log(dx,dy)
      //两个位置相加,就是点击右键时候在屏幕中的绝对位置
        winform.popmenu.popup(x+dx,y+dy,true)
    }
}



admin

赞同来自:

winform.wndproc = function(hwnd,message,wParam,lParam){
    if( message == 0x201/*_WM_LBUTTONDOWN*/ ) {
         winform.hitCaption();
    }
    if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
         var x,y = win.getMessagePos(lParam); 
         if(x>=90){ //如果此时鼠标右键位置大于相对的90
          return   ; //退出这个调用
         }
      //   console.log(x,y) 
         var dx,dy,dwid,dhigh=win.getPos(hwnd)
      //   console.log(dx,dy)
        winform.popmenu.popup(x+dx,y+dy,true)
    }
}

退出调用的办法,return.

admin

赞同来自:

winform.popmenu.popup(x,y,false)

如果popup里面不填写参数,那么就默认是此时鼠标点击地方的位置.

所以我们可以这样写

winform.wndproc = function(hwnd,message,wParam,lParam){
    if( message == 0x201/*_WM_LBUTTONDOWN*/ ) {
         winform.hitCaption();
    }
    if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
         var x,y = win.getMessagePos(lParam); 
         if(x>=90){ //如果此时鼠标右键位置大于相对的90
           return   ; //退出这个调用
         }
      //   console.log(x,y) 
      //   var dx,dy,dwid,dhigh=win.getPos(hwnd)
      //   console.log(dx,dy)
        winform.popmenu.popup()
    }
}

效果和上面的是一样的.

还有一种办法:

如果popup(x,y,true)里面的参数true改为false也一样,

这个true的含义是否是屏幕坐标,选false就不是屏幕坐标就可以直接用x,y了而不需要

x+dx等等操作了

admin

赞同来自:

//移除列标题
winform.listview.modifyStyle(,0x4000/*_LVS_NOCOLUMNHEADER*/)
//插入列,标题,宽度(-1表示占满整个框),格式
winform.listview.insertColumn("列标题3",100,,0x0/*_LVCFMT_LEFT*/)


admin

赞同来自:

笔记:

纠结了一天的dll调用,终于初步搞定了.

函数原型的调用

var dll = ..raw.loadDll($"\res\xxxDLL.dll",,"cdecl");

为什么后面要用cdecl这个调用约定?

我自己的理解是这个dll是用vc++写的,风格呢就是c的风格,所以调用约定指定为C

Xxxdll_OpenDevice = dll.api("xxxdll_OpenDevice","int(void)");

它的原型是

int HUAVEDAQ_OpenDevice(void)

下一个函数

Xxxdll_ReadSingleLightPower= dll.api("Xxxdll_ReadSingleLightPower","int( INT channel, INT lightWavelenght, float &LightPower )")

原型为

int Xxxdll_ReadSingleLightPower( unsigned char channel, unsigned char lightWavelenght, float *LightPower )

还有一个

Xxxdll_ReadVersion= dll.api("Xxxdll_ReadVersion","int( pointer str)");

原型为

int Xxxdll_ReadVersion( char *str )


这里需要注意的是最后一个,因为版本号的读取,c原型里面是用的指针指向数组的头,是一个字节一字节的数据,所以这样写.


这些操作完成后,需要调用

mainForm.button4.oncommand = function(id,event){
var status,power = Xxxdll_ReadSingleLightPower(1,1,0);//最后一个参数,需要随机填入一个数字,要不然指针会是Null,而报错
if(status!=0){
console.log("读取失败")
}
console.log(power) ;

}

这里要注意注释部分(110)的0,是随机写的,什么数字都可以的

,要特别注意这里的写法:

float &LightPower

这样写是因为aardio中这样规定的,所有原型中修改的数据,必须在输出中体现!

blob.png

下面是读版本号

mainForm.button.oncommand = function(id,event){
var str = raw.malloc(1000);
var status=Xxxdll_ReadVersion(str);
 
var straa = ""
    straa = initif(str,16 );
console.log(straa) ;

}

因为我们的dll里面已经规定版本号是16个字节,所以我这里填写的是16.

第一步给数据分配空间,

第二步获取str这个指针

第三步,取这个指针的数据,按字节进行处理,

//转换为HEX码
var Hex=function(data,len){
var str="";
for(i=1;len;1){
str = str++" "++string.right(string.format("X", data[ i ]),2);//默认转换成有符号字节,因此取最右边两位  HEX码
}
return str;                    

这里参考了以前的帖子里面的串口助手的写法.


admin

赞同来自:

blob.png

admin

赞同来自: lulmlc

windows消息大全 
 
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做Msg, 
 
它在Windows单元中是这样声明的: 
typedef struct tagMSG {
    HWND   hwnd; 窗口句柄 
    UINT   message; 消息常量标识符 
    WPARAM wParam;  32位消息的特定附加信息 
    LPARAM lParam;  32位消息的特定附加信息 
    DWORD  time; 消息创建时的时间 
    POINT  pt; 消息创建时的鼠标位置 
} MSG, PMSG; 
 
消息中有什么? 
是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释: 
hwnd    32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。 
message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。 
wParam  通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 
lParam  通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的, 
因此,它们之间可以相互转换。 
 
WM_NULL = $0000; 
WM_CREATE = $0001; 
应用程序创建一个窗口 
WM_DESTROY = $0002; 
一个窗口被销毁 
WM_MOVE = $0003; 
移动一个窗口 
WM_SIZE = $0005; 
改变一个窗口的大小 
WM_ACTIVATE = $0006; 
一个窗口被激活或失去激活状态; 
WM_SETFOCUS = $0007; 
获得焦点后 
WM_KILLFOCUS = $0008; 
失去焦点 
WM_ENABLE = $000A; 
改变enable状态 
WM_SETREDRAW = $000B; 
设置窗口是否能重画 
WM_SETTEXT = $000C; 
应用程序发送此消息来设置一个窗口的文本 
WM_GETTEXT = $000D; 
应用程序发送此消息来复制对应窗口的文本到缓冲区 
WM_GETTEXTLENGTH = $000E; 
得到与一个窗口有关的文本的长度(不包含空字符) 
WM_PAINT = $000F; 
要求一个窗口重画自己 
WM_CLOSE = $0010; 
当一个窗口或应用程序要关闭时发送一个信号 
WM_QUERYENDSESSION = $0011; 
当用户选择结束对话框或程序自己调用ExitWindows函数 
WM_QUIT = $0012; 
用来结束程序运行或当程序调用postquitmessage函数 
WM_QUERYOPEN = $0013; 
当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 
WM_ERASEBKGND = $0014; 
当窗口背景必须被擦除时(例在窗口改变大小时) 
WM_SYSCOLORCHANGE = $0015; 
当系统颜色改变时,发送此消息给所有顶级窗口 
WM_ENDSESSION = $0016; 
当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序, 
通知它对话是否结束 
WM_SYSTEMERROR = $0017; 
WM_SHOWWINDOW = $0018; 
当隐藏或显示窗口是发送此消息给这个窗口 
WM_ACTIVATEAPP = $001C; 
发此消息给应用程序哪个窗口是激活的,哪个是非激活的; 
WM_FONTCHANGE = $001D; 
当系统的<a href="http://www.btbat.com/tag/%25e5 ... ot%3B查看更多关于字体的文章" target="_blank">字体</a>资源库变化时发送此消息给所有顶级窗口 
WM_TIMECHANGE = $001E; 
当系统的时间变化时发送此消息给所有顶级窗口 
WM_CANCELMODE = $001F; 
发送此消息来取消某种正在进行的摸态(操作) 
WM_SETCURSOR = $0020; 
如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 
WM_MOUSEACTIVATE = $0021; 
当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 
WM_CHILDACTIVATE = $0022; 
发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 
WM_QUEUESYNC = $0023; 
此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序 
分离出用户输入消息 
WM_GETMINMAXINFO = $0024; 
此消息发送给窗口当它将要改变大小或位置; 
WM_PAINTICON = $0026; 
发送给最小化窗口当它图标将要被重画 
WM_ICONERASEBKGND = $0027; 
此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画 
WM_NEXTDLGCTL = $0028; 
发送此消息给一个对话框程序去更改焦点位置 
WM_SPOOLERSTATUS = $002A; 
每当打印管理列队增加或减少一条作业时发出此消息 
WM_DRAWITEM = $002B; 
当button,combobox,listbox,menu的可视外观改变时发送 
此消息给这些空件的所有者 
WM_MEASUREITEM = $002C; 
当button, combo box, list box, list view control, or menu item 被创建时 
发送此消息给控件的所有者 
WM_DELETEITEM = $002D; 
当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息 
WM_VKEYTOITEM = $002E; 
此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息 
WM_CHARTOITEM = $002F; 
此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息 
WM_SETFONT = $0030; 
当绘制文本时程序发送此消息得到控件要用的颜色 
WM_GETFONT = $0031; 
应用程序发送此消息得到当前控件绘制文本的<a href="http://www.btbat.com/tag/%25e5 ... ot%3B查看更多关于字体的文章" target="_blank">字体</a> 
WM_SETHOTKEY = $0032; 
应用程序发送此消息让一个窗口与一个热键相关连 
WM_GETHOTKEY = $0033; 
应用程序发送此消息来判断热键与某个窗口是否有关联 
WM_QUERYDRAGICON = $0037; 
此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标 
WM_COMPAREITEM = $0039; 
发送此消息来判定combobox或listbox新增加的项的相对位置 
WM_GETOBJECT = $00<a href="http://www.btbat.com/tag/3d%26 ... ot%3B查看更多关于3D的文章" target="_blank">3D</a>; 
WM_COMPACTING = $0041; 
显示内存已经很少了 
WM_WINDOWPOSCHANGING = $0046; 
发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数 
WM_WINDOWPOSCHANGED = $0047; 
发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数 
WM_POWER = $0048;(适用于16位的windows) 
当系统将要进入暂停状态时发送此消息 
WM_COPYDATA = $004A; 
当一个应用程序传递数据给另一个应用程序时发送此消息 
WM_CANCELJOURNAL = $004B; 
当某个用户取消程序日志激活状态,提交此消息给程序 
WM_NOTIFY = $004E; 
当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口 
WM_INPUTLANGCHANGEREQUEST = $0050; 
当用户选择某种输入语言,或输入语言的热键改变 
WM_INPUTLANGCHANGE = $0051; 
当平台现场已经被改变后发送此消息给受影响的最顶级窗口 
WM_TCARD = $0052; 
当程序已经初始化windows帮助例程时发送此消息给应用程序 
WM_HELP = $0053; 
此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就 
发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口 
WM_USERCHANGED = $0054; 
当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体 
设置信息,在用户更新设置时系统马上发送此消息; 
WM_NOTIFYFORMAT = $0055; 
公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构 
在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信 
WM_CONTEXTMENU = $007B; 
当用户某个窗口中点击了一下右键就发送此消息给这个窗口 
WM_STYLECHANGING = $007C; 
当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口 
WM_STYLECHANGED = $007D; 
当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口 
WM_DISPLAYCHANGE = $007E; 
当显示器的分辨率改变后发送此消息给所有的窗口 
WM_GETICON = $007F; 
此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄; 
WM_SETICON = $0080; 
程序发送此消息让一个新的大图标或小图标与某个窗口关联; 
WM_NCCREATE = $0081; 
当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送; 
WM_NCDESTROY = $0082; 
此消息通知某个窗口,非客户区正在销毁 
WM_NCCALCSIZE = $0083; 
当某个窗口的客户区域必须被核算时发送此消息 
WM_NCHITTEST = $0084;移动鼠标,按住或释放鼠标时发生 
WM_NCPAINT = $0085; 
程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时; 
WM_NCACTIVATE = $0086; 
此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态; 
WM_GETDLGCODE = $0087; 
发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件 
通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它 
WM_NCMOUSEMOVE = $00A0; 
当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 
的边框体 
WM_NCLBUTTONDOWN = $00A1; 
当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息 
WM_NCLBUTTONUP = $00A2; 
当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息; 
WM_NCLBUTTONDBLCLK = $00A3; 
当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息 
WM_NCRBUTTONDOWN = $00A4; 
当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息 
WM_NCRBUTTONUP = $00A5; 
当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息 
WM_NCRBUTTONDBLCLK = $00A6; 
当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息 
WM_NCMBUTTONDOWN = $00A7; 
当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息 
WM_NCMBUTTONUP = $00A8; 
当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息 
WM_NCMBUTTONDBLCLK = $00A9; 
当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息 
WM_KEYFIRST = $0100; 
WM_KEYDOWN = $0100; 
按下一个键 
WM_KEYUP = $0101; 
释放一个键 
WM_CHAR = $0102; 
按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息 
WM_DEADCHAR = $0103; 
当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口 
WM_SYSKEYDOWN = $0104; 
当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口; 
WM_SYSKEYUP = $0105; 
当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口 
WM_SYSCHAR = $0106; 
当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口 
WM_SYSDEADCHAR = $0107; 
当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口 
WM_KEYLAST = $0108; 
WM_INITDIALOG = $0110; 
在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务 
WM_COMMAND = $0111; 
当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译 
WM_SYSCOMMAND = $0112; 
当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息 
WM_TIMER = $0113; 发生了定时器事件 
WM_HSCROLL = $0114; 
当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件 
WM_VSCROLL = $0115; 
当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件 WM_INITMENU = $0116; 
当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单 
WM_INITMENUPOPUP = $0117; 
当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部 
WM_MENUSELECT = $011F; 
当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口) 
WM_MENUCHAR = $0120; 
当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者; 
WM_ENTERIDLE = $0121; 
当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待 
WM_MENURBUTTONUP = $0122; 
WM_MENUDRAG = $0123; 
WM_MENUGETOBJECT = $0124; 
WM_UNINITMENUPOPUP = $0125; 
WM_MENUCOMMAND = $0126; 
WM_CHANGEUISTATE = $0127; 
WM_UPDATEUISTATE = $0128; 
WM_QUERYUISTATE = $0129; 
WM_CTLCOLORMSGBOX = $0132; 
在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色 
WM_CTLCOLOREDIT = $0133; 
当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色 
WM_CTLCOLORLISTBOX = $0134; 
当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色 
WM_CTLCOLORBTN = $0135; 
当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色 
WM_CTLCOLORDLG = $0136; 
当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色 
WM_CTLCOLORSCROLLBAR= $0137; 
当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色 
WM_CTLCOLORSTATIC = $0138; 
当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色 
WM_MOUSEFIRST = $0200; 
WM_MOUSEMOVE = $0200; 
 移动鼠标 
WM_LBUTTONDOWN = $0201; 
按下鼠标左键 
WM_LBUTTONUP = $0202; 
释放鼠标左键 
WM_LBUTTONDBLCLK = $0203; 
双击鼠标左键 
WM_RBUTTONDOWN = $0204; 
按下鼠标右键 
WM_RBUTTONUP = $0205; 
释放鼠标右键 
WM_RBUTTONDBLCLK = $0206; 
双击鼠标右键 
WM_MBUTTONDOWN = $0207; 
按下鼠标中键 
WM_MBUTTONUP = $0208; 
释放鼠标中键 
WM_MBUTTONDBLCLK = $0209; 
双击鼠标中键 
WM_MOUSEWHEEL = $020A; 
当鼠标轮子转动时发送此消息个当前有焦点的控件 
WM_MOUSELAST = $020A; 
WM_PARENTNOTIFY = $0210; 
当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口 
WM_ENTERMENULOOP = $0211; 
发送此消息通知应用程序的主窗口that已经进入了菜单循环模式 
WM_EXITMENULOOP = $0212; 
发送此消息通知应用程序的主窗口that已退出了菜单循环模式 
WM_NEXTMENU = $0213; 
WM_SIZING = 532; 
当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置也可以修改他们 
WM_CAPTURECHANGED = 533; 
发送此消息 给窗口当它失去捕获的鼠标时; 
WM_MOVING = 534; 
当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们; 
WM_POWERBROADCAST = 536; 
此消息发送给应用程序来通知它有关电源管理事件; 
WM_DEVICECHANGE = 537; 
当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序 
WM_IME_STARTCOMPOSITION = $010D; 
WM_IME_ENDCOMPOSITION = $010E; 
WM_IME_COMPOSITION = $010F; 
WM_IME_KEYLAST = $010F; 
WM_IME_SETCONTEXT = $0281; 
WM_IME_NOTIFY = $0282; 
WM_IME_CONTROL = $0283; 
WM_IME_COMPOSITIONFULL = $0284; 
WM_IME_SELECT = $0285; 
WM_IME_CHAR = $0286; 
WM_IME_REQUEST = $0288; 
WM_IME_KEYDOWN = $0290; 
WM_IME_KEYUP = $0291; 
WM_MDICREATE = $0220; 
应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口 
WM_MDIDESTROY = $0221; 
应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口 
WM_MDIACTIVATE = $0222; 
应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它; 
WM_MDIRESTORE = $0223; 
程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小 
WM_MDINEXT = $0224; 
程序 发送此消息给MDI客户窗口激活下一个或前一个窗口 
WM_MDIMAXIMIZE = $0225; 
程序发送此消息给MDI客户窗口来最大化一个MDI子窗口; 
WM_MDITILE = $0226; 
程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口 
WM_MDICASCADE = $0227; 
程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口 
WM_MDIICONARRANGE = $0228; 
程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口 
WM_MDIGETACTIVE = $0229; 
程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄 
WM_MDISETMENU = $0230; 
程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单 
WM_ENTERSIZEMOVE = $0231; 
WM_EXITSIZEMOVE = $0232; 
WM_DROPFILES = $0233; 
WM_MDIREFRESHMENU = $0234; 
WM_MOUSEHOVER = $02A1; 
WM_MOUSELEAVE = $02A3; 
WM_CUT = $0300; 
程序发送此消息给一个编辑框或combobox来删除当前选择的文本 
WM_COPY = $0301; 
程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板 
WM_PASTE = $0302; 
程序发送此消息给editcontrol或combobox从剪贴板中得到数据 
WM_CLEAR = $0303; 
程序发送此消息给editcontrol或combobox清除当前选择的内容; 
WM_UNDO = $0304; 
程序发送此消息给editcontrol或combobox撤消最后一次操作 
WM_RENDERFORMAT = $0305; 
 
WM_RENDERALLFORMATS = $0306; 
WM_DESTROYCLIPBOARD = $0307; 
当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者 
WM_DRAWCLIPBOARD = $0308; 
当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来 
显示剪贴板的新内容; 
WM_PAINTCLIPBOARD = $0309; 
当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画; 
WM_VSCROLLCLIPBOARD = $030A; 
WM_SIZECLIPBOARD = $030B; 
当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者; 
WM_ASKCBFORMATNAME = $030C; 
通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字 
WM_CHANGECBCHAIN = $030D; 
当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口; 
WM_HSCROLLCLIPBOARD = $030E; 
此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 ;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值; 
WM_QUERYNEWPALETTE = $030F; 
此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板 
WM_PALETTEISCHANGING= $0310; 
当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序 
WM_PALETTECHANGED = $0311; 
此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板 
WM_HOTKEY = $0312; 
当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息 
WM_PRINT = 791; 
应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分; 
WM_PRINTCLIENT = 792; 
WM_HANDHELDFIRST = 856; 
WM_HANDHELDLAST = 863; 
WM_PENWINFIRST = $0380; 
WM_PENWINLAST = $038F; 
WM_COALESCE_FIRST = $0390; 
WM_COALESCE_LAST = $039F; 
WM_DDE_FIRST = $03E0; 
WM_DDE_INITIATE = WM_DDE_FIRST+0; 
一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名; 
WM_DDE_TERMINATE = WM_DDE_FIRST+1; 
一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话; 
WM_DDE_ADVISE = WM_DDE_FIRST+2; 
一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它 
WM_DDE_UNADVISE = WM_DDE_FIRST+3; 
一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项 
WM_DDE_ACK = WM_DDE_FIRST+4; 
此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息 
WM_DDE_DATA = WM_DDE_FIRST+5; 
一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项 
WM_DDE_REQUEST = WM_DDE_FIRST+6; 
一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值; 
WM_DDE_POKE = WM_DDE_FIRST+7; 
一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项; 
WM_DDE_EXECUTE = WM_DDE_FIRST+8; 
一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应; 
WM_DDE_LAST = WM_DDE_FIRST+8; 
WM_APP = $8000; 
WM_USER = $0400; 
此消息能帮助应用程序自定义私有消息; 
 
通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows 95公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 
按扭 
BN_CLICKED 用户单击了按钮 
BN_DISABLE 按钮被禁止 
BN_DOUBLECLICKED 用户双击了按钮 
BN_HILITE 用户加亮了按钮 
BN_PAINT 按钮应当重画 
BN_UNHILITE 加亮应当去掉 
组合框 
CBN_CLOSEUP 组合框的列表框被关闭 
CBN_DBLCLK 用户双击了一个字符串 
CBN_DROPDOWN 组合框的列表框被拉出 
CBN_EDITCHANGE 用户修改了编辑框中的文本 
CBN_EDITUPDATE 编辑框内的文本即将更新 
CBN_ERRSPACE 组合框内存不足 
CBN_KILLFOCUS 组合框失去输入焦点 
CBN_SELCHANGE 在组合框中选择了一项 
CBN_SELENDCANCEL 用户的选择应当被取消 
CBN_SELENDOK 用户的选择是合法的 
CBN_SETFOCUS 组合框获得输入焦点 
编辑框 
EN_CHANGE 编辑框中的文本己更新 
EN_ERRSPACE 编辑框内存不足 
EN_HSCROLL 用户点击了水平滚动条 
EN_KILLFOCUS 编辑框正在失去输入焦点 
EN_MAXTEXT 插入的内容被截断 
EN_SETFOCUS 编辑框获得输入焦点 
EN_UPDATE 编辑框中的文本将要更新 
EN_VSCROLL 用户点击了垂直滚动条消息含义 
列表框 
LBN_DBLCLK 用户双击了一项 
LBN_ERRSPACE 列表框内存不够 
LBN_KILLFOCUS 列表框正在失去输入焦点 
LBN_SELCANCEL 选择被取消 
LBN_SELCHANGE 选择了另一项 
LBN_SETFOCUS 列表框获得输入焦点


admin

赞同来自:

OCX控件一例:

[com] 利用WMPlayer.OCX制作音乐播放器

/**
By:ざ凍結の→愛
**/
import win.ui;
import com;
import fsys;
import table;
import string;
/*DSG{{*/
var winform = ..win.form( exmode="toolwindow";min=false;bottom=384;max=false;right=368;parent=...;text="aardio Form" )
winform.add( 
stop={ ah=1;bottom=42;right=208;left=165;top=7;aw=1;text="停止";z=3;cls="button" };
next={ ah=1;bottom=42;right=320;left=276;top=7;z=6;text="下一曲";aw=1;cls="button" };
previous={ ah=1;bottom=42;text="上一曲";left=221;top=7;z=5;right=265;aw=1;cls="button" };
listbox={ ah=1;bgcolor=16777215;bottom=366;top=54;right=336;left=33;vscroll=1;
items={  };z=4;aw=1;hscroll=1;edge=1;cls="listbox" };
pause={ ah=1;bottom=42;text="暂停";left=109;top=7;aw=1;right=153;z=2;cls="button" };
play={ ah=1;bottom=42;text="播放";left=47;top=7;aw=1;right=97;z=1;cls="button" }
)
/*}}*/

var wmp = com.CreateObject("WMPlayer.OCX");

//io.open();
list = {};
musiclist = {};
path = "F:/music/";//你音乐文件夹

fsys.enum( path, "*.*",
function(dir,filename,fullpath,findData){ 
if(filename){ 
            //io.print("发现文件:"+filename,"完整路径:"+fullpath)
            if string.find(filename,".mp3")!=null or string.find(filename,".wav")!=null or string.find(filename,".MP3")!=null or string.find(filename,".WAV")!=null {
            //io.print(filename);
            table.push(list,filename+"  "+fullpath);
            table.push(musiclist,fullpath);
            }
}
/*
else{
io.print( "发现目录:" + dir )
}*/

,
function(dir){
return true;
}
/*如果此参数为false则忽略子目录*/
);

for i in list {
winform.listbox.add(list[i]);
}

for j in musiclist {
media = wmp.newMedia(musiclist[j]);
wmp.currentPlaylist.appendItem(media);
}

winform.next.oncommand = function(id,event){
wmp.controls.next();
}


winform.previous.oncommand = function(id,event){
wmp.controls.previous();
}

winform.stop.oncommand = function(id,event){
wmp.controls.stop();
}


winform.pause.oncommand = function(id,event){
wmp.controls.pause();
}


winform.play.oncommand = function(id,event){
wmp.controls.play();
}

winform.listbox.oncommand = function(id,event){
if( event == 0x2/*_LBN_SELCHANGE*/ ){
winform.msgbox(musiclist[winform.listbox.selIndex]);
}
}

winform.show() 
win.loopMessage();

blob.png

admin

赞同来自:

	class zip_fileinfo {
struct tmz_date = {
     INT second; 
     INT minute;
     INT hour;
     INT day; 
     INT month;
     INT year;
};
INT dosDate;  
INT internal_fa; 
INT external_fa; 
}

调用

	var info = zip_fileinfo();

var ftm = file.getFileTime().write;
file.close();

ftm.local();
 
info.dosDate = ftm.toDosTime();
info.external_fa = attr;


admin

赞同来自:

记录: Hid 上位机实现

利用 UsbHidApi.dll实现hid比较方便

blob.png

VB用的调用为

Private Declare Function SetInstance Lib "UsbHidApi" (ByVal val As Long) As Long
Private Declare Function GetLibVersion Lib "UsbHidApi.dll" (ByVal pBuf As String) As Long
Private Declare Sub CloseWrite Lib "UsbHidApi.dll" ()
Private Declare Sub CloseRead Lib "UsbHidApi.dll" ()
Private Declare Function Read Lib "UsbHidApi.dll" (ByRef pBuf As Byte) As Long
Private Declare Function Write2 Lib "UsbHidApi.dll" Alias "Write" (ByRef pBuf As Byte) As Long
Private Declare Sub ShowVersion Lib "UsbHidApi.dll" ()
Private Declare Sub GetReportLengths Lib "UsbHidApi.dll" (ByRef inlen As Long, ByRef outlen As Long)
Private Declare Function Open2 Lib "UsbHidApi.dll" Alias "Open" (ByVal VendorID As Long, ByVal ProductID As Long, ByVal Manufacturer As String, ByVal SerialNumber As String, ByVal DeviceName As String, ByVal bAsync As Long) As Long
Private Declare Function GetList Lib "UsbHidApi.dll" (ByVal VendorID As Long, ByVal ProductID As Long, ByVal Manufacturer As String, ByVal SerialNumber As String, ByVal DeviceName As String, ByRef DeviceList As mdeviceList, ByVal MaxDevices As Long) As Long
Private Declare Sub SetCollection Lib "UsbHidApi.dll" (ByVal col)
Private Declare Function GetCollection Lib "UsbHidApi.dll" () As Long
Private Declare Sub SetInterface Lib "UsbHidApi.dll" (ByVal iface)
Private Declare Function GetInterface Lib "UsbHidApi.dll" () As Long



先调用dll

var dll = ..raw.loadDll("\res\UsbHidApi.dll");

一个一个来,先实验下

 UsbGetLibVersion = dll.api("GetLibVersion","int(string &pBuf)");

它的原函数为:

Private Declare Function GetLibVersion Lib "UsbHidApi.dll" (ByVal pBuf As String) As Long

功能为:查看这个dll库的版本,

使用的时候要这样

var status,LibVersion = UsbGetLibVersion(raw.malloc(10));

这里的raw.malloc(10)分配10个内存给它用.

下面是官方的介绍

This function retrieves the current library version.  A string pointer must be supplied by the caller for storing the version string.  (The buffer should be at least 10 characters in length.)   It returns 0 on success, -1 otherwise.


admin

赞同来自:

下一个

 UsbShowVersion = dll.api("ShowVersion","void(void)");

调用的时候用

UsbShowVersion();

运行会自动弹出一个弹窗,里面显示的是这个dll的库版本号

admin

赞同来自:

blob.png

admin

赞同来自:

Hidapi库搞定了,下面是完整的代码:

先上封装的用户库 Usbhidapi.aardio

//Usbhidapi用户库
namespace Usbhidapi;

var dll = ..raw.loadDll($"\res\hidapi.dll", , "cdecl");
//初始化函数,0成功,-1失败
Hidapi_init= dll.api("hid_init","int(void)");
//释放端口函数,0成功,-1失败
Hidapi_exit= dll.api("hid_exit","int(void)");
//枚举端口
Hidapi_enumerate= dll.api("hid_enumerate","struct(WORD vendor_id, WORD product_id)","cdecl");
//释放枚举端口
Hidapi_free_enumeration= dll.api("hid_free_enumeration","void(struct devs)","cdecl");
//vid和pid方式打开端口
Hidapi_open= dll.api("hid_open","pointer(WORD vendor_id, WORD product_id, string serial_number)","cdecl");
//路径名方式打开
Hidapi_open_path= dll.api("hid_open_path","pointer(STRING path)","cdecl");
//发送数据函数,返回发送成功的长度 或者 发送失败-1
Hidapi_write= dll.api("hid_write","int(POINTER device, pointer data, INT length)","cdecl");
//读取(超时方式)
Hidapi_read_timeout= dll.api("hid_read_timeout","int(POINTER device, pointer data, INT length, INT milliseconds)","cdecl");
//读取(普通方式)
Hidapi_read= dll.api("hid_read","int(POINTER device, pointer data, INT length)","cdecl");
//设置阻塞模式 0 使用,1 不使用
Hidapi_set_nonblocking= dll.api("hid_set_nonblocking","int(POINTER device, int nonblock)","cdecl");
//发送功能报告
Hidapi_send_feature_report= dll.api("hid_send_feature_report","int(POINTER device, pointer data, int length)","cdecl");
//获取功能报告
Hidapi_get_feature_report= dll.api("hid_get_feature_report","int(POINTER device, pointer data, int length)","cdecl");
//关闭端口函数
Hidapi_close = dll.api("hid_close","void(POINTER device)","cdecl");
//获取用户码
Hidapi_get_manufacturer_string= dll.api("hid_get_manufacturer_string","int(POINTER device, ustring& data, INT maxlen)","cdecl");
//获取产品码
Hidapi_get_product_string= dll.api("hid_get_product_string","int(POINTER device, ustring& data, int maxlen)","cdecl");
//获取序列号
Hidapi_get_serial_number_string= dll.api("hid_get_serial_number_string","int(POINTER device, ustring& data, int maxlen)","cdecl")
//获取字符(按照给定的帧首[string_index]获取 1=manufacturer_strin, 2=product_string, 3=serial_number_string),同上面的功能一样
Hidapi_get_indexed_string= dll.api("hid_get_indexed_string","int(POINTER device, int string_index, ustring& data, int maxlen)","cdecl");
//获取错误信息
Hidapi_error= dll.api("hid_error","ustring(POINTER device)","cdecl");

主程序程序:

main.aardio

import win.ui;
import Usbhidapi;
import console;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=691;bottom=408;border="dialog frame")
mainForm.add(
Rxdata={cls="listbox";left=429;top=57;right=650;bottom=128;edge=1;items={};z=20};
Txdata={cls="edit";text="123456abcd";left=136;top=101;right=304;bottom=134;align="center";edge=1;z=19};
button={cls="button";text="初始化";left=40;top=146;right=140;bottom=181;z=1};
button10={cls="button";text="设置非阻塞";left=40;top=251;right=140;bottom=286;z=10};
button11={cls="button";text="发送功能报告";left=381;top=146;right=481;bottom=181;z=11};
button12={cls="button";text="获取功能报告";left=381;top=199;right=481;bottom=234;z=12};
button13={cls="button";text="关闭";left=553;top=302;right=653;bottom=337;z=13};
button14={cls="button";text="获取用户码";left=219;top=146;right=319;bottom=181;z=14};
button15={cls="button";text="获取产品码";left=219;top=198;right=319;bottom=234;z=15};
button16={cls="button";text="获取序列号";left=219;top=251;right=319;bottom=286;z=16};
button17={cls="button";text="获取首字符";left=219;top=304;right=319;bottom=338;z=17};
button18={cls="button";text="获取错误信息";left=553;top=248;right=653;bottom=283;z=18};
button2={cls="button";text="退出";left=553;top=356;right=653;bottom=392;z=2};
button3={cls="button";text="枚举";left=381;top=304;right=481;bottom=339;z=3};
button4={cls="button";text="释放枚举";left=381;top=357;right=481;bottom=391;z=4};
button5={cls="button";text="普通方式打开";left=40;top=198;right=140;bottom=234;z=5};
button6={cls="button";text="路径名方式打开";left=381;top=252;right=481;bottom=286;z=6};
button7={cls="button";text="发送";left=40;top=304;right=140;bottom=340;z=7};
button8={cls="button";text="读取(超时)";left=219;top=356;right=319;bottom=391;z=8};
button9={cls="button";text="读取";left=40;top=357;right=140;bottom=391;z=9};
static={cls="static";text="发送数据:";left=63;top=109;right=121;bottom=132;transparent=1;z=21};
static2={cls="static";text="接收数据:";left=356;top=106;right=413;bottom=125;transparent=1;z=22};
static3={cls="static";text="UsbHid库调用示例";left=241;top=12;right=436;bottom=50;align="center";font=LOGFONT(h=-24);transparent=1;z=23}
)
/*}}*/

hid_device_info = class {
string path ;
WORD vendor_id ;
WORD product_id ;
ustring serial_number;
WORD release_number ;
ustring manufacturer_string ;
ustring product_string ;
WORD usage_page ;
WORD usage;
int interface_number;
pointer next ;
};

//转换成AISCII
Aiscii=function(data,len){
var str="";           
for(i=1;len;1){
str ++=string.pack(data[i]);
}
return str; 
}

var Hiddevice;

mainForm.button3.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button3.text );
var devs = hid_device_info();
var cur_dev;

var devlist = Usbhidapi.Hidapi_enumerate(0,0);
cur_dev = raw.convert(devlist,hid_device_info());
while(cur_dev){
console.dump(cur_dev);
cur_dev = cur_dev.next;
if(cur_dev){
cur_dev = raw.convert(cur_dev,hid_device_info());
}
else {
break;
}

}


}

mainForm.button6.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button6.text );
//mainForm.msgbox( "这个功能下面的写的不对,就没测了" );


/*
var str = "\\?\hid#vid_5555&pid_5555#6&8282ff9&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
Hiddevice = Usbhidapi.Hidapi_get_feature_report(str);
if(Hiddevice){
console.log("路径方式打开成功!")
}else {
console.log("路径方式打开失败!")
}
*/


}

mainForm.button12.oncommand = function(id,event){
mainForm.msgbox( "硬件电路里面没有使用到控制端点,所以这个功能没有测试" );
//硬件电路里面没有使用到控制端点,所以这个功能没有测试
/**
var buf = raw.malloc(1000, 0);
var len = 100;
var Rxlength = Usbhidapi.Hidapi_get_feature_report(Hiddevice, buf, len);
if(Rxlength == -1){
console.log("读取失败!")
}else {
console.log("读取成功!!读取长度为:",Rxlength,'\n读取到:' /*,raw.tostring(databuf)*/);
//console.log(raw.tostring(databuf, 1, Rxlength));
if(Rxlength == 0){
return; //没数据退出
}
var str = "";
str = Aiscii(buf,Rxlength);

mainForm.Rxdata.add(str);
console.log(str);
}
**/

}

mainForm.button11.oncommand = function(id,event){
mainForm.msgbox( "硬件电路里面没有使用到控制端点,所以这个功能没有测试" );
//硬件电路里面没有使用到控制端点,所以这个功能没有测试
/*
var Txlength = Usbhidapi.Hidapi_send_feature_report(Hiddevice,'\0'+mainForm.Txdata.text,#mainForm.Txdata.text+1);
if(Txlength == -1){
console.log("发送失败!")
}else {
console.log("发送成功!!发送长度为:",Txlength)
}

*/
}

mainForm.button8.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button8.text );
var buf = raw.malloc(1000, 0);
var len,ms = 100,1000;
var Rxlength = Usbhidapi.Hidapi_read_timeout(Hiddevice, buf, len, ms);
if(Rxlength == -1){
console.log("读取失败!")
}else {
console.log("读取成功!!读取长度为:",Rxlength,'\n读取到:' /*,raw.tostring(databuf)*/);
//console.log(raw.tostring(databuf, 1, Rxlength));
if(Rxlength == 0){
return; //没数据退出
}
var str = "";
str = Aiscii(buf,Rxlength);

mainForm.Rxdata.add(str);
console.log(str);
}

}

mainForm.button17.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button17.text );
var buf = raw.malloc(1000);
//var buf= "";
var Maxlen = 255;
var ret,buf2= Usbhidapi.Hidapi_get_indexed_string(Hiddevice,3,buf,Maxlen);
if(ret == -1){
console.log("获取首字符失败!")
}else {
console.log("获取首字符成功!")
console.log("首字符为:",buf2);

}

}

mainForm.button16.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button16.text );

var buf = raw.malloc(1000);
//var buf= "";
var Maxlen = 255;
var ret,buf2= Usbhidapi.Hidapi_get_serial_number_string(Hiddevice,buf,Maxlen);
if(ret == -1){
console.log("获取序列号失败!")
}else {
console.log("获取序列号成功!")
console.log("序列号为:",buf2);

}
}

mainForm.button15.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button15.text );
var buf = raw.malloc(1000);
//var buf= "";
var Maxlen = 255;
var ret,buf2= Usbhidapi.Hidapi_get_product_string(Hiddevice,buf,Maxlen);
if(ret == -1){
console.log("获取产品码失败!")
}else {
console.log("获取产品码成功!")
console.log("产品码为:",buf2);

}

}

mainForm.button14.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button14.text );
var buf = raw.malloc(1000);
//var buf= "";
var Maxlen = 255;
var ret,buf2= Usbhidapi.Hidapi_get_manufacturer_string(Hiddevice,buf,Maxlen);
if(ret == -1){
console.log("获取用户码失败!")
}else {
console.log("获取用户码成功!")
console.log("用户码为:",buf2);

}

}

mainForm.button13.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button13.text );
Usbhidapi.Hidapi_close(Hiddevice);
console.log("已经关闭");

}

//var buf = raw.malloc(100, 0);
mainForm.button9.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button9.text );
var buf = raw.malloc(1000, 0);
var len = 100;
var Rxlength = Usbhidapi.Hidapi_read(Hiddevice, buf, len);
if(Rxlength == -1){
console.log("读取失败!")
}else {
console.log("读取成功!!读取长度为:",Rxlength,'\n读取到:' /*,raw.tostring(databuf)*/);
//console.log(raw.tostring(databuf, 1, Rxlength));
if(Rxlength == 0){
return; //没数据退出
}
var str = "";
str = Aiscii(buf,Rxlength);

mainForm.Rxdata.add(str);
console.log(str);
}

}


mainForm.button7.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button7.text );
var Txlength = Usbhidapi.Hidapi_write(Hiddevice,'\0'+mainForm.Txdata.text,#mainForm.Txdata.text+1);
if(Txlength == -1){
console.log("发送失败!")
}else {
console.log("发送成功!!发送长度为:",Txlength)
}

}


mainForm.button10.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button10.text );
var ret = Usbhidapi.Hidapi_set_nonblocking(Hiddevice, 1);
if(ret == -1){
console.log("设置非阻塞模式失败!")
}else {
console.log("设置非阻塞模式成功!")
}

}


mainForm.button5.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button5.text );
Hiddevice = Usbhidapi.Hidapi_open(21845, 21845, null);
if(Hiddevice){
console.log("Vid和Pid方式打开成功!")
}else {
console.log("Vid和Pid方式打开失败!")
}
}


mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );

var ret = Usbhidapi.Hidapi_init();
if(ret == -1){
console.log("初始化失败!")
}else {
console.log("初始化成功!")
}

}
mainForm.show() 
return win.loopMessage();

功能介绍:

枚举: 列出电脑中所有的hid协议的设备,比如鼠标,键盘.....

使用介绍:

  1. 先初始化

  2. 打开

  3. 设置非阻塞

  4. 发送

  5. 接收


admin

赞同来自:

群里有大神分享的一个排序最快的办法:

T1,T2,T3三个number, 怎么快速得出它们三个的最大数与最小数的差值???

最简单的办法:


//取跨值

getkua = function(t1,t2,t3){
   var tb = {t1;t2;t3};
   table.sort(tb);
   return tb[3]-tb[1];
}

这个办法看起来高大上,但是不知道和循环排序再去减哪个更快?


admin

赞同来自:

转载一个摄像头的调用方法:afvideocapture - 视频捕获控件( 摄像头操作 )

原文地址:http://bbs.aardio.com/forum.php?mod=viewthread&tid=2992&highlight=%C9%E3%CF%F1%CD%B7

blob.png

主要是对视频设备(摄像头)的操作,函数命名按照 Windows 消息名称命名。

用法第一步: 
在aardio中创建 win.form 窗体,从工具箱拖动自定义控件到界面上。
修改自定义控件的类名为 afvideocapture

用法第二步:
切换到代码视图,在 import win.ui 后面添加一行 代码:


import win.ui.ctrl.afvideocapture;

范例源码

import win.ui;
import win.ui.ctrl.afvideocapture;
/*DSG{{*/
var winform = ..win.form( right=614;bottom=487;parent=...;text="视频捕获控件";border="resizable" )
winform.add( 
afvideocapture={ dr=1;dl=1;bottom=440;right=608;left=8;dt=1;top=8;font=LOGFONT( name='SimSun' );z=1;db=1;transparent=1;cls="afvideocapture" };
btnScale={ dl=1;bottom=472;right=400;left=312;top=448;font=LOGFONT( name='SimSun' );z=5;db=1;text="缩放模式";cls="button" };
btnConnect={ dl=1;bottom=472;right=192;left=104;top=448;font=LOGFONT( name='SimSun' );z=3;db=1;text="连接设备";cls="button" };
btnPreview={ dl=1;bottom=472;right=496;left=408;top=448;font=LOGFONT( name='SimSun' );z=6;db=1;text="预览模式";cls="button" };
btnEnumDrivers={ dl=1;bottom=472;text="枚举设备";left=8;top=448;font=LOGFONT( name='SimSun' );z=2;db=1;right=96;cls="button" };
btnDisconnect={ dl=1;bottom=472;text="断开设备连接";left=200;top=448;font=LOGFONT( name='SimSun' );z=4;db=1;right=304;cls="button" };
btnSave={ dl=1;bottom=472;right=592;left=504;top=448;font=LOGFONT( name='SimSun' );z=7;db=1;text="保存截图";cls="button" }
)
/*}}*/

winform.btnEnumDrivers.oncommand = function(id,event){
    io.open();
    io.print("视频设备有:");
    
    for (i = 0; 9) {
        var name, ver = winform.afvideocapture.getDriverDescription(i);
        if ( ! name) break;
        
        io.print(name, ver);
    }
}

winform.btnConnect.oncommand = function(id,event){
    winform.afvideocapture.driverConnect(0);
}

winform.btnDisconnect.oncommand = function(id,event){
    winform.afvideocapture.driverDisconnect();
}

winform.btnScale.oncommand = function(id,event){
    winform.afvideocapture.setScale(true);
}

winform.btnPreview.oncommand = function(id,event){
    winform.afvideocapture.setPreviewRate(30); // 30ms 一帧
    winform.afvideocapture.setPreview(true);
}

winform.btnSave.oncommand = function(id,event){
    import process;
    var tmp = io.tmpname() + ".bmp";
    winform.afvideocapture.fileSaveDIB(tmp);
    process.execute(tmp);
}

winform.show() 
win.loopMessage();

win.ui.ctrl.afvideocapture支持库源码:

/*
Author: lujjjh
Date:   2011-9-4
*/

import win.ui.ctrl.static;

namespace win.ui.ctrl; 

class afvideocapture { 
ctor(parent,tvalue) {
tvalue.cls = "static";
this = ..win.ui.ctrl.static(parent, tvalue);
}

onCreate = function () {
this.hwndControl = capCreateCaptureWindow(, 0x10000000 | 0x40000000/*_WS_VISIBLE | _WS_CHILD*/, 0, 0, this.clientRect.right, this.clientRect.bottom, this.hwnd, 1);
this.wndproc = function (hwnd, message, wParam, lParam) {
if (message == 0x5/*_WM_SIZE*/) {
..win.setPos(this.hwndControl, 0, 0, this.clientRect.right, this.clientRect.bottom);
}
}
}

onDestroy = function () {
::DestroyWindow(this.hwndControl);
}

// Basic Capture Operations
abort = function () {
return ::SendMessageInt(this.hwndControl, 0x445/*_WM_CAP_ABORT*/, 0, 0);
}

driverConnect = function (index = 0) {
return ::SendMessageInt(this.hwndControl, 0x40A/*_WM_CAP_DRIVER_CONNECT*/, index, 0);
}

sequence = function () {
return ::SendMessageInt(this.hwndControl, 0x43E/*_WM_CAP_SEQUENCE*/, 0, 0);
}

stop = function () {
return ::SendMessageInt(this.hwndControl, 0x444/*_WM_CAP_STOP*/, 0, 0);
}

// Capture Windows
getDriverDescription = function (index) {
var re, name, ver = capGetDriverDescription(index, 128, 128, 128, 128);
if (re) {
return ..string.str(name), ..string.str(ver);
}
else {
return null, null, ..lasterr();
}
}

driverDisconnect = function () {
return ::SendMessageInt(this.hwndControl, 0x40B/*_WM_CAP_DRIVER_DISCONNECT*/, 0, 0);
}

getStatus = function () {
var status = CAPSTATUS();
::SendMessageByStruct(this.hwndControl, 0x436/*_WM_CAP_GET_STATUS*/, ..raw.sizeof(status), status);
return status;
}

// Capture Drivers
driverGetCaps = function () {
var driverCaps = CAPDRIVERCAPS();
::SendMessageByStruct(this.hwndControl, 0x40E/*_WM_CAP_DRIVER_GET_CAPS*/, ..raw.sizeof(driverCaps), driverCaps);
return driverCaps;
}

driverGetName = function () {
var re, name = ::SendMessageByString(this.hwndControl, 0x40C/*_WM_CAP_DRIVER_GET_NAME*/, 128, 128);
if (re) {
return ..string.str(name);
}
else {
return null, ..lasterr();
}
}

driverGetVersion = function () {
var re, ver = ::SendMessageByString(this.hwndControl, 0x40D/*_WM_CAP_DRIVER_GET_VERSION*/, 128, 128);
if (re) {
return ..string.str(ver);
}
else {
return null, ..lasterr();
}
}

driverGetAudioFormat = function () {
var format = WAVEFORMATEX();
::SendMessageByStruct(this.hwndControl, 0x424/*_WM_CAP_GET_AUDIOFORMAT*/, ..raw.sizeof(format), format);
return format;
}

driverGetVideoFormat = function () {
var format = BITMAPINFO();
::SendMessageByStruct(this.hwndControl, 0x42C/*_WM_CAP_GET_VIDEOFORMAT*/, ..raw.sizeof(format), format);
return format;
}

driverSetAudioFormat = function (format) {
return ::SendMessageByStruct(this.hwndControl, 0x423/*_WM_CAP_SET_AUDIOFORMAT*/, ..raw.sizeof(format), format);
}

driverSetVideoFormat = function (format) {
return ::SendMessageByStruct(this.hwndControl, 0x42D/*_WM_CAP_SET_VIDEOFORMAT*/, ..raw.sizeof(format), format);
}

// Capture Driver Preview and Overlay Modes
setOverlay = function (bOverlay) {
return ::SendMessageInt(this.hwndControl, 0x433/*_WM_CAP_SET_OVERLAY*/, bOverlay ? 1 : 0, 0);
}

setPreview = function (bPreview) {
return ::SendMessageInt(this.hwndControl, 0x432/*_WM_CAP_SET_PREVIEW*/, bPreview ? 1 : 0, 0);
}

setPreviewRate = function (rate) {
return ::SendMessageInt(this.hwndControl, 0x434/*_WM_CAP_SET_PREVIEWRATE*/, rate, 0);
}

setScale = function (bScale) {
return ::SendMessageInt(this.hwndControl, 0x435/*_WM_CAP_SET_SCALE*/, bScale ? 1 : 0, 0);
}

setScroll = function (x, y) {
var pt = ::POINT(x, y);
return ::SendMessageByStruct(this.hwndControl, 0x437/*_WM_CAP_SET_SCROLL*/, 0, pt);
}

// Capture Driver Video Dialog Boxes
dlgVideoCompression = function () {
return ::SendMessageInt(this.hwndControl, 0x42E/*_WM_CAP_DLG_VIDEOCOMPRESSION*/, 0, 0);
}

dlgVideoDisplay = function () {
return ::SendMessageInt(this.hwndControl, 0x42B/*_WM_CAP_DLG_VIDEODISPLAY*/, 0, 0);
}

dlgVideoFormat = function () {
return ::SendMessageInt(this.hwndControl, 0x429/*_WM_CAP_DLG_VIDEOFORMAT*/, 0, 0);
}

dlgVideoSource = function () {
return ::SendMessageInt(this.hwndControl, 0x42A/*_WM_CAP_DLG_VIDEOSOURCE*/, 0, 0);
}

// Video Capture Settings
getSequenceSetup = function () {
var params = CAPTUREPARMS();
::SendMessageByStruct(this.hwndControl, 0x441/*_WM_CAP_GET_SEQUENCE_SETUP*/, ..raw.sizeof(params), params);
return params;
}

setSequenceSetup = function (params) {
return ::SendMessageByStruct(this.hwndControl, 0x440/*_WM_CAP_SET_SEQUENCE_SETUP*/, ..raw.sizeof(params), params);
}

// Capture File and Buffers
fileAllocate = function (size) {
return ::SendMessageInt(this.hwndControl, 0x416/*_WM_CAP_FILE_ALLOCATE*/, 0, size);
}

fileGetCaptureFile = function () {
var re, name = ::SendMessageByString(this.hwndControl, 0x415/*_WM_CAP_FILE_GET_CAPTURE_FILE*/, 0x104/*_MAX_PATH*/, 0x104/*_MAX_PATH*/);
if (re) {
return ..string.str(name);
}
else {
return null, ..lasterr();
}
}

fileSaveAs = function (name) {
return ::SendMessage(this.hwndControl, 0x417/*_WM_CAP_FILE_SAVEAS*/, null, name);
}

fileSetCaptureFile = function (name) {
return ::SendMessage(this.hwndControl, 0x414/*_WM_CAP_FILE_SET_CAPTURE_FILE*/, null, name);
}

// Directly Using Capture Data
sequenceNoFile = function () {
return ::SendMessageInt(this.hwndControl, 0x43F/*_WM_CAP_SEQUENCE_NOFILE*/, 0, 0);
}

setMCIDevice = function (name) {
return ::SendMessage(this.hwndControl, 0x442/*_WM_CAP_SET_MCI_DEVICE*/, null, name);
}

// Manual Frame Capture
singleFrame = function () {
return ::SendMessageInt(this.hwndControl, 0x448/*_WM_CAP_SINGLE_FRAME*/, 0, 0);
}

singleFrameClose = function () {
return ::SendMessageInt(this.hwndControl, 0x447/*_WM_CAP_SINGLE_FRAME_CLOSE*/, 0, 0);
}

singleFrameOpen = function () {
return ::SendMessageInt(this.hwndControl, 0x446/*_WM_CAP_SINGLE_FRAME_OPEN*/, 0, 0);
}

// Still-Image Capture
editCopy = function () {
return ::SendMessageInt(this.hwndControl, 0x41E/*_WM_CAP_EDIT_COPY*/, 0, 0);
}

fileSaveDIB = function (name) {
return ::SendMessage(this.hwndControl, 0x419/*_WM_CAP_FILE_SAVEDIB*/, null, name);
}

grabFrame = function () {
return ::SendMessageInt(this.hwndControl, 0x43C/*_WM_CAP_GRAB_FRAME*/, 0, 0);
}

grabFrameNoStop = function () {
return ::SendMessageInt(this.hwndControl, 0x43D/*_WM_CAP_GRAB_FRAME_NOSTOP*/, 0, 0);
}

// Advanced Capture Options
// ...

// Working with Palettes
// ...

// Yielding to Other Applications
// ...

// AVICap Callback Functions
// ...

// More Information: http://msdn.microsoft.com/en-us/library/dd757696(v=vs.85).aspx
}

namespace afvideocapture {
var avicap32 = ..raw.loadDll("Avicap32.dll");
capCreateCaptureWindow = avicap32.api("capCreateCaptureWindowA", "int(string,INT,int,int,int,int,int,int)");
capGetDriverDescription = avicap32.api("capGetDriverDescriptionA", "int(word,string&,int,string&,int)");

CAPSTATUS = class {
INT uiImageWidth;
INT uiImageHeight;
int fLiveWindow;
int fOverlayWindow;
int fScale;
struct ptScroll = ::POINT();
int fUsingDefaultPalette;
int fAudioHardware;
int fCapFileExists;
INT dwCurrentVideoFrame;
INT dwCurrentVideoFramesDropped;
INT dwCurrentWaveSamples;
INT dwCurrentTimeElapsedMS;
pointer hPalCurrent;
int fCapturingNow;
INT dwReturn;
INT wNumVideoAllocated;
INT wNumAudioAllocated;
}

CAPDRIVERCAPS = class {
INT wDeviceIndex;
int fHasOverlay;
int fHasDlgVideoSource;
int fHasDlgVideoFormat;
int fHasDlgVideoDisplay;
int fCaptureInitialized;
int fDriverSuppliesPalettes;
int hVideoIn;
int hVideoOut;
int hVideoExtIn;
int hVideoExtOut;
}

WAVEFORMATEX = class {
WORD wFormatTag;
WORD nChannels;
INT nSamplesPerSec;
INT nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
}

BITMAPINFOHEADER = class {
INT biSize;
int biWidth;
int biHeight;
WORD biPlanes;
WORD biBitCount;
INT biCompression;
INT biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
INT biClrUsed;
INT biClrImportant;
}

RGBQUAD = class {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}

BITMAPINFO = class {
  struct bmiHeader = ..win.ui.ctrl.afvideocapture.BITMAPINFOHEADER();
  struct bmiColors[1] = { ..win.ui.ctrl.afvideocapture.RGBQUAD() };
}

CAPTUREPARMS = class {
INT dwRequestMicroSecPerFrame;
int fMakeUserHitOKToCapture;
INT wPercentDropForError;
int fYield;
INT dwIndexSize;
INT wChunkGranularity;
int fUsingDOSMemory;
INT wNumVideoRequested;
int fCaptureAudio;
INT wNumAudioRequested;
INT vKeyAbort;
int fAbortLeftMouse;
int fAbortRightMouse;
int fLimitEnabled;
INT wTimeLimit;
int fMCIControl;
int fStepMCIDevice;
INT dwMCIStartTime;
INT dwMCIStopTime;
int fStepCaptureAt2x;
INT wStepCaptureAverageFrames;
INT dwAudioBufferSize;
int fDisableWriteCache;
INT AVStreamMaster;
}
}

/**intellisense()
win.ui.ctrl.afcapture = 视频捕获控件
?win.ui.ctrl.afcapture = !afcapture.

!afcapture.abort() = 
!afcapture.driverConnect(__/*设备索引*/) = 连接设备
!afcapture.sequence() = 
!afcapture.stop() = 
!afcapture.getDriverDescription(__/*设备索引*/) = 
!afcapture.driverDisconnect() = 断开连接设备
!afcapture.getStatus() = 
!afcapture.driverGetCaps() = 
!afcapture.driverGetName() = 
!afcapture.driverGetVersion() = 
!afcapture.driverGetAudioFormat() = 
!afcapture.driverGetVideoFormat() = 
!afcapture.driverSetAudioFormat(__/*音频格式*/) = 
!afcapture.driverSetVideoFormat(__/*视频格式*/) = 
!afcapture.setOverlay(__/*是否开启覆盖模式*/) = 
!afcapture.setPreview(__/*是否开启预览模式*/) = 
!afcapture.setPreviewRate(__/*预览频率*/) = 
!afcapture.setScale(__/*是否自动缩放*/) = 
!afcapture.setScroll(.(x,y) = 
!afcapture.dlgVideoCompression() = 
!afcapture.dlgVideoDisplay() = 
!afcapture.dlgVideoFormat() = 
!afcapture.dlgVideoSource() = 
!afcapture.getSequenceSetup() = 
!afcapture.setSequenceSetup(__/*参数*/) = 
!afcapture.fileAllocate(__/*预分配大小*/) = 
!afcapture.fileGetCaptureFile() = 
!afcapture.fileSaveAs(__/*文件名*/) = 
!afcapture.fileSetCaptureFile(__/*文件名*/) = 
!afcapture.sequenceNoFile() = 
!afcapture.setMCIDevice(__/*设备名称*/) = 
!afcapture.singleFrame() = 
!afcapture.singleFrameClose() = 
!afcapture.singleFrameOpen() = 
!afcapture.editCopy() = 
!afcapture.fileSaveDIB(__/*文件名*/) = 
!afcapture.grabFrame() = 
!afcapture.grabFrameNoStop() = 
end intellisense**/


 /**intellisense()
_WM_CAP_START=@0x400/*_WM_CAP_START*/
_WM_CAP_UNICODE_START=@0x464/*_WM_CAP_UNICODE_START*/
_WM_CAP_GET_CAPSTREAMPTR=@0x401/*_WM_CAP_GET_CAPSTREAMPTR*/
_WM_CAP_SET_CALLBACK_ERRORW=@0x466/*_WM_CAP_SET_CALLBACK_ERRORW*/
_WM_CAP_SET_CALLBACK_STATUSW=@0x467/*_WM_CAP_SET_CALLBACK_STATUSW*/
_WM_CAP_SET_CALLBACK_ERRORA=@0x402/*_WM_CAP_SET_CALLBACK_ERRORA*/
_WM_CAP_SET_CALLBACK_STATUSA=@0x403/*_WM_CAP_SET_CALLBACK_STATUSA*/
_WM_CAP_SET_CALLBACK_ERROR=@0x402/*_WM_CAP_SET_CALLBACK_ERROR*/
_WM_CAP_SET_CALLBACK_STATUS=@0x403/*_WM_CAP_SET_CALLBACK_STATUS*/
_WM_CAP_SET_CALLBACK_YIELD=@0x404/*_WM_CAP_SET_CALLBACK_YIELD*/
_WM_CAP_SET_CALLBACK_FRAME=@0x405/*_WM_CAP_SET_CALLBACK_FRAME*/
_WM_CAP_SET_CALLBACK_VIDEOSTREAM=@0x406/*_WM_CAP_SET_CALLBACK_VIDEOSTREAM*/
_WM_CAP_SET_CALLBACK_WAVESTREAM=@0x407/*_WM_CAP_SET_CALLBACK_WAVESTREAM*/
_WM_CAP_GET_USER_DATA=@0x408/*_WM_CAP_GET_USER_DATA*/
_WM_CAP_SET_USER_DATA=@0x409/*_WM_CAP_SET_USER_DATA*/
_WM_CAP_DRIVER_CONNECT=@0x40A/*_WM_CAP_DRIVER_CONNECT*/
_WM_CAP_DRIVER_DISCONNECT=@0x40B/*_WM_CAP_DRIVER_DISCONNECT*/
_WM_CAP_DRIVER_GET_NAMEA=@0x40C/*_WM_CAP_DRIVER_GET_NAMEA*/
_WM_CAP_DRIVER_GET_VERSIONA=@0x40D/*_WM_CAP_DRIVER_GET_VERSIONA*/
_WM_CAP_DRIVER_GET_NAMEW=@0x470/*_WM_CAP_DRIVER_GET_NAMEW*/
_WM_CAP_DRIVER_GET_VERSIONW=@0x471/*_WM_CAP_DRIVER_GET_VERSIONW*/
_WM_CAP_DRIVER_GET_NAME=@0x40C/*_WM_CAP_DRIVER_GET_NAME*/
_WM_CAP_DRIVER_GET_VERSION=@0x40D/*_WM_CAP_DRIVER_GET_VERSION*/
_WM_CAP_DRIVER_GET_CAPS=@0x40E/*_WM_CAP_DRIVER_GET_CAPS*/
_WM_CAP_FILE_SET_CAPTURE_FILEA=@0x414/*_WM_CAP_FILE_SET_CAPTURE_FILEA*/
_WM_CAP_FILE_GET_CAPTURE_FILEA=@0x415/*_WM_CAP_FILE_GET_CAPTURE_FILEA*/
_WM_CAP_FILE_SAVEASA=@0x417/*_WM_CAP_FILE_SAVEASA*/
_WM_CAP_FILE_SAVEDIBA=@0x419/*_WM_CAP_FILE_SAVEDIBA*/
_WM_CAP_FILE_SET_CAPTURE_FILEW=@0x478/*_WM_CAP_FILE_SET_CAPTURE_FILEW*/
_WM_CAP_FILE_GET_CAPTURE_FILEW=@0x479/*_WM_CAP_FILE_GET_CAPTURE_FILEW*/
_WM_CAP_FILE_SAVEASW=@0x47B/*_WM_CAP_FILE_SAVEASW*/
_WM_CAP_FILE_SAVEDIBW=@0x47D/*_WM_CAP_FILE_SAVEDIBW*/
_WM_CAP_FILE_SAVEAS=@0x417/*_WM_CAP_FILE_SAVEAS*/
_WM_CAP_FILE_SAVEDIB=@0x419/*_WM_CAP_FILE_SAVEDIB*/
_WM_CAP_FILE_SET_CAPTURE_FILE=@0x414/*_WM_CAP_FILE_SET_CAPTURE_FILE*/
_WM_CAP_FILE_GET_CAPTURE_FILE=@0x415/*_WM_CAP_FILE_GET_CAPTURE_FILE*/
_WM_CAP_FILE_ALLOCATE=@0x416/*_WM_CAP_FILE_ALLOCATE*/
_WM_CAP_FILE_SET_INFOCHUNK=@0x418/*_WM_CAP_FILE_SET_INFOCHUNK*/
_WM_CAP_EDIT_COPY=@0x41E/*_WM_CAP_EDIT_COPY*/
_WM_CAP_SET_AUDIOFORMAT=@0x423/*_WM_CAP_SET_AUDIOFORMAT*/
_WM_CAP_GET_AUDIOFORMAT=@0x424/*_WM_CAP_GET_AUDIOFORMAT*/
_WM_CAP_DLG_VIDEOFORMAT=@0x429/*_WM_CAP_DLG_VIDEOFORMAT*/
_WM_CAP_DLG_VIDEOSOURCE=@0x42A/*_WM_CAP_DLG_VIDEOSOURCE*/
_WM_CAP_DLG_VIDEODISPLAY=@0x42B/*_WM_CAP_DLG_VIDEODISPLAY*/
_WM_CAP_GET_VIDEOFORMAT=@0x42C/*_WM_CAP_GET_VIDEOFORMAT*/
_WM_CAP_SET_VIDEOFORMAT=@0x42D/*_WM_CAP_SET_VIDEOFORMAT*/
_WM_CAP_DLG_VIDEOCOMPRESSION=@0x42E/*_WM_CAP_DLG_VIDEOCOMPRESSION*/
_WM_CAP_SET_PREVIEW=@0x432/*_WM_CAP_SET_PREVIEW*/
_WM_CAP_SET_OVERLAY=@0x433/*_WM_CAP_SET_OVERLAY*/
_WM_CAP_SET_PREVIEWRATE=@0x434/*_WM_CAP_SET_PREVIEWRATE*/
_WM_CAP_SET_SCALE=@0x435/*_WM_CAP_SET_SCALE*/
_WM_CAP_GET_STATUS=@0x436/*_WM_CAP_GET_STATUS*/
_WM_CAP_SET_SCROLL=@0x437/*_WM_CAP_SET_SCROLL*/
_WM_CAP_GRAB_FRAME=@0x43C/*_WM_CAP_GRAB_FRAME*/
_WM_CAP_GRAB_FRAME_NOSTOP=@0x43D/*_WM_CAP_GRAB_FRAME_NOSTOP*/
_WM_CAP_SEQUENCE=@0x43E/*_WM_CAP_SEQUENCE*/
_WM_CAP_SEQUENCE_NOFILE=@0x43F/*_WM_CAP_SEQUENCE_NOFILE*/
_WM_CAP_SET_SEQUENCE_SETUP=@0x440/*_WM_CAP_SET_SEQUENCE_SETUP*/
_WM_CAP_GET_SEQUENCE_SETUP=@0x441/*_WM_CAP_GET_SEQUENCE_SETUP*/
_WM_CAP_SET_MCI_DEVICEA=@0x442/*_WM_CAP_SET_MCI_DEVICEA*/
_WM_CAP_GET_MCI_DEVICEA=@0x443/*_WM_CAP_GET_MCI_DEVICEA*/
_WM_CAP_SET_MCI_DEVICEW=@0x4A6/*_WM_CAP_SET_MCI_DEVICEW*/
_WM_CAP_GET_MCI_DEVICEW=@0x4A7/*_WM_CAP_GET_MCI_DEVICEW*/
_WM_CAP_SET_MCI_DEVICE=@0x442/*_WM_CAP_SET_MCI_DEVICE*/
_WM_CAP_GET_MCI_DEVICE=@0x443/*_WM_CAP_GET_MCI_DEVICE*/
_WM_CAP_STOP=@0x444/*_WM_CAP_STOP*/
_WM_CAP_ABORT=@0x445/*_WM_CAP_ABORT*/
_WM_CAP_SINGLE_FRAME_OPEN=@0x446/*_WM_CAP_SINGLE_FRAME_OPEN*/
_WM_CAP_SINGLE_FRAME_CLOSE=@0x447/*_WM_CAP_SINGLE_FRAME_CLOSE*/
_WM_CAP_SINGLE_FRAME=@0x448/*_WM_CAP_SINGLE_FRAME*/
_WM_CAP_PAL_OPENA=@0x450/*_WM_CAP_PAL_OPENA*/
_WM_CAP_PAL_SAVEA=@0x451/*_WM_CAP_PAL_SAVEA*/
_WM_CAP_PAL_OPENW=@0x4B4/*_WM_CAP_PAL_OPENW*/
_WM_CAP_PAL_SAVEW=@0x4B5/*_WM_CAP_PAL_SAVEW*/
_WM_CAP_PAL_OPEN=@0x450/*_WM_CAP_PAL_OPEN*/
_WM_CAP_PAL_SAVE=@0x451/*_WM_CAP_PAL_SAVE*/
_WM_CAP_PAL_PASTE=@0x452/*_WM_CAP_PAL_PASTE*/
_WM_CAP_PAL_AUTOCREATE=@0x453/*_WM_CAP_PAL_AUTOCREATE*/
_WM_CAP_PAL_MANUALCREATE=@0x454/*_WM_CAP_PAL_MANUALCREATE*/
_WM_CAP_SET_CALLBACK_CAPCONTROL=@0x455/*_WM_CAP_SET_CALLBACK_CAPCONTROL*/
_WM_CAP_UNICODE_END=@0x4B5/*_WM_CAP_UNICODE_END*/
_WM_CAP_END=@0x4B5/*_WM_CAP_END*/
end intellisense**/

使用方法:

扩展库的名称来看:win.ui.ctrl.afvideocapture

是在win目录下的ui目录中的ctrl虚拟目录里建立一个名称为afvideocapture的用户库文件

blob.png

blob.png

blob.png

然后将哪个扩展库的代码黏贴进去即可.

admin

赞同来自:

获取电脑上自带的计算器计算框里面的值:

import win.ui;
import winex;
import console;
import process;
/*DSG{{*/
var winform = win.form(text="aardio form";right=418;bottom=335)
winform.add(
button={cls="button";text="button";left=50;top=275;right=161;bottom=312;z=1};
button2={cls="button";text="button2";left=222;top=270;right=346;bottom=308;z=2}
)
/*}}*/

//定义一个全局变量装载计算器窗口句柄
var hwndcalc;

winform.button2.oncommand = function(id,event){
//获取结果框的控件句柄
var anjian_hwnd = winex.findEx(hwndcalc,4,"Static"); 
//输出这个句柄
console.varDump(anjian_hwnd)
//获取这个控件里面的数值
var tempstr = winex.getText(anjian_hwnd);
//输出这个数值
console.varDump(tempstr)

}

winform.button.oncommand = function(id,event){
//打开计算器,并获取计算器的句柄
hwndcalc = winex.waitActive(,,,,,process("calc.exe").id)

}

winform.show() 
win.loopMessage();

下面记录下为什么这么写:

需要一个辅助软件 彗星编程助手,这个软件可以获取任意窗体和控件的句柄.

blob.png

看到右边这个static是位于第四个,所以里面偏移写的是4.

而窗口查找的控件类即为:static

blob.png

admin

赞同来自:

利用QQ邮箱截图TXGYMailCamera.dll使用截图功能:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=258;bottom=159)
mainForm.add(
button={cls="button";text="截图";left=80;top=66;right=167;bottom=104;z=1}
)
/*}}*/

var dll = ..raw.loadDll("\res\TXGYMailCamera.dll",,"cdecl");
//var dll = ..raw.loadDll("\res\TXGYMailCamera.dll","TXGYMailCamera.dll")
PrScrn = dll.api("CameraWindow","int(int a)")

mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );

PrScrn(0);
}

mainForm.show() 
return win.loopMessage();

本来想用微信的那个dll,但是发现微信那个截图保存功能不完善,保存的时候不能选择保存的格式,而且也没默认格式,还要自己手写.

blob.png

这个dll不能集成到生成的exe文件里,目前不知道原因,只能发布exe之后把这个dll一同发布.


admin

赞同来自:

实现一个好玩的功能,将一个压缩包比如rar的,和一个gif动态图片进行合并,然后合并为一个动态的gif图片,

这个图片里面就包含了这个rar的压缩包,而且也不影响这个gif图片的浏览,但是如果你将这个图片的格式改为rar或者zip,那么他就可以加压出来我们合并进去的那个rar文件,

怎么样?好玩吧?

这个可以实现什么功能呢? 封装为gif后,更方便传播了.

而且你可以录制一个gif演示这个压缩包程序的文件,然后把这个程序代码打包放到这个图片里,让别人先看演示动画,看完后,解压图片,就可以运行演示的那个代码.

 io.open()
import inet.http;
var down = inet.http();
var baiduPng = down.get("https://ss0.bdstatic.com/5aV1b ... 6quot;);
var CometAssistant4 = down.get("http://www.it608.com/down/CometAssistant4.zip";); 
string.save("d:\test.png",string.concat(baiduPng,CometAssistant4) )
io.print("生成结束");
execute("pause")

这样就在D盘生成了一个test.png这样的图片了.

利用windows自带的copy也可以实现这个功能:

1:开始→运行→键入"cmd"命令 

2:在cmd对话框中将目录定位到存放图片和软件的位置,例如:1.jpg和1.rar都存放在D:目录下,只要将目录定位到D:即可; 

3:定位到正确目录后 键入copy /b (图片名称).jpg+(压缩包名称).rar (生成后图片名称).jpg,例如:将1.rar合并到1.jpg中去,就要键入copy /b 1.jpg+1.rar 2.jpg(注意:键入以上任意名称均要写全文件名,不能省略文件的拓展名) 

4:所生成的新的图片文件就已经包含了软件,只要将图片传入相册即可共享.用时只要下载图片并将拓展名改为.rar后解压即可使用。


admin

赞同来自: lulmlc

截图指定窗口并保存jpg

import win.ui;
import console;
/*DSG{{*/
var winform = ..win.form(text="AAuto Form";right=695;bottom=399)
winform.add(
button={cls="button";text="button";left=584;top=24;right=680;bottom=88;z=1};
picturebox={cls="picturebox";left=8;top=8;right=576;bottom=392;autosize=1;z=2}
)
/*}}*/
 
winform.button.oncommand = function(id,event){
    //winform.msgbox( winform.button.text );
    var pic = com.picture.printWindow(winform.hwnd);
    var picData = gdip.bitmap(pic.Handle).save("D:\testRRR.jpg",80);
     
    winform.picturebox.image = string.load( "D:\testRRR.jpg" );
     
}
 
winform.show() 
win.loopMessage();

blob.png

Travis

赞同来自:

哇,厉害!

wide(BG7RGT)

赞同来自:

学习,再学习,大神

admin

赞同来自:

图表控件:

图表的实现需要引用webkit,利用开源的html5技术,

国内外有很多的这方面的资料:

举例:百度图表,网址echarts.baidu.com

免费使用下载

blob.png

这里我们新建一个窗体,里面添加一个custom控件,

准备把这个图表显示在这个控件里面,而且填充满控件

利用css属性:

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script src="js/echarts.common.min.js"></script>
<style type="text/css">
#main {  height:100% ; width:100%; position:absolute;}
body {  margin:0px; padding:0px; overflow:hidden;}
</style>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data:['销量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>
</html>
import win.ui;
/*DSG{{*/
var winform = win.form(text="webkit浏览器支持库";right=630;bottom=446;border="dialog frame")
winform.add(
custom={cls="custom";text="custom";left=56;top=55;right=591;bottom=384;autosize=1;center=1;edge=1;transparent=1;z=1}
)
/*}}*/

//导入webkit支持库
import web.kit.form;
import web.kit.jsFunction;
//import web.kit.fileSystem; //支持嵌入资源文件

//创建webkit浏览器窗口
var webkit = web.kit.form(winform.custom);
webkit.go("\html\main.html"); 

//可以使用CSS选择器获取HTML节点对象
//webkit.querySelector("#header .title-bar .title").innerText = "我 的 软 件";

//添加可拖动边框
import win.ui.resizeBorder;
win.ui.resizeBorder(winform);

//添加阴影
import win.ui.shadow;
win.ui.shadow(winform);

//限定最大化范围
import win.ui.minmax;
win.ui.minmax(winform);

winform.show();
win.loopMessage();


admin

赞同来自:

要实现图表能够拖动:

    <div id="main"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data:['销量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
dataZoom: [
{   // 这个dataZoom组件,默认控制x轴。
            type: 'slider', // 这个 dataZoom 组件是 slider 型 dataZoom 组件
            start: 10,      // 左边在 10% 的位置。
            end: 60         // 右边在 60% 的位置。
},
        {   // 这个dataZoom组件,也控制x轴。
            type: 'inside', // 这个 dataZoom 组件是 inside 型 dataZoom 组件
            start: 10,      // 左边在 10% 的位置。
            end: 60         // 右边在 60% 的位置。
        }
    ],
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>

新增的

dataZoom

即可实现.其他的操作看官方文档了

gonghuwei

赞同来自:

太长了,下次看。

PUMA

赞同来自:

mark先,慢慢看

admin

赞同来自:

实现透明窗体但是窗体内图片和js显示:

blob.png

blob.png


我测试上面的代码之后的显示效果如下:

blob.png

这里还有要给问题:

当我运行的时候,先出现的是一个常规界面,之后立马转成了上面的图片形式,

没有深入研究,先放着.

admin

赞同来自:

回复: 实现透明窗体但是窗体内图片和js显示:

找到问题了,只要将默认的界面设置位无边框就可以了...

blob.png

admin

赞同来自:

取字符串中的某个字符操作:

blob.png

示例:

blob.png

第一次取的是字符3对应的字节码即ascii对应的

blob.png

而双中括号去到的是对应的字符.

admin

赞同来自:

获取电脑CPU信息的截图,代码楼上已经有了

blob.png

admin

赞同来自:

转)定时任务的一个例子:

import win.ui;
import win.ui.atom;
import web.form.util;
import time.ole;
/*DSG{{*/
var winform = win.form(text="aardio form";right=1071;bottom=680;max=false;mode="popup")
winform.add(
button={cls="button";text="启动计划";left=920;top=8;right=984;bottom=38;z=7};
button2={cls="button";text="立刻执行";left=1000;top=8;right=1064;bottom=38;z=17};
edit={cls="edit";left=56;top=16;right=184;bottom=40;autohscroll=false;autovscroll=false;edge=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);tabstop=1;z=1};
edit2={cls="edit";left=224;top=16;right=344;bottom=40;autohscroll=false;autovscroll=false;edge=1;font=LOGFONT(name='YaHei Consolas Hybrid');password=1;tabstop=1;z=2};
listbox={cls="combobox";left=424;top=16;right=464;bottom=40;edge=1;items={};mode="dropdownlist";tabstop=1;z=10};
listbox2={cls="combobox";left=480;top=16;right=520;bottom=40;edge=1;items={};mode="dropdownlist";tabstop=1;z=11};
listbox3={cls="combobox";left=776;top=16;right=816;bottom=40;edge=1;items={};mode="dropdownlist";tabstop=1;z=12};
listbox4={cls="combobox";left=832;top=16;right=872;bottom=40;edge=1;items={};mode="dropdownlist";tabstop=1;z=13};
static10={cls="static";text="static";left=552;top=16;right=719;bottom=40;center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=16};
static2={cls="static";text="签到:";left=376;top=16;right=424;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=3};
static3={cls="static";text="分";left=520;top=16;right=536;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=4};
static4={cls="static";text="签退:";left=728;top=16;right=776;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=5};
static5={cls="static";text="分";left=872;top=16;right=888;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=6};
static6={cls="static";text="时";left=464;top=16;right=480;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=8};
static7={cls="static";text="时";left=816;top=16;right=832;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=9};
static8={cls="static";text="账号";left=16;top=16;right=56;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=14};
static9={cls="static";text="密码";left=184;top=16;right=224;bottom=40;align="center";center=1;font=LOGFONT(name='YaHei Consolas Hybrid';h=-14);transparent=1;z=15}
)
/*}}*/

var atom,hwnd/*冲突窗口的句柄,该函数会自动激活此窗口*/ = winform.atom("C8BF2042-4FDC-4CAD-AFC5-17E24DFC41F5");
if(!atom){  
    win.quitMessage();  return;/*为窗口设置原子值可以避免一个程序重复运行多个实例*/
}
winform.addtimer( 
        1000,
    function(){
        var today = time.now();
        winform.static10.text = time.ole(today,"%Y/%m/%d %H:%M:%S");
    }
)
//匿名函数,设置窗体
(function() begin
//设置主窗体大小
    winform.left = 0;
    winform.right = 1024;
    winform.top = 0;
    winform.bottom = 768;
//主窗体居中
    winform.center();
//防止拖动改变窗口大小时闪烁
    winform.modifyStyle(, 0x2000000/*_WS_CLIPCHILDREN*/ );
end)();
winform.listbox.items = {"17";"16";"15";"14";"13";"12";"11";"10";"09";"08";"07";"06"}
winform.listbox2.items = {"55";"50";"45";"40";"35";"30";"25";"20";"15";"10";"05"}
winform.listbox3.items = {"23";"22";"21";"20";"19";"18";"17";"16";"15";"14";"13";"12";"11";"10";"09"}
winform.listbox4.items = {"55";"50";"45";"40";"35";"30";"25";"20";"15";"10";"05"}
     
winform.edit.text="name";
winform.edit2.text="password";
winform.listbox.selIndex = 11;
winform.listbox2.selIndex = 3;
winform.listbox3.selIndex = 6;
winform.listbox4.selIndex = 4;
 
checkin = function(){
     winform.add(
        static={cls="static";left=8;top=56;right=1064;bottom=675;bgcolor=16777193;db=1;dl=1;dr=1;dt=1;z=2};
      );
         
    (function() begin
        web.form.util.crossDomain();
        web.form.util.emulation(11001);
        web.form.util.enableTab();
        web.form.util.featureControl("FEATURE_MAXCONNECTIONSPER1_0SERVER",32,false);
        web.form.util.featureControl("FEATURE_MAXCONNECTIONSPERSERVER",32,false);
        web.form.util.featureControl("FEATURE_RESTRICT_ACTIVEXINSTALL",1,false);
        web.form.util.featureControl("FEATURE_SCRIPTURL_MITIGATION",1,false);
        web.form.util.featureControl("FEATURE_SECURITYBAND",1,false);
        web.form.util.featureControl("FEATURE_XSSFILTER",1);
        wb = web.form(winform.static
            ,0x4/*_UIFLAG_NO3DBORDER*/  | 0x8/*_UIFLAG_SCROLL_NO*/  //禁用边框,禁用滚动条
            ,0x10/*_DLCTL_DLIMAGES*/ | 0x40000000/*_DLCTL_SILENT*/  //允许下载图片,但是禁用组件对话框、脚本错误对话框等
        );
        wb.noScriptErr = true;
        wb.zoomFactor = 1.0;
        wb.mediaVolume = 0;
    end)();
         
    wb.NewWindow2=function( ppDisp, Cancel) {
        //禁止打开新窗口
        return owner.openproxy;
    }
     
    /*
    wb.go("http://11.11.146.18:8080/OA/login.jsp";);
    wb.wait();  
    wb.queryEles( innerHTML="协同办公系统";tagName="SPAN";className="" );
    ele.click();
    wb.wait();
     
    try{
        var ele = wb.queryEles( className="usernameshuruk" );
        ele.value = winform.edit.text;
        var ele = wb.queryEles( className="passwordshuruk" );
        ele.value = winform.edit2.text;
        var ele = wb.queryEles( className="zhanghm_btn" );
        ele.click();
        return 0;
    }
    wb.wait();
    */
     
    wb.post("http://11.11.146.18:8080/OA/login.do","password="+winform.edit2.text+"&username="+winform.edit.text);
    wb.wait();
    var ele = wb.queryEles(tagName="BODY";className="")
    var json = ele.innerHTML;
    import web.json
    var tab = web.json.parse(json) //var tab =  string.match(json,"success\:(.*),")
    if(!tab.success){
        ..win.msgbox(tab.msg+"!!!","重要提醒")
        return 0; 
    }   
    wb.go("http://11.11.146.18:8080/OA/";);
    wb.wait()   
    var ele1 = wb.queryEles( innerHTML="上下班签到";tagName="SPAN";className="" );
    ele1.click();
    wb.wait("");
    var ele2 = wb.queryEles( innerHTML="";src="@/clock.jpg";tagName="IMG";className="" );//签到图标
    ele2.click();
    wb.wait();
    var ele3 = wb.getEle("ext-gen298") //确认按钮
    ele3.click();
    wb.wait();
    //var ele = wb.queryEles( innerHTML="@<h3>操作信息</h3>成功签到!";tagName="DIV";className="x-box-mc" );
    for(i=1;300;1){
        ..win.delay(10)
    }   
    winform.static.close();
}
 
import win.taskScheduler;
var 签到  = win.taskScheduler()
var 签退  = win.taskScheduler()
 
var task = 签到.create("签到任务",checkin)
task.time = { //指定时间运行任务 04月10日10时48分00秒
    //second =  00;
    //minute = 55;
    //hour = 08;
    //day = 10;
    //month = 04;
}
 
var taskT = 签退.create("签退任务",postjob)
taskT.time = { //指定时间运行任务 04月10日10时48分00秒
    //second =  00;
    //minute = 35;
    //hour = 17;
    //day = 10;
    //month = 04;
}
 
winform.button.oncommand = function(id,event){
    if(winform.button.text == "启动计划"){
        if(winform.edit.text == null || winform.edit2.text == null || winform.edit.text == "" || winform.edit2.text == ""){
            ..win.msgbox("账号或者密码没有填写!!!","重要提醒")
            return 0; 
        };
        winform.button.text = "停止计划"
        winform.edit.disabled = true;
        winform.edit2.disabled = true;
        winform.listbox.disabled = true;
        winform.listbox2.disabled = true;
        winform.listbox3.disabled = true;
        winform.listbox4.disabled = true;
        task.time.hour = tonumber(winform.listbox.text);
        task.time.minute = tonumber(winform.listbox2.text);
        taskT.time.hour = tonumber(winform.listbox3.text);
        taskT.time.minute = tonumber(winform.listbox4.text);
        //运行计划任务
        签到.start();
        签退.start(); 
    }else {
        winform.button.text = "启动计划"
        //停止计划任务
        签到.stop();
        签退.stop();
        winform.edit.disabled = false;
        winform.edit2.disabled = false;
        winform.listbox.disabled = false;
        winform.listbox2.disabled = false;
        winform.listbox3.disabled = false;
        winform.listbox4.disabled = false;
    }
}
 
winform.button2.oncommand = function(id,event){
    checkin()
}
 
winform.show() ;
win.loopMessage();


admin

赞同来自:

可控数字格式化方法:

blob.png

读取输入框中的数字,将它放置到格式化函数中

mainForm.sensordata.text = 	string.format("%." ++ tonumber(mainForm.showlimit.text) ++ "f", math.round(power,tonumber(mainForm.showlimit.text)) );

注意上面用的++ 连接符,这样写! 字符串的连接用++

admin

赞同来自:

查询硬件信息的方法:

在上面我们曾经用到了串口通信,我们利用读取注册表来获取到了系统中所有的硬件串口的端口号,但是,有些时候我们电脑中的硬件串口不止一个,这样的话,我们每次打算使用串口,必须先要去到设备管理器里面看看我们准备使用的硬件串口到底是哪个,才能在软件里面选择相应的com口,这样做就显得繁琐了,我们能不能在软件里面加入一个硬件串口的友好名称指示,这样就不必每次去到设备管理器里面查看了.,

如下图所示:

我电脑中有两个串口

blob.png

而先前我们的软件中选择只能看到这些:

blob.png

我们只看到端口确实有两个,分别是com1和com2,但是我们不知道应该用的是哪个

但是我们去到设备管理器里面看到,他们两个显示的名称分别是:

blob.png

如果软件中用这个名称进行指示,那么就不会搞错端口了.

为了实现这个功能,我们需要用到以下功能:

首先新建了个控制台,写入下面的代码:

//查询硬件信息

import console;
import win.guid;
import win.reg;


//串口号
var reg = win.regReader("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\");
if(reg)
{
for(name,value,t in reg.eachValue()) 
{
console.log(name +"   "+ value);
}

}


Setupapi := raw.loadDll("Setupapi.dll")
SetupDiGetDeviceRegistryProperty = Setupapi.api("SetupDiGetDeviceRegistryProperty"
    ,"bool(addr deviceInfoSet,struct deviceInfoData,INT property,INT &dataType,ustring &propertyBuffer,INT propertyBufferSize,INT &requiredSize)" )

class SP_DEVINFO_DATA {
  INT cbSize;
  struct classGuid = ..win.guid();
  INT devInst;
  ADDR reserved;
}

var guidMedia = win.guid.fromString("{4d36e978-e325-11ce-bfc1-08002be10318}");
var  hScsi  =  Setupapi.SetupDiGetClassDevs( guidMedia,  null,  null,   2/*_DIGCF_PRESENT*/);  // _DIGCF_PRESENT:只返回当前存在的设备

var adapterData = SP_DEVINFO_DATA()
adapterData.cbSize  =  raw.sizeof(adapterData);  

var idx = 0;
while(Setupapi.SetupDiEnumDeviceInfo(hScsi,idx,adapterData)){

    var ret,dataType,propertyBuffer,requiredSize = SetupDiGetDeviceRegistryProperty(hScsi,adapterData,12 /*_SPDRP_FRIENDLYNAME */,0,0,0,0);
    ret,dataType,propertyBuffer,requiredSize = SetupDiGetDeviceRegistryProperty(hScsi,adapterData,12/*_SPDRP_FRIENDLYNAME */,0,requiredSize,requiredSize,0)
    console.log( propertyBuffer )
    idx ++;
}

Setupapi.SetupDiDestroyDeviceInfoList(hScsi)

console.pause()

这个代码运行后的结果是:

blob.png

这样就得到了我们想要的友好名称

下面说下为什么是上面的写法:

第一,这个代码是我根据aardio的例子改编来的

blob.png

这个示例是列出电脑中的主板等硬件信息,如果我们只是想列出其他设备管理器里面的特定分类的东西,那么我们需要先知道这个分类里面的GUID码

举例: 我们这里需要列出设备管理器中的端口(com和LPT)分类

我们在这个分类里面的任意一个设备上面点击右键->属性->详细信息->设备类(GUID)

blob.png

然后在这个代码上面点击右键,选择复制.

把这个代码复制到上面的程序中,例如:

var guidMedia = win.guid.fromString("{4d36e978-e325-11ce-bfc1-08002be10318}");

这样就能定性这个分类了.

然后你肯定也会疑惑下面的代码中的数字是从哪里来的????

var  hScsi  =  Setupapi.SetupDiGetClassDevs( guidMedia,  null,  null,   2/*_DIGCF_PRESENT*/);

SetupDiGetDeviceRegistryProperty(hScsi,adapterData,12 /*_SPDRP_FRIENDLYNAME */,0,0,0,0);

他们里面的

2/*_DIGCF_PRESENT*/
12 /*_SPDRP_FRIENDLYNAME */

从哪里得知的啊??


解答这个问题,你就要取微软的官方看文档了,这里我百度搜到的注释先列出来.

public enum DIGCF
{
DIGCF_DEFAULT = 0x1,
DIGCF_PRESENT = 0x2,
DIGCF_ALLCLASSES = 0x4,
DIGCF_PROFILE = 0x8,
DIGCF_DEVICEINTERFACE = 0x10
}

public enum SPDRP
{
SPDRP_DEVICEDESC = 0,
SPDRP_HARDWAREID = 0x1,
SPDRP_COMPATIBLEIDS = 0x2,
SPDRP_UNUSED0 = 0x3,
SPDRP_SERVICE = 0x4,
SPDRP_UNUSED1 = 0x5,
SPDRP_UNUSED2 = 0x6,
SPDRP_CLASS = 0x7,
SPDRP_CLASSGUID = 0x8,
SPDRP_DRIVER = 0x9,
SPDRP_CONFIGFLAGS = 0xA,
SPDRP_MFG = 0xB,
SPDRP_FRIENDLYNAME = 0xC,
SPDRP_LOCATION_INFORMATION = 0xD,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0xE,
SPDRP_CAPABILITIES = 0xF,
SPDRP_UI_NUMBER = 0x10,
SPDRP_UPPERFILTERS = 0x11,
SPDRP_LOWERFILTERS = 0x12,
SPDRP_BUSTYPEGUID = 0x13,
SPDRP_LEGACYBUSTYPE = 0x14,
SPDRP_BUSNUMBER = 0x15,
SPDRP_ENUMERATOR_NAME = 0x16,
SPDRP_SECURITY = 0x17,
SPDRP_SECURITY_SDS = 0x18,
SPDRP_DEVTYPE = 0x19,
SPDRP_EXCLUSIVE = 0x1A,
SPDRP_CHARACTERISTICS = 0x1B,
SPDRP_ADDRESS = 0x1C,
SPDRP_UI_NUMBER_DESC_FORMAT = 0x1E,
SPDRP_MAXIMUM_PROPERTY = 0x1F
}

public enum DICS
{
DICS_ENABLE = 0x1,
DICS_DISABLE = 0x2,
DICS_PROPCHANGE = 0x3,
DICS_START = 0x4,
DICS_STOP = 0x5,
DICS_FLAG_GLOBAL = DICS_ENABLE,
DICS_FLAG_CONFIGSPECIFIC = DICS_DISABLE,
DICS_FLAG_CONFIGGENERAL = DICS_START
}

public enum DIF
{
DIF_SELECTDEVICE = 0x1,
DIF_INSTALLDEVICE = 0x2,
DIF_ASSIGNRESOURCES = 0x3,
DIF_PROPERTIES = 0x4,
DIF_REMOVE = 0x5,
DIF_FIRSTTIMESETUP = 0x6,
DIF_FOUNDDEVICE = 0x7,
DIF_SELECTCLASSDRIVERS = 0x8,
DIF_VALIDATECLASSDRIVERS = 0x9,
DIF_INSTALLCLASSDRIVERS = 0xA,
DIF_CALCDISKSPACE = 0xB,
DIF_DESTROYPRIVATEDATA = 0xC,
DIF_VALIDATEDRIVER = 0xD,
DIF_MOVEDEVICE = 0xE,
DIF_DETECT = 0xF,
DIF_INSTALLWIZARD = 0x10,
DIF_DESTROYWIZARDDATA = 0x11,
DIF_PROPERTYCHANGE = 0x12,
DIF_ENABLECLASS = 0x13,
DIF_DETECTVERIFY = 0x14,
DIF_INSTALLDEVICEFILES = 0x15,
DIF_UNREMOVE = 0x16,
DIF_SELECTBESTCOMPATDRV = 0x17,
DIF_ALLOW_INSTALL = 0x18,
DIF_REGISTERDEVICE = 0x19,
DIF_NEWDEVICEWIZARD_PRESELECT = 0x1A,
DIF_NEWDEVICEWIZARD_SELECT = 0x1B,
DIF_NEWDEVICEWIZARD_PREANALYZE = 0x1C,
DIF_NEWDEVICEWIZARD_POSTANALYZE = 0x1D,
DIF_NEWDEVICEWIZARD_FINISHINSTALL = 0x1E,
DIF_UNUSED1 = 0x1F,
DIF_INSTALLINTERFACES = 0x20,
DIF_DETECTCANCEL = 0x21,
DIF_REGISTER_COINSTALLERS = 0x22,
DIF_ADDPROPERTYPAGE_ADVANCED = 0x23,
DIF_ADDPROPERTYPAGE_BASIC = 0x24,
DIF_RESERVED1 = 0x25,
DIF_TROUBLESHOOTER = 0x26,
DIF_POWERMESSAGEWAKE = 0x27
}

我也是为了自己以后使用查询方便.

再说说我是怎么知道是那两个变量的.

我们再上面我提到的详细信息界面里面看到里面又很多各种各样的信息,这些信息都是可以读取的.至于上面的名称分别读取的哪个,我也不是很清楚,可以到微软取核对,我没用到的就没去核对了.

我上面用的变量名,是这样发现的,我在百度上面搜: 获取串口名称,然后发现了个网址,里面有用vc写的获取设备的友好名称的办法.我看到

blob.png

然后我又去百度搜

blob.png

发现这个正是我要的友好名称的变量名.

blob.png

于是我又去搜这个变量对应的数值.然后就得到了上面的程序.



admin

赞同来自:

自制数字键盘:

某些时候我们需要点击输入框然后弹出一个特定样式键盘.

现在我遇到的问题是:需要在win平板上面运行程序,程序里有几个输入框,里面限定了必须是数字.也就是说,必须弹出纯数字键盘,而且键盘要足够大,因为用到的是触摸,不能利用鼠标和键盘.

我画了一个数字键盘

blob.png

这里面的功能一目了然,精简之后的代码如下:

//数字键盘
import win.ui;
/*DSG{{*/
var winform = win.form(text="数字键盘";right=464;bottom=175;border="none";max=false)
winform.add(
button={cls="button";text='\u2190';left=356;top=6;right=461;bottom=53;font=LOGFONT(h=-32);z=11};
button0={cls="button";text="0";left=356;top=64;right=461;bottom=111;font=LOGFONT(h=-29);z=10};
button1={cls="button";text="1";left=6;top=9;right=111;bottom=56;font=LOGFONT(h=-29);z=1};
button10={cls="button";text="清零";left=355;top=121;right=460;bottom=169;font=LOGFONT(h=-19);z=12};
button2={cls="button";text="2";left=123;top=9;right=228;bottom=56;font=LOGFONT(h=-29);z=3};
button3={cls="button";text="3";left=238;top=9;right=343;bottom=56;font=LOGFONT(h=-29);z=6};
button4={cls="button";text="4";left=6;top=68;right=111;bottom=115;font=LOGFONT(h=-29);z=2};
button5={cls="button";text="5";left=123;top=64;right=228;bottom=111;font=LOGFONT(h=-29);z=5};
button6={cls="button";text="6";left=238;top=64;right=343;bottom=111;font=LOGFONT(h=-29);z=9};
button7={cls="button";text="7";left=6;top=124;right=111;bottom=171;font=LOGFONT(h=-29);z=4};
button8={cls="button";text="8";left=123;top=123;right=228;bottom=170;font=LOGFONT(h=-29);z=8};
button9={cls="button";text="9";left=238;top=122;right=343;bottom=169;font=LOGFONT(h=-29);z=7}
)
/*}}*/

//遍历所有类名为"button"的控件(实际上是为了指定所有数字键的事件)
for(name,ctrl in winform.eachControl("button") ){
    ctrl.oncommand = function(id,event){
  //向主窗口发送按键功能码
  win.sendCopyData(mainForm.hwnd,ctrl.text);
 
    }
}

//扁平化处理
import win.ui.shadow;
win.ui.shadow(winform,70,7);

winform.show() 
win.loopMessage();
return winform;

键盘只负责发送所对应的数字到主程序窗口,而获取到这个指令之后,由主窗口自己分辨处理.

主窗口处理的思路:

当用户点击任意一个输入框,则将输入框选中标志置为相对应的数字,当用户点击了数字键盘里面的数字,主窗口接收到发送回来的数据,通过这个选中标志进行分别处理.

当然,如果用户点击数字键盘之外的任意地方,数字键盘就自动销毁.

主程序示例如下:

blob.png

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=402;bottom=271;border="none")
mainForm.add(
button={cls="button";text="button";left=323;top=233;right=376;bottom=261;z=2};
edit={cls="edit";text="1000";left=53;top=34;right=300;bottom=66;edge=1;num=1;z=1};
edit2={cls="edit";text="edit2";left=64;top=130;right=250;bottom=176;edge=1;multiline=1;z=3}
)
/*}}*/

var frmChild,wb = mainForm.loadForm("\res\calc.aardio",mainForm);
frmChild.show(false);

var Selectedit = 0;


function showkey(谁的){
/*var语句声明的变量作用域限于函数内部*/
  var x,y,cx,cy = 谁的.getPos();
  //在输入框下部显示键盘
  frmChild.setPos(x,y+cy);
frmChild.show();
//置顶小数字键盘
win.setTopmost(frmChild.hwnd)
}


mainForm.onCopyData = function(data){


select(Selectedit) {
case 1 {

select(data) {
case '0','1','2','3','4','5','6','7','8','9' {
if(tonumber(mainForm.edit.text,10) = 0){
mainForm.edit.text = data;
}
else {
mainForm.edit.appendText(data);
}

}

case '清零' {

mainForm.edit.text = 0;

}

else {

if(#mainForm.edit.text == 1){
mainForm.edit.text = 0;
}
else {
var str = string.sub(mainForm.edit.text,1,#mainForm.edit.text - 1);
mainForm.edit.text = str;
}

}
}



}
case 2 {

select(data) {
case '0','1','2','3','4','5','6','7','8','9' {
if(tonumber(mainForm.edit2.text,10) = 0){
mainForm.edit2.text = data;
}
else {
mainForm.edit2.appendText(data);
}

}

case '清零' {

mainForm.edit2.text = 0;

}

else {

if(#mainForm.edit2.text == 1){
mainForm.edit2.text = 0;
}
else {
var str = string.sub(mainForm.edit2.text,1,#mainForm.edit2.text - 1);
mainForm.edit2.text = str;
}

}
}


}
}

}


mainForm.wndproc = function(hwnd,message,wParam,lParam){
select( message ) { 
case 0x205/*_WM_RBUTTONUP*/,0x201/*_WM_LBUTTONDOWN*/{
//鼠标右键弹起,下面获取坐标
//var x,y = win.getMessagePos(lParam);
frmChild.show(false);
}
else{

}
}
//无返回值则继续调用默认回调函数
}


mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );
frmChild.close();
mainForm.close();

}

mainForm.edit.oncommand = function(id,event){
//mainForm.msgbox( mainForm.edit.text );

 if(  event == 0x100/*_EN_SETFOCUS*/ ){
 Selectedit = 1;
 showkey(owner);
 }
}


mainForm.edit2.oncommand = function(id,event){
//mainForm.msgbox( mainForm.edit2.text );
 if(  event == 0x100/*_EN_SETFOCUS*/ ){
 Selectedit = 2;
 showkey(owner);
 }
}

mainForm.fullscreen(true);
mainForm.show() 
return win.loopMessage();

上面点击输入框,用的是 输入框获得焦点 事件.

blob.png

admin

赞同来自:

接着小键盘更新:

增加一个判断键盘是否超出屏幕范围,当超出屏幕范围不能显示完全的话,则将键盘显示在输入框的上部.

function showkey(谁的){
/*var语句声明的变量作用域限于函数内部*/
  var x,y,cx,cy = 谁的.getPos();

  //主窗口大小
  var mainx,mainy,maincx,maincy = mainForm.getPos();
  //小键盘大小
var calcx,calcy,calccx,calccy = frmChild.getPos();
//判断有没有在屏幕外
if( (maincy - calccy) >= (y+cy) ){
//下部分没有超出屏幕
frmChild.setPos(x,y+cy);
}else {
//下部分超出屏幕,则显示在输入框上部
frmChild.setPos(x,y-calccy);
}

frmChild.show();
win.setTopmost(frmChild.hwnd)
}

blob.png

至此,自制数字键盘结束.

admin

赞同来自:

配置文件ini的使用:

import fsys.ini;
//打开文件,支持内嵌资源文件
//如果文件不存在则自动创建新文件
ini=fsys.ini("\res\配置文件.ini")
var Commhao = ini.read("端口设置","端口号")

上面是读出,下面是写入:

ini.write("端口设置","端口号",mainForm.combobox2.text);

再写一个用到的下拉列表框使用

if(reg)
{
for(name,value,t in reg.eachValue()) 
{
mainForm.combobox2.add(value);
}

if(mainForm.combobox2.count)
if(Commhao){
var ind = mainForm.combobox2.find(Commhao);
if(ind == 0){
mainForm.combobox2.selIndex = 1;
}else {
mainForm.combobox2.selIndex = ind;
port = ind;
}

}else {
mainForm.combobox2.selIndex = 1;
}


}

下面是关于一个输入框的调用:

如果输入框里面的东西发生变化,那么就获取这个消息进行处理,这里是进行比较,如果里面的值大于一个阀值则相对的动作触发.

mainForm.axis3_step.oncommand = function(id,event){
//mainForm.msgbox( mainForm.axis3_step.text );

 if(  event == 0x100/*_EN_SETFOCUS*/ ){
 Selectedit = 3;
 showkey(owner);
 }elseif(event == 0x300/*_EN_CHANGE*/){
  if(tonumber(mainForm.axis3_step.text) > 65535){
   mainForm.axis3_step.text = 65535;
   mainForm.axis3_step.bgcolor = 255;
  }else {
   mainForm.axis3_step.bgcolor = 15793151;
  }
  
 }


admin

赞同来自:

数字键盘更新:

修改键盘主窗口显示位置函数

自动判断应该显示的位置,不再局限在全屏模式,窗口模式同样可以进行键盘位置显示判定

function showkey(谁的){
                //主窗口再屏幕中的位置xy和主窗口的长宽
var x,y,cx,cy = win.getPos(mainForm.hwnd,true);
  //输入框在屏幕中的位置xy和自身的长宽
  var mainx,mainy,maincx,maincy =  win.getPos(谁的.hwnd,true);
  //小键盘大小长宽
var calcx,calcy,calccx,calccy = frmChild.getPos();
//判断有没有在屏幕外
//主窗口位置y+高度cy 小于 输入框位置mainy+输入框高度maincy+键盘                //高度calccy
if((cy+y) < (mainy+maincy+calccy) ){
frmChild.setPos(mainx,mainy-calccy);
}else {
frmChild.setPos(mainx,mainy+maincy);
}

frmChild.show();
win.setTopmost(frmChild.hwnd)
}

blob.png

admin

赞同来自:

软件运行时可拖动按钮调整位置:

blob.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="拖动控件";right=599;bottom=399;parent=...)
winform.add(
button={cls="button";text="可拖动";left=221;top=228;right=312;bottom=275;z=1}
)
/*}}*/

import mouse;

var moveFlag,bx,by;

winform.button.wndproc = function(hwnd,message,wParam,lParam){
select( message ) { 
case 0x201/*_WM_LBUTTONDOWN*/{
//置移动标志,以后可以用于选框开启移动功能
moveFlag = true;
//获取鼠标当前位置
var x,y = mouse.getPos();
//格式化鼠标位置为相对于被点击的按钮的位置坐标
bx,by = win.toClient(winform.button.hwnd,x,y);
}
case 0x202/*_WM_LBUTTONUP*/ {
//移动结束
moveFlag = false;
}
case 0x200/*_WM_MOUSEMOVE*/{
var x,y = mouse.getPos();
//格式化鼠标当前位置为相对于软件窗口位置坐标
var fx,fy = win.toClient(winform.hwnd,x,y)
if(moveFlag){
//设置按钮位置为相对于软件窗口的位置
winform.button.setPos(fx-bx,fy-by);
}
}
}
}

winform.show() 
win.loopMessage();

这里应该注意setpos是相对于软件窗口而不是整个屏幕

admin

赞同来自:

拖动控件的改造:

import win.ui;
/*DSG{{*/
var winform = win.form(text="拖动控件";right=599;bottom=399;parent=...)
winform.add(
button={cls="button";text="可拖动";left=367;top=64;right=458;bottom=99;ah=1;aw=1;z=1};
edit={cls="edit";text="edit";left=124;top=65;right=351;bottom=100;ah=1;aw=1;edge=1;z=2}
)
/*}}*/

import mouse;
 
var moveFlag,bx,by;
 
 Movefun=function(moveonwer,message){
      select( message ) { 
        case 0x201/*_WM_LBUTTONDOWN*/{
        //置移动标志,以后可以用于选框开启移动功能
            moveFlag = true;
            //获取鼠标当前位置
            var x,y = mouse.getPos();
            //格式化鼠标位置为相对于被点击的按钮的位置坐标
            bx,by = win.toClient(moveonwer.hwnd,x,y);
        }
        case 0x202/*_WM_LBUTTONUP*/ {
        //移动结束
            moveFlag = false;
        }
        case 0x200/*_WM_MOUSEMOVE*/{
            var x,y = mouse.getPos();
            //格式化鼠标当前位置为相对于软件窗口位置坐标
            var fx,fy = win.toClient(winform.hwnd,x,y)
            if(moveFlag){
            //设置按钮位置为相对于软件窗口的位置
                moveonwer.setPos(fx-bx,fy-by);
            }
        }
    }
 
 }
 
winform.edit.wndproc = function(hwnd,message,wParam,lParam){
Movefun(owner,message);
}
 

winform.button.wndproc = function(hwnd,message,wParam,lParam){
   Movefun(owner,message);
}
 
winform.enableDpiScaling()
winform.show() 
win.loopMessage();


admin

赞同来自:

实现软件中控件拖动后位置保存功能:

实现拖动控件之后,保存控件的位置信息,然后当再次打开软件的时候,调用位置信息文件,恢复到之前拖动之后的界面.

import win.ui;
/*DSG{{*/
var winform = win.form(text="拖动控件";right=806;bottom=401;parent=...)
winform.add(
button={cls="button";text="可拖动";left=367;top=64;right=458;bottom=99;ah=1;aw=1;z=2};
button2={cls="button";text="按键";left=653;top=72;right=773;bottom=103;z=4};
button3={cls="button";text="buttonddd";left=172;top=153;right=292;bottom=184;z=5};
button4={cls="button";text="button4";left=349;top=143;right=469;bottom=174;z=6};
button5={cls="button";text="button5";left=223;top=285;right=343;bottom=316;z=7};
edit={cls="edit";text="edit";left=124;top=65;right=351;bottom=100;ah=1;aw=1;edge=1;z=3};
groupbox2={cls="groupbox";text="groupbox2";left=636;top=3;right=798;bottom=390;border=1;edge=1;z=1}
)
/*}}*/
import console
import fsys.ini;
//打开文件,支持内嵌资源文件
//如果文件不存在则自动创建新文件
ini=fsys.ini("\res\配置文件.ini")

for section in ini.eachSection() { 
//获取节点,section.name()是获取到节点的名称
winform[section.name()].setPos(ini.read(section.name(),"位置X"),ini.read(section.name(),"位置Y"));
/*
for(k,v in section){
console.log(section.name(),k,v)  
}
*/
}

import mouse;
import win.ui.menu;//必须导入菜单支持库
var moveFlag,bx,by;
 
 Movefun=function(moveonwer,message,name){
      select( message ) { 
        case 0x201/*_WM_LBUTTONDOWN*/{
        //置移动标志,以后可以用于选框开启移动功能
            moveFlag = true;
            //获取鼠标当前位置
            var x,y = mouse.getPos();
            //格式化鼠标位置为相对于被点击的按钮的位置坐标
            bx,by = win.toClient(moveonwer.hwnd,x,y);
        }
        case 0x202/*_WM_LBUTTONUP*/ {
        //移动结束
            moveFlag = false;
            
            var px,py,pcx,pcy = moveonwer.getPos();
            ini.write(name,"位置X",px);
            ini.write(name,"位置Y",py);
        }
        case 0x200/*_WM_MOUSEMOVE*/{
            var x,y = mouse.getPos();
            //格式化鼠标当前位置为相对于软件窗口位置坐标
            var fx,fy = win.toClient(winform.hwnd,x,y)
            if(moveFlag){
            //设置按钮位置为相对于软件窗口的位置
                moveonwer.setPos(fx-bx,fy-by);
            }
        }
    }
 
 }
 //var tab = {};建立一个表,用来存储所有控件的id,值为该控件的名称
 for(name,ctrl in winform.eachControl("button") ){
//存储name,形成一个表
//tab[ctrl.id] = name;
    //创建弹出菜单
    winform["pop"+name] = win.ui.popmenu(winform); 
    winform["pop"+name].add('编辑功能',function(id){ 
            winform[name].text =name+"按钮被修改了"
    } )
 
    winform[name].wndproc = function(hwnd,message,wParam,lParam){
     
    //无返回值则继续调用默认回调函数
        if( message == 0x205/*_WM_RBUTTONUP*/  ){ 
             var x,y = win.getMessagePos(); 
            winform["pop"+name].popup(x,y,true)
        }
Movefun(owner,message,name);

    }
     
         
}

 
/*
winform.edit.wndproc = function(hwnd,message,wParam,lParam){
Movefun(owner,message);

}
 

winform.button.wndproc = function(hwnd,message,wParam,lParam){
   Movefun(owner,message);
}
 
*/
winform.enableDpiScaling()
winform.show() 
win.loopMessage();

实现思路:

将Movefun函数改造为3个参数,添加name参数,这个参数是控件的名称(不是控件显示在外部的text名),

两种思路,一种是建立一个表,里面键值存储控件的id,例如button3.id,内容value存这个button3名,通过迭代器存储界面中所有的控件id,然后使用的时候根据控件的id从表中取出name.

blob.png

另外一种就是直接将name参数在forin迭代器中直接使用.

本例中即使用这种方法.

admin

赞同来自:

鼠标拖拽框选实现选中控件:

GIF.gif

import win.ui;
import mouse;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=759;bottom=469)
mainForm.add(
button={cls="button";text="button";left=142;top=78;right=275;bottom=123;z=1};
button2={cls="button";text="button2";left=158;top=200;right=301;bottom=251;z=2};
button3={cls="button";text="button3";left=396;top=119;right=542;bottom=177;z=3};
button4={cls="button";text="button4";left=391;top=234;right=537;bottom=292;z=4};
button5={cls="button";text="button5";left=245;top=330;right=391;bottom=388;z=5}
)
/*}}*/

//定义变量x,y,m,n用于记录框选区域坐标,j,k用于临时记录鼠标坐标用于比较,w,h用于记录区域宽和高,flag是鼠标左键按下标志
var x,y,m,n,j,k,w,h;
var flag=false;

mainForm.wndproc = function(hwnd,message,wParam,lParam){
select( message ) { 
        case 0x201/*_WM_LBUTTONDOWN*/{
            flag=true;
            //获取鼠标左键按下的窗口坐标
            var xx,yy = mouse.getPos();
            x,y = win.toClient(hwnd,xx,yy) 
            m,n = x,y;
        }
        case 0x202/*_WM_LBUTTONUP*/{
            flag=false;
           //这个函数如果数值不变再次被调用,那么会删除刚才的虚线框
           //实现抬起鼠标删除虚线框功能
            ::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
   mainForm.redraw();//强制刷新整个客户区
   //遍历所有控件
  for(name,ctrl in mainForm.eachControl("button") ){
  //如果控件的区域与鼠标拖拽的虚线框相交
  if(ctrl.getRect().intersectsWith(::RECT(x,y,m,n)))
  {
  //为了更好的观察,改变文本内容
  ctrl.text = "选中了"
  //将选中的控件用虚线框环绕
  ::DrawFocusRect(::GetDC(hwnd),ctrl.getRect());
  }
 
  }

        }
        case 0x200/*_WM_MOUSEMOVE*/{
            if(flag){
             
                //擦除上次画出的虚线框
                ::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
                var xxx,yyy = mouse.getPos();
                j,k=win.toClient(hwnd,xxx,yyy)
//处理反向拖动
                if(j<x+(m-x)/2)
                    x=j;
                else 
                    m=j;
                if(k<y+(n-y)/2)
                    y=k;
                else 
                    n=k;

                //画出新的虚线框
                ::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));  
                sleep(1); 
                  
            }
        }


    }
}


mainForm.enableDpiScaling();
mainForm.show();

return win.loopMessage();

这里需要特别注意一个地方:

//如果控件的区域与鼠标拖拽的虚线框相交
 if(ctrl.getRect().intersectsWith(::RECT(x,y,m,n)))

这个是怎么知道要用这个函数的呢?

我点击

win.loopMessage()

右键查看它的代码.拉倒下面之后发现了这个

blob.png

看到里面有个判断两个区块碰撞相交,呵呵,这个正好是我要的一个功能

但是怎么使用呢?

根据上面的注释,貌似应该是一个RETC的intersectsWith上另一个RETC

那么就进行实验,于是有了

mainform.button.getRect().intersectsWith(::RECT(x,y,m,n))

果然合适


admin

赞同来自:

此示例演示了aardio与Javascript间使用JSON交换数据的方法。

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio echarts";right=909;bottom=669;border="dialog frame";max=false;min=false)
/*}}*/

import web.form;
var wb = web.form( winform );

import web.json;
wb.external = { 
    getOption = 
function( num ){
        
var data = {
            calculable = 
true;
            legend = {
                data = { 
"直接访问""邮件营销""联盟广告""视频广告""搜索引擎" };
                orient = 
"vertical";
                x = 
"left"
            };
            series = {
                {
                    center = { 
"50%""60%" };
                    data = {
                        { name = 
"直接访问"; value = 335 }; 
                        { name = 
"邮件营销"; value = 310 }; 
                        { name = 
"联盟广告"; value = 234 }; 
                        { name = 
"视频广告"; value = 135 }; 
                        { name = 
"搜索引擎"; value = 1548 }
                    };
                    name = 
"访问来源"; radius = "55%"type = "pie"
                }
            };
            title = { subtext = 
"纯属虚构"; text = "某站点用户访问来源"; x = "center"    };
            toolbox = {
                feature = {
                    dataView = { readOnly = 
false; show = true };
                    magicType = {
                        option = { funnel = { funnelAlign = 
"left"; max = 1548; width ="50%"; x = "25%" }};
                        show = 
true;
                        
type = { "pie""funnel" }
                    };
                    mark = { show = 
true };
                    restore = { show = 
true };
                    saveAsImage = { show = 
true }
                }; show = 
true
            };
            tooltip = { formatter = 
"{a} <br/>{b} : {c} ({d}%)"; trigger = "item" }
        }
        
        
return web.json.stringify(data);
    }
}

wb.html = 
/**
<!doctype html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta charset="UTF-8">  
</head>
<body>
    <div id="main" style="height:600px;"></div> 
    <script src="http://echarts.baidu.com/dist/ ... gt%3B
    <script>
        var myChart = echarts.init(document.getElementById('main')); 
        myChart.setOption( JSON.parse( external.getOption() ) );
    </script>
</body>
</html>
**/

winform.show(); 
//显示窗体

//启动消息循环
win.loopMessage(); 


admin

赞同来自:

写个webkit的应用方面的东西:

用到了layui界面

先写了个测试按钮的网页

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="layui/css/layui.css">
  <script src="layui/layui.js"></script>
</head>
<body>
 <fieldset class="layui-elem-field site-demo-button">
  <legend>六种按钮主题</legend>
  <div>
    <button class="layui-btn layui-btn-primary" onclick = "javascript:external.xiugai('hello')">原始按钮</button>
    <button class="layui-btn" onclick = "javascript:external.zhixing()">默认按钮</button>
    <button class="layui-btn layui-btn-normal" onclick = "javascript:external.xiugai('hello')">百搭按钮111</button>
    <button class="layui-btn layui-btn-warm">暖色按钮</button>
    <button class="layui-btn layui-btn-danger">警告按钮</button>
    <button class="layui-btn layui-btn-disabled">禁用按钮</button>
  </div>
</fieldset>
 
</body>
</html>

可以看到里面我定义了几个按钮样式,并且分别定义了他们被单击的事件回调函数

例如

javascript:external.zhixing()

意思就是,单击调用zhixing()这个函数,而这个函数可以再aar的引用界面里自己定义.

import win.ui;
/*DSG{{*/
mainForm = win.form(text="webkit浏览器支持库";right=724;bottom=449;border="dialog frame";mode="popup")
mainForm.add()
/*}}*/

//导入webkit支持库
import web.kit.form;
import web.kit.jsFunction;
var wbKitView = web.kit.form(mainForm);//创建webkit浏览器窗口

//使用external接口定义网页脚本可调用的本地函数
wbKitView.external = {

    xiugai = function(str){ 
        mainForm.msgbox(str);
    };
    zhixing = function(){
     var ele = wbKitView.querySelector(".layui-btn.layui-btn-normal");
     if(ele){
     ele.onclick = "";
     ele.className = "layui-btn layui-btn-disabled";
     }
    
     //console.dump(table.tostring(ele))
    }
    
}

//打开链接时触发
/**
wbKitView.onNavigation = function(url,navigationType){ 
if( navigationType == 0/*_WKE_NAVIGATION_TYPE_LINKCLICK*/ ){

}
return true;
}
**/

import wsock.tcp.simpleHttpServer;
wbKitView.go( wsock.tcp.simpleHttpServer.startUrl("/html/main.aardio") ); 

//可以使用CSS选择器获取HTML节点对象
//wbKitView.querySelector("#header .title-bar .title").innerText = "我 的 软 件";

//添加可拖动边框
import win.ui.resizeBorder;
win.ui.resizeBorder(mainForm);

//添加阴影
import win.ui.shadow;
win.ui.shadow(mainForm);

//限定最大化范围
import win.ui.minmax;
win.ui.minmax(mainForm);

mainForm.show();
win.loopMessage();

这里面我们看到了,这个zhixing()函数,执行的动作是,查找要执行动作的按钮的class类,然后把它的onclick事件清空,把它的样式改为禁止点击样式.

zhixing = function(){
     var ele = wbKitView.querySelector(".layui-btn.layui-btn-normal");
     if(ele){
     ele.onclick = "";
     ele.className = "layui-btn layui-btn-disabled";
     }
    
     //console.dump(table.tostring(ele))
    }

这里有个我的猜想,就是我要修改什么事件就直接写就可以,不知道对不对

blob.png

admin

赞同来自:

软件发布后运行界面框选和拖拽功能:

上面楼层实现了鼠标拉框进行框选,这里我们来实现框选中后进行拖拽排序功能:

import win.ui;
import mouse;
import console;
/*DSG{{*/
mainForm = win.form(text="软件运行中框选拖拽功能";right=759;bottom=469;bgcolor=12632256)
mainForm.add(
button={cls="button";text="button";left=223;top=84;right=356;bottom=129;z=1};
button10={cls="button";text="button10";left=42;top=44;right=161;bottom=73;z=10};
button11={cls="button";text="button11";left=593;top=61;right=712;bottom=90;z=11};
button12={cls="button";text="button12";left=518;top=209;right=637;bottom=238;z=12};
button13={cls="button";text="button13";left=500;top=330;right=604;bottom=345;z=13};
button14={cls="button";text="button14";left=390;top=418;right=511;bottom=447;z=14};
button15={cls="button";text="button15";left=425;top=378;right=597;bottom=410;z=15};
button2={cls="button";text="button2";left=191;top=182;right=334;bottom=233;z=2};
button3={cls="button";text="button3";left=396;top=119;right=542;bottom=177;z=3};
button4={cls="button";text="button4";left=391;top=234;right=537;bottom=292;z=4};
button5={cls="button";text="button5";left=245;top=330;right=391;bottom=388;z=5};
button6={cls="button";text="button6";left=21;top=231;right=153;bottom=274;z=6};
button7={cls="button";text="button7";left=55;top=276;right=174;bottom=305;z=7};
button8={cls="button";text="button8";left=128;top=390;right=247;bottom=419;z=8};
button9={cls="button";text="button9";left=412;top=64;right=531;bottom=93;z=9}
)
/*}}*/

//定义变量x,y,m,n用于记录框选区域坐标,j,k用于临时记录鼠标坐标用于比较,w,h用于记录区域宽和高,flag是鼠标左键按下标志
var x,y,m,n,j,k,w,h;
var flag=false;
var secflag = false;
var moveFlag,bx,by,cccx,cccy;
tab = {};//定义一个表,用来存储被框选中的原件id
console.open()
mainForm.wndproc = function(hwnd,message,wParam,lParam){
select( message ) { 
        case 0x201/*_WM_LBUTTONDOWN*/{
            flag=true;
            //获取鼠标左键按下的窗口坐标
            var xx,yy = mouse.getPos();
            x,y = win.toClient(hwnd,xx,yy) 
            m,n = x,y;
           
        }
        case 0x202/*_WM_LBUTTONUP*/{
            flag=false;
           //这个函数如果数值不变再次被调用,那么会删除刚才的虚线框
           //实现抬起鼠标删除虚线框功能
            ::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
   mainForm.redraw();//强制刷新整个客户区
   //遍历所有控件
   var count = 1;
  for(name,ctrl in mainForm.eachControl("button") ){
  //如果控件的区域与鼠标拖拽的虚线框相交
  if(ctrl.getRect().intersectsWith(::RECT(x,y,m,n)))
  {
  //为了更好的观察,改变文本内容
  ctrl.text = "选中了"
  //将选中的控件用虚线框环绕
  ::DrawFocusRect(::GetDC(hwnd),ctrl.getRect());
  //取得被选中的控件的id,并存储到表中
  tab[count] = ctrl.id;
  count++;
  secflag = true;
  }
 
  }

        }
        case 0x200/*_WM_MOUSEMOVE*/{
            if(flag){
             
                //擦除上次画出的虚线框
                ::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
                var xxx,yyy = mouse.getPos();
                j,k=win.toClient(hwnd,xxx,yyy)
//处理反向拖动
                if(j<x+(m-x)/2)
                    x=j;
                else 
                    m=j;
                if(k<y+(n-y)/2)
                    y=k;
                else 
                    n=k;

                //画出新的虚线框
                ::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));  
                sleep(1); 
                  
            }
        }


    }
}


Movefun=function(moveonwer,message,name){
       select( message ) { 
        case 0x201/*_WM_LBUTTONDOWN*/{
        //置移动标志,以后可以用于选框开启移动功能
            moveFlag = true;
            //获取鼠标当前位置
            var sx,sy = mouse.getPos();
            //格式化鼠标位置为相对于被点击的按钮的位置坐标
            bx,by = win.toClient(moveonwer.hwnd,sx,sy);
            
            if(secflag){
            
             cccx,cccy = win.toClient(mainForm.hwnd,sx,sy);
              //console.log("cccx,cccy ",cccx,cccy )
            }
            
        }
        case 0x202/*_WM_LBUTTONUP*/ {
        //移动结束
            moveFlag = false;

        }
        case 0x200/*_WM_MOUSEMOVE*/{
            var sx,sy = mouse.getPos();
            //格式化鼠标当前位置为相对于软件窗口位置坐标
            var fx,fy = win.toClient(mainForm.hwnd,sx,sy)
            if(moveFlag){
            //设置按钮位置为相对于软件窗口的位置
           
            
            if(secflag){
            //计算移动值
var movex = fx - cccx;            
             var movey = fy - cccy;
             //重置初始鼠标位置为当前,避免多次叠加
             cccx,cccy = fx,fy;
             //console.log("movex,movey",movex,movey)
             //遍历所有被选中的按键
             for(i=1;#tab;1){
             //通过记录的id查找控件,并取得控件的大小和位置信息
             var ssx,ssy,dddd,fffff = mainForm.getCtrlById(tab[i]).getPos(mainForm.hwnd)
             //通过记录的id查找控件名并设置控件的位置
             mainForm.getCtrlById(tab[i]).setPos(movex+ssx,movey+ssy);
            
             }
            
            
            
            }else {
             //如果没有框选,则执行移动此控件命令
              moveonwer.setPos(fx-bx,fy-by);
            
             }
            
     
                
            }
        }
    }
    
 }

 for(name,ctrl in mainForm.eachControl("button") ){

  
    mainForm[name].wndproc = function(hwnd,message,wParam,lParam){

        Movefun(owner,message,name);
 
    }
      
          
}

//mainForm.enableDpiScaling();
mainForm.show();

return win.loopMessage();

这里问题找了好长时间,归结最后是因为movefun中少了一句

//重置初始鼠标位置为当前,避免多次叠加
             cccx,cccy = fx,fy;

╮(╯▽╰)╭

效果图就不上了,就是框选后可以鼠标点击按住移动....

admin

赞同来自:

最近利用串口接收到ascii码,这里列举一个处理的办法:

import console; 
console.open();

var dataaa = "57 32 50 30 2D 38 30 2E 30 30 31 54 57 32 50 30 2D 38 30 2E 30 30 31 54 0D 0A"
var txdata="";

str = string.replace(dataaa,"\s","");//去除空格及换行符

for(i=1; #str;2)
{
    //第一种方法
    //txdata ++= string.pack(eval("0X"+string.sub(str,i,i+1)));
    //第二种方法
    txdata ++=string.format("%c", tonumber(string.sub(str,i,i+1),16))
}    

console.log(dataaa);
console.log(str)
console.log(txdata)
console.pause(true);

blob.png

最后一行就是我要显示的内容.

一个设备发送来的就是最后一行的数据,用串口助手16进制接收到的是第一行的显示的数据.

admin

赞同来自: 悄悄飞

将一个数字格式化为16进制字符显示(双字节)

import console; 
//var num = console.getNumber( "请输入数值:" )

var num1 = 65; 
var num2 = 564; 
console.log(num1,"=",string.format("%.4X", num1))
console.log(num2,"=",string.format("%.4X", num2))
console.pause(true);

blob.png

admin

赞同来自:

listview支持bindConfig自动保存控件的行列数据

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="button";left=227;top=279;right=304;bottom=330;z=2};
listview={cls="listview";left=152;top=56;right=498;bottom=214;edge=1;z=1}
)
/*}}*/

winform.button.oncommand = function(id,event){
winform.listview.addItem({"1";"2"})
}

winform.listview.insertColumn("1",100)
winform.listview.insertColumn("2",100)

import config;
winform.bindConfig( config.winform,{
edit = "text";
radiobutton = "checked";
checkbox = "checked";
combobox = "selIndex";
listview = "items";
} );


winform.show() 
win.loopMessage();


壹句壹傷

赞同来自:

 这个类似 vb 

admin

赞同来自:

import console; 
 //acsii转换为HEX码
var Hex=function(data,len){
    var str="";
    for(i=1;len;1){
            str = str++" "++string.right(string.format("%X", data[ i ]),2);//默认转换成有符号字节,因此取最右边两位  HEX码
        }
    return str; 
    }
 //hex转ascii
 var Ascii=function(data){
  var data = string.replace(data," ","");
var str="";           
for(i=1;#data;2){
str =str ++ string.pack( eval("0x"++data[[i]]++data[[i+1]] ));
}
return str; 
}   
 

var ssss = "64 65 66 67 68 69";

console.log(Ascii(ssss))
console.log(eval("0x64"))
console.log(string.pack(eval("0x64")))


console.pause(true);

blob.png

我的STM32DUBE

赞同来自:

斑竹, 那个HID 上位机我很有兴趣 但是我调试死活调试不成功,报错,我在网上找的 UsbHidApi.dll 在加载.DLL的时候说找不到函数,斑竹能不能把你的HID 上位机的aardio源码发一份给我 或者发你测试没问题的那个UsbHidApi.dll给我 我的QQ邮箱770684845@qq.com  感谢不尽。


余一水

赞同来自:

就想知道这是什么编程语言?

admin

赞同来自:

学习用plus做漂亮界面过程中的代码:

blob.png

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=799;bottom=505;bgcolor=16777215;border="none";max=false)
mainForm.add(
btnClose={cls="plus";text="r";left=773;top=0;right=800;bottom=23;bgcolor=3291122;color=16777215;dr=1;dt=1;font=LOGFONT(name='Webdings';h=-19);notify=1;transparent=1;z=2};
picturebox={cls="picturebox";left=0;top=0;right=800;bottom=413;image=$"\res\btm_wrap_bg.jpg";z=1};
plus={cls="plus";left=445;top=443;right=605;bottom=483;foreground="\res\taobao.jpg";z=4};
plus2={cls="plus";left=627;top=443;right=787;bottom=483;foreground="\res\qqq.jpg";z=5};
plus3={cls="plus";text="新人红包";left=66;top=221;right=253;bottom=358;bgcolor=16777215;color=128;font=LOGFONT(name='微软雅黑';h=-29;weight=700);foreground="\res\barimg2.jpg";valign="bottom";x=0.5;y=0.30000001192093;z=6};
plus4={cls="plus";text="新人福袋";left=312;top=221;right=499;bottom=358;bgcolor=16777215;color=128;font=LOGFONT(name='微软雅黑';h=-29;weight=700);foreground="\res\barimg3.jpg";valign="bottom";x=0.5;y=0.30000001192093;z=7};
plus5={cls="plus";text="现金抽奖";left=557;top=221;right=744;bottom=358;bgcolor=16777215;color=128;font=LOGFONT(name='微软雅黑';h=-29;weight=700);foreground="\res\barimg1.jpg";valign="bottom";x=0.5;y=0.30000001192093;z=8};
static={cls="static";text="一键登录,领取新人福利";left=32;top=443;right=373;bottom=483;align="center";center=1;color=3291122;font=LOGFONT(name='黑体';h=-29;weight=700);transparent=1;z=3}
)
/*}}*/

namespace theme{
taobao = {
foreground = { 
         hover = "\res\qqq.jpg";
         //focus = "/res/images/button-focus.png";
         active = "\res\taobao.jpg";
         //disabled = "/res/images/button-disabled.png"; 
     }
}
qq = {
 foreground = { 
         hover = "\res\taobao.jpg";
         //focus = "/res/images/button-focus.png";
         active = "\res\qqq.jpg";
         //disabled = "/res/images/button-disabled.png"; 
     }
}
    close = {
        color = {
            hover = 0xFF57c0ff; 
            active = 0xFFffc057; 
        } 
    }
}
mainForm.btnClose.skin(theme.close); 
mainForm.plus.skin(theme.taobao); 
mainForm.plus2.skin(theme.qq); 

mainForm.btnClose.oncommand = function(id,event){
    mainForm.close()
}
mainForm.wndproc = function(hwnd,message,wParam,lParam){
select( message ) { 
case 0x205/*_WM_RBUTTONUP*/{
//鼠标右键弹起,下面获取坐标
var x,y = win.getMessagePos(lParam);

}
case 0x201/*_WM_LBUTTONDOWN*/{
mainForm.hitCaption();
}
else{

}
}
//无返回值则继续调用默认回调函数
}
mainForm.enableDpiScaling();
mainForm.show();

return win.loopMessage();

整个代码工程下载:http://pan.baidu.com/s/1nuZYRvN

爱哭的热带鱼

赞同来自:

绝好的学习帖呀

╰⋛⋋⊱⋋๑胡萝卜๑⋌⊰ - 80后,学渣

赞同来自:

很好的学习帖子。

要回复问题请先登录注册