Я письмо в личку написал, посмотрите, может подойдёт такой вариант.Юрий писал(а):Да, печально. А я уж губу раскатал.
Дочернее окно в пределах родительского
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Дочернее окно в пределах родительского
-
Konstantin Sumenko
- expert
- Сообщения: 1439
- Зарегистрирован: 17 июл 2008, 12:20
- Награды: 2
- Версия LabVIEW: 2010
- Откуда: Moscow
- Поблагодарили: 1 раз
- Контактная информация:
Re: Дочернее окно в пределах родительского
Когда-то делал стандартными средствами LV и winapi: http://labviewportal.org/viewtopic.php? ... mdi#p19374
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Дочернее окно в пределах родительского
У меня даже в 2018 64-bit заработало. В принципе, если нет желания заморачиваться с тулкитами, это самое то. Только надо кое какие вещи допилить для большей надёжности:Konstantin Sumenko писал(а):Когда-то делал стандартными средствами LV и winapi: http://labviewportal.org/viewtopic.php? ... mdi#p19374
1. Все вызовы CLFN организованы в UI-потоке (оранжевый цвет). Большинство функций WinAPI реентерантны (около 90%) и те, что используются в примере, точно. Думаю, не нужно объяснять, чем чревато параллельное выполнение несвязанных частей кода в UI-потоке. Потому CLFN'ы нужно переключить в Any thread (жёлтый).
2. Все хэндлы окон (HWND) заданы как U32. Это верно только для 32-разрядной среды выполнения, т.к. указатель в ней имеет размер в 4 байта. Для 64-разрядной среды размер указателя - 8 байтов.
Так что следует установить Data Type как (Un)signed Pointer-sized Integer (лучше-таки как Signed, т.к. некоторые функции могут принимать вместо хэндла зарезервированные отрицательные параметры).typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;
Почему работает в 64-bit - часто у недавно запущенного/бездействующего/мало загруженного приложения достаточно памяти, чтобы адреса выделяемых ячеек не выходили за границу 4-х байтов. В этом случае адрес хэндла вполне помещается в 4-байтовое число без потери данных. При длительной работе или большом количестве операций память может заполниться и программа начнёт выделять адреса за границей 4-х байтов. В таком случае они уже не будут помещаться в 4 байта. Точнее, число U64 обрежется и в U32 попадёт младшая часть числа. В результате получится неверный хэндл. Понятно, что в таком случае не удастся выполнить никаких операций с окном - хотя критической ошибки не случится, окно или не создастся, или не будет управляться, или не закроется.
А пример ниже довольно интересный, в том плане, что оказывается была в функция для встраивания одного окна в другое. Почему была - потому что в последних версиях не работает по какой-то причине (заменил deprecated-узлы на новые - толку ноль). В 8.5 работает, как ни странно, только графика "жертвы" подглючивает местами.
- JohnChaban
- leader
- Сообщения: 669
- Зарегистрирован: 18 фев 2010, 13:26
- Версия LabVIEW: 2015,2016
- Откуда: Город Сосновый Бор Ленинградская Область
- Контактная информация:
Re: Дочернее окно в пределах родительского
Скачал вчера тулкит.
Установил. Надо на работу там нет интернета.
Может кто поделится ссылочкой где можно скачать просто тулкит и на работу отнести.
Спасибо.
Установил. Надо на работу там нет интернета.
Может кто поделится ссылочкой где можно скачать просто тулкит и на работу отнести.
Спасибо.