Главная страница
    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.039 c
6-1165907575
Rentgen
2006-12-12 10:12
2007.07.15
image/gif - Mozilla отображается, а в ослике нет.


2-1182176439
kyro
2007-06-18 18:20
2007.07.15
Заголовки mp3


11-1164877035
Don
2006-11-30 11:57
2007.07.15
вопрос по ToolBar-у


11-1164571711
Trible
2006-11-26 23:08
2007.07.15
Как глобально, во всей програме отключить хинты?


3-1175764351
DeadMeat
2007-04-05 13:12
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский