Не знаю проблемы у меня или в модуле http://forum.pascal.net.ru/index.php?s=&showtopic=4687&view=findpost&p=38949 или еще в чем-то, но не всегда получается отловить нажатие кнопки мыши, а после readkey графическое окно вообще перестает реагировать на другие события.
Как я пытаюсь работать с мышой:
repeat
if PollMouseEvent(MEvent) then
begin
GetMouseEvent(MEvent);
MouseX:=MEvent.x; MouseY:=MEvent.y;
if (MouseX <> x0) or (MouseY <> y0) then
begin
x0:=MouseX; y0:=MouseY;
if (MEvent.action=MouseActionDown) or (keypressed) then
Arrow.StartNew
else
Arrow.ChangePosition(round(MouseX/step)*step,
round(MouseY/step)*step);
end;
Delay(1);
end;
until CloseGraphRequest;
CloseGraph;
Погоди, а зачем PollMouseEvent? Насколько я помню, можно просто вот по такому шаблону:
uses WinCrt, WinMouse, Graph;
...
flag := false;
repeat
GetMouseState(x, y, State);
If (State and LButton) = LButton Then // чего-то там делать, было нажатие
If ( State and RButton ) = RButton Then // ну, а по правому клику - выход
flag := true;
until flag;
procedure GetMouseEvent(out MouseEvent:MouseEventType);
begin
while (nr_readmouse = nr_inputmouse) do Sleep(10);<---!!!!!
EnterCriticalSection(protect_mouse);
PollMouseEvent(MouseEvent);
IncMouseCyclic(nr_readmouse);
LeaveCriticalSection(protect_mouse);
end;
uses WinCrt, WinMouse, Graph;
Во-первых, я ничего просто
А можно поинтересоваться- почему стандартный модуль mouse не работает со стандартным модулем graph?
Ну, модуль Graph я тоже не знаю, зачем поддерживается в FPC... Можно было и забыть уже про него - это ж только для совместимости с TP/BP, а так есть же GL/GLUT в стандартной поставке (согласись, то, что можно создать в GLUT обычному Графу и не снилось)...
А вообще-то я в FreePascal Community наткнулся на интересный способ работы с мышью - от некоего Sampsa Seppälä, который предлагал вот такое:
uses windows;(не проверял, но выглядит вполне работоспособно)
var
mpos: tpoint;
...
getcursorpos(mpos);
write(mpos.x, mpos.y); { mouse cordinates }
if getasynckeystate(1) < 0 then { mouse button pressed }
...
У тебя в папке "FPC\units\i386-win32\opengl" нет файлов GL.*, GLU.*, GLUT.* ? Значит, "неправильный мед" (С) - качай правильный...
Ну, а описание модуля Windows - это как всегда: msdn.microsoft.com (там все те же функции из WinAPI, только в фри-паскальной обертке)
Нет, мед - правильный, это у меня что-то неправильно..
Лучше всего - в виде "OpenGL Programming Guide (Addison-Wesley Publishing Company)
RedBook: Second Edition (The Official Guide to Learning OpenGL)" - довольно полное и понятное (по-английски, разумеется) описание основных функций с примерами использования...
По форуму пошерсти, по-моему тоже что-то на тему OpenGL проскальзывало...
Тема обработки событий уже жевалась, и не на одном форуме. http://www.freepascal.ru/forum/viewtopic.php?p=7566&sid=46f4000e0793ccadb38ff0c577841999 SDL - в нём и видео и обработка событий. Сейчас забросил в каталог файл sdl.dll и заработало под виндовсом. Всё просто. Функцией SDL_PollEvent записываем в переменную события а потом вытаскиваем нужное. И клик мышкой и координаты курсора, всё сразу записано в одной переменной.
Прикрепленные файлы
sdl.dll.zip ( 94.06 килобайт )
Кол-во скачиваний: 321
SKVOZNJAK, можешь чуть подробнее объяснить? Почему ты мне даешь модуль с видеорежимом? Мне же просто графический надо.. какая разница между ними? Пробовал запустить твой код с последнего месседжа - не вышло: компиляция проходит успешно, но потом, во время выполнения, вылетает с 309 ошибкой.
Да, наверно никакой, так назвалось. И последний и предпоследний пример в 2.0.2 версии у меня запустились. Спешил, не было времени другую демку делать. Версий причин неполадок у меня 3:
1 Пример выводит на экран картинку BMP. Программа могла не найти в текущем каталоге графический файл указанного разрешения и имени файла.
2
screen := SDL_SetVideoMode(width, height, colordepth, (SDL_FULLSCREEN + SDL_SWSURFACE));Последний параметр в функции, сумма констант, маска. Она определяет многое, можно убирать лишние и прибавлять дополнительные константы. Если убрать SDL_FULLSCREEN, окно будет не полноэкранным. SDL_SWSURFACE - тип используемой видеорежимом памяти, можно использовать другой, прибавить константы - двойная буферизация, опенгл. Но с последней константой у меня не работало. Попробуй использовать другой тип памяти.
Ни одного гото не используется, почти подвиг В принципе, поправить кодировочку и можно на хранение в фак, в рунете с примерами к SDL - совсем не густо.
program demo;
uses
SDL, SDL_Video, SDL_Events, SDL_Mouse, crt;
const
width = 800;
height = 600;
{Ј«гЎЁ 梥в®бвЁ}
colordepth = 32;
var
screen: PSDL_Surface;
event: PSDL_Event;
done: Boolean;
XX,YY,q,w : word;
{Ґб«Ё Ј«гЎЁ 梥в®бвЁ 16 ЎЁв, ЁбЇ®«м§®ў вм вЁЇ word, 8 - byte}
Type
Pixel = cardinal ; { Must have colordepth bits }
Type {ЎгдҐа ў Є®в®а®¬ Ўг¤Ґ¬ аЁб®ў вм Ја дЁЄг}
{ This type mimics the pixel surface srtucture: 'height' sequential rows
of 'width' pixels each. }
TpixelBuf = Array [0..height-1, 0..width-1] of Pixel ;
var zzz: Pixel;
begin
SDL_Init(SDL_INIT_VIDEO);
event := new(PSDL_Event);
{ЁЁжЁ «Ё§ жЁп Ја д ०Ё¬ , ў ЇҐаҐ¬Ґго screen § ЇЁблў овбп Ї а ¬Ґвал Ја д ®Є }
screen := SDL_SetVideoMode(width, height, colordepth, ({SDL_FULLSCREEN +} SDL_SWSURFACE));
if screen = nil then
begin
writeLn ('Couldn''t initialize video mode at ', width, 'x', height, 'x', colordepth, 'bpp');
halt(1);
end;
{Ё§ в Ў«Ёжл 梥⮢ нв®Ј® ўЁ¤Ґ®аҐ¦Ё¬ ўлЎЁа Ґ¬ г¦л© § ЇЁблў п ҐЈ® Єа ᮥ,
§Ґ«с®Ґ Ё бЁҐҐ § 票Ґ - ЎЁвҐ}
zzz:=SDL_MapRGB(screen^.format, 255,0,255);
{§ ЇЁблў Ґ¬ ў ЎгдҐа Ї® Є®®а¤Ё в ¬ е=400, г=200 дЁ®«Ґв®ўго в®зЄг}
Tpixelbuf(screen^.pixels^)[200,400] :=zzz;
{Ґб«Ё Ї®б«Ґ¤ЁҐ 4 Ї а ¬Ґва =0 - ®Ў®ў«пҐвбп нЄа , в®Ј¤ в®зЄ Ї®Ї ¤св нЄа }
SDL_updateRect(screen, 0, 0, 0, 0);
Tpixelbuf(screen^.pixels^)[200,100] := SDL_MapRGB(screen^.format, 255,255,255);
Tpixelbuf(screen^.pixels^)[300,400] := SDL_MapRGB(screen^.format, 0,255,0);
delay(3000);
SDL_updateRect(screen, 0, 0, 0, 0);
done := FALSE;
while (done = FALSE) do
begin
if (SDL_PollEvent(event) > 0) then
begin
CASE event^.eventtype OF
{Їа®Ё§®и«® б®ЎлвЁҐ - ¦ вЁҐ Є« ўг}
SDL_KEYDOWN :begin
{зЁв Ґ¬ § ЇЁб л© бЄ Є®¤ ¦ в®© Є« ўл}
xx:= event^.Key.keysym.sym ;
w:=1;
done := TRUE;
end;
{Їа®Ё§®и«® б®ЎлвЁҐ - ¦ вЁҐ Є®ЇЄг Єалбл}
SDL_MOUSEBUTTONDOWN : begin
{зЁв Ґ¬ § ЇЁб лҐ Є®®а¤Ё вл Єгаб®а ¬®¬Ґв Є«ЁЄ }
xx:=event^.MOTION.x;
yy:=event^.MOTION.y;
q:=1;
done := TRUE;
end;
end;
end;
end;
{ў®§ўа 饨Ґ нЄа г ҐЈ® த®Ј® а §аҐиҐЁп}
SDL_freeSurface(screen);
SDL_Quit ;
if q=1 then writeln('x Ї®§ЁжЁп Єгаб®а ', xx,', y Ї®§ЁжЁп Єгаб®а ',yy);
if w=1 then writeln('Ўл« ¦ в Є« ў , Ґс бЄ Є®¤ ',xx);
delay(5000);
writeln('rfrjq tynj dsvjhf;bdf.obq vfhfpv nsrfnm d dbylt vbrhjcrjgbxtcrbt cbvdjks');
end.
Создавай