关于时钟的指针问题(100分)

  • 主题发起人 主题发起人 yeti48
  • 开始时间 开始时间
Y

yeti48

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个时钟程序,指针用自己画好的指针,求教怎么让这个指针转起来,image是方形的,转的时候会不会闪烁,最好有关键的代码,我很菜的,谢谢。偶在线等。我快没分了,100分不要嫌少哟!
 
基本思路是:先在一个Image上画好,然后在StreachDraw
 
比较弱智的问题--什么是streachdraw?[:D]
 
设image控件的streach属性为true吧?
 
偶先试试,谢谢,回头再请教
 
我在网上找到以代码,可以根据图形设置窗体形状,不管把指针放在image1上,还是放在image2上,总是闪烁,怎么解决这闪的总是。
代码如下
procedure TPointForm.Timer1Timer(Sender: TObject);
var
ox,oy,r:integer;
MyNow:TDatetime;
Hour,Min,Sec,MSec:word;
angle,anglem,angles,angleh:Real;
px,py:integer;

w1:TBitmap;
w2:TColor;
rgn: HRGN;
i:integer;

begin
ox:=76;
oy:=76;
r:=35;


MyNow:=Now;
DecodeTime(MyNow,Hour,Min,Sec,mSec);
Image1.Refresh;//.Repaint;

with PointForm.Image1.Canvas do
begin
Canvas.Brush.Style := bsDiagCross;
Canvas.Brush.Color := clAqua;
canvas.Pen.Width:=5;
canvas.Pen.Color:=clyellow;

//h
angleh:=2*3.14159*(Hour+min/60)/12;
py:=round(oy-5*cos(angleh));
px:=round(ox+5*sin(angleh));
canvas.Pen.Width:=4;
canvas.pen.Color:=clblack;
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
py:=round(oy+20*cos(angleh));
px:=round(ox-20*sin(angleh));
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);

//m
anglem:=2*3.14159*min/60;
py:=round(oy-5*cos(anglem));
px:=round(ox+5*sin(anglem));
canvas.Pen.Width:=3;
canvas.pen.Color:=clGreen;
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
py:=round(oy+30*cos(anglem));
px:=round(ox-30*sin(anglem));
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);

//s
angle:=2*3.14159*sec/60;
py:=round(oy-r*cos(angle));
px:=round(ox+r*sin(angle));
canvas.Pen.Width:=1;
canvas.pen.Color:=clRed;
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);
py:=round(oy+8*cos(angle));
px:=round(ox-8*sin(angle));
canvas.MoveTo(ox,oy);
canvas.LineTo(px,py);


end;







//设置窗体函数
function TPointForm.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
dc, dc_c: HDC;
rgn: HRGN;
x, y: integer;
coord: TPoint;
line: boolean;
color: TColor;
begin
dc := GetWindowDC(hControl);
dc_c := CreateCompatibleDC(dc);
SelectObject(dc_c, wMask.Handle);
BeginPath(dc);
for x:=0 to wMask.Width-1 do
begin
line := false;
for y:=0 to wMask.Height-1 do
begin
color := GetPixel(dc_c, x, y);
if not (color = wColor) then
begin
if not line then
begin
line := true;
coord.x := x;
coord.y := y;
end;
end;
if (color = wColor) or (y=wMask.Height-1) then
begin
if line then
begin
line := false;
MoveToEx(dc, coord.x, coord.y, nil);
LineTo(dc, coord.x, y);
LineTo(dc, coord.x + 1, y);
LineTo(dc, coord.x + 1, coord.y);
CloseFigure(dc);

end;
end;
end;
end;
EndPath(dc);
rgn := PathToRegion(dc);
ReleaseDC(hControl, dc);
Result := rgn;

end;



procedure TPointForm.FormCreate(Sender: TObject);
var
w1:TBitmap;
w2:TColor;
rgn: HRGN;
i:integer;
begin


w1:=TBitmap.Create;
w1.Assign(image1.Picture.Bitmap);
w2:=w1.Canvas.Pixels[0,0];
rgn := CreateRegion(w1,w2,Handle);
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);
end;
w1.Free;
end;
 
闪得太厉害,没办法解决,谁有办法?[:(!][:(]
 
应该已经有这样的控件了吧,找找看。
 
时钟控件是有的,但不是我想要的那种:(
 
加上:
doublebuffer:=true;
或者使用DrictX技术!!!
 
谢谢,masm你的回答很简略,但是我觉得应该能行,虽然我不会做,但慢慢研究吧,起码知道该用什么做了。:)
 
doublebuffer:=true;
就可以了,但系统资源要减少
 
后退
顶部