|
1 / 1 / 0
Регистрация: 07.05.2006
Сообщений: 6
|
|
Как сделать окно нестандартной формы09.05.2006, 08:16. Показов 3266. Ответов 2
Метки нет (Все метки)
0
|
|
| 09.05.2006, 08:16 | |
|
Ответы с готовыми решениями:
2
Посоветуйте как сделать resize нестандартной формы
Пикчербокс нестандартной формы - не работает |
|
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
|
|
| 26.08.2006, 15:14 | |
|
Помогаю со студенческими работами здесь
3
Как из *.VBS можно создать окно формы ? Как сделать окно нестандартной формы? Окно нестандартной формы!
(MFC) Окно нестандартной формы? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Фото всей Земли с борта корабля 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. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|