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

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

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

Postby dadreamer on 26 Oct 2018, 20:32

Юрий wrote:Да, печально. А я уж губу раскатал.

Я письмо в личку написал, посмотрите, может подойдёт такой вариант.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

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

Postby Konstantin Sumenko on 31 Oct 2018, 13:21

Когда-то делал стандартными средствами LV и winapi: viewtopic.php?f=142&t=2186&p=19374&hilit=mdi#p19374
User avatar
Konstantin Sumenko
expert
expert
 
Posts: 1437
Joined: 17 Jul 2008, 12:20
Location: Moscow
Medals: 2
Activity (1) Bronze (1)
LabVIEW Version: 2010
Karma: 122
VIP bloggers students

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

Postby dadreamer on 31 Oct 2018, 15:14

Konstantin Sumenko wrote:Когда-то делал стандартными средствами LV и winapi: viewtopic.php?f=142&t=2186&p=19374&hilit=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 работает, как ни странно, только графика "жертвы" подглючивает местами.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

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

Postby JohnChaban on 01 Nov 2018, 20:48

Скачал вчера тулкит.
Установил. Надо на работу там нет интернета.
Может кто поделится ссылочкой где можно скачать просто тулкит и на работу отнести.
Спасибо.
User avatar
JohnChaban
master
master
 
Posts: 476
Joined: 18 Feb 2010, 13:26
Location: Город Сосновый Бор Ленинградская Область
LabVIEW Version: 2015,2016
Karma: 0

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

Postby alex3f on 01 Nov 2018, 21:24

alex3f
beginner
beginner
 
Posts: 17
Joined: 23 Aug 2016, 09:16
LabVIEW Version: 2016
Karma: 10

Previous

Return to Для чайников

Who is online

Users browsing this forum: Google and 19 guests

cron