Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Everba
0 / 0 / 1
Регистрация: 22.03.2017
Сообщений: 14
#1

Создание нестандартных окон - Visual Basic .NET

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

Всем доброго времени суток!

Прочитав статью Ильи Наумова по созданию окон неправильной формы(язык прогромирования VB.NET), очень заинтересовался этим вопросом.
Действительно получается великолепное окно. Хотелось бы пойти дальше, а именно прорисовка элементов управления.
Каким образом отображать компоненты, такие как кнопки, текстовые поля и др., если операционная система
берет на себя весь процесс перерисовки окна, и стандартное сообщение WM_PAINT окну более не отсылается?
Илья пишет мол есть какой то "не простой путь" Где его найти? Помогите если можете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2017, 11:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создание нестандартных окон (Visual Basic .NET):

Использование нестандартных шрифтов в приложении
Вопрос знатокам. Необходимо сделать добавление выбора нестандартных шрифтов....

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

Поиск дочерних окон
Не могу понять как осуществляется поиск дочерних окон. С главными окнами все...

Открытие двух окон одновременно
Здравствуйте,помогите пожалуйста, нужно чтобы открывалось два окна ...

Ограничение разворота всех окон
Я не знаю, как это правильно называется. Прошу помочь, как сделать так,...

Отображение двух окон одновременно
Доброго времени суток. В программе две формы - главная и вторая. Свойство...

14
Rius
Эксперт .NET
4589 / 2887 / 708
Регистрация: 25.05.2015
Сообщений: 8,925
Записей в блоге: 10
Завершенные тесты: 4
22.03.2017, 11:11 #2
Как вариант: http://www.cyberforum.ru/vb-net/thread1688177.html
Только не торопитесь с выводами.
1
Everba
0 / 0 / 1
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 11:35  [ТС] #3
Владимир спасибо за Ваш ответ. Этот метод я использую, если окно имеет прямоугольную (правильную) форму без тени.
Пытаюсь докопаться до следующего:
Окно рисуется при помощи 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
Rius
Эксперт .NET
4589 / 2887 / 708
Регистрация: 25.05.2015
Сообщений: 8,925
Записей в блоге: 10
Завершенные тесты: 4
22.03.2017, 11:42 #4
Цитата Сообщение от Everba Посмотреть сообщение
Грубо говоря так прописывается Lable, а как Button ?
Label это обычно просто статический текст.
С кнопками же всё не просто. Вам придётся их прорисовывать полностью самостоятельно. Поддержку стилей из операционной системы, реакцию на мышь, клавиатуру, фокус, включение/отключение программно...
И так все остальные контролы.
Цитата Сообщение от Everba Посмотреть сообщение
если окно имеет прямоугольную (правильную) форму без тени
Там я привёл метод и с тенями, и с контролами. Совершенно иной путь.
0
Everba
0 / 0 / 1
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 11:49  [ТС] #5
Цитата Сообщение от Rius Посмотреть сообщение
Там я привёл метод и с тенями, и с контролами. Совершенно иной путь.
Но ведь тени, различные "округлые формы" получаются некрасиво?
0
Rius
Эксперт .NET
4589 / 2887 / 708
Регистрация: 25.05.2015
Сообщений: 8,925
Записей в блоге: 10
Завершенные тесты: 4
22.03.2017, 11:50 #6
Всё там получается, дочитайте до конца. Есть другой путь.
Я же сразу предупредил, не торопитесь с выводами, как автор той темы...
0
Everba
0 / 0 / 1
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 14:08  [ТС] #7
Цитата Сообщение от Rius Посмотреть сообщение
Всё там получается, дочитайте до конца. Есть другой путь.
Я же сразу предупредил, не торопитесь с выводами, как автор той темы...
Владимир! Сделать просто заставку, которая появляется в начале программы(в виде какой то красивой картинки- это просто) Все же я не могу понять. Есть форма, она стандартная. На форме расположены элементы управления, программа работает. Есть красивая картинка PNG, я режу картинкой свою форму, в результате появляются рваные края. Какую дописку необходимо сделать, подскажите пожалуйста.

Добавлено через 9 минут
Цитата Сообщение от Rius Посмотреть сообщение
Есть другой путь
Владимир! Другой путь, это использовать стандартный конструктор форм, но с какими то изменениями?
0
Rius
Эксперт .NET
4589 / 2887 / 708
Регистрация: 25.05.2015
Сообщений: 8,925
Записей в блоге: 10
Завершенные тесты: 4
22.03.2017, 14:14 #8

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

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

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

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

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

И на 2017 видел жаловались на нестабильность. Сам ещё не проверял.
1
Everba
0 / 0 / 1
Регистрация: 22.03.2017
Сообщений: 14
22.03.2017, 14:46  [ТС] #13
Спасибо Вам большое за все. Еще раз извиняюсь.
0
XIST
1032 / 761 / 107
Регистрация: 01.10.2009
Сообщений: 2,359
Записей в блоге: 1
22.03.2017, 19:26 #14
Цитата Сообщение от Rius Посмотреть сообщение
многое другое реализуется легко
после WF не очень привязки их всякие, сразу не понятны совсем, а мышкой да, накидать можно и стандартно много чего
0
Rius
Эксперт .NET
4589 / 2887 / 708
Регистрация: 25.05.2015
Сообщений: 8,925
Записей в блоге: 10
Завершенные тесты: 4
22.03.2017, 19:30 #15
А я не говорил, что изучить легко. Мозг взрывает, да.
Но то, что на Windows Forms реализуется сложно, легко реализуется на WPF.
0
22.03.2017, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2017, 19:30
Привет! Вот еще темы с решениями:

Организация приоритета окон в приложении
Здравствуйте господа. Возник очередной вопрос. В организации отображения...

Форма поверх всех окон
Я хочу сделать &quot;блокировщик&quot;, что бы можно было оставлять комп без присмотра и...

Получить список всех окон приложения
Может кто нибудь сталкивался с такой ситуацией, нужно получить список всех...

Открыть форму поверх всех окон
Требуется открыть форму поверх всех приложений в системе так чтобы ее нельзя...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru