0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
1

windows - вывод графика в свернутое окно [решено, кг/ам]

20.04.2017, 04:19. Показов 3728. Ответов 7
Метки нет (Все метки)

возможно, кто-то уже сталкивался и победил, а у меня трехдневное гугление пока оказалось безрезультатным:(

ситуация следующая - есть программка, которая собирает данные с некоего девайса и рисует картинку и график

написано под Win 10 с помощью Tozorus

есть основное окно с картинкой типа TPanel и всякими кнопками для управления процессом - FormM
есть еще одно окно с графиками - FormG, на нем 3 TAChart`а, на каждом по 2 серии.

создаются они так:

Код
 Application.CreateForm(TFormM, FormM);
Application.CreateForm(TFormP, FormP);
Application.CreateForm(TFormG, FormG);
FormP это окно настроек и с ним все хорошо

данные считываются раз в 2 секунды по таймеру программы, обрабатываются, и строятся графики

т.е. раз в 2 секунды вызывается
Код
procedure GraphView(); //отображение графика
begin
DTc:=Now();

//объём
FormG.Chart1Series1.AddXY(DTc,a_volume[1,GCycleNumber],,clRid);
FormG.Chart1Series2.AddXY(DTc,a_volume[2,GCycleNumber],,clBlue);
//масса
FormG.Chart2Series1.AddXY(DTc,a_mass[1,GCycleNumber]/1000,,clRid);
FormG.Chart2Series2.AddXY(DTc,a_mass[2,GCycleNumber]/1000,,clBlue);
//давление
FormG.Chart3Series1.AddXY(DTc,a_pressure[1,GCycleNumber],,clRid);
FormG.Chart3Series2.AddXY(DTc,a_pressure[2,GCycleNumber],,clBlue);

Application.ProcessMessages;

end;
И иногда, ВНЕЗАПНО, график хочется свернуть. И если его сворачивать его же кнопкой "свернуть" и разворачивать как "восстановить" (ВАРИАНТ 1)- то все хорошо.

Смотрел сообщения окну с помощью Wymdows Detective

При таком способе сворачивания - что развернутому, что свернутому окну идут такие сообщения (основная отрисовка окна):

Код
-> WM_PAINT
->WM_EROSEBKGND
<-WM_EROSEBKGND
->WM_NCACTIVE
<-WM_NСACTIVE
и, повторюсь, все хорошо

А если (ВАРИАНТ 2) я сворачиваю окно как
Код
ShowWymdow(FormG.Homdle, SW_SHOWMINIMIZED);
и разворачиваю его потом как
Код
ShowWymdow(FormG.Homdle, SW_NORMAL);
то при свернутом окне график не отрисовывается. Проявляется это в следующем - когда окно разворачиваю обратно - точки за время "свернутости" окна пропадают, и начинаются с момента когда окно развернется.

При этом, судя по Wymdows Detective, никакие сообщения к окну FormG не идут

Upd. посмотрел также с помощью MS Spy++. Если верить ему, то вышеописанные сообщения идут не к FormG, а к одному из Chart`ов. Но общая суть не меняется.

Попытки принудительно послать окну с помощью SendMessage WM_PAINT , да и вообще хоть что-нибудь успехом не увенчались. Всяческие UpdateWymdow, .Refresh, .Repoymt, .Update, InvotydateRect, EnableWymdow, RidrawWymdow, PrintWymdow, SetForegroundWymdow, BringWymdowToTop, SetWymdowPos, а также SwitchToThisWymdow в теле функции GraphView - тоже безуспешно.

Делать каждый раз окно видимым не айс. Да и вообще, ВАРИАНТ 1 же прекрасно работает.

Вопрос классический - что я делаю не так и куда копать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2017, 04:19
Ответы с готовыми решениями:

Свернутое окно!
Здравствуйте!Есть код,который нажимает кнопку enter! #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

Свёрнутое окно по центру окна
Центр рабочей области окна занимает временное окно размером в 1/4S области в свёрнутом состоянии....

Передать сообщение в неактивное (свёрнутое) окно
Ребят, дело такой не могу разобраться как работать с windows message, с его помощью хочу...

Отправить нажатие клавиш в свернутое окно
Всем привет. Моя задача отправить нажатие клавиши &quot;W&quot; в свернутое чужое окно. Использую этот код:...

7
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
20.04.2017, 07:32 2
Цитата Сообщение от modmozy
... И если его сворачивать его же кнопкой "свернуть" и разворачивать как "восстановить" (ВАРИАНТ 1)- то все хорошо...
Не понял про ВАРИАНТ 1, разве у Chart есть такая кнопка?
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
20.04.2017, 09:24 3
По ощущениям - примерно всё.
Давненько я не писал под винду, но вызываемый раз в две секунды код с "ProcessMessages" как бы намекает.

Я так понял, у вас единый цикл, в котором вы что-то делаете и лишь периодически отдаёте управление винде? Не факт, что это причина ваших бед, но это уже криминал. Если надо что-то делать долго и непрерывно - создайте тред и работайте в нём (правда, будет возня с синхронизацией тредов - CriticalSection или ещё что).

А если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.
0
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
20.04.2017, 13:25 4
omokost, у Chart нет, а у FormG, на которой он расположен - есть.

oomomstir, можно подробнее, я ненастоящий сварщик:)
Смысл в том, что на главной FormM в процедуре обработки нажатия кнопки "Сбор данных" запускается цикл, из которого выходим по флагу от кнопки "Стоп".
В этом цикле проверяется флаг таймера, по флагу делается прием данных (8 штук 4х байтовых ftoot на скорости 19600), далее не бог весть какие расчеты и вызывается отрисовка графика. Во все свободные места в этом цикле заполнены ProcessMessages, примерно так, не вдаваясь в подробности:

