Реалізація круглої кнопки в CBuilder

Для того щоб отримати круглу кнопку, вам необхідно розуміти, як API працює з вікнами

У процесі зміни способу кнопки є два кроки і використовуються дві функції API Перший крок – створення образу (shape), який буде потім застосований до кнопки Можете вважати, що на цьому кроці ми робимо заготовку з тіста Ви робите заготовку, а потім розкочуєте її і надати їй форму (ну, наприклад, у моїх дітей виходить в такому випадку наполовину зїдена заготівля, але це окрема розповідь) Другий крок – «розкачати» заготовку на вікні Перший крок реалізується за допомогою функції APICreateEllipticRgn   (Створити еліптичну область) Ця функція – варіант функції CreatePolygonRgn (Створити многокутну область) Насправді функцій, що створюють області, мало: CreateRectRgn, CreateEllipticRgn, CreateRoundRectRgn і CreatePolygonRgn Кожна з них, як ви можете дізнатися з файлу Win32SDKhlp, створює свій тип відображуваної області Якщо ви хочете отримати хитру область, то можете викликати кілька цих функцій для створення декількох областей, а потім скомбінувати їх функцією API CombineRgn Це дозволить вам, наприклад, створити область у вигляді бублика Коли ви створили область, ви застосовуєте її до вікна («розкочуєте тісто»), використовуючи функцію SetWindowRgn

Найкраще створювати область для вікна при створенні форми Створіть обробник події форми OnCreate і додайте в метод FormCreate наступний код:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

HRGN hRgn = CreateEllipticRgn(

0, / / ​​x-координата лівого верхнього кута

/ / Би прямокутника

0, / / ​​y-координата лівого верхнього кута

/ / Би прямокутника

Button1-> Width, / / ​​x-координата правого нижнього

/ / Кута би прямокутника

Button1-> Height / / y-координата правого нижнього

/ / Кута би прямокутника

)

SetWindowRgn (Button1-&gtHandle, hRgn, TRUE)

}

Цей код створює еліптичну область всередині кордонів кнопки і потім привласнює її кнопці як нову область вікна Зауважте, що область повинна бути визначена в координатах щодо кнопки, а не щодо екрана Точка 0,0 – це лівий верхній кут кнопки, а точка Width, Height – правий нижній кут кнопки

Дуже важливо, щоб ви більше нічого не робили із посиланням (handle) на область після присвоювання її вікна Найбезневинніше, що трапиться при зміні або видаленні цього посилання, – падіння програми, найгірше – Обвал системи У даний момент у вас є кнопка на формі, яка відображає себе як еліпс, і наступним кроком є ​​написання коду, що робить те ж саме з формою Перед тим як це Зробити, встановіть властивість форми BorderStyle (стиль рамки) в bsNone (тобто без рамки) Інакше ви будете бачити частини рамки форми, що вилазять за еліпс, що виглядає непривабливо Крім того, зауважте, що на картинку, покладену на форму, також впливає округлість форми: картинка промальовується тільки всередині галузі форми

Додайте цей код в метод FormCreate (Після коду, який ви тільки що ввели для кнопки), який робить форму еліптичної:

HRGN hRgn1 = CreateEllipticRgn(

0, / / ​​x-координата лівого верхнього кута

/ / Би прямокутника

0, / / ​​y-координата лівого верхнього кута

/ / Би прямокутника

Width, / / ​​x-координата правого нижнього

/ / Кута би прямокутника

Height / / y-координата правого нижнього

/ / Кута би прямокутника

)

SetWindowRgn (Handle, hRgn1, TRUE)

Код в точності такий же, як і для кнопки Єдине, що не згадується Button при зверненні до властивостей Це не так вже дивно Всі вікна однакові з точки зору областей (regions), які їх обмежують Наприклад, ви могли б створити кругле вікно списку, круглий список каталогів або вікно діалогу Це може дивно виглядати, але такі речі можливі

Ви, мабуть, помітите, що кнопка виглядає дивно, коли вона відображена в еліптичному вигляді Це через рамки у кнопки Напряму неможливо змінити рамку кнопки, тільки наслідуючи новий компонент від класу button Це можна зробити, але це далеко не так просто, як зробити кнопку круглою

Цим ми завершуємо дискусію про круглій формі Все, що було потрібно, – по два виклики двох різних функцій Windows API Тепер ви розумієте, чому так важливо знати, що можна зробити за допомогою Windows API Уявіть собі, яких зусиль коштувало б створити круглу форму без цих двох функцій

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*