界面库

优化升级
This commit is contained in:
tslediter 2024-01-17 16:25:51 +08:00
parent 7146bd0fe6
commit 5d69525909
5 changed files with 178 additions and 89 deletions

View File

@ -1263,6 +1263,12 @@ type TWinControl = class(tcontrol)
//rc := ps._getvalue_("rcpaint");
img := _wapi.cairo_image_surface_create(1,cr[2]-cr[0]+100,cr[3]-cr[1]+100);
memdc := _wapi.cairo_create(img);
rcpaint := ps.rcpaint;
_wapi.gtk_object_set_data(memdc,nil);
_wapi.cairo_reset_clip(memdc);
rng := _wapi.CreateRectRgn(rcpaint[0],rcpaint[1],rcpaint[2],rcpaint[3]);
_wapi.SelectClipRgn(memdc,rng);
{$endif}
e.wparam := memdc;
if Color then
@ -1272,9 +1278,11 @@ type TWinControl = class(tcontrol)
Dispatch(o,e);
e.wparam := 0;
rc := ps.rcpaint;
{$ifdef gdipaint}
_wapi.BitBlt(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1],memdc,rc[0],rc[1],SRCCOPY); //_wapi.BitBlt(dc,c[0],c[1],c[2],c[3],memdc,0,0,SRCCOPY);
{$else}
_wapi.SelectClipRgn(memdc,0);
_wapi.cairo_set_source_surface(dc, img, 0, 0);
_wapi.cairo_rectangle(dc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]);
_wapi.cairo_clip(dc);
@ -1417,8 +1425,8 @@ type TWinControl = class(tcontrol)
c := array(0,0); //设置基准点,为00 20201112 修改
rcpaint := PaintStruct().rcpaint;
if sum(rcpaint)<4 then exit;
rgC := _wapi.CreateRectRgn(0,0,10,10);
rga := _wapi.CreateRectRgn(rcpaint[0],rcpaint[1],rcpaint[2],rcpaint[3]);
//rgC := _wapi.CreateRectRgn(0,0,10,10);
//rga := _wapi.CreateRectRgn(rcpaint[0],rcpaint[1],rcpaint[2],rcpaint[3]);
try
for i := 0 to ControlCount-1 do
begin
@ -1433,8 +1441,9 @@ type TWinControl = class(tcontrol)
end
//rgb := _wapi.CreateRectRgn(itbounds[0],itbounds[1],itbounds[2],itbounds[3]); //控件区域
rgb := _wapi.CreateRectRgn(outrect[0],outrect[1],outrect[2],outrect[3]); //控件区域
_wapi.CombineRgn(rgC,rga,rgb,RGN_AND); //控件绘画区域
bkrg := _wapi.SelectClipRgn(TheMessage.wparam,rgc); //裁剪区域
//_wapi.CombineRgn(rgC,rga,rgb,RGN_AND); //控件绘画区域
//bkrg := _wapi.SelectClipRgn(TheMessage.wparam,rgc); //裁剪区域
bkrg := _wapi.SelectClipRgn(TheMessage.wparam,rgb); //裁剪区域
try
pts := it.PaintStruct();
pts._setvalue_("rcpaint",array(outrect[0]-itbounds[0],outrect[1]-itbounds[1],outrect[2]-itbounds[0],outrect[3]-itbounds[1]));
@ -1449,8 +1458,8 @@ type TWinControl = class(tcontrol)
end
end
finally
_wapi.DeleteObject(rga);
_wapi.DeleteObject(rgc);
//_wapi.DeleteObject(rga);
//_wapi.DeleteObject(rgc);
end;
end
procedure PaintWindow(DC:HDC);virtual;

View File

