时间: 2021-07-31 作者:daque
在网上有很多作品都提到还好吗在菜单中介入后台图片,然而都没有一个完备的回复,也没有一个比拟完备的例子。固然csdn已经有一个高人说过这个题目,并且在步调员大学本科营2000版中也有保藏。我参考了少许本领和本领,固然囊括海外的了,写下了如次的代码,蓄意不妨满意大师的诉求,然而不是很完备,即使有哪位大侠窜改过,无妨也将窜改过的代码贴出来,大师共享!为了在menu控件中介入后台图片,没有径直的本领,都的靠本人发端画,由于menu控件没有canvas属性,以是只能本人发端了!这个货色我也是菜鸟一只,说不出什么高超的货色,即使有什么题目不妨发信给我,咱们共通商量:cqwty@sina.com,源代码如次:unit fmain;interfaceuses windows, graphics, forms, menus, classes;type tfrmmain = class(tform) mnupopup: tpopupmenu; mainmenu1: tmainmenu; sdfsdf1: tmenuitem; sdfsdf2: tmenuitem; dfgdfg1: tmenuitem; dfgdfg2: tmenuitem; n1: tmenuitem; werwer1: tmenuitem; procedure drawmenu(sender: tobject; acanvas: tcanvas; arect: trect; state: townerdrawstate); procedure measuremenu(sender: tobject; acanvas: tcanvas; var width, height: integer); procedure formcreate(sender: tobject); procedure formclose(sender: tobject; var action: tcloseaction); end;var frmmain: tfrmmain; bmp1:tbitmap;implementation{$r *.dfm}procedure tfrmmain.drawmenu(sender: tobject; acanvas: tcanvas; arect: trect; state: townerdrawstate);var ctemp: tcanvas; stext: string; mwnd: hwnd; rmenu: trect;begin acanvas.brushcopy(arect, bmp1, arect, clblack); acanvas.brush.style := bsclear; stext := tmenuitem(sender).caption; acanvas.font.color:=clred; with acanvas do begin if odselected in state then begin pen.style:=psinsideframe; brush.color := rgb(110, 131, 184); pen.color := rgb(47, 60, 93); rectangle(arect); end; if stext = '-' then begin // draw line acanvas.pen.color := rgb(0, 0, 0); moveto(arect.left, arect.top + ((arect.bottom - arect.top) div 2)); lineto(arect.right, arect.top + ((arect.bottom - arect.top) div 2)); end else begin // draw text inc(arect.left, 12); drawtext(handle, pchar(stext), length(stext), arect, dt_left or dt_vcenter or dt_singleline); end; end; // 画边框的,功效是平面包车型的士 mwnd := windowfromdc(acanvas.handle); if mwnd <> self.handle then begin ctemp := tcanvas.create(); ctemp.handle := getdc(0); windows.getwindowrect(mwnd, rmenu); ctemp.brush.color := rgb(120, 120, 120); ctemp.framerect(rmenu); inflaterect(rmenu, -1, -1); ctemp.brush.color := rgb(240, 240, 240); ctemp.framerect(rmenu); inflaterect(rmenu, -1, -1); ctemp.framerect(rmenu); releasedc(0, ctemp.handle); ctemp.free(); end;end;procedure tfrmmain.measuremenu(sender: tobject; acanvas: tcanvas; var width, height: integer);begin inc(width,50);//安排菜单的宽窄 inc(height,15);//安排每一个item的莫大,这一句不妨不要,运用默许值end;procedure tfrmmain.formcreate(sender: tobject);begin bmp1:=tbitmap.create; bmp1.loadfromfile('e:\aaa.bmp');end;procedure tfrmmain.formclose(sender: tobject; var action: tcloseaction);beginbmp1.free;end;end.