{ Frames unit - a set of comprehensive (for my purposes) functions for drawing pretty 3-D frames of all types. Pretty simple stuff - I'm sure you will be able to figure it out - but that's why I included it. As always, you are welcome to do whatever with this unit. I only ask that if you upload it somewhere modified, keep my name off it, so I don't have to answer for your bad code . If you have any suggestions or questions, by all means send them to me - I'd love to hear from a fellow programmer. Steve Willer Mark Data Management CIS: 70400,3667 AOL: SteveWill } unit frames; interface uses WinTypes,WinProcs,WinDOS; procedure DrawBorderFrame(PaintDC:HDC;PaintR:TRect;Back:boolean); procedure DrawOutFrame(PaintDC:HDC;PaintR:TRect;Back:boolean;Width:integer); procedure DrawInFrame(PaintDC:HDC;PaintR:TRect;Back:boolean;Width:integer); procedure DrawDivLine(PaintDC:HDC;Y:integer;Width:integer); procedure DrawDotLine(PaintDC:HDC;PaintR:TRect;Incr:integer); function MakeBorBrush(HWindow:HWnd;BackColor1,BackColor2:TColorRef):HBrush; procedure DrawExplodeFrame(PaintDC:HDC;ExplR:TRect;PenColor,BrushColor:TColorRef;DrawBrush:boolean;Width:integer; Steps:integer;Pause:longint); implementation procedure DrawBorderFrame(PaintDC:HDC;PaintR:TRect;Back:boolean); var ThePen,OldPen:HPen; FillBrush,OldBrush:HBrush; begin if Back then begin FillBrush := CreateSolidBrush($00C0C0C0); OldBrush := SelectObject(PaintDC,FillBrush); InflateRect(PaintR,-1,-1); FillRect(PaintDC,PaintR,FillBrush); InflateRect(PaintR,1,1); SelectObject(PaintDC,OldBrush); DeleteObject(FillBrush); end; OldBrush := SelectObject(PaintDC,GetStockObject(Null_Brush)); ThePen := CreatePen(ps_Solid,1,$00C0C0C0); OldPen := SelectObject(PaintDC,ThePen); PaintR.top:=PaintR.top+1; PaintR.left:=PaintR.left-1; Rectangle(PaintDC,PaintR.left,PaintR.top,PaintR.right,PaintR.bottom); PaintR.top:=PaintR.top-1; PaintR.left:=PaintR.left+1; SelectObject(PaintDC,OldPen); DeleteObject(ThePen); SelectObject(PaintDC,OldBrush); ThePen := CreatePen(ps_Solid,1,RGB(255,255,255)); OldPen := SelectObject(PaintDC,ThePen); MoveTo(PaintDC,PaintR.right,PaintR.top); LineTo(PaintDC,PaintR.left,PaintR.top); LineTo(PaintDC,PaintR.left,PaintR.bottom); MoveTo(PaintDC,PaintR.left+2,PaintR.bottom-2); LineTo(PaintDC,PaintR.right-2,PaintR.bottom-2); LineTo(PaintDC,PaintR.right-2,PaintR.top+2); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); ThePen := CreatePen(ps_Solid,1,RGB(127,127,127)); OldPen := SelectObject(PaintDC,ThePen); MoveTo(PaintDC,PaintR.right-2,PaintR.top+2); LineTo(PaintDC,PaintR.left+2,PaintR.top+2); LineTo(PaintDC,PaintR.left+2,PaintR.bottom-3); MoveTo(PaintDC,PaintR.left,PaintR.bottom); LineTo(PaintDC,PaintR.right,PaintR.bottom); LineTo(PaintDC,PaintR.right,PaintR.top); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); end; procedure DrawOutFrame (PaintDC:HDC; PaintR:TRect; Back:boolean; Width:integer); var ThePen, OldPen:HPen; FillBrush, OldBrush:HBrush; count:integer; CalcR:TRect; begin if Back then begin FillBrush := CreateSolidBrush ($00C0C0C0); OldBrush := SelectObject(PaintDC,FillBrush); InflateRect (PaintR, -1*(Width)+1, -1*(Width)+1); FillRect (PaintDC,PaintR,FillBrush); InflateRect (PaintR,Width-1,Width-1); SelectObject (PaintDC,OldBrush); DeleteObject (FillBrush); end; CalcR := PaintR; for count:=0 to (Width-1) do begin PaintR := CalcR; InflateRect (PaintR, -1*(count), -1*(count)); ThePen := CreatePen(ps_Solid,1,RGB(255,255,255)); OldPen := SelectObject(PaintDC,ThePen); MoveTo (PaintDC,PaintR.right,PaintR.top); LineTo (PaintDC,PaintR.left,PaintR.top); LineTo (PaintDC,PaintR.left,PaintR.bottom+1); SelectObject (PaintDC,OldPen); DeleteObject (ThePen); ThePen := CreatePen (ps_Solid,1,RGB(127,127,127)); OldPen := SelectObject (PaintDC,ThePen); MoveTo (PaintDC,PaintR.right,PaintR.top+1); LineTo (PaintDC,PaintR.right,PaintR.bottom); LineTo (PaintDC,PaintR.left,PaintR.bottom); SelectObject (PaintDC,OldPen); DeleteObject (ThePen); end; end; procedure DrawInFrame(PaintDC:HDC;PaintR:TRect;Back:boolean;Width:integer); var ThePen,OldPen:HPen; FillBrush,OldBrush:HBrush; count:integer; CalcR:TRect; begin if Back then begin FillBrush := CreateSolidBrush($00C0C0C0); OldBrush := SelectObject(PaintDC,FillBrush); InflateRect(PaintR,-1*(Width)+1,-1*(Width)+1); FillRect(PaintDC,PaintR,FillBrush); InflateRect(PaintR,Width-1,Width-1); SelectObject(PaintDC,OldBrush); DeleteObject(FillBrush); end; CalcR:=PaintR; for count:=0 to (Width-1) do begin PaintR:=CalcR; InflateRect(PaintR,-1*(count),-1*(count)); ThePen := CreatePen(ps_Solid,1,RGB(127,127,127)); OldPen := SelectObject(PaintDC,ThePen); MoveTo(PaintDC,PaintR.right,PaintR.top); LineTo(PaintDC,PaintR.left,PaintR.top); LineTo(PaintDC,PaintR.left,PaintR.bottom); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); ThePen := CreatePen(ps_Solid,1,RGB(255,255,255)); OldPen := SelectObject(PaintDC,ThePen); MoveTo(PaintDC,PaintR.right,PaintR.top+1); LineTo(PaintDC,PaintR.right,PaintR.bottom); LineTo(PaintDC,PaintR.left-1,PaintR.bottom); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); end; end; procedure DrawDivLine(PaintDC:HDC;Y:integer;Width:integer); var ThePen,OldPen:HPen; FillBrush,OldBrush:HBrush; count:integer; begin ThePen := CreatePen(ps_Solid,Width,RGB(127,127,127)); OldPen := SelectObject(PaintDC,ThePen); MoveTo(PaintDC,GetSystemMetrics(sm_CXScreen),Y); LineTo(PaintDC,0,Y); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); Y:=Y+Width; ThePen := CreatePen(ps_Solid,Width,RGB(255,255,255)); OldPen := SelectObject(PaintDC,ThePen); MoveTo(PaintDC,GetSystemMetrics(sm_CXScreen),Y); LineTo(PaintDC,0,Y); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); end; procedure DrawDotLine(PaintDC:HDC;PaintR:TRect;Incr:integer); var ROP2:integer; count:integer; begin ROP2 := GetROP2(PaintDC); SetROP2(PaintDC,r2_Not); count := PaintR.left; while count < PaintR.right-1 do begin SetPixel(PaintDC,count,PaintR.top,$00000000); SetPixel(PaintDC,count,PaintR.bottom-1,$00000000); count := count + Incr; end; count := PaintR.top+2; while count < PaintR.bottom-1 do begin SetPixel(PaintDC,PaintR.left,count,$00000000); SetPixel(PaintDC,PaintR.right-1,count,$00000000); count := count + Incr; end; SetROP2(PaintDC,ROP2); end; function MakeBorBrush(HWindow:HWnd;BackColor1,BackColor2:TColorRef):HBrush; var DC,MemDC:HDC; Bits:HBitmap; FillR:TRect; TheBrush,OldBrush:HBrush; begin DC:=CreateDC('display',nil,nil,nil); MemDC:=CreateCompatibleDC(DC); Bits:=CreateCompatibleBitmap(DC,8,8); SelectObject(MemDC,Bits); if Bits<>0 then begin TheBrush:=CreateSolidBrush(GetNearestColor(DC,BackColor2)); OldBrush:=SelectObject(MemDC,TheBrush); PatBlt(MemDC,0,0,8,8,Blackness); with FillR do begin left:=0;right:=8;top:=0;bottom:=8; end; FillRect(MemDC,FillR,TheBrush); SelectObject(MemDC,OldBrush); DeleteObject(TheBrush); SetPixel(MemDC,0,0,BackColor1); SetPixel(MemDC,0,2,BackColor1); SetPixel(MemDC,0,4,BackColor1); SetPixel(MemDC,0,6,BackColor1); SetPixel(MemDC,2,0,BackColor1); SetPixel(MemDC,2,2,BackColor1); SetPixel(MemDC,2,4,BackColor1); SetPixel(MemDC,2,6,BackColor1); SetPixel(MemDC,4,0,BackColor1); SetPixel(MemDC,4,2,BackColor1); SetPixel(MemDC,4,4,BackColor1); SetPixel(MemDC,4,6,BackColor1); SetPixel(MemDC,6,0,BackColor1); SetPixel(MemDC,6,2,BackColor1); SetPixel(MemDC,6,4,BackColor1); SetPixel(MemDC,6,6,BackColor1); MakeBorBrush:=CreatePatternBrush(Bits); end else MakeBorBrush:=0; DeleteDC(MemDC); DeleteDC(DC); DeleteObject(Bits); end; procedure DrawExplodeFrame(PaintDC:HDC;ExplR:TRect;PenColor,BrushColor:TColorRef;DrawBrush:boolean;Width:integer; Steps:integer;Pause:longint); var count:integer; dX,dY:double; ThePen,OldPen:HPen; TheBrush,OldBrush:HBrush; OrigR:TRect; TimeCount:longint; begin ThePen := CreatePen(ps_Dot,Width,PenColor); OldPen := SelectObject(PaintDC,ThePen); if DrawBrush then TheBrush:=CreateSolidBrush(BrushColor) else TheBrush := GetStockObject(Null_Brush); OldBrush:= SelectObject(PaintDC,TheBrush); dY:=(ExplR.bottom-ExplR.top)/Steps; dX:=(ExplR.right-ExplR.left)/Steps; with ExplR do begin left:=left+((right-left) div 2); top:=top+((bottom-top) div 2); right:=left;bottom:=top; end; OrigR:=ExplR; for count:=1 to steps do begin with ExplR do begin TimeCount := GetTickCount; left:=OrigR.left-integer(Round(dX*count)); right:=OrigR.right+integer(Round(dX*count)); bottom:=OrigR.bottom-integer(Round(dY*count)); top:=OrigR.top+integer(Round(dY*count)); Rectangle(PaintDC,left,top,right,bottom); while (GetTickCount - TimeCount) < Pause do begin end; end; end; SelectObject(PaintDC,OldBrush); DeleteObject(TheBrush); SelectObject(PaintDC,OldPen); DeleteObject(ThePen); end; begin end.