Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2015, 21:41   #1
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию WinApi Рисование

Здравствуйте, пишу графический движок, рисование идет на битмапе затем выводится картинка на DC формы, но при перемещении формы dc обновляется и почему то перерисовка не происходит. Подскажите пожалуйста.

Код:
procedure MainPaint;
var
  ohbr,hbr:HBRUSH;
begin
  // Заливка битмапа черным vvvvv
  hbr:=CreateSolidBrush(0);
  ohbr:=SelectObject(BitMapHandle, hbr);
  FillRect(BitMapHandle,rect(0,0,Main_Width,Main_Height),hbr);
  SelectObject(BitMapHandle,ohbr);
  DeleteObject(hbr);
  // Заливка битмапа черным ^^^^^

  if @NGlDrawProc <> nil then NGlDrawProc;
  // Рисуем из клиентского кода

  BitBlt(dc,0,0,Main_width,Main_Height,BitMapHandle,0,0,SRCCOPY);
  // Выводим на дс окна
end;
Код:
function windowproc(wnd: hwnd; msg: integer; wparam: wparam; lparam: lparam):lresult;stdcall;
var
  ps : PAINTSTRUCT;
begin
  case msg of
//...
  WM_PAINT:
    begin
      dc := BeginPaint(form, ps);
      Result:=0;
    end;
//...
end
И Код клиента

Код:
procedure MainPaint;
begin
  NPaint_Line(100,100,300,300,psSolid,3,RGB(0,100,100));
  NPaint_Rect(Random(1920),Random(1080),60,60,psSolid,3,random(100500));
end;

begin
  LoadNEoGLLibrary('MyGlEngine.dll');
  NGlRegProcedure(NGL_Draw,@MainPaint);
  NGlCreateWindow(1920,1080);
  NGlInit;
end.
Заранее спасибо
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 06.04.2015, 22:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
WM_PAINT:
begin
dc := BeginPaint(form, ps);
Result:=0;
end;
А где вызов MainPaint()?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.04.2015, 15:52   #3
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А где вызов MainPaint()?
MainPaint вызывается по таймеру, с dc который был получен в сообщении.

Код:
procedure MMCallBack(uTimerID, uMsg: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
  case dwUser of
    0: exit;
    1: MainPaint;
  else
    TNEoGlTimer(dwUser).OnTimer;
  end;
end;

procedure NGLInit;
begin
  timeSetEvent(10, 1, @MMCallBack, 1,TIME_CALLBACK_FUNCTION or TIME_PERIODIC);

  while getmessage(mmsg,0,0,0) do
  begin
    translatemessage(mmsg);
    dispatchmessage(mmsg);
  end;
end;
>>> Сорц


Хм.
Проблема решилась добавлением

Код:
  WM_PAINT:
    begin
      //EndPaint(Form,ps);
      InvalidateRect(Form,nil,false);
      dc := BeginPaint(form, ps);

      Result:=0;
    end;
Влепил наугад, верное решение?)
Здравствуйте

Последний раз редактировалось NEoMASTERR; 07.04.2015 в 16:15.
NEoMASTERR вне форума Ответить с цитированием
Старый 07.04.2015, 16:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Даж не знаю... Я как-то по таймеру рисование не делал, в основном все в WM_PAINT. Изменения контента в таймере еще понимаю, но рисовать как-то привык в соответствующем событии\сообщении.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.04.2015, 17:19   #5
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Ну WM_Paint приходит лишь один раз (пока не подергаешь), а там движущиеся фигуры которые надо перерисовывать, движок + игрушку делаю. С Формой сделал но хочу отдельно дллкой и на апи
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 07.04.2015, 17:34   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Bitmap и Canvas - одно и тоже. Берите технологии приспособленние для нужд. Иначе сами потом матерясь будите все это переписывать на GDI хотя бы. Но и у него есть ограничение на вроде бы 8-10 тыс. объектов.
Человек_Борща вне форума Ответить с цитированием
Старый 07.04.2015, 17:35   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
приходит лишь один раз
Ниче такого )
Она приходит когда окну нужно перерисоваться. И не один раз а много по необходимости - винда сама знает когда это сделать.
Цитата:
а там движущиеся фигуры которые надо перерисовывать
У нас тут на форуме обсуждались темы как писать игры - рекомендую пошариться поиском по ветке http://www.programmersforum.ru/forumdisplay.php?f=33
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.04.2015, 17:41   #8
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ниче такого )
Она приходит когда окну нужно перерисоваться. И не один раз а много по необходимости - винда сама знает когда это сделать.
И Что ждать пока винда сама решит когда игроку видеть соперников?) Я навязываю ей, думаю так и другие движки делают

Цитата:
Сообщение от Stilet Посмотреть сообщение
У нас тут на форуме обсуждались темы как писать игры - рекомендую пошариться поиском по ветке http://www.programmersforum.ru/forumdisplay.php?f=33
Я не прошу помочь с игрой, я прошу помощи с графическим движком). Я не хочу готовый взять и использовать, мне интересно двиг. Первый раз такое делаю вот и поинтересовался. С формой сделал и 1200 объектов с нарисованным фоном в битмапе на 6 мб прыгали и бегали и не лагали, подумал выкинуть форму, взять таймер другой, короче полная переделка кода, там рисовал канвой а тут всякие SelectObject и подобное. В интернетах не нашёл ничего путного так что иду наугад

Вот кстати заготовка игры

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Bitmap и Canvas - одно и тоже. Берите технологии приспособленние для нужд. Иначе сами потом матерясь будите все это переписывать на GDI хотя бы. Но и у него есть ограничение на вроде бы 8-10 тыс. объектов.
Я и так на GDI все это делаю, всё по стандарту..
Здравствуйте

Последний раз редактировалось Stilet; 07.04.2015 в 18:30.
NEoMASTERR вне форума Ответить с цитированием
Старый 07.04.2015, 18:02   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы можете подать сигнал окну на перерисовку.
Refresh попробуйте.
Цитата:
Я навязываю ей, думаю так и другие движки делают
рисуя насильно вы не навязываете.
движки не так делают
тем более граф движки вообще немного на иной технологии пашут
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.04.2015, 18:32   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я не хочу готовый взять и использовать, мне интересно двиг.
Да я только теорию предлагаю )
Так сказать для кругозора. Просто я не очень понимаю как же в таймере так изголиться чтоб за все обьекты отвечать. Я еще понимаю мол параметры перса и окружения меняются в сопроцессах, но таймер...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование средствами WinApi maksim_serg Microsoft Office Excel 1 09.12.2014 08:07
WinApi рисование в VBA Desha Помощь студентам 5 05.12.2012 12:32
рисование в WINAPI Alt_Shift Помощь студентам 3 03.07.2011 20:14
Рисование в WinApi nazavrik Win Api 13 30.08.2009 23:54
Рисование на форме созданной на WinApi N!ckeL Win Api 3 30.04.2008 19:02