Оба ответа здесь хороши, но я упустил то, что я считаю действительно интересным (включая пару, которые вы не спрашивали напрямую, но вы все равно можете найти интерес), так что вот мой 2c:
Рисование элементов управления
В идеале вы просто создаете обычный экземпляр элемента управления. Вы хотите что-то похожее на кнопку? Создайте настоящую кнопку. Хитрость заключается в том, чтобы помешать ему вести себя как кнопка: вы хотите, чтобы щелчки активировали его для перемещения, а не «нажимали» на него.
Один из способов справиться с этим - предполагая, что рассматриваемые элементы управления основаны на HWND (например, стандартный набор окон для кнопок, редактирования, статики, списка, дерева и т. д.) - создать элемент управления, а затем подкласс это - т.е. переопределить wndproc с помощью SetWindowLongPtr(GWLP_WNDPROC, ...), чтобы код дизайнера мог перехватывать ввод с мыши и клавиатуры и использовать его для инициации перемещения, например, вместо того, чтобы ввод мыши передавался фактическому коду кнопки, который вместо этого будет интерпретировать это как событие «щелчка».
Альтернативный подход к созданию подклассов — разместить над кнопкой невидимое окно для захвата ввода. Та же идея перехвата ввода, просто другая реализация.
Вышеизложенное относится как к управляемым (VB.Net, C#), так и к неуправляемым (C/C++) элементам управления; они оба, по сути, стандартные HWND для окон; управляемые версии просто имеют управляемый код-оболочку, передаваемый базовому неуправляемому элементу управления.
Старые (с предварительно управляемым кодом) элементы управления ActiveX, использовавшиеся в VB до .Net, представляли собой совершенно другую игру. Существует довольно сложная взаимосвязь между контейнером ActiveX и элементами управления ActiveX внутри него, при этом многие COM-интерфейсы обрабатывают такие вещи, как согласование свойств, событий, рисование и т.д. (Существует набор интерфейсов, который позволяет элементу управления ActiveX получать входные данные и рисовать себя, не имея собственного HWND.) Одна из выгод, которую вы получаете от этой сложности, заключается в том, что элементы управления ActiveX имеют явный «режим разработки»; таким образом, элемент управления знает, как правильно реагировать в этом случае, и может сотрудничать со всей процедурой.
Сама форма...
Так что в основном элементы управления - это обычные элементы управления. Итак, вы ожидаете, что сама форма будет обычной формой? - Почти. Насколько я знаю, это просто еще одно окно на основе HWND, которое является дочерним элементом дизайнера (поэтому оно обрезается и может прокручиваться внутри него); но я думаю, что дизайнер немного «обманывает» здесь, потому что обычно Windows рисует только такие кадры, как - с заголовком и кнопками min / max, которые для реальных окон верхнего уровня. Я не знаю навскидку точную технику, которую они здесь используют, но некоторые варианты могут включать: раскрашивание вручную, чтобы имитировать внешний вид Windows; использование API-интерфейсов «темы» Windows, которые позволяют вам получать доступ к графическим элементам, используемым для фрагментов заголовков, и рисовать их там, где вы хотите; или, что менее вероятно, настроить окно как «дочернее окно MDI» — это единственный случай исключения, когда окна рисуют рамку вокруг вложенного окна.
Перетаскиваемые ручки
Самый простой подход здесь для дизайнера — создать восемь маленьких квадратных всплывающих окон без строки заголовка, которые располагаются над всеми остальными элементами — которые инициируют соответствующий код изменения размера при нажатии на них. Когда пользователь щелкает от элемента управления к элементу управления, просто переместите окна маркера перетаскивания к текущему активному элементу управления. (Обратите внимание, что во всем вышеизложенном Windows сама выясняет, кто был нажат, вам никогда не придется фактически сравнивать координаты мыши с координатами прямоугольника элемента и решать это самостоятельно.)
Сохранение и воссоздание
Для простых системных элементов управления Windows, которые используются неуправляемым C/C++, это относительно просто: существует хорошо известный текстовый формат файла — .rc — который описывает элементы управления и их расположение. Попросите дизайнера выплюнуть это (и, вероятно, файл resource.h), и все готово: любой проект C/C++ может подобрать эти файлы и скомпилировать их. Управляемый код (C#, VB.Net) имеет несколько больше возможностей. сложная схема, но основная идея все та же: напишите описание в том стиле, которого ожидают управляемые инструменты, и они с радостью его скомпилируют и будут использовать.
(Элементы управления ActiveX — как вы уже догадались — это совсем другая история. Насколько мне известно, не существует стандартного формата, поэтому редактор форм и среда выполнения, потребляющая данные, будут тесно связаны друг с другом — например, редактор форм из pre-.Net VB6 создает формы, которые может использовать только VB.- Я думаю.Это было некоторое время назад...)
Что касается воссоздания формы: если у вас есть файл .rc, он компилируется в диалоговый ресурс, Windows имеет встроенную поддержку для их воссоздания. Точно так же библиотеки поддержки управляемого кода знают, как воссоздать форму из ее определенного формата. Оба в основном анализируют описание и для каждого элемента создают элементы соответствующих классов и устанавливают соответствующий стиль, текст и другие свойства, как указано. Он не делает ничего, что вы не можете сделать сами, это просто вспомогательный служебный код.
Управление фокусом
Для коллекции HWND в любом контейнере, будь то в «тестовом» режиме или фактически работающем в реальном приложении, и независимо от того, позволяете ли вы Windows или Winforms обрабатывать создание формы или создаете ли вы каждый HWND самостоятельно, вы можете добавить поддержку табуляции, вызов IsDialogMessage в цикле сообщений: см. раздел примечаний на странице MSDN. для деталей. (Хотя WinForms может сделать это, я думаю, он фактически выполняет свою собственную обработку фокуса, так что он может иметь порядок табуляции, независимый от Z-порядка визуального стека.)
Другие вещи для изучения...
Подружитесь с приложением Spy++ (часть SDK, устанавливается вместе с Visual Studio). Если вы собираетесь что-то делать с HWND, управляемыми или неуправляемыми, полезно знать, как использовать этот инструмент: вы можете указать его на любой элемент пользовательского интерфейса в Windows и посмотреть, как он построен из дерева различные типы HWND. Направьте его на дизайнера VB и посмотрите, что на самом деле происходит. (Нажмите значок «бинокль» на панели инструментов, затем перетащите перекрестие в интересующее вас окно.)
Также взгляните на файлы ресурсов, которые выдает дизайнер. Все, что вы можете настроить, переместить или отредактировать в дизайнере форм, соответствует некоторому элементу где-то в одном из этих файлов ресурсов. Сделайте их копию, настройте некоторые параметры, а затем сравните два набора файлов и посмотрите, что изменилось. Попробуйте изменить некоторые вещи в файлах вручную (я думаю, что они почти все текстовые), перезагрузите и посмотрите, уловил ли дизайнер ваши изменения.
Другие вещи, чтобы отметить...
Much of the above is specific to Windows - notably the fact that since we're using Window's own building blocks - HWNDs - we can get Windows itself to do some of the hard work for us: it gives us the facilities to reuse the controls themselves at design time so we don't have to draw mock-ups; to intercept input on other controls so we can make a click into a move or whatever other action we want, or figure out which control is clicked without having to do the location math ourselves. If this was a designer for some other UI framework - say Flash - which doesn't use HWNDs internally, it would likely instead use
that framework's own internal facilities to do similar work.
Кроме того, будет намного проще, если вы ограничите количество элементов управления в палитре небольшим конечным набором, по крайней мере, на первых порах. Если вы хотите разрешить перетаскивание любого элемента управления - например. сторонний или тот, который вы использовали в другом проекте; обычно вам сначала нужно каким-то образом «зарегистрировать» этот элемент управления, чтобы дизайнер знал, что он доступен в первую очередь. И вам также может понадобиться какой-то способ узнать, какой значок он использует на панели инструментов, как его зовут, какие свойства он поддерживает и так далее.
Получайте удовольствие от изучения!
person
BrendanMcK
schedule
04.04.2011