-
Вот прога: program Win1;
uses
Windows,
Messages;
var
WndClass: TWndClass;
szAppName: PChar;
WinHandle: HWnd;
Msg: TMsg;
i:integer;
const
n = 10;
function MyWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM) : LRESULT; stdcall;
var
R: TRect;
ps: TPaintStruct;
Context, hdcm: HDC;
Font: HFont;
Brush: HBrush;
PR: PRect;
bmp: HBitmap;
mass: array[1..n] of TPoint;
begin
case Msg of
WM_PAINT:
begin
Context:= BeginPaint(hWnd, ps);
bmp:=CreateCompatibleBitmap(Context,1100, 700);
hdcm:=CreateCompatibleDC(Context);
SelectObject(hdcm,bmp);
try
GetClientRect(hWnd, R);
Font:= CreateFont(40,40,0,0, 470,60, 40, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, 'Tahoma');
Brush := CreateHatchBrush(4, $FFFFFF);
SelectObject(hdcm,Brush);
try
for i := 1 to n do
begin
mass[i].X:=100+Round(100*sin(i*2*Pi/n));
mass[i].y:=100+Round(100*cos(i*2*Pi/n));
end;
Polygon(hdcm, mass, 10);
finally
end;
Brush:= CreateHatchBrush(4, $FF8888);
SelectObject(hdcm, Brush);
SelectObject(hdcm, Font);
try
r.left := ( i div(1))- 60;
DrawText(hdcm, 'Microsoft Windows',-1,R,
DT_SINGLELINE or DT_VCENTER);
r.right := ( i div(5))+ 30;
Polygon(hdcm,mass,10);
BitBlt(Context,0,0,1100,700,hdcm,0,0,srccopy);
lineto(hdcm, 100,50) ;
finally
DeleteObject(Font);
DeleteObject(Brush);
deletedc(hdcm);
deleteobject(bmp);
end;
finally
EndPaint(hWnd, ps);
Result:= 0;
end;
end;
WM_TIMER:
begin
Inc(I, 50);
GetClientRect(hWnd,R);
If i<R.Right-R.Left then
inc(I, 20)
else i:=0;
InvalidateRect(hWnd, nil, True);
end;
WM_SIZING:
begin
PR := pointer(lParam);
if PR.Right - PR.Left < 100 then
PR.Right := PR.Left + 100;
if Pr.Bottom - PR.Top < 100 then
Pr.Bottom := PR.Top + 100;
Result := 0;
end;
WM_DESTROY:
begin
PostQuitMessage(0);
Result:= 0;
end;
else
Result:= DefWindowProc(hWnd, Msg, wParam, lParam);
end;
end;
begin
szAppName:= 'Windows';
WndClass.Style:= CS_HREDRAW or CS_VREDRAW;
WndClass.lpfnWndProc:= @MyWndProc;
WndClass.cbClsExtra:= 0;
WndClass.cbWndExtra:= 0;
WndClass.hInstance:= HInstance;
WndClass.hIcon:= LoadIcon(HInstance, IDI_APPLICATION);
WndClass.hCursor:= LoadCursor(HInstance, IDC_ARROW);
WndClass.hbrBackground:= GetStockObject(White_BRUSH);
WndClass.lpszMenuName:= nil;
WndClass.lpszClassName:= szAppName;
RegisterClass(WndClass);
WinHandle:= CreateWindow(WndClass.lpszClassName,
'.....',
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
HInstance,
nil);
ShowWindow(WinHandle, SW_SHOW);
UpdateWindow(WinHandle);
I:=0;
SetTimer(winhandle, 1, 500, nil);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
KillTimer(winhandle, 1);
end.
Как сделать,чтобы десятиугольник и надпись циклически горизонтально двигались(типа анимации)?
-
включить таймер, менять координаты и перерисовывать
-
а, таймер тут уже есть... а что тогда не получается?
-
> for i := 1 to n do ... > r.left := ( i div(1))- 60; ... > Inc(I, 50);
- warning-и надо читать...
-
Хм..... Где вы взяли этот код? Переделывать полностью не буду, а просто дам рекомендации: 1) SetTimer(winhandle, 1, 50, nil); 2) Удалить эти строки: hdcm: HDC; bmp: HBitmap;
bmp:=CreateCompatibleBitmap(Context,1100, 700);
hdcm:=CreateCompatibleDC(Context);
SelectObject(hdcm,bmp);
Polygon(Context, mass, 10); BitBlt(Context,0,0,1100,700,hdcm,0,0,srccopy);
deletedc(hdcm);
deleteobject(bmp);
Inc(I, 50); 3) В MyWndProc добавить: var j: Integer; 4) Все hdcm поменять на Context 5) Завершающий штрих: for j:=1 to n do
begin
mass[j].X:=100+Round(100*Cos((j/n+i/(R.Right-R.Left))*2*Pi));
mass[j].Y:=100+Round(100*Sin((j/n+i/(R.Right-R.Left))*2*Pi));
end;
|