特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
2 t3 a( M7 ]& {8 U/ N第57章 WINDOW-窗口控件
8 o) J$ f0 s. N1 M' C 本期教程讲解STemWin支持的窗口控件,窗口控件和前面讲的窗口本质上面是一样的,只不过这里是以控件的形式存在,专门用于对话框中创建窗口。 57. 1窗口控件介绍 57. 2 官方WIDGET_Window实例 57. 3 总结
( l2 X- [* f9 W' ^$ Q; M57.1 窗口控件介绍 WINDOW控件的作用是从资源表创建对话框窗口。如果对话框看起来不象框架窗口,则应当使用WINDOW控件。窗口控件充当的是背景以及子窗口的容器:它可包含子窗口,通常采用灰色来作为背景的填充色。它类似于没有框架和标题栏的框架窗口,供对话框所使用。 57.2 官方WIDGET_Window实例 官方的这个实例很好的演示了window的使用,这个例子在模拟器中的位置: 源码如下(程序中进行了详细的注释): - #include "GUI.h"$ o( }! k* N$ b
- #include "DIALOG.h"4 q$ Y* P0 @/ C. h
- 0 d! J9 ?; L) e. ?' R5 L
-
) G* Z8 f6 z M8 h& l* l - /*********************************************************************3 C2 U' j0 B" Q% p
- *# p1 C( K: o' n: J" v
- * _aDialog: e% V7 V0 P/ J9 L2 k
- * 对话框创建资源7 f, D. D3 J }0 h' r' Y5 Q: U
- */
- r% n2 z! B( M0 U: w - static const GUI_WIDGET_CREATE_INFO _aDialog[] = {6 N! \4 J: W. R, J# v% F
- { WINDOW_CreateIndirect, "", 0, 0, 0, 260, 200, 0 },
" w+ \ X8 a6 d, X; J( S - { TEXT_CreateIndirect, "Dialog", 0, 80, 5, 100, 20, TEXT_CF_HCENTER },5 a* |' Q4 f% ~+ E8 P6 r
- { BUTTON_CreateIndirect, "Close", GUI_ID_BUTTON0, 80, 160, 100, 20, 0 }2 i; ^0 l* G1 x* d T6 a4 H
- };
# x2 \6 {4 U) J4 A ^& n7 X- N - ' e+ q$ C, E0 @: [# @- w) [
- /*********************************************************************
' A( e. n3 x# k0 u$ j - *
5 D/ x% J# M: g) F( y1 q - * _cbDialog% ^4 A6 B( m. X1 @7 [# Y
- * 对话框回调函数
( M6 P M: s c# G8 N8 D% ^) t0 B - */
0 @) c' C: g4 @2 g- J0 t/ c - static void _cbDialog(WM_MESSAGE *pMsg) {3 F$ a$ C! F- P0 o3 ]
- int NCode;( _0 q# s- u) ^* `
- int Id;) \9 _" v3 B: D
- 5 ~1 L3 j/ m# Z( W* [
- switch (pMsg->MsgId) {
, D6 w6 J) D/ D; _* a - case WM_PAINT:
1 W* s0 P; u' ~' h8 M1 k - GUI_SetBkColor(GUI_GREEN);% M: P% t' u3 n
- GUI_Clear();
( X" }3 u' m9 x4 c! i+ d - break;
# t; }, L1 Z; v/ i* y. B2 C6 p - case WM_NOTIFY_PARENT:% K5 d5 { F3 M
- Id = WM_GetId(pMsg->hWinSrc); // Id of widget
! ^' b; Q& r1 ?5 @7 ~ - NCode = pMsg->Data.v; // Notification code9 @% u; K( |" [1 B6 L' j
- switch (NCode) {
' o8 H$ b* O3 V# {1 u - case WM_NOTIFICATION_RELEASED: // React only if released, t; a( j5 A# C$ b; D- Q
- switch (Id) {
" ]5 s& O, n# W! @ - case GUI_ID_BUTTON0:8 }4 s6 U [8 `* n+ h- C
- GUI_EndDialog(pMsg->hWin, 0);
+ u- I" ?3 l! H2 I$ `) q( f ] - break;
6 z" f8 | ^2 D" k$ H - }
- U& a k+ D& ]0 E; I - break;6 i6 O" U3 R8 F
- }
" [/ R+ n/ e7 T6 D3 G6 ] - break;+ N! K [, _% K* v5 c4 V2 N3 Q
- default:3 B& ^' U" n) N0 A4 ^! ?+ h
- WM_DefaultProc(pMsg);
! u9 r- @, s' d. a - }7 S* q% y3 v5 F+ [2 e z. L
- }8 k G p3 `6 j0 M+ ]
-
0 `/ n0 ]4 i" G/ x9 }0 i1 x, s - /*********************************************************************' U. `( Y% Q$ k1 |8 K
- *
6 K0 V1 N2 `4 P - * MainTask* V5 n; w |" ]( C1 T3 b
- */
1 [4 `& f+ a0 _/ U - void MainTask(void) {
5 I" G) s; Z- X. T - GUI_Init();
5 v1 k; M. G W. u) Y - while(1) {
" m9 O6 d" A5 w5 q - GUI_DispStringHCenterAt("WIDGET_Window sample\nshows how to use a WINDOW widget", 160, 5);+ R! c1 e# _/ O/ g
- /* 阻塞式对话框 */
0 u2 k$ X5 [! J0 }+ x+ \ - GUI_ExecDialogBox(_aDialog, GUI_COUNTOF(_aDialog), _cbDialog, WM_HBKWIN, 30, 30);- U% J: `, Q1 l6 M
- GUI_Clear();
7 Y. O: { N& g) e; s - GUI_DispStringHCenterAt("Dialog has been closed", 160, 5);4 w4 H7 E8 b% ^+ @ [, T$ l
- GUI_Delay(1000);
9 I; A) _4 H& I- H) [ - GUI_Clear();
3 Q# O- F4 D6 A1 |/ v1 S f - }
9 i: C/ Q. j1 S* T" T4 A' P* M5 ~ - }
复制代码实际显示效果如下: 57.3 总结 本期教程主要是跟大家讲解了窗口控件的使用,窗口控件使用同上期讲的文本控件一样,都比较的容易些,只是现在的uCGUIBulder4.0和GUIBulder5.22都还不支持在对话框上面创建窗口控件。 ; g& d9 }8 I6 L1 x3 d" c
|