Нажмите кнопку DirectX в Windows Forms - PullRequest
0 голосов
/ 19 января 2011

У меня есть приложение Windows Form, в котором я хотел бы найти дескриптор приложения DirectX, найти кнопку DirectX в этом окне и щелкнуть ее.

Возможно ли это, и если да, то гделучшее место для начала?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Это действительно невозможно.

В отличие от Windows Forms, «кнопка DirectX» не имеет четкого дескриптора окна. На самом деле вы не «нажимаете» кнопку в окне DirectX, а просто посылаете щелчок мышью по всему окну DirectX и позволяете приложению выполнить свое собственное тестирование нажатия, чтобы «щелкнуть» «кнопку» (которая является просто графика).

Самое близкое, что вы могли бы сделать, - это послать щелчок мышью в какое-либо место в окне - однако найти местоположение «кнопки» может быть очень сложно.

1 голос
/ 28 марта 2011

На самом деле, это не так уж сложно, если это так.DX-объект может получить щелчок, если вы можете изолировать объект с помощью мыши с помощью системы реверсирования, в зависимости от того, основан ли он на 3D или 2D.2D использует маскирующие эффекты, а 3D добавляет для перевода в и из 2D / 3D пространство на основе определенных свойств, используемых в векторном исчислении.

В значительной степени из логического пространства, в 3D срез трехмерного объекта отображается в 2D-пространстве, которое затем отображается в пространстве камеры, которое затем отображается.Грубый, есть еще кое-что, но я сохраняю это настолько простым, насколько это возможно.Теперь задача состоит в том, чтобы найти 2D-объем / местоположение на пиксель, перевести копию 2D-рендеринга 3D-объекта на изображение, которое будет / уже является DeviceContext для монитора, чтобы показать () на карте, и объединитькликабельный объект (который будет выполнять намеченный код, как и должна делать кнопка) для копии объекта 2D-карты.

Другими словами, найдите, где на экране отображается объект, и сгенерируйте кликабельную маску поверхвизуализированная часть экрана.Будь то растровая маска, или маска многоугольника, или маска куба, или любая другая форма, которую вы можете создать математически;до тех пор, пока 2D-активируемый объект на самом деле взаимодействует с положением и состоянием мыши в системе с постоянным обновлением.

Например, скажем, что приложение полноэкранное, что разрешение составляет 800 x 600 (что проще,это может быть что угодно), и что объект, который вы хотите иметь возможность взаимодействовать, визуализируется в контексте, который не допускает его сам по себе (* 1), и что визуализированный объект показывает прямоугольник.Допустим, в этом вся суть, и система, которую вы используете для перевода, выдает Rectangle (код C # .NET, да, но это только пример, лучше плавать вокруг).Таким образом, мы можем сказать, что координаты прямоугольника маски идентичны координатам визуализируемого объекта.

Итак, скажем: "Маска прямоугольника = новый прямоугольник (100, 100, 200, 100); // Начальная точка X, Начальная точка Y, Длина, Ширина."Довольно понятно.Добавление покадровой позиции курсора по сравнению с позициями маски будет указывать, находится ли курсор над маской, и с дополнительным кодированием может указывать, если курсор щелкнул (или другие события), находясь в пределах диапазона маски.

Допустим, кнопка открывает главное меню.И происходит событие, в частности событие «MouseClick», когда точка доступа курсора находится в точке (125, 200).Который, конечно, был в пределах маски.В этом случае через весь этот тривиальный код открывается главное меню.В эту систему легко добавлять новые интерактивные объекты, если все сделано правильно.

Да, существуют и другие, более простые способы.Но из всех этих, это одна из наиболее динамичных и гибких систем.Диапазон использования варьируется от наличных денег, которые вы получаете в игре, которую вы должны нажать, чтобы получить, до пользовательского интерфейса, до меню, до чего-либо, что можно нажимать.Диапазон не только в играх, либо.Дизайнеры пользовательских интерфейсов, которые любят изобретать велосипед, могут и используют преимущества подобных систем, таких как я, любят определять каждый аспект от микрокода до макрокода.Точно, чтобы определить макрокод как он нужен, как ожидается, и без лишнего раздувания с помощью управления микрокодами.Не говорю, что мне нравится микрокод, поскольку он может быть слишком чертовски привередливым, и часто это так.Это стоит тех нескольких сотен кадров в секунду, которые вы получаете при правильной оптимизации (в первый раз), хотя ...>: - D

* 1 = (предсказуемо в моделях трехмерного рендеринга, с точки зрения рендерингане модифицирование (которое, кажется, включает в себя выбор объекта (через позицию мыши / курсора и все такое), что по сути то, что вы ищете) и как таковое не включено (напрямую). Через перевод это становится возможным, с наивысшей точностью, еслисделано правильно. В дополнение к этому DirectX, OpenGL и другие, как, по умолчанию Renderers.)

...