再次研究videocapX视频控件

By admin at 2018-10-06 • 0人收藏 • 1303人看过

上次想要调用这个控件来显示视频,当时失败了.就放弃了

10.1出去玩了一圈之后,突然觉得应该再研究一下,感觉思路清晰了,应该可以成功.

下面记录下自己一点一点是怎么想的和实现的过程, 给自己一个研究下去的动力.


首先,去百度上搜了破解版(这个是收费控件), 里面包含了一个破解的软件

1, 注册了原来文件夹里的videocapX.ocx . 

2,点开自带的示例app ,发现提示试用30已经过期...必须注册....

3,双击破解软件,破解完成后, 重新注册了破解之后的这个控件,

4,再次点开示例的app发现不提示了,而且也打开了视频设置界面, 勾选里面的time显示在视频那个选项之后,视频可以很好的显示了.


这样就可以开始用aardio调用ocx了.


下面的试验我上传到了网盘里:

链接:https://pan.baidu.com/s/1tbfK9ZUnK58cRLCETrhxQA 

提取码:nb1s


14 个回复 | 最后更新于 2019-05-17
2018-10-06   #1

对了,首先记录一下,怎么去查看com控件(ocx和dll)的GUID码的:

我这里利用了一个名字为ComRaider的工具, 使用方法很简单百度下即可.

言归正传↓


我的原则是先测试功能,再封装为库, 所以:

首先创建了一个winform窗口

然后调用控件的aboutbox()属性

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=897;bottom=675)
winform.add(
button={cls="button";text="Button";left=5;top=626;right=164;bottom=668;z=1};
button2={cls="button";text="Button";left=179;top=625;right=338;bottom=667;z=2}
)
/*}}*/

import console
console.open()

var cvx =  winform.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");

winform.button.oncommand = function(id,event){
	cvx._object.AboutBox()
}

winform.button2.oncommand = function(id,event){
	
	console.log("音频数量:", cvx._object.GetAudioDeviceCount() )
	for(i=0;cvx._object.GetAudioDeviceCount()-1;1){
		console.log( cvx._object.GetAudioDeviceName(i) )
	
	}
	
}

winform.show() 
win.loopMessage();

image.png

可以看到运行后得到了想要的东西.

2018-10-07   #2
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=897;bottom=675)
winform.add(
button={cls="button";text="about";left=5;top=626;right=164;bottom=668;z=1};
button2={cls="button";text="audio";left=179;top=626;right=276;bottom=668;z=2};
button3={cls="button";text="vedio";left=287;top=626;right=384;bottom=668;z=3};
button4={cls="button";text="version";left=783;top=623;right=880;bottom=665;z=4}
)
/*}}*/

import console
console.open()

var cvx =  winform.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");


winform.button.oncommand = function(id,event){
	cvx._object.AboutBox()
}

winform.button2.oncommand = function(id,event){
	
	console.log("音频数量:", cvx._object.GetAudioDeviceCount() )
	for(i=0;cvx._object.GetAudioDeviceCount()-1;1){
		console.log( cvx._object.GetAudioDeviceName(i) )
	
	}
	
}

winform.button3.oncommand = function(id,event){
	console.log("摄像头数量:", cvx._object.GetVideoDeviceCount() )
	for(i=0;cvx._object.GetVideoDeviceCount()-1;1){
		console.log( cvx._object.GetVideoDeviceName(i) )
	
	}
	
	cvx._object.VideoDeviceIndex = 0;
	cvx._object.UseVideoFilter = 0;
	cvx._object.Connected = 1;
	cvx._object.SetVideoFormat(320, 240);
	cvx._object.Preview = 1;
}

winform.button4.oncommand = function(id,event){
	console.log( cvx._object.Version )
}

winform.show() 
win.loopMessage();


上面我增加摄像头的调用,但是再次在这里卡壳了. 

image.png

看了vb中的调用方式:

Private Sub Combo2_Click()
If vcx.Connected Then vcx.Connected = False
vcx.CaptureAudio = Check2.Value
vcx.VideoDeviceIndex = Combo2.ListIndex
vcx.UseVideoFilter = False
vcx.PreviewAudio = True
vcx.Connected = True
vcx.SetVideoFormat 320, 240 '640, 480
vcx.Preview = True
End Sub

然后, 这个出错的地方是哪里的呢?  这个在vb中是控件的属性框里的东西...

image.png

再次郁闷了.

2018-10-07   #3

我上面利用之前写的 [查看com组件里面函数的方法]http://www.htmlayout.cn/t/51 这个, 是看不到videoDeviceIndex这个方法的. 

通过aar工具里面的com常量工具也看不到这个videoDeviceIndex名字.

不知道这个是哪里的方法?


image.png

vb里面

image.png

2018-10-07   #4

病急乱投医也试了试

image.png

还是不行.::>_<::

2018-10-07   #5

解决了.

群里大神提供了个测试代码, 在需要设置的属性名前面加上set关键词

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=759;bottom=469)
mainForm.add()
/*}}*/

mainForm.enableDpiScaling();
mainForm.show();
import console
var VideoCapX1 = mainForm.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewScale(true)
cap.setConnected(true)
console.varDump(cap.GetVideoCaps()[1])
cap.setPreview(true)


return win.loopMessage();


我猜测:

image.png

2018-10-07   #6

目前测试发现用笔记本上面的摄像头VideoFlip这个视频翻转的函数貌似不起作用, 其他的还没测试.

2018-10-08   #7

今天测试sv4000这个摄像头,翻转是可以使用的.

下面是四通道显示 

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=897;bottom=675)
winform.add(
button={cls="button";text="about";left=5;top=626;right=164;bottom=668;z=1};
button2={cls="button";text="audio";left=179;top=626;right=276;bottom=668;z=2};
button3={cls="button";text="vedio";left=287;top=626;right=384;bottom=668;z=3};
button4={cls="button";text="version";left=783;top=623;right=880;bottom=665;z=4};
button5={cls="button";text="flip";left=411;top=626;right=508;bottom=668;z=6};
button6={cls="button";text="show";left=782;top=509;right=879;bottom=551;z=7};
button7={cls="button";text="show";left=783;top=559;right=880;bottom=601;z=8};
custom1={cls="custom";text="自定义控件";left=0;top=0;right=299;bottom=256;z=5};
custom2={cls="custom";text="自定义控件";left=343;top=0;right=642;bottom=256;z=9};
custom3={cls="custom";text="自定义控件";left=7;top=307;right=306;bottom=563;z=10};
custom4={cls="custom";text="自定义控件";left=343;top=310;right=642;bottom=566;z=11}
)
/*}}*/

import console
console.open()
var cvx = {};
for(i=1;4;1){
	cvx[i] =  winform["custom"++i].createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");
}

winform.button.oncommand = function(id,event){
	cvx[1]._object.AboutBox()
}

winform.button2.oncommand = function(id,event){
	
	console.log("音频数量:", cvx[1]._object.GetAudioDeviceCount() )
	for(i=0;cvx[1]._object.GetAudioDeviceCount()-1;1){
		console.log( cvx[1]._object.GetAudioDeviceName(i) )
	
	}
	
}

winform.button3.oncommand = function(id,event){
	console.log("摄像头数量:", cvx[1]._object.GetVideoDeviceCount() )
	for(i=0;cvx[1]._object.GetVideoDeviceCount()-1;1){
		console.log( cvx[1]._object.GetVideoDeviceName(i) )
	
	}
	for(i=1;4;1){
		cvx[i]._object.setVideoDeviceIndex(i-1);
		cvx[i]._object.setPreviewScale(true)
		cvx[i]._object.setConnected(true);
		cvx[i]._object.setPreview(true);	
	
	}

}

winform.button4.oncommand = function(id,event){
	console.log( cvx[1]._object.getVideoFlip() )
}

winform.button5.oncommand = function(id,event){
	console.log( cvx[1]._object.setVideoFlip(-3) );
}

winform.button6.oncommand = function(id,event){
	cvx[1]._object.ShowVideoSourceDlg();
}

winform.button7.oncommand = function(id,event){
	cvx[1]._object.ShowVideoFormatDlg()
}

winform.show() 
win.loopMessage();

blob.png

2018-10-08   #8

试了三台电脑,得出一个结论:

win7 32位 SP1版本

直接注册破解的ocx第一次打开会提示未注册版本, 之后就不会提示了.

摄像头也可以打开, 但是不能 镜像和翻转 画面.


win7 32位 非SP1 版本

直接注册破解的ocx是可以直接使用的 , 也可以进行镜像和翻转 画面.


win7 64位 SP1版本

直接注册后,第一次打开后提示未注册版本,  摄像头可以打开, 镜像和翻转 不能使用




仔细看了看有啥区别, 

发现非sp1的电脑里 videocapx.ocx 显示的是 已注册版本

而其他的都是 未注册版本


估计可能未注册的有些功能限制, 刚好有这个 flip 翻转功能.


2018-10-13   #9

利用网盘里那个1.6.0版本+lic那个文件,注册就可以变为已注册版本了

2018-10-24   #10

给视频控件加个蒙版: 实现蒙版上面画线 (给视频画线)

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=491;bottom=483;bgcolor=16777215)
winform.add(
button={cls="button";text="Button";left=283;top=368;right=473;bottom=447;z=3};
picturebox={cls="picturebox";left=57;top=69;right=380;bottom=318;bgcolor=15780518;db=1;dl=1;dr=1;dt=1;z=2};
plus={cls="plus";left=57;top=69;right=380;bottom=318;bgcolor=255;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var VideoCapX1 = winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewAudio(0);
cap.setPreviewScale(true)
cap.setConnected(true)
cap.setPreview(true)

//自绘plus背景
winform.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,2);
	graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom);
	pen.delete()
	return true;//返回true阻止绘制默认背景
}

winform.plus.orphanWindow(true);

winform.show() 
win.loopMessage();


2018-10-25   #11

根据鼠标点击位置动态画线:

这里注意: 由于picturebox被videocapx使用了,鼠标左键单击信息貌似被屏蔽了,拦截不到, 但是下面的消息可以使用.

var xx,yy;
mainForm.picturebox.wndproc = function(hwnd,message,wParam,lParam){
		select(message) {
		case 0x210/*_WM_PARENTNOTIFY*/ {
			xx,yy = win.getMessagePos(lParam);
			//通知plus重画	
			mainForm.plus.redraw()
		}
		else {
			
		}
	}
}
//自绘plus背景
mainForm.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,2);
    if(xx){
    	graphics.drawLine(pen,xx,rc.top,xx,rc.bottom);
	
    }else {
    graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom);
	
    }
    
	pen.delete()
	return true;//返回true阻止绘制默认背景
}
mainForm.plus.orphanWindow(true);



画多重线方法:

var mtab = {};
var xx,yy;

mainForm.picturebox.wndproc = function(hwnd,message,wParam,lParam){
	select(message) {
		case 0x210 {
			xx,yy = win.getMessagePos(lParam)
			table.push(mtab,{xx;yy})
			if(#mtab >1){
				table.shift(mtab,1);
			}
			mainForm.plus.redraw()
		}
		else {
		}
	}
}
//自绘plus背景
mainForm.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,1);
   if(mtab){
       for(i=1;#mtab;1){
       	graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.right,mtab[i][2]+(rc.width()-mtab[i][1])*math.tan(math.rad(18)));
		graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.left,mtab[i][2]-mtab[i][1]*math.tan(math.rad(18)));
        graphics.drawLine(pen,rc.left,mtab[i][2],rc.right,mtab[i][2]);      
       
       }
   }
	pen.delete()
	return true;//返回true阻止绘制默认背景
}
mainForm.plus.orphanWindow(true);


2018-11-11   #12

鼠标点击画十字可调整角度线:

画板端代码:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=740;bottom=684)
winform.add(
picturebox={cls="picturebox";left=0;top=0;right=741;bottom=685;db=1;dl=1;dr=1;dt=1;z=1};
plus={cls="plus";left=0;top=0;right=741;bottom=685;bgcolor=255;db=1;dl=1;dr=1;dt=1;z=2}
)
/*}}*/

arg={...};
parent = table.shift(arg);

var mtab = {};
var xx,yy;

try{
	var cvx =  winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");
	cvx._object.setVideoDeviceIndex(arg[1].index);
	cvx._object.setPreviewScale(true)
	cvx._object.setPreviewAudio(0);
	cvx._object.setConnected(true);
	cvx._object.setPreview(true);
	cvx._object.setVideoFlip(arg[1].flip);
	winform.text = arg[1].title;
}
catch(e){
	winform.msgboxErr("摄像头打开失败")
}


winform.picturebox.wndproc = function(hwnd,message,wParam,lParam){
    if(arg[1].Lineopen){
    	select(message) {
			case 0x210 {
				xx,yy = win.getMessagePos(lParam)
				table.push(mtab,{xx;yy})
				if(#mtab >1){
					table.shift(mtab,1);
				}
				winform.plus.redraw()
			}
			else {
			}
		
    	}
	}
}
//自绘plus背景
winform.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    if(arg[1].Lineopen){
    	var pen = gdip.pen(backgroundColor,arg[1].lineWidth);
   		if(mtab){
       		for(i=1;#mtab;1){
       			if((arg[1].angle == "90") or (arg[1].angle=="270")){
       				graphics.drawLine(pen,mtab[i][1],rc.top,mtab[i][1],rc.bottom);
       				graphics.drawLine(pen,rc.left,mtab[i][2],rc.right,mtab[i][2]);
       			}else {
       				graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.right,mtab[i][2]+(rc.width()-mtab[i][1])*math.tan(math.rad(arg[1].angle)));
					graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.left,mtab[i][2]-mtab[i][1]*math.tan(math.rad(arg[1].angle)));
        			graphics.drawLine(pen,rc.left,mtab[i][2],rc.right,mtab[i][2]);
       			}
       			
       			      
       		
       		}
   		}
		pen.delete()
    }

	return true;//返回true阻止绘制默认背景
}
winform.plus.orphanWindow(true);


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

主界面端代码:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="摄像头V2";right=385;bottom=147)
mainForm.add(
button={cls="button";text="开启";left=255;top=23;right=371;bottom=97;z=1};
checkbox={cls="checkbox";text="开启画线";left=26;top=117;right=110;bottom=135;z=4};
edit={cls="edit";text="18";left=174;top=117;right=232;bottom=141;align="center";border=1;num=1;z=5};
flip={cls="combobox";left=24;top=71;right=232;bottom=97;edge=1;items={"不翻转";"上下翻转";"左右镜像";"全镜像"};mode="dropdown";z=3};
static={cls="static";text="画线角度:";left=109;top=116;right=167;bottom=140;align="right";center=1;transparent=1;z=6};
sxtlist={cls="combobox";left=26;top=23;right=232;bottom=49;edge=1;items={};mode="dropdown";z=2};
trackbar={cls="trackbar";left=248;top=107;right=371;bottom=137;max=8;min=1;z=7}
)
/*}}*/

import com.activeX;

if(!io.exist("\res\videocapx.lic")){
    	string.save("\res\videocapx.lic",$"\res\videocapx.lic");	
	}
if(!io.exist("\res\videocapx.ocx")){
    string.save("\res\videocapx.ocx",$"\res\videocapx.ocx");	
}
com.activeX.regsvr32As("\res\videocapx.ocx")
var sxtobj = com.CreateObject("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")

for(i=0;sxtobj.GetVideoDeviceCount()-1;1){
		 mainForm.sxtlist.add(sxtobj.GetVideoDeviceName(i))
	
}
mainForm.sxtlist.selIndex = 1;
//mainForm.trackbar.pos = 1;

mainForm.button.oncommand = function(id,event){
	var flipmode;
	select(mainForm.flip.text) {
		case "不翻转" {
			flipmode = 0;
		}
		case "上下翻转" {
			flipmode = -2;
		}
		case "左右镜像" {
			flipmode = -1;
		}
		case "全镜像" {
			flipmode = -3;
		}
		else {
		}
	}
    var frmChild = mainForm.loadForm("\dlg\sxt.aardio",{index=mainForm.sxtlist.selIndex-1;flip=flipmode;title=mainForm.sxtlist.text;Lineopen=mainForm.checkbox.checked;angle=mainForm.edit.text;lineWidth=mainForm.trackbar.pos});
	frmChild.show();	
}

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

image.png

2019-01-16   #13

摄像头上显示按键和图像:

不用.orphanWindow(true)方式

其实就类似于两个控件重叠了, 两个控件又都有自己的事件, 那么要显示另外一个控件的事件,就需要指定父窗体, 然后就可以自动调用事件了.


在aardio里创建工程选项里有一个[高级界面]->里面的[播放器] 那个里面其实就用到了这个,

可以看到右上角又个搜索框, 搜索框里又有个button这样的搜索图标, 这个图标可以点击进行搜索

 那么要想点击这个图标, 就需要指定这个搜索图标的父窗体为下面的那个控件

于是:

