Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

Как нарисовать увеличивающийся круг   Найти похожие ветки 

 
Loonar ©   (2007-06-23 16:53) [0]

При нажатии на кнопку в центре формы будет нарисован красный круг, плавно увеличивающийся в размере. После достижения максимального размера, круг плавно уменьшается в размере и т.д.\
(но без использования таймера)
Заранее спасибо


 
Dib@zol   (2007-06-23 17:21) [1]

Не хочешь VCL-таймер, будет тебе API-таймер! :))))))))

program Test;

uses
 Windows, Messages;

const
 CN = "WND_CIRCLE";
 WN = "Circle";
 WW = 500;
 WH = 500;

var
 M : MSG;
 DC : HDC;
 W : HWND;
 Btn : HWND = 1;
 WC : WNDCLASS;
 WXPos, WYPos, cx, cy : Word;

 B, BN, PN : HGDIOBJ;
 rad, inc : Smallint;

function WindowProc(hWnd: HWND; Msg: integer; WParam, LParam: LongInt): LongInt; stdcall;
var
 TB, TP : HGDIOBJ;
begin
 Result:=0;
 case Msg of
   WM_CREATE:
     begin
       DC:=GetDC(hWnd);
       Btn:=CreateWindow("BUTTON", "Start", BS_DEFPUSHBUTTON
       or WS_CHILD or WS_VISIBLE, 5, 5, 100, 25, hWnd, 0,
       hInstance, nil);
       B:=CreateSolidBrush($0000FF);
       BN:=GetSysColorBrush(COLOR_BTNFACE);
       PN:=CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE));
       inc:=-2;

       SetTimer(hWnd, 1, 100, nil);
     end;

   WM_COMMAND:
     if LParam=Btn then begin
       DestroyWindow(Btn);
       Btn:=0;
     end;

   WM_TIMER: InvalidateRect(hWnd, nil, false);

   WM_PAINT:
     begin
       if Btn = 0 then begin
         TB:=SelectObject(DC, BN);
         TP:=SelectObject(DC, PN);
         Ellipse(DC, cx-rad, cy-rad, cx+rad, cy+rad);
         SelectObject(DC, TP);
         SelectObject(DC, TB);
         if (Rad>=cx)or (Rad<=0) then inc:=-inc;
         Rad:=Rad+inc;
         TB:=SelectObject(DC, B);
         Ellipse(DC, cx-rad, cy-rad, cx+rad, cy+rad);
         SelectObject(DC, TB);
       end;
     end;

   WM_CLOSE:
     begin
       KillTimer(hWnd, 1);
       ReleaseDC(hWnd, DC);
       DeleteDC(DC);
       DeleteObject(B);
       DestroyWindow(Btn);
       DestroyWindow(hWnd);
     end;

   WM_DESTROY: PostQuitMessage(0);
 end;
 Result:=DefWindowProc(hWnd, Msg, WParam, LParam);
end;

begin
 WXPos:=round((GetSystemMetrics(SM_CXSCREEN)-WW)/2);
 WYPos:=round((GetSystemMetrics(SM_CYSCREEN)-WH)/2);
 cx:=round(WW/2);
 cy:=round(WH/2);
 
 with WC do begin
   Style := CS_HREDRAW or CS_VREDRAW;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := sysInit.HInstance;
   hCursor := LoadCursor(0, IDC_ARROW);
   hbrBackground := GetSysColorBrush(COLOR_BTNFACE);
   lpszClassName := CN;
 end;
 RegisterClass(WC);
 W := CreateWindowEx(0, CN, WN, WS_VISIBLE or WS_SYSMENU,
 WXPos, WYPos, WW, WH, 0, 0, HInstance, nil);
 ShowWindow(W, SW_SHOWNORMAL);
 UpdateWindow(W);

 while GetMessage(M, 0, 0, 0) do begin
   TranslateMessage(M);
   DispatchMessage(M);
 end;
 Halt(M.wParam);
end.

Пойдёт? =D


 
Loonar ©   (2007-06-23 17:39) [2]

а проще никак, типа через бесконечный цикл,
вот тут образец, но я не знаю как его сделать
ftp://85.21.145.96/Incoming_FTP/круг.exe


 
Dib@zol   (2007-06-23 17:57) [3]

А вообще нахрена тебе это в принципе надо? Почему без таймера-то, а?


 
Loginov Dmitry ©   (2007-06-23 18:30) [4]

Еще способ без таймера - InvalidateRect в OnPaint ;)

Можно еще дополнительным потоком выкрутиться. <бррр... для кого я это пишу... :)>


 
Джо ©   (2007-06-23 18:57) [5]

> [4] Loginov Dmitry ©   (23.06.07 18:30)
> Можно еще дополнительным потоком выкрутиться. <бррр... для
> кого я это пишу... :)>

А какой смысл в доп. потоке, если рисовать все-равно нужно будет в контексте главного?


 
Плохиш ©   (2007-06-23 20:31) [6]

Зачем таймер в данном описании [0]

while true do
begin
 <рисуем круг>
 Application.ProcessMessages;
 sleep(500);
 <стираем круг>
 <изменяем размеры>
end;  


 
Loginov Dmitry ©   (2007-06-23 20:57) [7]

> А какой смысл в доп. потоке, если рисовать все-равно нужно
> будет в контексте главного?


Это как вариант было ;)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.047 c
15-1181752900
Tonich
2007-06-13 20:41
2007.07.15
текс из hlp


15-1182092938
БарЛог
2007-06-17 19:08
2007.07.15
1. Как правильно записАть диск? 2. Заземлять ли компьютер?


15-1181691118
programmerts
2007-06-13 03:31
2007.07.15
Глюк с Delphi 6.


2-1182368953
Просто_новичок
2007-06-20 23:49
2007.07.15
Обработка Enter у Memo


15-1181638216
TUser
2007-06-12 12:50
2007.07.15
Чудище





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский