Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 07.05.2006
Сообщений: 6

Как сделать окно нестандартной формы

09.05.2006, 08:16. Показов 3266. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне надо сделать окно вот такое окно:
________
(________)

где ( и )-полукруглые края
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2006, 08:16
Ответы с готовыми решениями:

Посоветуйте как сделать resize нестандартной формы
У меня есть нестандартная форма и я хочу делать resize за правый-нижний угол, если кто уже делал подскажите как это удобнее реализовать? ...

Создание нестандартной формы на VB
Подскажите кто-нить можно ли создать в vb6 форму не стандарную(квадратную), а например: круглую либо в виде текста??? ...

Пикчербокс нестандартной формы - не работает
Здравствуйте! С Новым Годом всех! Скачал пример из сети - PictureBox нестандартной формы. Но не работает. Подскажите, в чём моя...

2
0 / 1 / 3
Регистрация: 27.03.2012
09.05.2006, 09:02
Нет проблем, Дмитрий!

В нашей копилке уже есть такой совет - его можно найти здесь:

http://vbcode.webhostme.com/ru/click.asp?id=41


0
0 / 0 / 0
Регистрация: 24.08.2006
Сообщений: 13
26.08.2006, 15:14
Описание ЛЮБОГО окна (с клыками, впадинами и т.д.)
1.Конечно же нужно создать стандартный EXE-проект. Теперь создайте
единственный на форме объект Image. Назовём его stern.
2.Так, начнём с создания регионов любой формы. Мне кажется красивее будет
если на форме будет рисунок, вокруг которого мы и "отрежем" лишнее. Поэтому
запустим Paint, аттрибуты рисунка установим 249 по высоте и 313 по ширине.
Теперь нарисуем самый угловатый рисунок - звёздочку (как у октябрят ) Кто
очень талантливый может посерёдке нарисовать вoждя мирового пролетариата -
на регионы это никак не повлияет ))!
3.Сохраните рисунок. Теперь объекту image по имени stern присвоим этот
рисунок.
4.Присвоили? Теперь сдвиньте его подальше вниз за пределы формы, чтобы он не
мешался, а размеры формы установите равными: Width = 4710, Height = 3780. В
свойстве BorderStyle установите флажок 0-None. Свойство AutoRedraw
установите равным True. Готово! Теперь приступим к созданию!
5.Сделайте двойной клик по форме и впишите в раздел General Declarations:
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _
As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint _
As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim P(10) As POINTAPI
Теперь объясню зачем это. Первая API-функция SetWindowRgn так сказать
накладывает созданный регион на окно. Те части которые остались за пределами
региона исчезают. Знаете с чем это можно сравнить? Есть такие специальные
жестянные формочки для выпечки печения. Они все в форме всяких цветков,
звёздочек, колокольчиков и т.д. Так вот я видел пару раз как ими работают:
лежит, например, на столе кусок теста и человек просто ложит эти острые
формочки на него и выдавлевает формы этих самых цветков, звёздочек,
колокольчиков!!! По такому же принципу и взамодействует окно с регионом.
Наша же задача - это именно создание "формочки" для формы Передаваемые
значения это:
hwnd - идентификатор окна, на котором нужно "выдавить" форму
hRgn - "формочка" для окна
bRedraw - перерисовывать ли окно после "выдавления"?
Для того, чтобы создать регион-"формочку" нам нужна вторая вторая
API-функция CreatePolygonRgn. Состоит регион из n-ого количества точек,
которое Вы и должны задать! Т.е., например, что бы описать звезду, нам нужны
все её точки, как внутрение, так и наружние. Как их всех найти мы рассмотрим
позже, а сейчас посмотрим на параметры:
lpPoint - первая точка региона.
nCount - количество точек
nPolyFillMode - описание метода заливки полигона
Каждая точка на форме, как известно, имеет свои координаты - по иксу и по
игреку. Поэтому каждая точка должна содержаться в переменной-ящичке
POINTAPI. Всего точек у звезды десять (5 внутренних и пять наружних), но
регион это замкнутая форма, поэтому какaя-то точка будет подсчитана дважды,
как первая и как последняя. Итак нам нужны одиннадцать точек и каждая имеет
свои координаты. Для этого-то мы и объявили массив P по типу POINTAPI. В
скобках стоит десять, но, т.к. счёт идёт у Бэйсика с нуля, то и значений в
нём одиннадцать.
6.А теперь в событие Form_Load впишем:
Picture = stern
Строка выглядит немного странновато, да. Зато короче уже не придумаешь. Это
значит:
Me.Picture = stern.Picture
Умный VB определил, что свойству формы Picture ничего не нужно, как такого
же вида свойство. Это можно делать со строковыми свойствами:
Label1 = "ABCVB SendMessage. В раздел
General Declarations допишем следующие API-функции:
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
'эта функция "захватывает" мышку для выполняемого задания
'зачем - не знаю сам! Неужели нельзя договориться? :-)))
Private Declare Sub ReleaseCapture Lib "user32" ()
Добавим процедуру передвижения иышки:
Private Sub Form_MouseMove(Button As Integer, Shift As _
Integer, X As Single, Y As Single)
'если была нажата левая кнопка вызываем процедуры
If Button = 1 Then
Call ReleaseCapture
Call SendMessage(hwnd, &HA1, 2, 0&)
End If
End Sub
[Окна c закругленными углами]
А вот это ещё проще! А всё-таки тоже необычно - часто Вы встречаете окна с
закругленными углами???
1.В раздел General Declarations допишем следующую API-функцию:
Private Declare Function CreateRoundRectRgn Lib "gdi32" _
(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Её параметры:
X1,Y1 - координаты верхней левой точки прямоугольника, углы которого надо
закруглить
X2,Y2 - координаты нижней правой точки
X3 - ширина овала, применяемого для закругления углов
Y3 - его высота
2.Теперь попробуем создать такой. В событии Form_Load закомментируйте строку
Picture = stern, чтобы картинка больше не появлялась. А под строкой
Dim Rgn As Long
объявите ещё одну переменную для региона:
Dim Rgn2 As Long
Теперь создадим второй регион:
Rgn2 = CreateRoundRectRgn(0, 0, Width / Screen.TwipsPerPixelX, _
Height / Screen.TwipsPerPixelY, 50, 50)
В качестве аргументов мы передаём координаты формы в пикселах а высоту и
ширину овала задаём одинаковой, тем самым углы будут именно закруглены, а не
"заовалены" .
Теперь чуть ниже вставьте эту строку, окраски формы в красный цвет:
BackColor = QBColor(12)
И строку
Call SetWindowRgn(hwnd, Rgn, True)
исправьте на
Call SetWindowRgn(hwnd, Rgn2, True)
Запускайте! Потрясающе, неправда ли !? Но вот если бы была ещё рамка, было
бы просто неотразимо. Но ведь это тоже осуществимо! Правда совсем не такая,
как у стандарного окна, но всё-таки!
3.Для этого можно применить API-функцию FrameRgn. Итак, под все остальные
API-функции допишем ещё одну:
Private Declare Function FrameRgn Lib "gdi32" (ByVal hDC As Long, _
ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, _
ByVal nHeight As Long) As Long
Передаваемые параметры:
hDC - handle Device Context (я не понимаю что это, но что-то на подобии hWnd
- может идентификатор какой?...)
hRgn - регион, который надо "обрамить"
hBrush - что это за "щётка" не понимаю тоже, но её надо прежде тоже создать
(!) скорее всего это вид рисования рамки.
nWidth, nHeight - толшина рамки по высоте и ширине
И, как я уже сказал, нам нужна ещё одна API-функция для создания "щётки"
(дописываем под первую):
Private Declare Function CreateSolidBrush Lib "gdi32" _
(ByVal crColor As Long) As Long
Внимание! Для FrameRgn тоже нужен регион! Ведь рамку можно нарисовать и на
квадратном окне и выглядеть она будет в зависимости от региона.
Теперь в событие Form_Load перед строкой
Call SetWindowRgn ...
вставьте строку
Call FrameRgn(hDC, Rgn, CreateSolidBrush(QBColor(0)), 3, 3)
Запускайте!
[Комбинирование регионов]
А ещё регионы можно комбинировать! Нужно это правда не так часто но, когда
вам нужна форма с одной стороны полукруглая, а с другой выперающие углы,
штыри и т.д., то без комбинирования регионов Вам уже не обойтись! Прежде чем
начать введите в Genral Declaration
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2006, 15:14
Помогаю со студенческими работами здесь

Как из *.VBS можно создать окно формы ?
Есть VBS-файл с алгоритмом. Как из него можно создать, а потом вызвать окно формы (с кнопками, LisBox-ми и т.д.)? P.S. InputBox не...

Как сделать окно нестандартной формы?
Полагаю, что для того, чтобы сделать окошко в форме рисунка из PNG, надо использовать UpdateLayeredWindow и WS_EX_LAYERED или как - то по...

Окно нестандартной формы!
Здравствуйте, интернет весь перекопан, надеюсь на вашу помощь! Возможно ли сделать окно не простой прямоугольной формы, а к примеру в форме...

Создать окно нестандартной формы
Приветствую всех. Делаю программку в целях изучения vb (QR чтения и запись кода в картинку). Есть идея сделать Form1 не прямоугольную а...

(MFC) Окно нестандартной формы?
Народ если кто знает как создать окно или диалог нестандартной формы (например треугольной или круглой :) ) объясните с чего начать и где...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru