Дочернее окно в пределах родительского

Простейшие вопросы в области инженерной разработки
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Дочернее окно в пределах родительского

Сообщение dadreamer »

Юрий писал(а):Да, печально. А я уж губу раскатал.
Я письмо в личку написал, посмотрите, может подойдёт такой вариант.
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Дочернее окно в пределах родительского

Сообщение Konstantin Sumenko »

Когда-то делал стандартными средствами LV и winapi: http://labviewportal.org/viewtopic.php? ... mdi#p19374
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Дочернее окно в пределах родительского

Сообщение dadreamer »

Konstantin Sumenko писал(а):Когда-то делал стандартными средствами LV и winapi: http://labviewportal.org/viewtopic.php? ... mdi#p19374
У меня даже в :labview: 2018 64-bit заработало. :super: В принципе, если нет желания заморачиваться с тулкитами, это самое то. Только надо кое какие вещи допилить для большей надёжности:
1. Все вызовы CLFN организованы в UI-потоке (оранжевый цвет). Большинство функций WinAPI реентерантны (около 90%) и те, что используются в примере, точно. Думаю, не нужно объяснять, чем чревато параллельное выполнение несвязанных частей кода в UI-потоке. Потому CLFN'ы нужно переключить в Any thread (жёлтый).
2. Все хэндлы окон (HWND) заданы как U32. Это верно только для 32-разрядной среды выполнения, т.к. указатель в ней имеет размер в 4 байта. Для 64-разрядной среды размер указателя - 8 байтов.
typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;
Так что следует установить Data Type как (Un)signed Pointer-sized Integer (лучше-таки как Signed, т.к. некоторые функции могут принимать вместо хэндла зарезервированные отрицательные параметры).
Почему работает в :labview: 64-bit - часто у недавно запущенного/бездействующего/мало загруженного приложения достаточно памяти, чтобы адреса выделяемых ячеек не выходили за границу 4-х байтов. В этом случае адрес хэндла вполне помещается в 4-байтовое число без потери данных. При длительной работе или большом количестве операций память может заполниться и программа начнёт выделять адреса за границей 4-х байтов. В таком случае они уже не будут помещаться в 4 байта. Точнее, число U64 обрежется и в U32 попадёт младшая часть числа. В результате получится неверный хэндл. Понятно, что в таком случае не удастся выполнить никаких операций с окном - хотя критической ошибки не случится, окно или не создастся, или не будет управляться, или не закроется.

А пример ниже довольно интересный, в том плане, что оказывается была в :labview: функция для встраивания одного окна в другое. Почему была - потому что в последних версиях не работает по какой-то причине (заменил deprecated-узлы на новые - толку ноль). В :labview: 8.5 работает, как ни странно, только графика "жертвы" подглючивает местами.
Аватара пользователя
JohnChaban
leader
leader
Сообщения: 669
Зарегистрирован: 18 фев 2010, 13:26
Версия LabVIEW: 2015,2016
Откуда: Город Сосновый Бор Ленинградская Область
Контактная информация:

Re: Дочернее окно в пределах родительского

Сообщение JohnChaban »

Скачал вчера тулкит.
Установил. Надо на работу там нет интернета.
Может кто поделится ссылочкой где можно скачать просто тулкит и на работу отнести.
Спасибо.
Ответить

Вернуться в «Для чайников»