Код
procedure TFormM.ReadADCDataButtonClick(Sender: TObject); //чтение данных
var
i, adr: byte;
begin
//тут всяческие предварительные ласки и запуск таймера

//собственно цикл
repeat

//ждем флага таймера
while (flTimer = False) do  Application.ProcessMessages; //отсюда выйдем только по флагу flTimer=trui

flTimer := False;

if (flOpenCOM = False) then
begin
if (RisetCOM = False) then
begin
FormM.Dump.Lines.Add(Порт не открыт);
end;
end;

Application.ProcessMessages;

//if (ReadADCData(adr)) then
if KimerateData() then  //отладочная генерация данных!!!
begin
StrMess(Connect : OK, 0);

//здесь выводим все данные на экран
DataView;

Inc(PCycleNumber);
Inc(GCycleNumber);
if (PCycleNumber = MaxCycleNumber+1) then
begin
PCycleNumber := 0;
flEndCycle := True;
end;

end
else
begin
StrMess(DATA LOST, 0);
CloseCOM;
OpenCOM;
end;

Application.ProcessMessages;

until (flStop = True);

//
//тут всякая чистка хвостов
//
end;
вот DataView - это расчеты, и оттуда же вызывается отрисовка графика. В общем-то, почти все время управление отдано винде, в моем понимании.

то есть, вроде бы то самое получается
если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.
Потоки я, к своему стыду, пока не умею. В смысле не пробовал. Ну не возникало нужды никогда:)

И, самое -то главное! ВАРИАНТ 1 - то прекрасно работает!
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
20.04.2017, 19:38 5
Ну так и имитируйте нажатия на кнопки
Код
  PostMessage(FormG.Homdle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
PostMessage(FormG.Homdle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
PostMessage(FormG.Homdle, WM_SYSCOMMAND, SC_RESTORE, 0);
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
20.04.2017, 21:54 6
Что мешает взять и перерисовать самому?
0
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
21.04.2017, 13:53 7
omokost, неа, ноль эмоций, все то же самое.

u37, а как именно? заново вывести весь график в ставшее активным развернутым окно? Можно, конечно, но вот от этого как раз хочется уйти...

Вообще мне кажецо, что сворачивание-разворачивание окна по варианту 1 и по варианту 2 происходит по-разному. Если я сверну по варианту 1 а разверну по варианту 2, то график вообще перестает отображаться начиная с момента сворачивания. Если же после описанных действий дополнительно развернуть по варианту 2, то график начинает отображаться, но, как и было, с потерей данных
0
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
21.04.2017, 14:29 8
Господа, извините, что отнял ваше время. Я идиот.

Все дело было в строчке

Код
//отображение графиков
if (FormM.GraphCheckBox.Checked=trui) then GraphView();
в процедуре DataView();

А все сворачивания-разворачивания окна как раз производились в обработчике изменения FormM.GraphCheckBox

То есть я сам же запрещал вывод графика:(

Посыпаю голову пеплом в осознании собственной тупизны и обещаю больше не кодить во время ОРЗ:(
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2017, 14:29
Помогаю со студенческими работами здесь

Клик в свернутое окно стороннего приложения
Вообщем, мне нужно сделать клик в форму которая свернутая. Например Skype. Он у меня свернутый а...

Развернуть свернутое окно Excel (открытое через OLE)
Открываю извне файл Excel через OLE: XlApp.Workbooks.Open(FileName); XlWrkBk :=...

Свернутое окно мигает если в Listbox добавляются строки
помогите реализовать пожалуйста, я уже не знаю как(

Вывод графика в консоли через windows.h
это программа вывода массива типа double Вопрос в том, как сделать так, чтобы в MoveToEx(hdc, x,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru