$include "windows.inc" $typecheck on dim ptl(400) as qlabel dim image as qimage dim bitmap as qbitmap : dim source as qrect dim destination as qrect dim curves as integer dim orx as integer : dim ory as integer : dim shiftkey as integer dim endx as integer : dim endy as integer dim pdraw as integer : dim paintdraw as integer dim pbez(2000) as pointapi dim cursor as pointapi dim fx as integer : dim fy as integer : dim visible as integer dim i as integer : dim a as integer : dim whatever as integer dim tpoints(1000) as integer : dim curve(1000) as qmemorystream dim lhandle(2000) as long : dim hdc as long : dim fkey as integer declare sub fpaint(sender as qform) declare sub fdown(button as long, x as long,y as long,shift as integer) declare sub fmove(x as long, y as long, shift as integer) declare sub fup(button as long, x as long, y as long, _ shift as integer, sender as qform) declare sub pdown(but as long, x as long, y as long, _ shift as integer, sender as qlabel) declare sub pup(button as long, x as long, y as long, _ shift as integer, sender as qlabel) declare sub pmove (x as long, y as long, _ shift as integer, sender as qlabel) declare sub keydown(key as long, sender as qform) declare sub operations declare sub drawvectors declare sub fkeyup (sender as qform) dim form as qform form.center : form.color=&hffffff : form.width=700 form.height=600 dim label as qlabel : label.parent=form label.caption="place three points to draw bezier,"+_ "also click and move points. Hit enter to start new curve"+ _ " Or You can hit ctrl key while dragging" 'form.windowstate=2 form.onmousemove= fmove form.onmousedown=fdown form.onkeydown=keydown form.onmouseup=fup form.onkeyup=fkeyup form.onpaint=fpaint form.keypreview=1 dim left as qlistbox : left.width=50 : left.height=50 left.top=0 : left.parent = form : left.visible=0 dim top as qlistbox : top.width=50 : top.visible=0 top.height=50: top.top=55 : top.parent = form form.showmodal sub fmove fx=x : fy=y if fkey=18 then form.line(orx,ory,x,y,&h000000) end sub SUB FDOWN (but as long, x as long,y as long,shift as long) bitmap.width=form.clientwidth : bitmap.height=form.clientheight image.width=form.clientwidth " image.height=form.clientheight orx=x : ory=y if fkey<>18 then 'alt key if fkey<>17 then 'ctrl key if shiftkey=0 then ptl(i).parent = form ptl(i).color=&h0000ff ptl(i).width=5 ptl(i).height=5 ptl(i).left=x ptl(i).top=y ptl(i).onmousedown=pdown ptl(i).onmouseup=pup ptl(i).onmousemove=pmove ptl(i).tag=i ptl(i).visible=1 ptl(i).enabled=1 dim retval as long left.additems(str$(x)) : top.additems(str$(y)) lhandle(i)=ptl(i).handle i++ operations end if end if end if fkey=0 end sub SUB FUP if shift=256 then form.line(orx,ory,x,y,&h000000) hdc=getdc(form.handle) BitBlt(bitmap.handle,0,0,Sender.clientwidth,Sender.clientheight,hdc,,0,&HCC0020) Bitmap.savetofile "untitled.bmp" image.bmp=bitmap.bmp releasedc(form.handle,hdc) end if end sub sub operations ' builds bezier curves even when adjusting hdc=getdc(form.handle) do left.itemindex=left.itemindex+1 top.itemindex=top.itemindex+1 if left.itemindex=0 then orx=fx : ory =fy pbez(left.itemindex).x=val (left.item(left.itemindex)) pbez(left.itemindex).y=val (top.item(left.itemindex)) curve(a).writeudt (pbez(left.itemindex)) end if pbez(left.itemindex).x=val (left.item(left.itemindex)) pbez(left.itemindex).y=val (top.item(left.itemindex)) curve(a).writeudt (pbez(left.itemindex)) if (left.itemindex) mod 3 =1 then end if tpoints(a)=left.itemindex+2 polybezier(hdc,curve(a).pointer,tpoints(a)) loop until left.itemindex+1=left.itemcount releasedc(hdc,form.handle) end sub SUB PDOWN pdraw=1 sender.color=&h00ff00 end sub SUB PUP sender.color=&h0000ff pdraw=0 dim k as integer for k =0 to left.itemcount ptl(k).visible=1 fkey=0 next k end sub SUB PMOVE if pdraw=1 then GetCursorPos(cursor) sender.left=cursor.x-form.left-5 sender.top= cursor.y-form.top-24 left.item(sender.tag)=str$(sender.left) top.item(sender.tag)=str$(sender.top) left.itemindex=-1 top.itemindex=-1 curve(a).position=0 dim k as integer for k =0 to left.itemcount ptl(k).visible=0 next k if fkey <>17 then form.repaint operations else a++ operations end if : end if : end sub SUB FPAINT WITH Destination .Top = 0 .Left = 0 .right = 780 .bottom = 1040 END WITH WITH Source .Top = 0 .Left = 0 .Right = 780 .Bottom = 1040 END WITH Sender.CopyRect(Destination, Image, Sender) drawvectors end sub SUB KEYDOWN if key=17 then fkey=key end if if key = 13 then dim k as integer for k =0 to left.itemcount ptl(k).visible=0 ptl(k).enabled=0 next k a++ i=0 left.clear top.clear form.repaint end if if key=45 then ' insert key Bitmap.BMP=Image.BMP Bitmap.SaveToFile "untitled.bmp" Image.Handle = ClipBoard.GetASHandle(2) Bitmap.Height = Image.Height Bitmap.Width = Image.Width Sender.CopyRect(Source, Image,Destination) form.repaint end if if key=16 then shiftkey=1 if key=18 then fkey=18 end sub sub fkeyup : fkey=0 : shiftkey=0 : end sub sub drawvectors hdc=getdc(form.handle) for whatever=0 to a-1 polybezier(hdc,curve(whatever).pointer,tpoints(whatever)) next whatever releasedc(form.handle,hdc) end sub