Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14

Создание нестандартных окон

22.03.2017, 11:07. Показов 1473. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!

Прочитав статью Ильи Наумова по созданию окон неправильной формы(язык прогромирования VB.NET), очень заинтересовался этим вопросом.
Действительно получается великолепное окно. Хотелось бы пойти дальше, а именно прорисовка элементов управления.
Каким образом отображать компоненты, такие как кнопки, текстовые поля и др., если операционная система
берет на себя весь процесс перерисовки окна, и стандартное сообщение WM_PAINT окну более не отсылается?
Илья пишет мол есть какой то "не простой путь" Где его найти? Помогите если можете.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2017, 11:07
Ответы с готовыми решениями:

Использование нестандартных шрифтов в приложении
Вопрос знатокам. Необходимо сделать добавление выбора нестандартных шрифтов. Пример: на форму кидаю lable1, затем combobox или что-то вроде...

Запись нестандартных символов в файл (национальные языки)
Всем доброго дня! Несколько месяцев назад написал удобную для моих нужд утилиту на старом добром VB 6.0 (нет, этот пост не про VB 6.0...

Создание нестандартных форм
Доброго времени суток!:) Появилась потребность создать приложение с нестандартной формой, слышал что Word написан с помощью студии, но как...

14
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 11:11
Как вариант: Создать окно нестандартной формы
Только не торопитесь с выводами.
1
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 11:35  [ТС]
Владимир спасибо за Ваш ответ. Этот метод я использую, если окно имеет прямоугольную (правильную) форму без тени.
Пытаюсь докопаться до следующего:
Окно рисуется при помощи API функций
VB.NET
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    Namespace System
        Public Class Win32API
            Public Const WS_EX_LAYERED = &H80000
            Public Const ULW_ALPHA As Int32 = &H2
            Public Const AC_SRC_OVER As Byte = &H0
            Public Const AC_SRC_ALPHA As Byte = &H1
    
            'Точка (координата)'
            <StructLayout(LayoutKind.Sequential)> _
            Public Structure Point
                Public x As Int32
                Public y As Int32
                Public Sub New(ByVal x As Int32, ByVal y As Int32)
                    Me.x = x
                    Me.y = y
                End Sub
            End Structure
    
            'Размер'
            <StructLayout(LayoutKind.Sequential)> _
            Public Structure Size
                Public cx As Int32
                Public cy As Int32
                Public Sub New(ByVal cx As Int32, ByVal cy As Int32)
                    Me.cx = cx
                    Me.cy = cy
                End Sub
            End Structure
    
            ' Определяет режим вывода полупрозрачных изображений'
            <StructLayout(LayoutKind.Sequential, Pack:=1)> _
            Public Structure BLENDFUNCTION
                Public BlendOp As Byte
                Public BlendFlags As Byte
                Public SourceConstantAlpha As Byte
                Public AlphaFormat As Byte
                Public Sub New(ByVal BledOp As Byte, ByVal BlendFlags As Byte, ByVal SourceContrastAlpha As Byte, ByVal AlphaFormat As Byte)
                    Me.BlendOp = BledOp
                    Me.BlendFlags = BlendFlags
                    Me.SourceConstantAlpha = SourceContrastAlpha
                    Me.AlphaFormat = AlphaFormat
                End Sub
            End Structure
    
            ' Получает дескриптор контекста дисплея для клиентской области указанного окна'
            <DllImport("user32.dll")> _
            Public Shared Function GetDC(ByVal hWnd As IntPtr) As IntPtr
            End Function
    
            'Создает совместимый контекст с заданным устройством'
            <DllImport("gdi32.dll")> _
            Public Shared Function CreateCompatibleDC(ByVal hDC As IntPtr) As IntPtr
            End Function
    
            'Освобождает контекст'
            <DllImport("user32.dll", ExactSpelling:=True)> _
            Public Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
            End Function
    
            'Удаляет контекст'
            <DllImport("gdi32.dll")> _
            Public Shared Function DeleteDC(ByVal hdc As IntPtr) As Boolean
            End Function
    
            'Выберает объект в заданный контекст'
            <DllImport("gdi32.dll", ExactSpelling:=True)> _
            Public Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
            End Function
    
            'Удаляет объект'
            <DllImport("gdi32.dll")> _
            Public Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
            End Function
    
            'Обновляет многослойное окно'
            <DllImport("user32.dll")> _
            Public Shared Function UpdateLayeredWindow(ByVal hwnd As IntPtr, ByVal hdcDst As IntPtr, ByRef pptDst As Win32API.Point, ByRef psize As Win32API.Size, ByVal hdcSrc As IntPtr, ByRef pprSrc As Win32API.Point, ByVal crKey As Int32, ByRef pblend As Win32API.BLENDFUNCTION, ByVal dwFlags As Int32) As Boolean
            End Function
        End Class
    End Namespace
Окно получается с тенью, без зубчиков, но элементы управления, как я понял необходимо прописывать программно.
VB.NET
153
154
155
156
Dim sf As New StringFormat(StringFormatFlags.LineLimit)
                    sf.Alignment = StringAlignment.Center
                    sf.LineAlignment = StringAlignment.Center
                    .DrawString("Сходить за молочком и забрать кошку от ветеринара", Me.Font, New SolidBrush(Me.ForeColor), New Rectangle(10, 10, bmpDest.Width - 20, bmpDest.Height - 20), sf)
Грубо говоря так прописывается Lable, а как Button ?
0
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 11:42
Цитата Сообщение от Everba Посмотреть сообщение
Грубо говоря так прописывается Lable, а как Button ?
Label это обычно просто статический текст.
С кнопками же всё не просто. Вам придётся их прорисовывать полностью самостоятельно. Поддержку стилей из операционной системы, реакцию на мышь, клавиатуру, фокус, включение/отключение программно...
И так все остальные контролы.
Цитата Сообщение от Everba Посмотреть сообщение
если окно имеет прямоугольную (правильную) форму без тени
Там я привёл метод и с тенями, и с контролами. Совершенно иной путь.
0
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 11:49  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Там я привёл метод и с тенями, и с контролами. Совершенно иной путь.
Но ведь тени, различные "округлые формы" получаются некрасиво?
0
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 11:50
Всё там получается, дочитайте до конца. Есть другой путь.
Я же сразу предупредил, не торопитесь с выводами, как автор той темы...
0
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 14:08  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Всё там получается, дочитайте до конца. Есть другой путь.
Я же сразу предупредил, не торопитесь с выводами, как автор той темы...
Владимир! Сделать просто заставку, которая появляется в начале программы(в виде какой то красивой картинки- это просто) Все же я не могу понять. Есть форма, она стандартная. На форме расположены элементы управления, программа работает. Есть красивая картинка PNG, я режу картинкой свою форму, в результате появляются рваные края. Какую дописку необходимо сделать, подскажите пожалуйста.

Добавлено через 9 минут
Цитата Сообщение от Rius Посмотреть сообщение
Есть другой путь
Владимир! Другой путь, это использовать стандартный конструктор форм, но с какими то изменениями?
0
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 14:14

Путей несколько:
  1. Регионы. В разных инкарнациях, под разным соусом, в разных средах рахработки. Проблема одна - те самые рваные края.
  2. LayeredWindow с альфа-блендингом. Требуется ручное рисование ВСЕГО, что нужно.
  3. WPF. Всё уже запилено за Вас и для Вас. Просто пользуйтесь. Если хотите сэкономить время и труд.
    Это и есть другой путь.

Пример на WPF из указанной ранее темы, только с добавлением контролов:
Вложения
Тип файла: zip WpfApplicationSplash.zip (110.7 Кб, 11 просмотров)
2
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 14:25  [ТС]
Цитата Сообщение от Everba Посмотреть сообщение
как автор той темы...
насколько я понял, что автор той темы просто использует средства конструктора форм

Добавлено через 10 минут
Цитата Сообщение от Rius Посмотреть сообщение
WpfApplicationSplash.zip (110.7 Кб, 0 просмотров)
Я понимаю, что я тупорез. Это и есть WPF. Это уже готовый exe. Я смотрел такуюже папку и с исходниками. но они не читаются Visual Studio 2010. Поэтому я и не могу понять кода. Простите.
0
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 14:28
Цитата Сообщение от Everba Посмотреть сообщение
насколько я понял, что автор той темы просто использует средства конструктора форм
Это я и автору той темы говорил:

Если вкратце, то советую осваивать Windows Presentation Foundation, на котором всё это и многое другое реализуется легко.
Это современная замена древнему Windows Forms.

Цитата Сообщение от Everba Посмотреть сообщение
но они не читаются Visual Studio 2010
Обновите Visual Studio на 2013, 2015 или 2017. Для частных лиц и мелких фирм это бесплатно - редакции Express и Community.
0
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 14:38  [ТС]
Разрешите тогда еще вопрос если я обновлюсь, мои "старые" проекты будут читаться?
0
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 14:43
Скорее всего.
Всегда можно поставить на виртуальной машине и проверить.
Обычно проект конвертируется в новый формат при первом открытии. А вот обратно только ручками, поэтому делайте резервные копии.

И на 2017 видел жаловались на нестабильность. Сам ещё не проверял.
1
 Аватар для Everba
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 14:46  [ТС]
Спасибо Вам большое за все. Еще раз извиняюсь.
0
 Аватар для XIST
1960 / 1070 / 148
Регистрация: 01.10.2009
Сообщений: 3,591
Записей в блоге: 1
22.03.2017, 19:26
Цитата Сообщение от Rius Посмотреть сообщение
многое другое реализуется легко
после WF не очень привязки их всякие, сразу не понятны совсем, а мышкой да, накидать можно и стандартно много чего
0
Эксперт .NET
 Аватар для Rius
13112 / 7673 / 1674
Регистрация: 25.05.2015
Сообщений: 23,395
Записей в блоге: 14
22.03.2017, 19:30
А я не говорил, что изучить легко. Мозг взрывает, да.
Но то, что на Windows Forms реализуется сложно, легко реализуется на WPF.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2017, 19:30
Помогаю со студенческими работами здесь

Создание окон
Пожалуйста подскажите, как создавать и работать с окнами.

Создание окон
Как мне все влепит в одно окно... Не та как при ф-ции ShowModal(); А чтоб в одном окне. Как в &quot;Проводнике&quot; Подскажите:) ...

Создание окон
Нужно сделать, чтобы дочерние окна в этой программе были 1/4 размера главного окна. Никак не могу это сделать, если присутствует функция...

Создание окон
Есть коды(решение разных задач для универа) на С++ написанные в разных файлах(решениях), хочу собрать их в один файл, так чтоб из главного ...

Создание окон
Доброго времени суток, подскажите пожалуйста. Не могу понять в чем проблема Код #include&lt;Windows.h&gt; HANDLE hlnst; typedef...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru