procedure TForm1.RefClock; var oBgCanvas:TBitmap; begin oBgCanvas:=TBitmap.Create; oBgCanvas.Height:=Self.Height; oBgCanvas.Width:=Self.Width; //get center point cx:=form1.ClientWidth div 2; cy:=form1.ClientHeight div 2; //set radius radius:=100; //set begin end point bx:=cx-110; by:=cy+110; ex:=cx+110; ey:=cy-110; //draw colock face //oBgCanvas.Canvas.Rectangle(bx,by,ex,ey); oBgCanvas.Canvas.Brush.Style := bsDiagCross; oBgCanvas.Canvas.Brush.Color := clAqua; oBgCanvas.Canvas.Pen.Width:=5; oBgCanvas.Canvas.Pen.Color:=clyellow; oBgCanvas.Canvas.Ellipse(bx,by,ex,ey); angle:=0; for i:=0 to 12 do begin by:=round(cy-radius*cos(angle*3.14159/180)); bx:=round(cx+radius*sin(angle*3.14159/180)); oBgCanvas.Canvas.Pen.Width:=0; oBgCanvas.Canvas.Brush.Style := bsSolid; oBgCanvas.Canvas.Brush.Color := clred; oBgCanvas.Canvas.Ellipse(bx-5,by+5,bx+5,by-5); //if word then begin oBgCanvas.Canvas.Brush.Style := bsClear; oBgCanvas.Canvas.Font.Size:=10; oBgCanvas.Canvas.Font.Style:=[fsBold]; if i<>0 then begin if angle=90 then oBgCanvas.Canvas.TextOut(bx-10,by-5,inttostr(i)) else if angle=270 then oBgCanvas.Canvas.TextOut(bx+5,by-5,inttostr(i)) else if (angle>=120) and (angle<=240) then begin oBgCanvas.Canvas.TextOut(bx-5,by-20,inttostr(i)); end else oBgCanvas.Canvas.TextOut(bx-5,by+5,inttostr(i)); end; //end; angle:=angle+30; end; //darw colock handle //with paintbox1 do begin //s DecodeTime(time, Hour, Min, Sec, MSec); angle:=2*3.14159*sec/60; by:=round(cy-radius*cos(angle)); bx:=round(cx+radius*sin(angle)); oBgCanvas.Canvas.Pen.Width:=1; oBgCanvas.Canvas.pen.Color:=clblack; oBgCanvas.Canvas.MoveTo(cx,cy); oBgCanvas.Canvas.LineTo(bx,by); by:=round(cy+20*cos(angle)); bx:=round(cx-20*sin(angle)); oBgCanvas.Canvas.MoveTo(cx,cy); oBgCanvas.Canvas.LineTo(bx,by); //m anglem:=2*3.14159*min/60; by:=round(cy-80*cos(anglem)); bx:=round(cx+80*sin(anglem)); oBgCanvas.Canvas.Pen.Width:=3; oBgCanvas.Canvas.pen.Color:=clblack; oBgCanvas.Canvas.MoveTo(cx,cy); oBgCanvas.Canvas.LineTo(bx,by); by:=round(cy+10*cos(anglem)); bx:=round(cx-10*sin(anglem)); oBgCanvas.Canvas.MoveTo(cx,cy); oBgCanvas.Canvas.LineTo(bx,by); //h angleh:=2*3.14159*(Hour+min/60)/12; by:=round(cy-60*cos(angleh)); bx:=round(cx+60*sin(angleh)); oBgCanvas.Canvas.Pen.Width:=5; oBgCanvas.Canvas.pen.Color:=clblack; oBgCanvas.Canvas.MoveTo(cx,cy); oBgCanvas.Canvas.LineTo(bx,by); by:=round(cy+7*cos(angleh)); bx:=round(cx-7*sin(angleh)); oBgCanvas.Canvas.MoveTo(cx,cy); oBgCanvas.Canvas.LineTo(bx,by); //end;
Self.Canvas.Draw(0,0,oBgCanvas);
FreeAndNil(oBgCanvas); end;
在 Timer 事件里加入 RefClock 便可以无闪烁刷新了. |