时间: 2021-07-31 作者:daque
陈学军 实行异型form并不是一件难题,正文将向您引见怎样运用api因变量实行圆角矩形和卵形form,并在此普通之上商量实行twincontrol类的后代的异型的实行。 欲变换form的形势,也即是实行对地区(region)的遏制。在win32 api步调参考画册相关地区(region)的设置是如许刻画的:它不妨是一个矩形,多角形,卵形(大概是两者的复合,大概是更多的形势),那些都不妨被弥补,绘图,翻转,构造化并不妨获得中心实行。 由设置得出论断:地区(region)是不妨被变换和安排的,按照咱们的需要可设置地区并创造出咱们所诉求的形势。 该当指出的是地区(region)也能对任何twincontrol类的后代设置和遏制(不只仅是forms),即是说,不妨将地区(region)的设置应用到向tpanel或tedit如许的东西。在变换twincontrol类的后代控件的形势时,须要供给一句柄并创造少许变换形势的因变量。 简直实行办法普遍分为两步: 1.设置所需形势的地区边境形势(比方:卵形)。 2.将已设置的地区边境形势应用到窗口。 这边,咱们将经过挪用windows api因变量实行之上两个办法,底下就简直因变量的运用给予证明: 实行第一步:设置地区边境。 在这边将挪用三个winapi,这三个因变量是: createellipticrgn()功效是天生卵形地区; createroundrectrgn()功效是天生圆角矩形地区; createpolygonrgn()功效是天生多角形地区,windows要保证使其极点机动贯串产生一封锁的地区。 这三个因变量经过归来的南针变量标识所天生的地区将被第二步所运用。那些因变量在delphi中的因变量证明及参数含意证明如次: (1)卵形地区天生因变量: 因变量究竟:hrgn createellipticrgn(int nleftrect,int ntoprect,int nrightrect,int nbottomrect); 参数含意: nleftrect,ntoprect:地区的左上角坐标; nrightrect, nbottomrect:地区的右下角坐标; (2)圆角矩形地区天生因变量: 因变量究竟:hrgn createroundrectrgn(int nleftrect,int ntoprect,int nrightrect,int nbottomrect,int nwidthellipse,int nheightellipse); 参数含意: nleftrect, ntoprect:地区的左上角坐标; nrightrect, nbottomrect:地区的右下角坐标; nwidthellipse, nheightellipse:圆角的宽窄和莫大; (3)多角形地区天生因变量: 因变量究竟:hrgn createpolygonrgn(const point *lppt,int cpoints, int fnpolyfillmode); 参数含意: lppt:指向一个point典型的数组,该数组设置多角形极点; cpoints:设置数组中极点数; fnpolyfillmode:设置弥补形式,可选值为alternate或winding。 实行第二步:将归来的hrgn典型的地区值被树立窗口地区因变量挪用。 树立窗口地区因变量: 因变量究竟:int setwindowrgn(hwnd hwnd, hrgn hrgn, bool bredraw); 参数证明: hwnd:指向所操纵的窗口的句柄; hrgn:所给地区句柄; bredraw:能否表露重画窗口的标记。 在每一个因变量的结果都须要挪用setwindowrgn因变量,而后由windows操纵体例实行地区的百般形势的树立并表露。 以次将尝试的form的所有源代码列出,在form上增添了四个按钮辨别遏制实行:卵形,圆角矩形,等边多角形和星形;一个tpanel控件为了演练twincontrol类的后代的地区设置和遏制;一个spinedit控件设置多角形和星形的极点贯穿数量。 源步调: unit form_statue; interface uses windows, messages, sysutils, classes, graphics, controls, forms, dialogs, stdctrls, extctrls, spin; type tform1 = class(tform) button1: tbutton; spinedit1: tspinedit; panel1: tpanel; button2: tbutton; button3: tbutton; button4: tbutton; procedure drawrndrectregion(wnd : hwnd; rect : trect); procedure drawellipticregion(wnd : hwnd; rect : trect); procedure drawpolygonregion(wnd : hwnd; rect : trect; numpoints : integer; dostarshape : boolean); procedure button1click(sender: tobject); procedure button4click(sender: tobject); procedure button3click(sender: tobject); procedure button2click(sender: tobject); private { private declarations } rgn : hrgn; rect : trect; public { public declarations } end; var form1: tform1; implementation {$r *.dfm} procedure tform1.drawrndrectregion(wnd : hwnd; rect : trect); begin rgn := createroundrectrgn(rect.left, rect.top, rect.right, rect.bottom, 30, 30); setwindowrgn(wnd, rgn, true); end; procedure tform1.drawellipticregion(wnd : hwnd; rect : trect); begin rgn := createellipticrgn(rect.left, rect.top, rect.right, rect.bottom); setwindowrgn(wnd, rgn, true); end; procedure tform1.drawpolygonregion(wnd : hwnd; rect : trect; numpoints : integer; dostarshape : boolean); const radconvert = pi/180; degrees = 360; maxlines = 100; var x, y, xcenter, ycenter, radius, pts, i : integer; angle, rotation: extended; arpts : array[0..maxlines] of tpoint; begin xcenter := (rect.right - rect.left) div 2; ycenter := (rect.bottom - rect.top) div 2; if dostarshape then begin rotation := degrees/(2*numpoints); pts := 2 * numpoints; end else begin rotation := degrees/numpoints; //获得每个极点的度数 pts := numpoints ; end; radius := ycenter; for i := 0 to pts - 1 do begin if dostarshape then if (i mod 2) = 0 then radius := round(radius/2) else radius := ycenter; angle := ((i * rotation) + 90) * radconvert; x := xcenter + round(cos(angle) * radius); y := ycenter - round(sin(angle) * radius); arpts[i].x := x; arpts[i].y := y; end; rgn := createpolygonrgn(arpts, pts, winding); setwindowrgn(wnd, rgn, true); end; procedure tform1.button1click(sender: tobject); begin drawrndrectregion(form1.handle, form1.clientrect); end; procedure tform1.button4click(sender: tobject); begin drawpolygonregion(panel1.handle, panel1.boundsrect, spinedit1.value, true); end; procedure tform1.button3click(sender: tobject); begin drawellipticregion(form1.handle, form1.clientrect); end; procedure tform1.button2click(sender: tobject); begin drawpolygonregion(panel1.handle, panel1.boundsrect, spinedit1.value, false); end; end. 源步调在pwin98+delphi5情况下调节和测试胜利,不妨径直援用。