Страница 2 из 2

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

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

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

Добавлено: 31 окт 2018, 13:21
Konstantin Sumenko
Когда-то делал стандартными средствами LV и winapi: http://labviewportal.org/viewtopic.php? ... mdi#p19374

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

Добавлено: 31 окт 2018, 15:14
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 работает, как ни странно, только графика "жертвы" подглючивает местами.

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

Добавлено: 01 ноя 2018, 20:48
JohnChaban
Скачал вчера тулкит.
Установил. Надо на работу там нет интернета.
Может кто поделится ссылочкой где можно скачать просто тулкит и на работу отнести.
Спасибо.

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

Добавлено: 01 ноя 2018, 21:24
alex3f