随便拖拉一个plus, 设置好按钮的点击样式, 什么都不要做, 然后设置,这个plus的parent为picturebox即可.

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=812;bottom=577;bgcolor=16777215)
winform.add(
picturebox={cls="picturebox";left=22;top=23;right=710;bottom=374;bgcolor=15780518;db=1;dl=1;dr=1;dt=1;z=1};
plus={cls="plus";left=370;top=305;right=527;bottom=362;bgcolor=65280;z=3};
plus2={cls="plus";text="预览按钮效果";left=559;top=308;right=701;bottom=363;bgcolor=-8355840;font=LOGFONT(h=-16;name='FontAwesome';charset=0);notify=1;z=2};
plus3={cls="plus";left=272;top=5;right=278;bottom=474;bgcolor=255;z=4}
)
/*}}*/

winform.plus2.skin({
	background={
		active=0xFFCF8E2D;
		default=0xFF008080;
		hover=0xFF00C2C2
	};

})

winform.plus.skin({
	background={
		active=0xFFCF8E2D;
		default=0xFF008080;
		hover=0xFF00C2C2
	};

})

var VideoCapX1 = winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewAudio(0);
cap.setPreviewScale(true)
cap.setConnected(true)
cap.setPreview(true)

//自绘plus背景
/*
winform.plus3.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,2);
    graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom);
    pen.delete()
    return true;//返回true阻止绘制默认背景
}
*/

winform.plus2.oncommand = function(id,event){
	winform.msgbox("点击了")
}

winform.plus3.setParent(winform.picturebox)

winform.plus2.setParent(winform.picturebox)
winform.plus.setParent(winform.picturebox)

winform.show() 
win.loopMessage();

image.png


2019-05-24   #14

实现: 鼠标移动到摄像头区域 按钮 显示, 移出就隐藏功能

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio工程37";right=959;bottom=591)
mainForm.add(
picturebox={cls="picturebox";left=94;top=38;right=854;bottom=508;bgcolor=12632256;db=1;dl=1;dr=1;dt=1;z=1};
plus={cls="plus";left=378;top=367;right=535;bottom=424;bgcolor=65280;db=1;dl=1;dr=1;z=3};
plus2={cls="plus";text="预览按钮效果";left=567;top=370;right=709;bottom=425;bgcolor=-8355840;db=1;dr=1;font=LOGFONT(h=-16;name='FontAwesome';charset=0);hide=1;notify=1;z=2}
)
/*}}*/

mainForm.plus2.skin({
    background={
        active=0xFFCF8E2D;
        default=0xFF008080;
        hover=0xFF00C2C2
    };
 
})
 
mainForm.plus.skin({
    background={
        active=0xFFCF8E2D;
        default=0xFF008080;
        hover=0xFF00C2C2
    };
 
})
 
var VideoCapX1 = mainForm.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewAudio(0);
cap.setPreviewScale(true)
cap.setConnected(true)
cap.setPreview(true)

mainForm.plus2.oncommand = function(id,event){
	mainForm.msgbox("哈哈哈")
}

//显示按钮在摄像头之上
mainForm.plus2.setParent(mainForm.picturebox)
mainForm.plus.setParent(mainForm.picturebox)


mainForm.show();
//必须加载鼠标事件库
import mouse;
return win.loopMessage(
	//消息循环里判断鼠标位置
	function(){
            var x,y = mouse.getPos()
			if( ::PtInRect(mainForm.picturebox.getRect(true),x,y) ) mainForm.plus2.hide = false;
			else {
				mainForm.plus2.hide = true;
			}
	}
);

写在消息循环里不知道会不会影响界面刷新效率?


更新:

增加鼠标右键点击才能显示按钮, 移出摄像头就消失功能

mainForm.picturebox.wndproc = function(hwnd,message,wParam,lParam){
	console.log(hwnd,message,wParam,lParam)
	if(message == 123){
		var x,y = win.getMessagePos(lParam)
		var xx,yy = win.toClient(mainForm.picturebox.hwnd,x,y)
		mainForm.plus2.setPos(xx,yy);
		mainForm.plus2.hide = false;
	}
	
	//无返回值则继续调用默认回调函数
}

import mouse;
return win.loopMessage(
    //消息循环里判断鼠标位置
    function(){
            var x,y = mouse.getPos();
            if( !::PtInRect(mainForm.picturebox.getRect(true),x,y) )
            {
                mainForm.plus2.hide = true;
            }
    }
);


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
Htmlayout皮肤Htmlayout皮肤引擎介绍
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...