tslediter/funcext/tvclib/utslvclbase.tsf

395 lines
11 KiB
Plaintext

unit utslvclbase;
interface
{$ifdef linux}
{$define gtkpaint}
{$define linuxgtk}
{$else}
{$define gdipaint}
{$endif}
uses utslvclconstant,utslvclmemstruct,utslvclauxiliary,UVCPropertyTypesPersistence;
type tswin32api = class({$ifdef linuxgtk}tsgtkapi {$else} twindowsapi {$endif} ) //windows接口
{$ifdef linuxgtk}
uses ugtkinterface;
{$else}
uses uwindowsinterface;
{$endif}
{**
@explan(说明) win32api接口函数类
1. 导出了部分win32的api
2. winuser头文件的宏定义
3. 添加了部分结构体定义到成员变量
4. 下面的external函数的win32api可以在msdn中查找具体用法
**}
public
function GetScreenRect();
begin
{**
@explan(说明) 获取屏幕大小%%
@return(array) 左上右下 %%
**}
rc := new tcrect();
SystemParametersInfoA(0x30,0,rc._getptr_(),0);
return rc._getdata_();
end
function getpathbyprocid(id);
begin
{**
@explan(说明) 获取所有进程路径 %%
@param(id)(integer) 进程id
**}
strFilePath := "";
len := 1024;
setlength(strFilePath,len);
hd := OpenProcess(0x000F0000L .| 0x00100000L .| 0xFFFF,0,id);
GetModuleFileNameExA(hd,0,strFilePath,len);
//QueryFullProcessImageNameA(hd, 1, strFilePath, len);
r := "";
for i := 1 to length(strFilePath) do
begin
vi := strFilePath[i];
if vi="\0" then break;
r += vi;
end
if hd then CloseHandle(hd);
return r;
end
function EnumProcesses();
begin
{**
@explan(说明) 获取所有进程id
**}
{**
@example(获取所有进程id,并获得路径)
t := EnumProcesses();
for i,v in t do echo getpathbyprocid(v),"\r\n";
**}
ret := zeros(2048);
EnumProcesses_(ret,length(ret)* 4,t);
r := "";
if t>0 then r := ret[0:t/4];
return r;
end
function Toolhelp32Snapshot();
begin
{**
@explan(说明) 获取所有进程信息 %%
@param()
@return(array) 进程信息 %%
**}
currentProcess := new Ttagprocessentry32();
hProcess := CreateToolhelp32Snapshot(2,0); //给系统内的所有进程拍一个快照
r := array();
if hProcess=-1 then return r;
bMore := Process32First(hProcess,currentProcess._getptr_); //获取第一个进程信息
countProcess := 0;
while(bMore) do
begin
r[countProcess]:= currentProcess._getdata_;
bMore := Process32Next(hProcess,currentProcess._getptr_); //遍历下一个
countProcess++;
end
CloseHandle(hProcess); //清除hProcess句柄
return r;
end
function Toolhelp32Snapshotmodule(id);
begin
{**
@explan(说明) 获取所有module信息
**}
if not(id >= 0)then id := 0;
currentProcess := new TtagMODULEENTRY32();
hProcess := CreateToolhelp32Snapshot(8,id); //给系统内的所有进程拍一个快照
r := array();
if hProcess=-1 then return r;
bMore := Module32First(hProcess,currentProcess._getptr_); //获取第一个进程信息
countProcess := 0;
while(bMore) do
begin
r[countProcess]:= currentProcess._getdata_;
bMore := Module32Next(hProcess,currentProcess._getptr_); //遍历下一个
countProcess++;
end
CloseHandle(hProcess); //清除hProcess句柄
return r;
end
function Comctl32version(); //获取comctl32.dll版本
begin
o := tslcstructure(array(
("cbsize","int",0),
("dwmajorversion","int",0),
("dwminorversion","int",0),
("dwbuildnumber","int",0),
("dwplatformid","int",0)));
o._setvalue_("cbsize",o._size_);
Comctl32DllGetVersion(o._getptr_);
return o._getdata_();
end
function shell32Version(); //获取shell32.dll版本
begin
o := tslcstructure(array(
("cbsize","int",0),
("dwmajorversion","int",0),
("dwminorversion","int",0),
("dwbuildnumber","int",0),
("dwplatformid","int",0)));
o._setvalue_("cbsize",o._size_);
shell32DllGetVersion(o._getptr_);
return o._getdata_();
end
function GetCursorInfo(); //获取cursor 信息
begin
{
字段:
flags 为0 表示 The cursor is hidden.
为1 表示 The cursor is showing.
为2 表示 The cursor is suppressed
hcursor 光标句柄
ptscreenpos 光标位置
}
o := new ctslctrans(array(
("cbsize","int",0,0,4,"int",1),
("flags","int",0,4,4,"int",1),
("hcursor","intptr",0,8,4,"intptr",1),
("ptscreenpos","int[2]",
(0,0),12,8,"intarray",2)),nil,nil);
o._setvalue_("cbsize",o._size_());
if(GetCursorInfo_(o._getptr_()))then
begin
return o._getdata_();
end
end
function GetMonitor(mhandle,r); //获得显示器信息%%
begin
r := new TMONITORINFO();
return GetMonitorInfoA(mhandle,r._getptr_());
end
end
type TSLUIBASE=class(TSLUICONST) //图像库基类
{**
@explan(说明)图像库基类,提供基本的底层操作和常量 %%
**}
private
FReCycleState;
static FTSLkeyWords;
static TSLRCS_NONE;
static TSLRCS_BEGIN;
static TSLRCS_END;
static FHAPP;
static FEditTypes;
_hashdata;
_temppath;
function Gethapp();
begin
return FHAPP;
end
function SetHapp(v);
begin
end
public
static _wapi; //windows api;
function create();virtual; //构造
begin
_hashdata := array();
sinit();
FReCycleState := TSLRCS_NONE;
end
class function sinit();virtual;
begin
{**
@explan(说明)初始化win32接口对象_wapi
**}
if not(_wapi)then
begin
global G_O_TSWIN32API_;
if not G_O_TSWIN32API_ then G_O_TSWIN32API_ := new tswin32api();
_wapi := G_O_TSWIN32API_;
FTSLkeyWords := TSL_ReservedKeys2();
end
if not FHAPP then
begin
FHAPP := _wapi.GetModuleHandleA(0);
TSLRCS_NONE := 0;
TSLRCS_BEGIN := 1;
TSLRCS_END := 2;
end
end
class Function isKeyWords(key);
begin
{**
@explan(说明) 判断是否为tsl关键字 %%
@param(key)(string)
**}
return ifstring(key)and ifarray(FTSLkeyWords)and(lowercase(key)in FTSLkeyWords);
return false;
end
function destroy();virtual;
begin
if FReCycleState=TSLRCS_NONE then Recycling();
end
function NoRecycled();
begin
{**
@explan(说明) 是否没有被回收 %%
@return(bool) 没有回收返回true ,否则返回false;
**}
return FReCycleState=TSLRCS_NONE;
end
function Recycling();virtual;
begin
{**
@explan(说明)析构准备;为消除循环引用的销毁
**}
if FReCycleState=TSLRCS_END then return;
_Tag := nil;
_hashdata := array();
FReCycling := true;
FReCycleState := TSLRCS_END;
end
function hashset(i,v,f);
begin
{**
@explan(说明)设置一个哈希值 %%
@param(i)(string | integer) 下标 %%
@param(f)(bool) i=nil and f=1 and v=array 替换哈希表 %%
@param(v)() 值
**}
if ifstring(i)or ifint(i)then
begin
_hashdata[i]:= v;
end else
if(ifnil(i)and ifarray(v)and(f=1))then _hashdata := v;
end
function hashget(i);
begin
{**
@explan(说明)获取一个哈希值 %%
@param(i)(string | integer) 下标 %%
@return() 值
**}
if ifstring(i)or ifint(i)then
begin
return _hashdata[i];
end else
if ifnil(i)then return _hashdata;
end
function hashdel(i,f);
begin
{**
@explan(说明)删除一个哈希值 %%
@param(i)(string | integer) 下标 %%
@param(f)(bool) i=nil and f=1 清空hash表 %%
@return(bool)是否成功
**}
if ifstring(i)or ifint(i)then
begin
return reindex(_hashdata,array(i:nil));
end else
if ifnil(i)and f=1 then _hashdata := array();
end
function caption(s);virtual;
begin
return "";
end
function temppath();
begin
{**
@explan(说明) 获取一个可以读写的文件夹 %%
@return(string) 目录路径 %%
**}
if not(ifstring(_temppath)and _temppath)then _temppath := gettemppath()+"tinysoft";
return _temppath;
end
class function RegPropertyType(v); //注册设计器编辑
begin
RegComponentPropertyType(v);
end
class function GetPropertyType(n); //获得设计器编辑
begin
return GetComponentPropertyType(n);
end
property happ read Gethapp write SetHapp;
property ReCycleState read FReCycleState; //write FReCycleState;
_Tag; //标签
{**
@param(_wapi)(tswin32api) win32宏定义,以及api接口 %%
@param(_Tag)(any) 调用者使用的成员变量 %%
**}
end
type TWMNCHITTEST=class(TSLUICONST) // hittest消息处理类
function hitstyle(o,e);
begin
return hitstyle2(o,e.lolparam,e.hilparam);
end
function hitstyle2(o,x,y);
begin
//rec := o.clientrect(); //客户区
//p := o.screentoclient(e.lolparam,e.hilparam);
rec := zeros(4);
o._wapi.GetWindowRect(o.Handle,rec);
p := array(x,y); //
r := borerhittest(p,rec,4);
r := inttohit(r);
return r;
end
function inttohit(i);
begin
r := HTCLIENT;
case i of
1:r := HTTOPLEFT;
2:r := HTTOPRIGHT;
3:r := HTBOTTOMRIGHT;
4:r := HTBOTTOMLEFT;
5:r := HTLEFT;
6:r := HTTOP;
7:r := HTRIGHT;
8:r := HTBOTTOM;
end;
return r;
end
function borerhittest(p,rec,dv);
begin
rec[0]+= 1;
rec[1]+= 1;
rec[2]-= 1;
rec[3]+= 1;
ps := array(rec[0:1],(rec[2],rec[1]),(rec[2],rec[3]),(rec[0],rec[3]));
ds := array();
for i,v in ps do
begin
ds[i]:= integer(sqrt((p[0]-v[0])^2+(p[1]-v[1])^2));
end
minds := minvalue(ds);
if minds<dv then
begin
for i,v in ds do if minds=v then
begin
return i+1;
end
end
ds := array();
ds[0]:= abs(p[0]-rec[0]);
ds[1]:= abs(p[1]-rec[1]);
ds[2]:= abs(p[0]-rec[2]);
ds[3]:= abs(p[1]-rec[3]);
minds := minvalue(ds);
if minds<dv then
begin
for i,v in ds do if minds=v then
begin
return i+5;
end
end
return 0;
end
end
implementation
initialization
end.