Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.04.2012, 19:20
Kingcss Kingcss вне форума
Начинающий
 
Регистрация: 20.12.2010
Адрес: Иваново
Сообщения: 100
Версия Delphi: Delphi 7
Репутация: 519
По умолчанию WinApi перерисовка формы

Вообщем недавно решил состряпать программу которая бы рисовала графики любых функций, программа довольно легкая и дабы усложнить задачу и для улучшения своих навыков программирование решил написать ее на win api, и столкнулся с проблемой, для начала я приведу листинг моей программы:
PHP код:
//тут я создаю окно и впоследствии выполняю функцию drawgrid
procedure CreateMainWindow;
begin
window
.cbSize := sizeof (window);
 
//window.style := CS_HREDRAW or CS_VREDRAW;
 
window.lpfnWndProc := @WindowProc;
 
window.cbClsExtra := 0;
 
window.cbWndExtra := 0;
 
window.hInstance := HInstance;
 
window.hIcon := LoadIcon (0,IDI_APPLICATION);
 
window.hCursor := LoadCursor (0,IDC_ARROW);
 
window.hbrBackground:=Color_BtnFace+12;
 
window.lpszMenuName := nil;
 
window.lpszClassName := 'Main_Window';
 
RegisterClassEx (window);
 
Mwindow:=CreateWindowEx0,'Main_Window','Graphic',WS_POPUP,100,100,xRect,yRect,0,0,Hinstance,nil); 
 
SHOWWINDOW (Mwindow,SW_Show);
 
DrawGrid;
end;

procedure DrawGrid;
 var
 
DC:HDC;
 
Penhandle:HPEN;
 
color:Cardinal;
 
i:integer;
 
x,y:Integer;
 
ps:PAINTSTRUCT;
 
begin
 DC
:=BeginPaint(Mwindow,ps);
 
color:=RGB(255,51,0);
 
Penhandle:=CreatePen(PS_SOLID,1,color);
 
SelectObject(DC,Penhandle);
 
x:=xRect div 2;
 
y:=yRect div 2;
 
MoveToEx(DC,x,yRect,nil);
 
LineTo(DC,x,0);
 
MoveToEx(DC,0,y,nil);
 
LineTo(DC,xRect,y);
 
DeleteObject(Penhandle);
 
Endpaint(Mwindow,ps);
 
end;
//в ней я рисую оси графика 
В итоге все рисуется но при переключениена другое окно, это уже не открывается и даже не перерисовывается, полазав по гуглу до меня дошло что нужно перерисовывать вручную в событие WM_PAINT
Дальше я столкнулся с такой проблемой: если в событие WM_PAINT написать например:
PHP код:
DC:=BeginPaint(Mwindow,ps);
 
TextOut(DC,0,0,PChar('Программа'),4);
 
Endpaint(Mwindow,ps); 
То все прекрасно перерисовывается, так же как и пока окно пустое, а если по WM_PAINT вызывать DrawGrid, то опять же проблема ничего не прорисовывается. Так же я и пытался создать BMP, делать изменения на нем и потом его прорисовывать. Также ноль успеха. Прошу помочь мне разобраться с моей задачей
Ответить с цитированием
  #2  
Старый 08.04.2012, 22:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Крепи архив, подправлю.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 12.04.2012, 15:13
Kingcss Kingcss вне форума
Начинающий
 
Регистрация: 20.12.2010
Адрес: Иваново
Сообщения: 100
Версия Delphi: Delphi 7
Репутация: 519
По умолчанию

Так долго не отвечал, потому что данную проблему решил сам. И дабы не создавать еще тем и засорять форум, прошу ответить на два вопроса:
1) У меня имеется два окна, создаваемых на winapi, сначало я создаю одно, на котором есть Edit и button, я перехватываю щелчок кнопки и по этому щелчку создаю второе окно, а потом уничтожаю первое. Так вот, может я немного не понимаю смысла работы с окнами, но при уничтожении первого окна, программа прекращает работать. На данный момент решаю скрытием окна.
PHP код:
SHOWWINDOW(ReqMwindow,SW_HIDE); 
Я так понял что тут также как в делфи есть одна главная форма, и при ее закрытии программа выключается, или я неправ.
2) И второй вопрос, каким образом можно реализовать интерпритатор (помоему так называется), тоесть я ввожу выражение: x^2 или (x-1)/(x^3+5) , а компьютер подставлял бы координату x, и считал y.
На данный момент работает только если, вручную писать в функцию.
Ответить с цитированием
  #4  
Старый 12.04.2012, 15:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1. PostQuitMessage наверное вызываешь
2. IScriptControl в помощь. либо:
Код:
  WebBrowser.Navigate('about:blank');
  while WebBrowser.ReadyState<READYSTATE_INTERACTIVE do
    Application.ProcessMessages;
  (WebBrowser.Document as IHTMLDocument2).body.innerText:='';
  (WebBrowser.Document as IHTMLDocument2).parentWindow.execScript('var r='+Edit.Text+'; document.write(r+"<br>");', 'javascript');
  Memo.Lines.Insert(0, (WebBrowser.Document as IHTMLDocument2).body.innerText);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 12.04.2012, 18:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от Kingcss
2) И второй вопрос, каким образом можно реализовать интерпритатор (помоему так называется), тоесть я ввожу выражение: x^2 или (x-1)/(x^3+5) , а компьютер подставлял бы координату x, и считал y.
На данный момент работает только если, вручную писать в функцию.
Писал один раз построитель графиков. Анализировал формулу самым простым методом - методом обратной польской польской нотации (примеры в гугле). Докачал до синусов и логарифмов, потом забил. Предварительно делал ломовую подготовку: все знаки операций (+, -, *, /, ^, sin, cos, tg, log, ...) заменял в строке на их номера (+ на #1, - на #2,...). При подсчете уже брал очередной элемент, если символ #1-#20 - вызывал соответствующую функцию, если цифра - дописывал к операнду, если буква - брал соответствующую переменную/константу (поддерживало pi, e, x; pi я заменял на греческую "пи"). Вообщем всё наиболее простым способом. Знаю, что есть намного более продуктивные методы, нежели польская нотация, но тогда не было желания копаться в сложном.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter