IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> WinAPI для простой графики
KljaGGsa
сообщение 6.07.2009 17:25
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Женский

Репутация: -  0  +


Как практически с помощью функций WinAPI нарисовать мячик, который бы двигался горизонтально в прямоугольнике вправо-влево, "отскакивая" от боковых стенок, "пинг-понг" - ? smile.gif

Сообщение отредактировано: KljaGGsa - 6.07.2009 17:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 6.07.2009 23:43
Сообщение #2


Гость






Так тебе совсем WinAPI-шное приложение надо, без VCL? Ну, тогда так, к примеру:
program Project1;

uses
Windows, Messages;

const
WM_SETUP = 500;

WinName = 'MainWClass';
R = 5;

var
myTimer: THandle;
delta: integer;
Rec: TRect;
posX, posY: integer;

function MainWndProc(Window: HWnd; AMessage: UINT; WParam: WPARAM; LParam: LPARAM): INT_PTR; stdcall;
var
myDC: HDC;
ps: PAINTSTRUCT;
begin
case AMessage of
WM_CREATE: // Создание окна
begin
myTimer := SetTimer(Window, 0, 1, nil);
Result := 0; Exit;
end;
WM_SETUP: // "Установка" начальных значений
begin
myDC := GetDC(Window);
GetClientRect(Window, Rec);
posX := 0; posY := (Rec.Bottom - Rec.Top) div 2; delta := 5;
ReleaseDC(Window, myDC);
Result := 0; Exit;
end;
WM_SIZE: // Изменение размеров окна
begin
PostMessage(Window, WM_SETUP, 0, 0); // Просто вызываем "установку"
Result := 0; Exit;
end;
WM_PAINT:
begin
myDC := BeginPaint(Window, ps);
PostMessage(Window, WM_SETUP, 0, 0); // Тоже "установка"
EndPaint(Window, ps);
Result := 0; Exit;
end;
WM_TIMER: // Событие таймера
begin
myDC := GetDC(Window);
// стираем старое изображение шарика
SelectObject(myDC, GetStockObject(WHITE_PEN));
Ellipse(myDC, posX - R, posY - R, posX + R, posY + R);

if ((delta > 0) and (posX + delta + R > (Rec.Right - Rec.Left)))
or
((delta < 0) and (posX - delta - R < 0))
then delta := -delta;
posX := posX + delta;

// и рисуем в новых координатах новое
SelectObject(myDC, GetStockObject(BLACK_PEN));
Ellipse(myDC, posX - R, posY - R, posX + R, posY + R);
ReleaseDC(Window, myDC);
Result := 0; Exit;
end;
WM_DESTROY: // Уничтожение окна
begin
KillTimer(Window, myTimer);
PostQuitMessage(0);
Result := 0; Exit;
end;
else
Result := DefWindowProc(Window, AMessage, WParam, LParam);
end;
end;

function InitApplication: Boolean;
var
wcx: TWndClass;
begin
wcx.style := CS_HREDRAW or CS_VREDRAW;
wcx.lpfnWndProc := @MainWndProc;
wcx.cbClsExtra := 0;
wcx.cbWndExtra := 0;
wcx.hInstance := hInstance;
wcx.hIcon := LoadIcon(0, IDI_APPLICATION);
wcx.hCursor := LoadCursor(0, IDC_ARROW);
wcx.hbrBackground := COLOR_WINDOW;
wcx.lpszMenuName := nil;
wcx.lpszClassName := PChar(WinName);

Result := RegisterClass(wcx) <> 0;
end;

function InitInstance: HWND;
begin
Result := CreateWindow(
PChar(WinName),
'Ping-pong',
WS_OVERLAPPEDWINDOW,
Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),
0, 0, hInstance, nil);
end;

var
hwndMain: HWND;
AMessage: msg;
begin
if (not InitApplication) then begin
MessageBox(0, 'Ошибка регистрации окна', nil, mb_Ok)
end
else begin
hwndMain := InitInstance;
if (hwndMain = 0) then begin
MessageBox(0, 'Ошибка создания окна', nil, mb_Ok)
end
else begin
ShowWindow(hwndMain, CmdShow);
UpdateWindow(hwndMain);
while (GetMessage(AMessage, 0, 0, 0)) do begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
end;
end;

end.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
KljaGGsa   WinAPI для простой графики   6.07.2009 17:25
volvo   Что именно вызывает затруднения? Рисуем шарик с по...   6.07.2009 21:24
KljaGGsa   В обычном пейнтбоксе и канвасе это действительно н...   6.07.2009 21:34
volvo   Так тебе совсем WinAPI-шное приложение надо, без V...   6.07.2009 23:43
Client   Это же не простой проект. Куда надо это скопироват...   7.07.2009 14:25
volvo   :blink: Это не простой, это простейший проект. На...   7.07.2009 14:35
Client   В смысле что там нету формы куда ложить кнопки, ед...   7.07.2009 14:46
volvo   Это WinAPI. Какие кнопки? Какие эдиты? VCL не испо...   7.07.2009 15:26
KljaGGsa   а я в полном шоке от этого кода, совершенно растер...   7.07.2009 21:18
volvo   Ну, начнем с самого начала. Ты знаешь, как Windows...   8.07.2009 11:17
KljaGGsa   Нет, мне пока что это совсем незнакомо. Знаю тольк...   8.07.2009 16:41
KljaGGsa   Хм, но что-то цель не получилось достичь. Прямое о...   8.07.2009 17:09
volvo   Вот именно это и есть основной цикл обработки сооб...   8.07.2009 17:13
Client   По той ссылке код для Си а примерах, а те функции ...   8.07.2009 17:33
KljaGGsa   Владимир, прямое обращение к функциям ОС меня заин...   8.07.2009 18:48
Unconnected   Дерганье и правда присутствует, даже не дёрганье, ...   8.07.2009 19:18


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 8.07.2025 11:29
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"