特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接4 j! f) H, `% S
第24章 STemWin支持的颜色 & h& f: H8 ^8 M! a; v% i
本期教程主要是跟大家讲解一下STemWin支持的颜色,了解这些支持的颜色主要目的是为了根据实际的液晶屏支持颜色进行配置。简单的说就是,如果大家使用的屏只支持黑白两色,那么就得使用GUICC_1。 24. 1 预定义颜色 24. 2 固定调色板及其说明 24. 3 模拟器上演示颜色条测试例程 24. 4 总结 24.1 预定义颜色 emWin支持黑色/白色、灰度 (具有不同强度的单色)和彩色显示器。同一用户程序可用于任何显示器;只有LCD显示器的配置才需要进行更改。颜色管理功能会尝试查找与要显示的任何颜色最接近的匹配颜色。 逻辑颜色是应用程序处理的颜色。逻辑颜色始终按RGB值进行定义,是一个24位的值,每种颜色包含8位,如下所示:0xBBGGRR。因此,白色为0xFFFFFF,黑色为0x000000,鲜红色为0xFF。 物理颜色是可用显示器实际显示的颜色。按与逻辑颜色相同的24位RGB格式进行定义。在运行时,逻辑颜色映射到物理颜色。对于有几种颜色的显示器(如单色显示器或8/16色LCD),emWin使用优化版的“最小二乘偏差搜索”对其进行转换。它将要显示的颜色 (逻辑颜色)与LCD可实际显示的所有可用颜色 (物理颜色)进行比较,并使用LCD认为最接近的颜色。 STemWin支持的预定义颜色如下,其它没有定义的需要自己获取相应的颜色数值: 这些颜色在GUI.h文件里面进行了定义: - /*********************************************************************% N5 H, U( b$ A6 f$ I
- *
, o# G: J2 i0 Q/ f* e - * Standard colors2 Q" v6 Y: V/ ~$ [6 y4 [; |9 T
- */
1 g/ V3 I: F3 \ B6 y. r - #define GUI_BLUE 0x00FF0000
8 C8 `& {5 O5 p* N0 Z* u! K - #define GUI_GREEN 0x0000FF00# j. ~" P- |' R8 `5 {- l
- #define GUI_RED 0x000000FF4 B6 e: c0 Z! ]# ?
- #define GUI_CYAN 0x00FFFF00
9 x! U, n5 J% v3 C# ]3 R% Y - #define GUI_MAGENTA 0x00FF00FF
8 M. {4 `. }* { - #define GUI_YELLOW 0x0000FFFF/ K+ W; ~5 V0 b7 [3 m8 K
- #define GUI_LIGHTBLUE 0x00FF8080
9 h% K# S0 }, a" c* x; J - #define GUI_LIGHTGREEN 0x0080FF806 n; ^& n) V: i& u; ^* A2 }
- #define GUI_LIGHTRED 0x008080FF
$ p7 c- k: ?7 e9 F3 z% A - #define GUI_LIGHTCYAN 0x00FFFF80
. d; q5 f4 M/ U4 W! O) k" Q- u - #define GUI_LIGHTMAGENTA 0x00FF80FF( ?+ ?: f/ v2 M5 l& C* K* C
- #define GUI_LIGHTYELLOW 0x0080FFFF
* O) Z5 r% i/ {8 e - #define GUI_DARKBLUE 0x00800000
" _/ M9 v, }' p/ t - #define GUI_DARKGREEN 0x000080000 N: a7 a, f9 s+ c" B& T
- #define GUI_DARKRED 0x00000080
\, X3 j h$ g7 A0 } - #define GUI_DARKCYAN 0x008080003 d- x) h3 ~" _, g- ^) |- I7 v% v
- #define GUI_DARKMAGENTA 0x00800080
9 U- U% N ~) H - #define GUI_DARKYELLOW 0x00008080( Z& N6 D0 X6 B5 |1 s( W
- #define GUI_WHITE 0x00FFFFFF
" c8 j/ n7 X3 L" M - #define GUI_LIGHTGRAY 0x00D3D3D3
1 r; R# g6 K2 W i2 C/ s' O: h# P; D - #define GUI_GRAY 0x00808080
& Q3 T& x; p9 ^/ K; T) o; B - #define GUI_DARKGRAY 0x00404040: {7 W i" o, |- |/ X+ g1 l, @. s
- #define GUI_BLACK 0x000000008 l& ?4 l2 _9 x: u
- #define GUI_BROWN 0x002A2AA5* p: ~6 p& F( N+ K
- #define GUI_ORANGE 0x0000A5FF
( H( ~* z a% P+ ^5 J6 a - #define GUI_TRANSPARENT 0xFF000000
' G7 D( _/ M* s- H' e - 2 l G$ j7 x! n( u7 s& e' R8 E
- #define GUI_INVALID_COLOR 0xFFFFFFF /* Invalid color - more than 24 bits */
复制代码 24.2 固定调色板及其说明 STemWin支持的调色板模式很多,这里我们就只介绍下面三种,其它的看官方手册。 | 可用的颜色数 | | | 2(黑白) | | | 65536 | | | 16777216 + 8位Alpha混合 | AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB | 24.2.1 GUICC_1 这种调色板适合用于OLED和12864等单色的显示屏。GUICC_1仅支持2中颜色,显示效果如下: (右下角是两种颜色的调色板) 24.2.2 GUICC_M565 教程配套的RA8875屏都是用的这种调色板,支持65536中颜色。这里565的意思是红色和绿色分量为5位,蓝色分量为6位,即BBBBBGGGGGGRRRRR。显示效果如下: 5 H8 L5 Y1 \) u# z5 Q
24.2.3 GUICC_M8888 前面第三章介绍F429的STemWin的底层驱动时,就是用的这种调色板。其中低位3字节用于颜色分量,高位字节用于Alpha混合。红、绿、蓝和Alpha混合分量都是8位。颜色掩码:AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB 24.3 模拟器上演示颜色条测试例程 官方的模拟器上有一个专门的例子进行了颜色条的演示,此程序的位置: 此DEMO的实际代码如下: - #include "GUI.h" E1 n/ f$ b! J: U/ n4 {
- #include "LCDConf.h"
$ ?( W; I+ f# l1 H+ ? - 2 r/ i4 p5 k5 E0 D1 ^
- /*******************************************************************
7 Y0 H! s# x. p3 O/ |0 m - *
/ M$ z3 B$ ]/ b: K - * Defines
t: R8 J/ @* k- @* e( C3 y - *. S; B* {1 R- e# `9 v- a; Y( D
- ********************************************************************
* y$ @2 r! [& E4 f+ Q2 a; _- x' { - */
# ]; N, N! O7 F) o% U+ e% S6 b$ r$ g - #define X_START 60
( {: M2 K2 f# p - #define Y_START 40
0 d: l$ S5 B$ g% C+ O2 ] -
4 z% t) ?* x" Y4 _1 I" U - /*******************************************************************
" Y: e! G' Q0 m3 `- l* U2 ]' L7 ] - *
2 w) w c, O: n7 k& ? - * Types! H' D6 G9 J( N2 H' r, r- ?8 f
- *
4 [3 z2 ?' ~" H8 [7 b4 s - ********************************************************************
) V& K D' v- Z$ ^1 N+ l9 N - */, W9 d2 n- K# e8 H* d4 R- \: D
- typedef struct { (1)( `# k, L# V1 B# }8 ]+ X ^1 ~
- int NumBars;
9 G) v7 a) D+ d - 2 ?3 a) i2 z7 q/ C) X
- GUI_COLOR Color;+ k0 k( p6 h! |+ Y
- const char * s;: \0 p5 Y$ B0 a8 q
- } BAR_DATA;
8 a, X. ^) k4 T) E0 t -
2 t' c3 e8 @, Z2 L( A - /*******************************************************************
4 R6 l4 b" q% h7 _3 S! I - *% B5 y. Z1 o' I; W( h1 f7 e9 c) e- M
- * Static data" u4 s# _# v) t5 c- _ T! z6 ?
- *
, s% f7 u$ r, w. H( ]: E3 z& x - ********************************************************************
9 W" Q$ F* b6 A! N! C; f- v - */+ a- G& x/ {) h. H7 h- C9 {
- static const BAR_DATA _aBarData[] = {(2)
) ^, ~; O: c m8 I2 \7 g: P - { 2, GUI_RED , "Red" }," Z. O( g* r- {3 }. H
- { 2, GUI_GREEN , "Green" },
( C4 Y6 |, D- ]3 w+ V - { 2, GUI_BLUE , "Blue" },
! f7 l' W- r) ^6 r: ]3 m - { 1, GUI_WHITE , "Grey" },
1 |- ^8 _' P4 K; R - { 2, GUI_YELLOW , "Yellow" },- @5 G. x; o5 v
- { 2, GUI_CYAN , "Cyan" },
0 p, l4 L7 A) c1 d8 \$ j - { 2, GUI_MAGENTA, "Magenta" },- o( ?& a# Q' W: Y' \$ W- D
- };2 w9 ?# D! k. U7 T' E% G
-
, q* i! @! H2 f% E( b1 y. c5 R- ^% y - static const GUI_COLOR _aColorStart[] = { GUI_BLACK, GUI_WHITE };(3)+ {. b/ S( i. ]( {: Y
- 0 C& P& V% E; a4 T# t
- /*******************************************************************
* v5 v: Z6 M; o& R - *
5 b0 t d; Y+ ^$ Q - * Static code
! o) B8 F9 l- y* p2 I1 s - *
! R- m/ [" @' u' _5 | - ********************************************************************. ?5 o9 ^! o% q4 i
- */& n4 _ ?, T/ a$ M- E& B
- /*******************************************************************
- f# E5 T, ?2 l, f& H; k2 G - *( r [- h: e# Q" r
- * _DemoShowColorBar
" x6 o( ^4 J6 Q$ ^( Z$ X+ g - */1 S. G5 S4 h" k c/ J% c) ?
- static void _DemoShowColorBar(void) {4 \; S4 P, H9 ?" s+ {4 G
- GUI_RECT Rect;
/ C3 r, P4 z7 p& _ - int yStep;5 \: E1 ~# ?) P5 O+ ?
- int i;2 O9 q5 q; L% w g
- int j;( _# W$ w, m4 z/ h& E
- int xSize;
6 m( F: V7 g( ] - int ySize;
- t0 d0 O) z) w. ?6 H6 g - int NumBars;
* v1 m1 y' E. I6 l } - int NumColors;
, {( M9 q" |: Z/ l- k6 E - ) [9 v* E3 A9 X
- //% U5 m* R1 U# W) a* z3 M( Z' t
- // Get display size/ P9 D) a( W3 F7 }- R, z/ B& ~
- //% X% \) Y. W5 o
- xSize = LCD_GetXSize();- ?* [9 C3 E6 }+ Y: X+ b/ t2 v
- ySize = LCD_GetYSize();
/ F, r: V- {. o* i* b - //
8 d) }6 f+ u. Q! { - // Get number of bars) u* \+ n: J: k9 e
- //
" @6 {9 w2 A% l2 j( _! W - NumColors = GUI_COUNTOF(_aBarData);9 s0 p0 A0 J J2 p# A$ w. m
- for (i = NumBars = 0, NumBars = 0; i < NumColors; i++) {) J5 O+ I* E. E, U5 x6 X
- NumBars += _aBarData[i].NumBars;
" X' \; M. y# R1 X - }/ y3 f2 w1 }. L$ ` X
- yStep = (ySize - Y_START) / NumBars;. s) S0 y7 b; a+ @
- //+ s) s- C! N# p. C; C8 t
- // Draw text' Z: ]) Y! j6 \
- //
) \8 Q1 W/ L6 n3 r7 Z( D - Rect.x0 = 0;3 G/ Y! E5 B, L9 Z* K# U
- Rect.x1 = X_START - 1;) a* B, d7 }2 X4 w, x& w8 v
- Rect.y0 = Y_START;
0 d- ]! u t5 \7 p - GUI_SetFont(&GUI_Font8x16);
j: b7 m7 |% N6 | - for (i = 0; i < NumColors; i++) {2 ~" b$ N5 I) ?: f; O7 o1 G
- Rect.y1 = Rect.y0 + yStep * _aBarData[i].NumBars - 1;+ j4 a" z! v* l* U; S( N: m, H1 |" a
- GUI_DispStringInRect(_aBarData[i].s, &Rect, GUI_TA_LEFT | GUI_TA_VCENTER);
q4 A9 y, b. f0 x5 v8 p9 t - Rect.y0 = Rect.y1 + 1;
( @5 x1 W1 V3 g* a) ]1 N9 `% [7 x0 Q - }
5 D1 D# x7 [8 ~4 B5 F3 \ - //
8 N7 O; s x# {6 {/ L' ~ - // Draw colors
6 s, c5 h# z6 u2 q8 ] - //
7 X/ Y0 d# Y2 c9 z9 x - Rect.x0 = X_START;, Q' i1 V. F- w5 F6 ^
- Rect.x1 = xSize - 1;- t3 G8 ^5 _0 I! e) ]
- Rect.y0 = Y_START;
" S+ ?9 K% z) Q5 g E# b - for (i = 0; i < NumColors; i++) {
- p# L# I6 {% H" e; m8 }$ o& _7 X; @ - for (j = 0; j < _aBarData[i].NumBars; j++) {: u p% Y" d7 M' k& c. s/ G
- Rect.y1 = Rect.y0 + yStep - 1;& M+ {2 y" y# I8 b7 S: v( h- Q
- GUI_DrawGradientH(Rect.x0, Rect.y0, Rect.x1, Rect.y1, _aColorStart[j], _aBarData[i].Color);1 X8 h( i7 F1 T+ \5 k
- Rect.y0 = Rect.y1 + 1;
* i# o9 z, Y+ F - }
. Z$ s: [+ M. L$ k7 b: R - }9 `# J8 Q( _; R
- }
* U0 U9 T/ P; L- G1 d" i! e% ^5 q9 i3 B - - v. [& w2 H k
- /*********************************************************************% S8 I, Y6 R! d! _; Y4 S
- *; N: B! p# D& g; o2 n' H; J2 i
- * Public code o+ J8 S' i5 o( u
- *( {" b% w% B# j4 E9 T- D7 d
- **********************************************************************
! c- G# c( S# V( X! f; |! i% L - */! W4 y$ ~( P, K; f
- /*********************************************************************
8 H# i- X" H9 G+ C) y - *, ]# I8 M" E, j; a* D3 `) y
- * MainTask8 ]3 w- O; O$ F [/ R6 a
- */6 ~5 Y; m- `: B% P
- void MainTask(void) {- T1 l$ F0 x. C6 z9 L
- GUI_Init();8 l# a8 i* |. _* U' F
- GUI_SetBkColor(GUI_BLACK);$ J9 ~' K! g; I" f
- GUI_Clear();2 m8 S& r8 \: q6 ]
- GUI_SetColor(GUI_WHITE);/ z( p* V# f$ ?: e( m( r) w9 z- `/ |
- GUI_SetFont(&GUI_Font24_ASCII);
- y1 Q! j9 T' h/ e - GUI_DispStringHCenterAt("COLOR_ShowColorBar - Sample", 160, 5);
8 |# d/ |. T. X% j$ v7 H! q& d# M) g - _DemoShowColorBar();
0 H2 u& A8 M# U' m: S1 X - while(1)
7 |8 I' c2 R( k1 P# v - GUI_Delay(100);1 h; e& U* ~' b: {" W& w
- }
复制代码1. 这个例子比较的简单,大家要学习的就是上面1,2,3这种数据的定义方式。在主程序中调用的时候就非常方便了。 实际显示效果如下: 24.4 总结 颜色方面的知识就跟大家说这么多,后面需要的时候再跟大家详细的讲解。
6 T* g+ J6 X) i |