« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
    Популярное
Функция AccessResource

Использование AutomatedQA MemProof

Основные моменты при выборе CMS для сайта

Настольный калькулятор

Функция date() - вывод даты и времени в PHP

Функция EnumMetaFile

Как хранить настройки программ

Полиморфизм и все-все-все

HTML5, XHTML2, и будущее Web

АJAX. Не повторяйте ошибок




    Архив файлов



    Сообщества



    Документация

Статьи:: C# C Sharp) :: C# Controls :: Элемент Shape на С#


отправить ссылку другу версия для печати  Обсудить на форуме

Элемент Shape на С#



Контрол shape - это визуальный элемент, который имеет определенную форму (круг, эллипс, квадрат, звезда).

Когда Microsoft проапгрейдила Visual Studio 6 до Visual Studio 7 (.NET), многие привычные графические контролы (такие как: Image или Shape) были исключены из набора стандартных элементов. В то же время, схожей функциональности, присущей этим контролам, можно добиться используя соответствующие классы библиотеки .NET library, однако для этого требуется больше усилий.

После того, как я достаточно хорошо освоился с графическим программированием под .NET, я смог портировать большинство моих графических программ с VB6 на C#. Наверняка уже существуют множество подобных контролов Shape под .NET от сторонних производителей, но я не смог найти такого, который бы полностью удовлетворил мои потребности. Поэтому я нашел время и реализовал перенос всей функциональности элемента Shape с VB6 на .NET.

В данной статье я хотел бы поделиться с читателями опытом, как я пытался реализовать контрол Shape под .NET.

Sample Image - ShapeControldotNET.jpg

Не много теории...

В VB6 элемент Shape представляет из себя графический и в то же время не большой по размеру контрол. На самом деле он является не настоящим контролом и не обладает таким свойством как Hwnd . В .NET все подобные элементы являются полноценными контролами имеющими свойство Hwnd. В то же время, в Visual Studio .NET не существует контрола эквивалентного Shape, зато есть различные другие классы в библиотеке .NET library, которые при использовании в совокупности могут быть использованы для реализации контрола Shape.

В общих чертах контрол Shape - это некое изображение, которое имеет строго определенную форму. Для управления функциональностью изображения предусмотрены классы Image и Bitmap. Для фигур предусмотрен класс GraphicsPath.

Данные классы являются ключевыми компонентами при реализации контрола Shape.

Прозрачность (Transparency)

В VB6 мы можем использовать свойство DrawMode контрола Shape для достижения эффекта прозрачности (чтобы видеть сквозь контрол). Свойство DrawMode все еще может быть реализовано с использованием GDI/GDI+ функций в .NET, но существует более простое и элегантное решение. .NET поддерживает 32 битную ARGB прорисовку. В VB6 так же поддерживаются 32 битные ARGB значение, которые могут быть назначены цветам, но компонент A (Alpha) такого значения никогда не используется.

Для многих стандартных контролов, порожденных от System.Windows.Form.Control, существуют по крайней мере два свойства, которые используют значения цвета Color: BackColor и ForeColor. Каждое из этих свойств мы можем связать со значением ARGB.

Как же мы можем провести тест для прозрачности? Ответ очевиден - использовать свойство background. Все контролы должны помещаться в контейнеры. Для большинства случаев таким контейнером является форма. В то же время есть контейнеры, которые сами содержат другие контейнеры, например, контрол панели Panel. Для испытания прозрачности мы можем установить в качестве фона контейнера какую-нибудь картинку, а для основного цвета контрола, находящегося в этом контейнере установить значение цвета с where the Alpha меньше, чем 255 (например 100). Теперь вы сможете увидеть картинку-подложку сквозь контрол. Чем ниже значение Alpha, тем отчетливее виден оригинальный фон (background).

Фигура

В VB6 мы так же можем создать пользовательский контрол с различными фигурами. Но это может быть сделано только посредством вызовов Win32 API функций. В .NET каждый контрол имеет свойство Region, которое может быть использовано для задания формы. Когда происходит отрисовка контрола, Windows будет рисовать пиксели только внутри такого региона. Region может быть создан путем определения внешней границы (контура элемента). Контур может быть создан при помощи объекта GraphicsPath. Код, приведенный ниже, создает объект GraphicsPath, добавляет фигуру "эллипс" к траектории, и потом использует эту траекторию для инициализации нового объекта Region, который будет связан со свойством Region контрола. В результате контрол примет форму соотнесенную с данным Region, которым в данном примере является эллипс.

GraphicsPath _outline=new GraphicsPath();

_outline.AddEllipse(0,0,
100,
100);

this.Region=new Region(_outline);

Пользовательские редакторы стадии проектирования

Когда вы используете оболочку Visual Studio .NET IDE, чтобы задать свойства Color , вы можете делать это используя стандартный редактор цветов ( Color Editor), где вы можете выбрать из предложенного набора цветов, или вы можете напрямую впечатать значение При использовании стандартного редактора, вы не можете определять значение для канала Alpha. А если вы прямо прописываете значение для ARGB, вы не знаете, как будет выглядеть этот цвет . В обоих способах есть недостатки.

Однако, Visual Studio .NET позволяет вам создать ваш собственный редактор для редактирования значений свойств. Для контрола Shape я создал два редактора для стадии проектирования. Один для редактирования значения ARGB, а другой - для выбора формы для контрола Shape.

В данной статье я не буду останавливаться на вопросе, как создать пользовательский редактор для стадии проектирования. Вы можете получить по данному вопросу все необходимую информацию из документации .NET по разделу пространства имен для System.Drawing.Design.

Sample screenshot Sample screenshot

Расширение функциональности контрола Shape

Исходный код для представленного контрола Shape (ShapeControl.cs) позволяет легко добавлять/удалять фигуры. Все фигуры определены в блоке перечислений для типа ShapeType. Вы можете редактировать этот блок для добавления/удаления фигур.

public enum ShapeType{
                Rectangle,
                RoundedRectangle,
                Diamond,
                Ellipse,
                TriangleUp,
                TriangleDown,
                TriangleLeft,
                TriangleRight,
                BallonNE,
                BallonNW,
                BallonSW,
                BallonSE,
                CustomPolygon,
                CustomPie
            }

Соответствующий блок добавления/удаления, который отвечает за создание вешнего вида фигуры (по просту формы) выглядит следующим образом:

internal 
static 
void 
updateOutline(ref 
GraphicsPath outline, 
                     ShapeType shape, 
int width,int height)
{
    Switch (Shape)
    {
        Case ShapeType.CustomPie:
            outline.AddPie(0,0,width,height,180,270);
            break;
        Case ShapeType.CustomPolygon:
            outline.AddPolygon(new Point[]{
                          new Point(0,0),
                          new Point(width/2,height/4),
                          new Point(width,0),
                          new Point((width*3)/4,height/2),
                          new Point(width,height),
                          new Point(width/2,(height*3)/4),
                          new Point(0,height),
                          new Point(width/4,height/2)
                                          }
                );
            break;
        Case ShapeType.Diamond:
            outline.AddPolygon(new Point[]{
                        new Point(0,height/2),
                        new Point(width/2,0),
                        new Point(width,height/2),
                        new Point(width/2,height)
                                          });
            break;

        Case ShapeType.Rectangle:
            outline.AddRectangle(new Rectangle(0,0,width,height));
            break;
        .....

Выбор фигуры в редакторе во время создания приложения кодируется таким образом при этом запрашивается перечисления типа ShapeType и вызывается функция updateOutline во время отрисовки пользовательского интерфейса во время проектирования. При этом фигура будет корректно отображена.

Пример - Демо Приложение

Данное приложение было создано, чтобы показать особенности элемента shape. Левая панель демонстрирует прозрачность во время перетаскивания фигуры "алмаз" в рамках панели. Другие контролы - фигуры показывают различные формы и настройки.

Возможные улучшения

Проблемой для любого контрола shape является то, что наверняка потребуются фигуры, которых нет в доступном списке для выбора. Один из путей решения данной проблемы - создание редактора контуров (Outline editor) - для стадии разработки приложения для редактирования свойства Outline. Редактор контуров может позволить пользователю редактировать/создавать объекты GraphicsPath и назначать им свойства Outline (Контур) для контролов с этой формой.

Заключение

Я надеюсь, что читатели извлекут пользу не только от использования контрола shape для создания функционального пользовательского интерфейса, но так же и от изучения различных .NET классов, используемых для создания контрола shape.

Автор: Yang Kok Wah, перевод: cronOS, источник: www.codeproject.com.

Перевод выполнен специально для www.realcoding.net




Рубрика: C# Controls




9 правил для начинающего Ajax-разработчика.

AJAX

Эти девять правил несложны, никаких кусков кода — только общие советы начинающим Ajax-разработчикам. Крайне вольный перевод 9 AJAX Tips & Tricks.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения.

AJAX

Приветствуем наших читателей. Что-то в последнее время много новостей и я даже не успеваю все отобрать и написать о самых интересных технологиях и продуктах. А ведь ещё и работать иногда надо. Но мимо этой новости мы просто не могли пройти - ведь AJAX и ExtJS как его наглядное воплощения это наша основная технологическая платформа. А буквально вчера вышла следующая версия в текущей ветке 2.х - 2.2 Что же там нового, полезного и интересного мы сейчас и рассмотрим.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

Windows 7: под покровом тайны.

Windows 7

О преемнице Windows Vista, носящей кодовое имя Windows 7, известно очень мало. Корпорация Microsoft, наученная горьким опытом, с крайней неохотой делится с журналистами информацией о разрабатываемой системе, дабы у пользователей и разработчиков программного обеспечения не сложилось искаженное представление о продукте, которое бы повлияло на продажи новой операционки, как это случилось с "Вистой". Тем не менее, некоторые скупые сведения хоть и изредка, но просачиваются из стен редмондского гиганта.


Подробнее... | Рубрика: Windows 7 | Добавлено: 25.08.2008

Остальные статьи:

Apache mod_ndb - MySQL кластер с доступом через HTTP и Ajax
Поиск уязвимостей в программах с помощью анализаторов кода
Как появилась библиотека VivaCore
Это сложно
ASP.NET и немного поисковой оптимизации
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google
Описание VivaVisualCode
JQuery: Пара сотен плагинов в одной заметке
Касание сетки
Разработка элементов управления ASP.NET на примере навигационной панели
Сохранения параметров приложения в .Net
Custom cursors в .Net
Бегун убегает от хозяина
"Битрикс" выпустил седьмую версию CMS
Выбираем систему управления сайтом
Рынок CMS в Европе или впечатления с CeBIT 2008


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 103
Пользователей: 0