Бутонът не е необходимо да има стандартен вид (макар че лично аз не намерите вида на стандартните бутони или скучен "unassumingly"). Въпреки това, за много фирми и ключови потребители с потребителски поглед, изглежда по-привлекателна. Следователно, можете да използвате бутоните, които показват растерна графика (растерна графика - растерна графика), за да се даде определен стил на своя собствена програма интерфейс.
Windows е с вградени механизми и API, подкрепят създаването на бутони (и други контроли), с нестандартен външен вид. Метод за съставяне на външен вид контрол зависи от неговия стил. В този случай, стила, който ни искат - това BS_OWNERDRAW. Името му може да се види този вид рисуване бутон изпълнява потребителски код, който се поставя в прозореца функция (диалогов), собственикът на контрола на прозореца.
Основните етапи на оказване на контрол от страна на xx_OWNERDRAW стил.
- Родителски контрол прозорец, съобщението идва WM_MEASUREITEM. където указател към структура чрез параметър MEASUREITEMSTRUCT lParam. манипулатор Съобщението трябва да зададете стойностите itemWidth itemHeight полета и структури, така че да съдържа наблюдението на ширина и височина, съответно. Ако сме обработили съобщение, водачът трябва да връща TRUE стойност на процедурата за прозорец. Това съобщение идва собственик, след като при създаването на контрол.
- Всеки път, когато трябва да се прекрои контрола на своя собственик получава WM_DRAWITEM съобщение. Параметърът lParam на съобщението съдържа указател към структура DRAWITEMSTRUCT. подготвени система. Целта на тази комуникация включва осигуряване на контекст, в който ще се случи за контрол на изобразяване. Дръжката на контекста е придружена от допълнителна информация за вътрешното състояние на контрола е необходимо (може би), за да промените външния му вид, както и действията на информация, изготвена в момента с контрола. Ще видим как тази информация може да се използва, за да промените външния вид на един бутон. И, отново, ако се справяме с това съобщение, водачът трябва да се върне от процедурата за прозорец, за да е истина.
Както ние осъзнаваме, че независимо може да се направи, но все пак бутона, би било хубаво, ако това е поведението на конвенционалните бутони - ръб в нормално състояние да симулира изпъкнал контрол, когато депресиран - депресирани, по време на бутон фокус трябва да бъде върху представете си правоъгълника, образуван от пунктираната линия и бутонът неактивна трябва рязко да се различават по цвят (или фон или букви, или и двете, че и друг).
Човек може лесно да се види, че ако искате да се изпълни изцяло стандартното поведение на един бутон ще трябва да се подготви достатъчно голям набор от растерни изображения:- изпъкнало без фокус и газта
- изпъкнала с фокус без ускорител
- изпъкнала с педала на газта, без фокус
- изпъкнала фокусиране и ускорител
- вдлъбната без фокус и газта
- вдлъбната без фокусиране ускорител
- вдлъбната без фокус с педала на газта
- вдлъбната с фокус и газта
- неактивен
Вие, като предприемачът има право да реши как внимателно да следвате тази процедура (I, например, се фокусира върху версията без ускорител :) в прилагането на пробата).
Изпълнението на тези изисквания, ние можем да се подготви пет растерни изображения (изпъкнали / вдлъбната с акцент / не фокус, неактивни), прилагането на външния вид на всеки един от щатите на бутона, и се направи в точното време (това е, когато има нужда да знае за текущото състояние на бутона) един от тях. В този случай, ние нямаме пълен контрол над външния вид на бутона във всяка държава. Impression правите върху потребителя, ще зависи изцяло от вашия вкус и възможност за създаване на растерни изображения.
По отношение на кода, който реализира необходимата логика, може да изглежда по следния начин:
Както можете да видите, нищо сложно. Кодът е разделен на две части: първата въз основа на информация за действията, които са извършени (itemAction) и текущото състояние на бутона (itemState) избира желаната растерна графика, във втората част се провежда в изхода на контекста избран бутони растерни.
Една ранна версия на кода по-горе, съдържаща вместо DrawState на повикване () следващия фрагмент.
По мое мнение и двете версии са еквивалентни по отношение на функционалност, но все пак в фрагмент от BitBlt () повече възможности да се направи грешка, която води до изтичане на ресурс.
Код рамка чек за необходимия контрол ID, като в работната програма на такъв контрол може да бъде няколко.
Внимателният читател е готов да зададете въпрос за това в самото начало, а не само на споменатите механизми (приложени, тъй като ние открихме, чрез WM_MEASUREITEM постове и WM_DRAWITEM), но API?
Всъщност, има няколко функции, които улесняват свързване на образец OWNERDRAW контрол. Developer подготвя основната ни растерна графика за бутона, и да изготви граници и бутон държави (неактивни и извън фокус) използва функции WinAPI - DrawEdge () (граничен контрол - на "изпъкнали / депресиран"), DrawState () (състояние "активно / неактивно") и DrawFocusRect () (състояние на "фокус"). В този случай, по-горе код ще бъде:
Печалбата на този подход се състои в използване на по-малко ресурси, независимо подготвени и по-нисък разход им по време на работа на програмата. Недостатъкът (и доста забележими, по мое мнение) е фактът, че има загуба на контрол над външния вид на бутона в различните му състояния. Въпреки това, работата на тези функции е насочена към поддържане на стандартен вид на контрола, така че резултатът не е много изразителен. По мое мнение, тази техника е по-подходяща за извършване на бутоните, които са основно стандартен вид, но оборудван с малки изображения, в непосредствена близост до текста на един бутон.
Трябва да се отбележи, че, ако е необходимо, е възможно (и понякога е необходимо), за да се използва комбинация от горните методи, предполагам, за да използвате, за да привлече четири (или повече) на растерна графика, но за да се направи функция граница DrawEdge ().
Свързани статии