ПредишенСледващото

Бутонът не е необходимо да има стандартен вид (макар че лично аз не намерите вида на стандартните бутони или скучен "unassumingly"). Въпреки това, за много фирми и ключови потребители с потребителски поглед, изглежда по-привлекателна. Следователно, можете да използвате бутоните, които показват растерна графика (растерна графика - растерна графика), за да се даде определен стил на своя собствена програма интерфейс.

Windows е с вградени механизми и API, подкрепят създаването на бутони (и други контроли), с нестандартен външен вид. Метод за съставяне на външен вид контрол зависи от неговия стил. В този случай, стила, който ни искат - това BS_OWNERDRAW. Името му може да се види този вид рисуване бутон изпълнява потребителски код, който се поставя в прозореца функция (диалогов), собственикът на контрола на прозореца.

Основните етапи на оказване на контрол от страна на xx_OWNERDRAW стил.

  1. Родителски контрол прозорец, съобщението идва WM_MEASUREITEM. където указател към структура чрез параметър MEASUREITEMSTRUCT lParam. манипулатор Съобщението трябва да зададете стойностите itemWidth itemHeight полета и структури, така че да съдържа наблюдението на ширина и височина, съответно. Ако сме обработили съобщение, водачът трябва да връща TRUE стойност на процедурата за прозорец. Това съобщение идва собственик, след като при създаването на контрол.
  2. Всеки път, когато трябва да се прекрои контрола на своя собственик получава WM_DRAWITEM съобщение. Параметърът lParam на съобщението съдържа указател към структура DRAWITEMSTRUCT. подготвени система. Целта на тази комуникация включва осигуряване на контекст, в който ще се случи за контрол на изобразяване. Дръжката на контекста е придружена от допълнителна информация за вътрешното състояние на контрола е необходимо (може би), за да промените външния му вид, както и действията на информация, изготвена в момента с контрола. Ще видим как тази информация може да се използва, за да промените външния вид на един бутон. И, отново, ако се справяме с това съобщение, водачът трябва да се върне от процедурата за прозорец, за да е истина.

Както ние осъзнаваме, че независимо може да се направи, но все пак бутона, би било хубаво, ако това е поведението на конвенционалните бутони - ръб в нормално състояние да симулира изпъкнал контрол, когато депресиран - депресирани, по време на бутон фокус трябва да бъде върху представете си правоъгълника, образуван от пунктираната линия и бутонът неактивна трябва рязко да се различават по цвят (или фон или букви, или и двете, че и друг).

Човек може лесно да се види, че ако искате да се изпълни изцяло стандартното поведение на един бутон ще трябва да се подготви достатъчно голям набор от растерни изображения:
  • изпъкнало без фокус и газта
  • изпъкнала с фокус без ускорител
  • изпъкнала с педала на газта, без фокус
  • изпъкнала фокусиране и ускорител
  • вдлъбната без фокус и газта
  • вдлъбната без фокусиране ускорител
  • вдлъбната без фокус с педала на газта
  • вдлъбната с фокус и газта
  • неактивен

Вие, като предприемачът има право да реши как внимателно да следвате тази процедура (I, например, се фокусира върху версията без ускорител :) в прилагането на пробата).

Изпълнението на тези изисквания, ние можем да се подготви пет растерни изображения (изпъкнали / вдлъбната с акцент / не фокус, неактивни), прилагането на външния вид на всеки един от щатите на бутона, и се направи в точното време (това е, когато има нужда да знае за текущото състояние на бутона) един от тях. В този случай, ние нямаме пълен контрол над външния вид на бутона във всяка държава. Impression правите върху потребителя, ще зависи изцяло от вашия вкус и възможност за създаване на растерни изображения.

По отношение на кода, който реализира необходимата логика, може да изглежда по следния начин:

Както можете да видите, нищо сложно. Кодът е разделен на две части: първата въз основа на информация за действията, които са извършени (itemAction) и текущото състояние на бутона (itemState) избира желаната растерна графика, във втората част се провежда в изхода на контекста избран бутони растерни.

Една ранна версия на кода по-горе, съдържаща вместо DrawState на повикване () следващия фрагмент.

По мое мнение и двете версии са еквивалентни по отношение на функционалност, но все пак в фрагмент от BitBlt () повече възможности да се направи грешка, която води до изтичане на ресурс.

Код рамка чек за необходимия контрол ID, като в работната програма на такъв контрол може да бъде няколко.

Внимателният читател е готов да зададете въпрос за това в самото начало, а не само на споменатите механизми (приложени, тъй като ние открихме, чрез WM_MEASUREITEM постове и WM_DRAWITEM), но API?

Всъщност, има няколко функции, които улесняват свързване на образец OWNERDRAW контрол. Developer подготвя основната ни растерна графика за бутона, и да изготви граници и бутон държави (неактивни и извън фокус) използва функции WinAPI - DrawEdge () (граничен контрол - на "изпъкнали / депресиран"), DrawState () (състояние "активно / неактивно") и DrawFocusRect () (състояние на "фокус"). В този случай, по-горе код ще бъде:

Печалбата на този подход се състои в използване на по-малко ресурси, независимо подготвени и по-нисък разход им по време на работа на програмата. Недостатъкът (и доста забележими, по мое мнение) е фактът, че има загуба на контрол над външния вид на бутона в различните му състояния. Въпреки това, работата на тези функции е насочена към поддържане на стандартен вид на контрола, така че резултатът не е много изразителен. По мое мнение, тази техника е по-подходяща за извършване на бутоните, които са основно стандартен вид, но оборудван с малки изображения, в непосредствена близост до текста на един бутон.

Трябва да се отбележи, че, ако е необходимо, е възможно (и понякога е необходимо), за да се използва комбинация от горните методи, предполагам, за да използвате, за да привлече четири (или повече) на растерна графика, но за да се направи функция граница DrawEdge ().

Свързани статии

Подкрепете проекта - споделете линка, благодаря!