Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново...

Ответ
 
Опции темы
Старый 18.10.2016, 20:41   #1
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Для тех, кому в блице внезапно не хватило браузера, word и тд

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

Код AutoIt 3.3.14.2:
#NoTrayIcon

#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
#Include <Word.au3>

Opt("WinTitleMatchMode", 3)

$eXn = @ScriptDir & '\bin.exe'
$lPn = 'SCL.auto'

$aRet = _GetDesktopWorkArea()

If Not WinExists($lPn) Then

	if _WinAPI_GetVersion() = 10 then
		$dw = _WinAPI_GetSystemMetrics(16) - 2 * _WinAPI_GetSystemMetrics(6)
		$dh = _WinAPI_GetSystemMetrics(17) - _WinAPI_GetSystemMetrics(6) - _WinAPI_GetSystemMetrics(7)
		ShellExecute ($eXn, string($dw) & "/" & string($dh))
		WinMove (WinWaitactive($lPn), "", $aRet[0] - 2 * _WinAPI_GetSystemMetrics(6), $aRet[1])
	Else
		$dw = _WinAPI_GetSystemMetrics(16) - 2 * _WinAPI_GetSystemMetrics(6)
		$dh = _WinAPI_GetSystemMetrics(17) - 2 * _WinAPI_GetSystemMetrics(7)
		ShellExecute ($eXn, string($dw) & "/" & string($dh))
		WinMove (WinWaitactive($lPn), "", $aRet[0] - 2 * _WinAPI_GetSystemMetrics(6), $aRet[1] + _WinAPI_GetSystemMetrics(7))
	EndIf

	$GUI = WinGetHandle ($lPn)

	_WinAPI_SetWindowLong($GUI, $GWL_STYLE, bitor(_WinAPI_getWindowLong($GUI, $GWL_STYLE), $WS_CLIPCHILDREN))

	Opt("WinTitleMatchMode", 1)

	$oWordApp = _Word_Create (0, 0)
	$hWnd = WinWait ("Microsoft Word")
	_WinAPI_SetWindowLong($hWnd, $GWL_EXSTYLE, $WS_EX_TOOLWINDOW)
	_Word_DocOpen($oWordApp, @ScriptDir & "\test.docx")
	_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, $WS_POPUP)

	_WinAPI_MoveWindow($hWnd, 0, 0, 200, 200)
	_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, BitOR($WS_CHILD, $WS_TABSTOP, $WS_VISIBLE))

	_WinAPI_SetParent($hWnd, $GUI)
	_WinAPI_MoveWindow($hWnd, 0, 61, $dw - $dw / 5, $dh - 61)

	_WinAPI_UpdateWindow($GUI)
	_WinAPI_UpdateWindow($hWnd)

	;$iTimer = TimerInit()
	_WinAPI_InvalidateRect($GUI)

	While WinExists($lPn)

		;If TimerDiff($iTimer) >= 500 Then
		;	$iTimer = TimerInit()
		;	_WinAPI_InvalidateRect($GUI)
		;EndIf

	Wend

	_Word_Quit($oWordApp)

Else

	WinSetState ($lPn, '', @SW_SHOW & @SW_RESTORE)
	WinActivate($lPn)

EndIf

Func _GetDesktopWorkArea()

    Local Const $SPI_GETWORKAREA = 48
    Local $sRect = DllStructCreate($tagRECT)

    If _WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($sRect)) Then
        Local $aRet[4] = [ _
        DllStructGetData($sRect, "Left"), _
        DllStructGetData($sRect, "Top"), _
        DllStructGetData($sRect, "Right"), _
        DllStructGetData($sRect, "Bottom")]
        Return SetError(0, 0, $aRet)
    EndIf
    Return SetError(1, 0, 0)
EndFunc   ;==>_GetDesktopWorkArea

Вкратце что делаем:
1. При открытии окна блица надо добавить к нему стиль WS_CLIPCHILDREN операцией бинарного ИЛИ к уже существующим стилям - это для того, чтобы блиц не перерисовывал область дочернего окна.
2. При запуске потенциального дочернего окна назначаем ему стиль WS_EX_TOOLWINDOW, чтобы он не мелькал в панели задач, а потом назначаем WS_POPUP, чтобы убрать рамку.
3. Переназначаем дочернему окну стили WS_CHILD и WS_VISIBLE - дочернее и видимое (тк по умолчанию окно будет скрыто после предыдущих операций).
4. Назначаем родителя SetParent, обновляем окна, посылая ему WM_PAINT, тут начинается лабуда из-за очередности прорисовки окон в винде, чтобы этой лабуды не было, назначаем InvalidateRect.

PS. Универсальную dll не стал делать, т.к. каждое приложение имеет свои особенности, лучше подгонять отдельно - править скрипт autoit.
PS2. Почему блиц? Мне нужна 3D сцена, которая создается считывая данные из документа Word, которые при этом правятся. В общем, из 3D движков я работал только с блицем, мне проще взять его и не париться.

Потестите пример (run.exe), у всех дочернее окно ворда нормально отрисовывается?
Проверял на Win 7 и 10 х64, офис 2010.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 1054
Размер:	63.9 Кб
ID:	22534  
Вложения
Тип файла: rar test0.rar (1.24 Мб, 650 просмотров)
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо DarkInside за это полезное сообщение:
ABTOMAT (18.10.2016), Arton (19.10.2016), L-ee-X (05.11.2016), St_AnGer (18.10.2016)
Старый 18.10.2016, 23:29   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд

Запустил, появляется Малевич маленький и закрывается тут же.
Винда 10 (обновления последние), офис 2010
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 18.10.2016, 23:57   #3
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд

Сообщение от ABTOMAT Посмотреть сообщение
Запустил, появляется Малевич маленький и закрывается тут же.
Винда 10 (обновления последние), офис 2010
Хм, а ты run.exe запускал? или bin.exe?

bin напрямую не запустится (Graphics3d запускается запускается с параметрами командной строки), которые передает run.

AppTitle "SCL.auto"

param$ = CommandLine$() 

num_p = parsecount (param$, "/", 0)

If num_p <> 2 Then End

dw = Int(parse$(param$, "/", 1, 0))
dh = Int(parse$(param$, "/", 2, 0))

Graphics3D dw, dh, 32, 2
Это я так имитирую развернутое окно. run берет системные метрики: из клиентской области рабочего стола минусует высоту шапки окна и толщину рамки окна и с этими dw и dh запускает блицевский файл. Поэтому если не запустилось через run.exe, это уже странно...

$dw = _WinAPI_GetSystemMetrics(16) - 2 * _WinAPI_GetSystemMetrics(6)
$dh = _WinAPI_GetSystemMetrics(17) - _WinAPI_GetSystemMetrics(6) - _WinAPI_GetSystemMetrics(7)
ShellExecute ('bin.exe', string($dw) & "/" & string($dh))
(Offline)
 
Ответить с цитированием
Старый 19.10.2016, 00:42   #4
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,019
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд

У меня появляется тоже что на скрине выше.
Не разбирался, но прикольно.
Блиц жив!

P. S. Win7 x64 SP1
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DarkInside (19.10.2016)
Старый 19.10.2016, 01:07   #5
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд

Сообщение от Arton Посмотреть сообщение
Блиц жив!
Это фигня, мне тут нужно web-приложение для малого количества пользователей (около 10-20), я вот думаю, может нафиг изучать канвасы, webGL и тд. Сделать быстрый стриминг: запускать блиц на серваке в отдельной песочнице для каждого пользователя, картинку разбивать на много сегментов по форме гуи и отправлять пользователю только те сегменты, которые изменились (сжимать их хорошенько). А у пользователя показывать эти сегменты в браузере. По идее в стриминге игр (через видео) проблема в том, что изображение динамично меняется, а в стриминге программ вообще с этим проблем не должно быть. Фотошоп же стримили подобным образом. А действия в гуи вообще часто повторяются, поэтому картинку можно держать в кэше, анимации оставить минимум... И на смартфон таким же образом портировать через браузерное приложение.
PS. Я не упоротый, просто меня в дрожь бросает от современного фронтенда https://habrahabr.ru/post/312022/

Это можно в отдельную тему - как сделать сайт на блице...

UPD: Опередили меня http://evoclouds.com/, не говоря уже о корпоративных решениях Citrix XenApp и Microsoft App-V.

Ну а чему тут удивляться, когда Microsoft запилила ядро Linux в Windows 10 и допиливает приложение для портирования iOS и Android приложений в винду за 5 минут, а Google запускает приложения Android в браузере. Виртуализация!

Из тех, что я нашел, лучше всего показался этот сервис https://www.rollapp.com/ Выдерживает большой поток пользователей, есть бесплатная версия. Но видно по артефактам, что картинка перерисовывается полностью и анимация приложений не упрощается и гуи не кэшируется, значит в принципе можно еще ускорить и избавиться от артефактов при этом.

Кто-нибудь встречался с сервисами лучше?

Блендер в браузере:
Миниатюры
Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 1065
Размер:	200.6 Кб
ID:	22536  

Последний раз редактировалось DarkInside, 19.10.2016 в 05:47.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
L.D.M.T. (04.11.2016)
Старый 19.10.2016, 06:03   #6
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд


Все же думают, что он только усложняет себе жизнь?

Тебе нужен VDS сервер на винде, но беда - не у всех есть видеоускорители (или дороговато), а у сервисов, типа который ты нашел - так вообще редкость.
Т.е твоя прога на нем даже не стартанет=)
Не усложняй.
Вон, мока тебе сейчас PlayCanvas посоветует. Хотя он пропал куда-то.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DarkInside (19.10.2016)
Старый 19.10.2016, 06:19   #7
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд

Сообщение от RegIon Посмотреть сообщение
Тебе нужен VDS сервер на винде, но беда - не у всех есть видеоускорители (или дороговато), а у сервисов, типа который ты нашел - так вообще редкость.
Т.е твоя прога на нем даже не стартанет=)
Не усложняй.
Вон, мока тебе сейчас PlayCanvas посоветует. Хотя он пропал куда-то.
Не, это я просто смотрю, какие есть сервисы и что они предлагают. Если бы я такое делал, то на своем серваке - на работе стоит с двумя xeon e5 2620 и tesla c2075 (старенькая, конечно, но поток для 20 пользователей сжимать пойдет с каким-нибудь продвинутым кодеком). Бэкенд в любом случае под виндой. А для фронтенда лень разбираться с html5, канвасом (хотя там вроде просто всё), да и есть уже по тому приложению наработки по интерфейсу, заново делать придется. А то, что я предлагаю - это по сути 200 строчек кода в совокупности.

В общем, надо подумать...с другой стороны канвас тоже интересно изучить.
(Offline)
 
Ответить с цитированием
Старый 04.11.2016, 12:58   #8
Владислав
ПроЭктировщик
 
Аватар для Владислав
 
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений
(для 219 пользователей)
Ответ: Для тех, кому в блице внезапно не хватило браузера, word и тд

Win7, все работает, здорово!
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DarkInside (04.11.2016)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 14:12.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com