@ -741,17 +741,24 @@ type tsgtkapi = class(tgtkapis)
InvalidateRect(hwnd,0,f);
end
//////////////////////////////gdi///////////////////////////////////////////
function cairo_clear_clip(hdc,rc);
begin
cairo_reset_clip(hdc);
cairo_rectangle(hdc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]);
cairo_clip(hdc);
end
function SelectObject(hdc :pointer;gdiobj:pointer);
begin
//
if not hdc then return 0;
if not(gdiobj>0 or gdiobj<0) then return 0;
global gtk_gdi_object_globals;
if not ifarray(gtk_gdi_object_globals) then return 0;
obj := gtk_gdi_object_globals[inttostr(gdiobj)];
gdiindex := inttostr(gdiobj);
obj := gtk_gdi_object_globals[gdiindex];
if not obj then return 0;
t := obj[1];
o := obj[0];
//gtk_gdi_object_globals[gdiindex,"hdc"] := hdc;
case obj[1] of
"pen":
begin
@ -774,10 +781,24 @@ type tsgtkapi = class(tgtkapis)
end
"rgn":
begin
x := gtk_object_get_data(dc,"viewport.x");
y := gtk_object_get_data(dc,"viewport.y");
r := gtk_object_get_data(hdc,"rgn");
gtk_object_set_data(hdc,"rgn",gdiobj);
rc := (new TCRect(gdiobj))._getdata_();
rc[0]+=x;
rc[2]+=x;
rc[1]+=y;
rc[3]+=y;
gtk_object_set_data(hdc,"rgn-rec",rc);
cairo_clear_clip(hdc,rc);
end
end ;
if r then
begin
//if ifarray(gtk_gdi_object_globals[inttostr(r)]) then gtk_gdi_object_globals[inttostr(r),"hdc"] := nil;
end
return r;
end
function textoutexa(hdc :pointer;X:integer;y:integer;txt:string;len:integer):integer;
@ -786,8 +807,7 @@ type tsgtkapi = class(tgtkapis)
// gtk_rgb_color_rgb(cl,r,g,b);
// cairo_set_source_rgb(hdc, r, g, b);
xb := gtk_object_get_data(hdc,"viewport.x");
yb := gtk_object_get_data(hdc,"viewport.y");
make_sure_rgn(hdc,xb,yb);
yb := gtk_object_get_data(hdc,"viewport.y");
ft := gtk_object_get_data(hdc,"font");
global gtk_gdi_object_globals;
if ft and ifarray(gtk_gdi_object_globals) then
@ -1038,17 +1058,17 @@ type tsgtkapi = class(tgtkapis)
begin
sy := rec[3]-3-ht;
end
bk := gtk_object_get_data(hdc,"rgn-rec");
gtk_object_set_data(hdc,"rgn-rec",rec);
r := TextOutexA(hdc,sx,sy,txt,slen);
if ifarray(bk) then
rgnrec := gtk_object_get_data(hdc,"rgn-rec");
if rgnrec then
begin
end else
begin
cairo_reset_clip(hdc);
end
gtk_object_set_data(hdc,"rgn-rec",bk);
x := gtk_object_get_data(hdc,"viewport.x");
y := gtk_object_get_data(hdc,"viewport.y");
reci := array(rec[0]+x,rec[1]+y,rec[2]+x,rec[3]+y);
if not intersectrect(rgnrec,reci,reco) then return 0;
cairo_clear_clip(hdc,reco);
end
r := TextOutexA(hdc,sx,sy,txt,slen);
if rgnrec then cairo_clear_clip(hdc,rgnrec);
return r;
end
Function SetTextColor(hdc :pointer;col:integer):integer;
@ -1086,7 +1106,6 @@ type tsgtkapi = class(tgtkapis)
cl := brs[0].Color;
x := gtk_object_get_data(dc,"viewport.x");
y := gtk_object_get_data(dc,"viewport.y");
make_sure_rgn(hdc,x,y);
cairo_rectangle(dc, x+rec[0], y+rec[1], rec[2]-rec[0], rec[3]-rec[1]);
gtk_rgb_color_rgb(cl,r,g,b);
cairo_set_source_rgb(dc,r,g,b);
@ -1105,22 +1124,12 @@ type tsgtkapi = class(tgtkapis)
cl := brs[0].Color;
x := gtk_object_get_data(dc,"viewport.x");
y := gtk_object_get_data(dc,"viewport.y");
make_sure_rgn(hdc,x,y);
cairo_rectangle(dc, x+rec[0], y+rec[1], rec[2]-rec[0], rec[3]-rec[1]);
gtk_rgb_color_rgb(cl,r,g,b);
cairo_set_source_rgb(dc,1-r,1-g,1-b);
cairo_fill(dc);
end
end
function make_sure_rgn(hdc,x,y);
begin
rc := gtk_object_get_data(hdc,"rgn-rec");
if rc then
begin
cairo_rectangle(hdc,rc[0]+x,rc[1]+y,rc[2]-rc[0],rc[3]-rc[1]);
cairo_clip(hdc);
end
end
function ReleaseDC(hwd :pointer;hdc:pointer):integer;
begin
DeleteDC(hdc);
@ -1134,42 +1143,11 @@ type tsgtkapi = class(tgtkapis)
gtk_object_set_data(hdc,"rgn-rec",nil);
cairo_reset_clip(hdc);
end
else
begin
rr := gtk_object_get_data(hdc,"rgn");
if rr = gdiobj then return ;
p := new TCRect(gdiobj);
rc := p._getdata_();
gtk_object_set_data(hdc,"rgn-rec",rc);
end
return r;
return r;
r := SelectObject(hdc,gdiobj);
if not(gdiobj) then
begin
gtk_object_set_data(hdc,"rgn",nil);
cairo_reset_clip(hdc);
end
else
begin
rr := gtk_object_get_data(hdc,"rgn");
if rr = gdiobj then return ;
p := new TCRect(gdiobj);
rc := p._getdata_();
cairo_reset_clip(hdc);
x := gtk_object_get_data(dc,"viewport.x"); //¿ØÖÆ»ù׼λÖÃ
y := gtk_object_get_data(dc,"viewport.y");
cairo_rectangle(hdc,rc[0]+x,rc[1]+y,rc[2]-rc[0],rc[3]-rc[1]);
cairo_clip(hdc);
//gtk_object_set_data(hdc,"rgn",gdiobj);
end
return r;
end
function CreateRectRgn(nLeftRect:integer;nTopRect:integer;nRightRect:integer;nBottomRect:integer):pointer;
begin
global gtk_gdi_object_globals;
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
global gtk_gdi_object_globals;
p := new TCRect();
p.left := nLeftRect;
p.top := nTopRect;
@ -1213,10 +1191,11 @@ type tsgtkapi = class(tgtkapis)
function DeleteObject(gdiobj :pointer);//ɾ³ýgdi¶ÔÏó
begin
global gtk_gdi_object_globals;
if not ifarray(gtk_gdi_object_globals) then return 0;
r := gtk_gdi_object_globals[inttostr( gdiobj)];
gdiindex := inttostr( gdiobj);
r := gtk_gdi_object_globals[gdiindex];
if r then
begin
//if ifarray(gtk_gdi_object_globals[inttostr(r)]) then gtk_gdi_object_globals[inttostr(r),"hdc"] := nil;
reindex(gtk_gdi_object_globals,array(inttostr(gdiobj):nil));
return true;
end
@ -1242,7 +1221,6 @@ type tsgtkapi = class(tgtkapis)
function CreatePen(FS,w,FC); //gtk Ä£Äâ pen
begin
global gtk_gdi_object_globals;
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
p := new ttgtk_pen();
p.width := w;
p.color := FC;
@ -1255,7 +1233,6 @@ type tsgtkapi = class(tgtkapis)
function CreateSolidBrush(crColor:integer);
begin
global gtk_gdi_object_globals;
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
p := new ttgtk_brush();
p.color := crColor;
ptr := p._getptr_();
@ -1263,10 +1240,8 @@ type tsgtkapi = class(tgtkapis)
return ptr;
end
function CreateFontIndirectA(lplf:pointer);
begin
begin
global gtk_gdi_object_globals;
if not ifarray(gtk_gdi_object_globals) then gtk_gdi_object_globals := array();
p := new ttgtk_font();
p2 := new ttgtk_font(lplf);
for i,v in array("height","width","escapement","orientation","weight","italic","underline","strikeout","charset","outprecision","clipprecision","quality","pitchandfamily","facename") do
@ -1308,8 +1283,7 @@ type tsgtkapi = class(tgtkapis)
gtk_rgb_color_rgb(pc,rc,gc,bc);
cairo_set_source_rgb(dc,rc,gc,bc);
end
cairo_applay_pen_style(dc);
make_sure_rgn(hdc,xb,yb);
cairo_applay_pen_style(dc); //LineTo
xy := gtk_object_get_data(dc,"movepointto");
if xy then
begin
@ -1508,7 +1482,7 @@ type tsgtkapi = class(tgtkapis)
global gtk_gdi_object_globals;
wd := 8;
ht := 16;
if ft and ifarray(gtk_gdi_object_globals) then
if ft then
begin
fto := gtk_gdi_object_globals[inttostr(ft)];
if fto then fto := fto[0];
@ -1861,7 +1835,7 @@ type tsgtkapi = class(tgtkapis)
y := gtk_object_get_data(dc,"viewport.y");
pc := gtk_object_get_data(dc,"pen.color");
pw := gtk_object_get_data(dc,"pen.width");
if pw>0 then cairo_set_line_width(dc,pw);
if pw>0 then cairo_set_line_width(dc,pw);
else cairo_set_line_width(dc,1);
if pc=0 then
begin
@ -2543,6 +2517,7 @@ type tsgtkapi = class(tgtkapis)
global g_gtk_ttimer_cache;
if not ifarray(g_gtk_ttimer_cache) then return 0;
obj := g_gtk_ttimer_cache[nIDEvent] ;
if not obj then return 0;
g_source_remove(obj._getvalue_(0));
reindex(g_gtk_ttimer_cache,array(nIDEvent:nil));
return true;
@ -3011,6 +2986,7 @@ type tsgtkapi = class(tgtkapis)
SetActiveWindow(hwd);
end
//socket
{
function socket(af:integer;tp:integer;protocol:integer):pointer;begin end
function WSAStartup(af:SHORT;DA:pointer):integer;begin end
function WSACleanup():integer;begin end
@ -3032,6 +3008,7 @@ type tsgtkapi = class(tgtkapis)
function ioctlsocket(s:pointer;cmd:integer;var argp:integer):integer;begin end
function setsockopt(s:pointer;level:integer;optname:integer;optval:string;optlen:integer):integer;begin end
function getsockopt(s:pointer;level:integer;optname:integer;var optval:string;var optlen:integer):integer;begin end
}
end
@ -4009,6 +3986,11 @@ type tgtkapis = class() //gtk
_f_ := static function(kmp:pointer):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(kmp);
end
function gdk_keymap_get_caps_lock_state(kmp:pointer):integer;
begin
_f_ := static function(kmp:pointer):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(kmp);
end
function gdk_screen_get_default():pointer;
begin
@ -4669,9 +4651,9 @@ type tgtkapis = class() //gtk
_f_ := static procedure(c:pointer;var x1:double;var y1:double;var x2:double;var y2:double);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(c,x1,y1,x2,y2);
end
function cairo_in_clip(c:pointer;x:double;y:double);
function cairo_in_clip(c:pointer;x:double;y:double):integer;
begin
_f_ := static function(c:pointer;x:double;y:double);cdecl;external getfuncptrbyname(0,functionname());
_f_ := static function(c:pointer;x:double;y:double):integer;cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(c,x,y);
end
procedure cairo_reset_clip(c:pointer);
@ -4844,10 +4826,18 @@ type tgtkapis = class() //gtk
begin
_f_ := static procedure(c:pointer;offset:double;r:double;g:double;b:double;a:double);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(c,offset,r,g,b,a);
end
end
/////////////////////////window//////////
procedure gtk_window_set_keep_above(w:pointer;f:integer);
begin
_f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,f);
end
procedure gtk_window_set_keep_below(w:pointer;f:integer);
begin
_f_ := static procedure(w:pointer;f:integer);cdecl;external getfuncptrbyname(0,functionname());
return ##_f_(w,f);
end
function gtk_window_list_toplevels():pointer;
begin
_f_ := static function():pointer;cdecl;external getfuncptrbyname(0,functionname());
@ -8124,6 +8114,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
//cr := _wapi.gdk_cairo_create(_wapi.gtk_widget_get_window(hd));
cr :=c;//rec := r;
rec := zeros(4); _wapi.gdk_cairo_get_clip_rectangle(cr,rec);
_Wapi.g_object_get_data(cr,nil);
//_wapi.cairo_clip_extents(cr,x,y,w,h);
hwd := handle;
_wapi.g_object_set_data(hwd,"paint_dc",cr);
@ -8151,7 +8142,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
CallTslVclProc(_const.WM_NCPAINT,0,cr); //»æÖÆ
end
end
//_wapi.cairo_destroy(cr);
//_wapi.cairo_destroy(cr);
_wapi.gtk_object_set_data(cr);
end;
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
@ -8452,7 +8443,7 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
private
ftarget ;
fscrollinfos;
ftimerobj;
ftimerobj;ftimerfptr;
Fscrolltimedo;
FStatscrollTime;
public
@ -8498,8 +8489,22 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
dr := ed.direction;
if dr<>0 and dr<>1 then return ;
x := ed.x;//ed.x_root;
y := ed.y;//ed.y_root;
r := array();
y := ed.y;//ed.y_root;-_wapi.gtk_object_get_data_title_height(h);
//////////////λÖô¦Àí////////////////////////////////////////////////////////
mb := _wapi.g_object_get_data(h,"menubar");
if mb and _wapi.gtk_widget_is_visible(mb) then
begin
rec := zeros(4);
_wapi.gtk_widget_get_allocation(mb,rec);
y-=rec[3];
end
if _wapi.gdk_backend_is_wayland() then
begin
global g_gtk_shadow_width,g_gtk_shadow_heigt;
y-=integer(g_gtk_shadow_heigt/2);//_wapi.gtk_object_get_data_title_height(h);
end
////////////////////////////////////////////////////////
r := array();
_wapi.GetTopWidgetList(h,x,y,r);
lenr := length(r)-1;
for i := lenr downto 0 do
@ -8523,7 +8528,8 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
if not ftimerobj then
begin
fscrollinfos := array();
Fscrolltimedo := makeinstance(thisfunction(scrolltimedo));
ftimerfptr := makeinstance(weakref_get(thisfunction(scrolltimedo)));
Fscrolltimedo := ftimerfptr;
ftimerobj := new ttmstruct(nil);
rt := _wapi.g_timeout_add(8,Fscrolltimedo,ftimerobj._getptr_() );
ftimerobj._setvalue_(0,rt);
@ -8541,6 +8547,14 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
function Destroy();override;
begin
inherited;
if ftimerobj then
begin
_wapi.g_source_remove(ftimerobj._getvalue_(0));
deleteinstance(ftimerfptr);
ftimerfptr := 0;
ftimerobj := nil;
end
get_instance_u(thisfunction(do_motion));
get_instance_u(thisfunction(do_received));
get_instance_u(thisfunction(do_drop));
@ -8677,7 +8691,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
eheight := cf.height;
dw := abs(AWidth-ewidth);
dh := abs(AHeight-eheight);
if dw>10 and dh>10 then
if dw>10 and dh>10 and dw<200 and dh<200 then
begin
g_gtk_shadow_width := dw;
g_gtk_shadow_heigt := dh;
@ -9613,8 +9627,9 @@ begin
global g_w_i_datas,g_w_c_width, g_gtk_buttontable,g_gtk_keytable,
g_gtk_call_handler_manager,g_gtk_font_get_size,g_gtk_dragxy,
g_gtk_shadow_width,g_gtk_shadow_heigt,g_gtk_shadow_size_nset,
G_E_ID_Name_1,G_E_ID_Name_2,g_Caret_Blink_Time,g_ansi_unit_cache;
G_E_ID_Name_1,G_E_ID_Name_2,g_Caret_Blink_Time,g_ansi_unit_cache,gtk_gdi_object_globals;
g_ansi_unit_cache := array();
gtk_gdi_object_globals := array();
G_E_ID_Name_2 := array();
G_E_ID_Name_1 := array(
"wm-user":10,

View File

@ -1067,7 +1067,6 @@ type TcustomInPutQuerys= class(tcustomscrollcontrol)
static SFInputType;
static SHashInited;
end
implementation
type TInputEditor=class()
{**
@ignore(ºöÂÔ) %%
@ -1121,6 +1120,7 @@ type TInputEditor=class()
end
FNextCtrl;
end
implementation
type tinputbool=class(tcustomcheckbtn,TInputEditor)
{**
@explan(˵Ã÷) ÊäÈë¿ò %%
@ -1429,7 +1429,7 @@ begin
global g_dlg_call_back;
if not g_dlg_call_back then
begin
g_dlg_call_back := makeinstance(thisfunction(folderdlgcall));
g_dlg_call_back := makeinstance(weakref_get( thisfunction(folderdlgcall)));
end
return g_dlg_call_back;
end

View File

@ -729,6 +729,12 @@ type tcustompagecontrol = class(TCustomControl)
function acceptsheettype(ty,del);
begin
idx := 0;
if ifstring(ty) and ty then
begin
ob := findclass(ty);
if ob then return acceptsheettype(ob,del);
return false;
end
if ty is class(tcontrol) then
begin
idx := inttostr(int64(ty));
@ -741,6 +747,7 @@ type tcustompagecontrol = class(TCustomControl)
begin
faccepttype[idx] := ty;
end
return true;
end
{**
@param(cursel)(integer) 当前选中序号 %%

View File

@ -6767,7 +6767,65 @@ type tcustomprocess = class(tcomponent) //
ftm.Interval := 500;
ftm.Ontimer := thisfunction(dispatchproc);
end
end
end
function executeblock(exe,cmd); //阻塞执行
begin
if fprocesshandle then return 0;
if fexecstr then
begin
e := exe;
if not(ifstring(e) and e) then return 0;
arg := cmd;
end else
begin
if not parserasexeclevparam(exe,cmd,e,arg,envp) then return 0;
end
//////////////处理linux启动路径/////////////////////
{$ifdef linux}
for i := length(e) downto 2 do
begin
if e[i]="/" then
begin
ph := e[1:i];
break;
end
end
envp := array();
if ph then
begin
envp[length(envp)] := "LD_LIBRARY_PATH="+ph;
end
Sysexecsetenvs(envp,1);
{$endif}
///////////////////////////处理管道////////////////////////
Sysexecnewpipe(0);
ferrinfo := nil;
sdir :=nil;
if ifstring(fStartupDirectory) and fStartupDirectory then
begin
if fStartupDirectory[length(fStartupDirectory)]=iofileseparator() then
begin
if filelist("",fStartupDirectory+"*") then
begin
sdir := fStartupDirectory;
end
end else
begin
if filelist("",fStartupDirectory) then
begin
sdir := fStartupDirectory+iofileseparator();
end
end
end
hd := sysexec(e,arg,sdir,true,code);
if ifarray(code) then
begin
doprocecho(self(true),code["out"]);
ferrinfo:=code["code"];
end
Sysexecdeletepipe(0);
return hd;
end
function CreateProcess(exe,cmd,exitWithParent);
begin
{**