界面库

优化visibe的消息处理
This commit is contained in:
tslediter 2024-01-11 10:44:25 +08:00
parent e6dd894873
commit 7146bd0fe6
2 changed files with 105 additions and 33 deletions

View File

@ -926,6 +926,10 @@ type TWinControl = class(tcontrol)
__wexstyle := co.dwexstyle; __wexstyle := co.dwexstyle;
end end
end end
function WMSHOWWINDOW(o,e):WM_SHOWWINDOW;virtual;
begin
FVisible := e.wparam?true:false;
end
function WMSETCURSOR(o,e):WM_SETCURSOR;virtual; function WMSETCURSOR(o,e):WM_SETCURSOR;virtual;
begin begin
if e.lolparam=HTCLIENT then if e.lolparam=HTCLIENT then

View File

@ -390,7 +390,7 @@ type tsgtkapi = class(tgtkapis)
//pt := GetParent(dialog); //pt := GetParent(dialog);
gtk_window_set_transient_for( GTK_WINDOW(dialog),0); gtk_window_set_transient_for( GTK_WINDOW(dialog),0);
//gtk_window_set_modal(GTK_WINDOW( dialog),false); //屏蔽掉showmodal //gtk_window_set_modal(GTK_WINDOW( dialog),false); //屏蔽掉showmodal
w.Visible := false; //w.Visible := false;
gtk_widget_hide(dialog); gtk_widget_hide(dialog);
pts := g_object_get_data(dialog,"modaling_top_parent"); pts := g_object_get_data(dialog,"modaling_top_parent");
if (pts) then if (pts) then
@ -401,7 +401,7 @@ type tsgtkapi = class(tgtkapis)
begin begin
gtk_widget_set_sensitive(pt,true); gtk_widget_set_sensitive(pt,true);
end end
end end
end end
function GetParent(h); //获得父窗口 function GetParent(h); //获得父窗口
begin begin
@ -462,13 +462,13 @@ type tsgtkapi = class(tgtkapis)
wd := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(h); wd := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(h);
if wd then return wd.gethitstyle(x,y); if wd then return wd.gethitstyle(x,y);
return 0; return 0;
end end
function GetTopWidgetList(h,x,y,r); function GetTopWidgetList(h,x,y,r);
begin begin
wd := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(h); wd := class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(h);
if wd and wd.Visible and wd.Enabled then if wd and wd.Visible and wd.Enabled then //¿É¼ûÒÆÈë×Ó´°¿ÚÅжÏ
begin begin
xy := wd.ScreenToClient(x,y); xy :=array(x,y) ;//wd.ScreenToClient(x,y);
if xy[0]>0 and xy[1]>0 and wd.width>xy[0] and wd.height>xy[1] then if xy[0]>0 and xy[1]>0 and wd.width>xy[0] and wd.height>xy[1] then
begin begin
r[length(r)] := array(h,xy); r[length(r)] := array(h,xy);
@ -478,12 +478,12 @@ type tsgtkapi = class(tgtkapis)
ci := ctls[i]; ci := ctls[i];
if (ci is class(TWinControl)) and ci.HandleAllocated() and (not ci.WsPopUp) then if (ci is class(TWinControl)) and ci.HandleAllocated() and (not ci.WsPopUp) then
begin begin
GetTopWidgetList(ci.Handle,x,y,r); GetTopWidgetList(ci.Handle,x-ci.left,y-ci.top,r);
end end
end end
end end
end end
end end
// class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(hwnd); // class(tUIglobalData).uigetdata("TGlobalComponentcache").getwndbyhwnd(hwnd);
function Gtk_TrigMoveSizeEvent(h,aleft,atop,AWidth,AHeight,flg); function Gtk_TrigMoveSizeEvent(h,aleft,atop,AWidth,AHeight,flg);
begin begin
@ -780,13 +780,14 @@ type tsgtkapi = class(tgtkapis)
end ; end ;
return r; return r;
end end
Function TextOutA(hdc :pointer;X:integer;y:integer;txt:string;len:integer):integer; function textoutexa(hdc :pointer;X:integer;y:integer;txt:string;len:integer):integer;
begin begin
cl := gtk_object_get_data(hdc,"text.color"); cl := gtk_object_get_data(hdc,"text.color");
// gtk_rgb_color_rgb(cl,r,g,b); // gtk_rgb_color_rgb(cl,r,g,b);
// cairo_set_source_rgb(hdc, r, g, b); // cairo_set_source_rgb(hdc, r, g, b);
xb := gtk_object_get_data(hdc,"viewport.x"); xb := gtk_object_get_data(hdc,"viewport.x");
yb := gtk_object_get_data(hdc,"viewport.y"); yb := gtk_object_get_data(hdc,"viewport.y");
make_sure_rgn(hdc,xb,yb);
ft := gtk_object_get_data(hdc,"font"); ft := gtk_object_get_data(hdc,"font");
global gtk_gdi_object_globals; global gtk_gdi_object_globals;
if ft and ifarray(gtk_gdi_object_globals) then if ft and ifarray(gtk_gdi_object_globals) then
@ -945,6 +946,18 @@ type tsgtkapi = class(tgtkapis)
end end
return 1; return 1;
end end
Function TextOutA(hdc :pointer;X:integer;y:integer;txt:string;len:integer):integer;
begin
s := txt;
for i,v in array("\r","\n") do
begin
if pos(v,s) then
begin
s := replacetext(s,v,"");
end
end
return textoutexa(hdc,x,y,s,min(len,length(s)));
end
Function DrawTextA(hdc :pointer;txt:string;len:integer;rec:array of integer;fmt:integer):integer; Function DrawTextA(hdc :pointer;txt:string;len:integer;rec:array of integer;fmt:integer):integer;
begin begin
//输出字符数 //输出字符数
@ -964,6 +977,24 @@ type tsgtkapi = class(tgtkapis)
wd := fto._getvalue_("width"); wd := fto._getvalue_("width");
ht := fto._getvalue_("height"); ht := fto._getvalue_("height");
end end
rl:=0;
mxl := 0;
rs := 1;
for i := 1 to length(txt) do
begin
vi:=txt[i];
if vi="\r" then continue;
if vi="\n" then
begin
rs++;
mxl := max(mxl,rl);
rl := 0;
continue;
end
rl++;
end
ht := ht*rs;
mxl := max(mxl,rl);
//DT_LEFT := 0; //DT_LEFT := 0;
DT_RIGHT := 0x2; DT_RIGHT := 0x2;
//DT_TOP := 0; //DT_TOP := 0;
@ -973,7 +1004,7 @@ type tsgtkapi = class(tgtkapis)
//DT_SINGLELINE:= 0x20; //DT_SINGLELINE:= 0x20;
//DT_TABSTOP:= 0x80; //DT_TABSTOP:= 0x80;
rw := rec[2]-rec[0]; rw := rec[2]-rec[0];
nlen := min(len, min(integer(rw/wd),slen)); nlen := min(len, min(integer(rw/wd),mxl));
sx := rec[0]; sx := rec[0];
rh := rec[3]-rec[1]; rh := rec[3]-rec[1];
sy := rec[1]; sy := rec[1];
@ -983,7 +1014,7 @@ type tsgtkapi = class(tgtkapis)
end end
if (fmt .& DT_CENTER)=DT_CENTER then //处理 if (fmt .& DT_CENTER)=DT_CENTER then //处理
begin begin
if nlen = slen then if nlen = mxl then
begin begin
sx +=(rw-(nlen*wd))/2; sx +=(rw-(nlen*wd))/2;
end end
@ -1006,21 +1037,18 @@ type tsgtkapi = class(tgtkapis)
if (fmt .& DT_BOTTOM)=DT_BOTTOM then //不处理 if (fmt .& DT_BOTTOM)=DT_BOTTOM then //不处理
begin begin
sy := rec[3]-3-ht; sy := rec[3]-3-ht;
end end
r := TextOutA(hdc,sx,sy,txt,nlen); bk := gtk_object_get_data(hdc,"rgn-rec");
return r; gtk_object_set_data(hdc,"rgn-rec",rec);
rr := gtk_object_get_data(hdc,"rgn"); r := TextOutexA(hdc,sx,sy,txt,slen);
if rr then if ifarray(bk) then
begin begin
p := new TCRect(rr);
rc := p._getdata_();
cairo_reset_clip(hdc);
cairo_rectangle(hdc,rc[0],rc[1],rc[2]-rc[0],rc[3]-rc[1]);
cairo_clip(hdc);
end else end else
begin begin
cairo_reset_clip(hdc); cairo_reset_clip(hdc);
end end
gtk_object_set_data(hdc,"rgn-rec",bk);
return r; return r;
end end
Function SetTextColor(hdc :pointer;col:integer):integer; Function SetTextColor(hdc :pointer;col:integer):integer;
@ -1058,6 +1086,7 @@ type tsgtkapi = class(tgtkapis)
cl := brs[0].Color; cl := brs[0].Color;
x := gtk_object_get_data(dc,"viewport.x"); x := gtk_object_get_data(dc,"viewport.x");
y := gtk_object_get_data(dc,"viewport.y"); 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]); 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); gtk_rgb_color_rgb(cl,r,g,b);
cairo_set_source_rgb(dc,r,g,b); cairo_set_source_rgb(dc,r,g,b);
@ -1076,18 +1105,46 @@ type tsgtkapi = class(tgtkapis)
cl := brs[0].Color; cl := brs[0].Color;
x := gtk_object_get_data(dc,"viewport.x"); x := gtk_object_get_data(dc,"viewport.x");
y := gtk_object_get_data(dc,"viewport.y"); 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]); 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); gtk_rgb_color_rgb(cl,r,g,b);
cairo_set_source_rgb(dc,1-r,1-g,1-b); cairo_set_source_rgb(dc,1-r,1-g,1-b);
cairo_fill(dc); cairo_fill(dc);
end end
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; function ReleaseDC(hwd :pointer;hdc:pointer):integer;
begin begin
DeleteDC(hdc); DeleteDC(hdc);
end end
function SelectClipRgn(hdc :pointer;gdiobj:pointer); function SelectClipRgn(hdc :pointer;gdiobj:pointer);
begin begin
r := SelectObject(hdc,gdiobj);
if not(gdiobj) then
begin
gtk_object_set_data(hdc,"rgn",nil);
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); r := SelectObject(hdc,gdiobj);
if not(gdiobj) then if not(gdiobj) then
begin begin
@ -1097,7 +1154,7 @@ type tsgtkapi = class(tgtkapis)
else else
begin begin
rr := gtk_object_get_data(hdc,"rgn"); rr := gtk_object_get_data(hdc,"rgn");
if rr <> gdiobj then return ; if rr = gdiobj then return ;
p := new TCRect(gdiobj); p := new TCRect(gdiobj);
rc := p._getdata_(); rc := p._getdata_();
cairo_reset_clip(hdc); cairo_reset_clip(hdc);
@ -1252,6 +1309,7 @@ type tsgtkapi = class(tgtkapis)
cairo_set_source_rgb(dc,rc,gc,bc); cairo_set_source_rgb(dc,rc,gc,bc);
end end
cairo_applay_pen_style(dc); cairo_applay_pen_style(dc);
make_sure_rgn(hdc,xb,yb);
xy := gtk_object_get_data(dc,"movepointto"); xy := gtk_object_get_data(dc,"movepointto");
if xy then if xy then
begin begin
@ -1391,7 +1449,7 @@ type tsgtkapi = class(tgtkapis)
if ifarray(p1) then if ifarray(p1) then
begin begin
dx := p1["x_r"]-p1["x"]; dx := p1["x_r"]-p1["x"];
dy := p1["y_r"]-p1["y"]; dy := p1["y_r"]-p1["y"];
p[0]-=dx; p[0]-=dx;
p[1]-=dy; p[1]-=dy;
end end
@ -8433,14 +8491,14 @@ type tgtk_ctl_scroll_window = class(tgtk_ctl_object)
function GtkEventDispatch(a,mn,c,d);override; function GtkEventDispatch(a,mn,c,d);override;
begin begin
//消息分发 //消息分发
if mn="scroll-event" then if mn=GS_SCROLL_EVENT then
begin begin
h := a.handle; h := a.handle;
ed := new _GdkEventScroll(c); ed := new _GdkEventScroll(c);
dr := ed.direction; dr := ed.direction;
if dr<>0 and dr<>1 then return ; if dr<>0 and dr<>1 then return ;
x := ed.x_root; x := ed.x;//ed.x_root;
y := ed.y_root; y := ed.y;//ed.y_root;
r := array(); r := array();
_wapi.GetTopWidgetList(h,x,y,r); _wapi.GetTopWidgetList(h,x,y,r);
lenr := length(r)-1; lenr := length(r)-1;
@ -8587,9 +8645,14 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
//消息分发 //消息分发
//echo "eventtype:",_wapi.gdk_event_get_event_type(c),"\r\n"; //echo "eventtype:",_wapi.gdk_event_get_event_type(c),"\r\n";
global g_gtk_shadow_size_nset,g_gtk_shadow_width,g_gtk_shadow_heigt; global g_gtk_shadow_size_nset,g_gtk_shadow_width,g_gtk_shadow_heigt;
case mn of case mn of
GS_HIDE:
begin
AddMessageToGtkMessageQueue(a.handle,_const.WM_SHOWWINDOW,0,0,nil);
end
GS_SHOW: GS_SHOW:
begin begin
AddMessageToGtkMessageQueue(a.handle,_const.WM_SHOWWINDOW,1,0,nil);
if _wapi.g_object_get_data(a.handle,"size_last_set") then //延时处理 if _wapi.g_object_get_data(a.handle,"size_last_set") then //延时处理
begin begin
_wapi.g_timeout_add(20,makeinstance(thisfunction(later_set_size)),a.handle); _wapi.g_timeout_add(20,makeinstance(thisfunction(later_set_size)),a.handle);
@ -8657,7 +8720,7 @@ type tgtk_ctl_window_PoPup = class(tgtk_ctl_scroll_window)
function GtkBaseEventName();override; function GtkBaseEventName();override;
begin begin
//return inherited union2 array("configure-event","delete-event","scroll-event","activate-default"); //return inherited union2 array("configure-event","delete-event","scroll-event","activate-default");
return inherited union2 array(GS_CONFIGURE_EVENT,GS_DELETE_EVENT,GS_SCROLL_EVENT,GS_SHOW); return inherited union2 array(GS_CONFIGURE_EVENT,GS_DELETE_EVENT,GS_SCROLL_EVENT,GS_SHOW,GS_HIDE);
end end
function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override; function CreateWnd(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nwidth,nheight,hwndparent,hmenu,hinstance,lpParam);override;
begin begin
@ -9655,6 +9718,11 @@ begin
return _gtkeventcall_(w,u_d,dt); return _gtkeventcall_(w,u_d,dt);
//return do_two_param_event(a, "value-changed"); //return do_two_param_event(a, "value-changed");
end end
function c_g_e_hide(w:pointer;u_d:pointer):integer; //
begin
return do_two_param_event(w, GetGtkEventNameOrId(u_d));
//return do_two_param_event(a, "value-changed");
end
function c_g_e_show(w:pointer;u_d:pointer):integer; // function c_g_e_show(w:pointer;u_d:pointer):integer; //
begin begin
return do_two_param_event(w, GetGtkEventNameOrId(u_d)); return do_two_param_event(w, GetGtkEventNameOrId(u_d));