你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第44章 FrameWin-框架窗口控件

[复制链接]
baiyongbin2009 发布时间:2015-3-3 11:57
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接0 U0 U5 ?* z* k9 r' H* M6 \6 x
第44章 FrameWin-框架窗口控件

% S' o- B# N7 S6 K9 h4 y. v
    本期教程讲解STemWin支持的框架窗口控件。
    44. 1 框架窗口控件介绍
    44 2 官方WIDGET_FrameWin实例
    44. 3 总结
44.1 框架窗口控件介绍
    框架窗口为您的应用提供一个PC应用程序的窗口外观。这些窗口由周围框架、标题栏和用户区组成。标题栏的颜色改变以显示窗口是否激活,如下图所示:
44.1.png
    如下图所示,可将预定义的按钮附加到标题栏,也可将自己的按钮附加到标题栏:
44.2.png
    设置皮肤后显示效果如下:
44.3.png
44.1.1 框架窗口的结构
    下图显示了框架窗口的详细结构和外观:
44.4.png
    框架窗口实际上由2种窗口组成;主窗口和子窗口。子窗口称为客户端窗口。处理回调函数时意识到此点非常重要:存在具有2种不同回调函数的2种窗口。创建子窗口时,这些子窗口通常作为客户端窗口的子窗口而创建;它们的父窗口因此是客户端窗口。
细节
描述
B
框架窗口的边框尺寸。默认的边框尺寸为3像素。
H
标题栏的高度。取决于标题所用字体的尺寸。
D
标题栏和客户端窗口的间距。(1像素)
标题栏
标题栏是框架窗口的一部分,不是单独的窗口。
客户端窗口
客户端窗口是一个单独的窗口,作为框架窗口的子窗口创建。
44.2 官方WIDGET_FrameWin实例
    官方的这个实例简单的演示了FrameWin的部分功能,这个例子在模拟器中的位置:
44.5.png
源代码如下:
  1. #include <stddef.h>8 z. {5 H. k  c9 A$ R
  2. #include <string.h>1 t% D- m0 w; j" ?$ C* D" b' P' L$ a# [
  3. #include "GUI.h"
    : i* a# G) R6 I
  4. #include "FRAMEWIN.h"0 m2 O+ o: a" I% u
  5. . v% O+ `$ m, {+ u3 |% f) g8 Z
  6. /*********************************************************************
    7 H2 f; q7 }; m4 f' W$ G& v- j0 |
  7. */ o9 L& H0 ^% h
  8. *       Defines
    + a, ?- x+ T* J( u: r8 c3 d
  9. *
    2 v3 b5 C+ j0 c$ q0 W! y9 m
  10. **********************************************************************" l, }/ v* [2 [- D; p
  11. */* [& }! l7 E) T" v! B
  12. #define SPEED   1200
    , r/ Z1 \0 V" ~8 M  h$ O

  13. + @1 T* O# X- J+ `- ?
  14. #define MSG_CHANGE_MAIN_TEXT (WM_USER + 0) (1)9 N  F/ Z4 y( ?/ f; G& H5 P! \6 n7 Y
  15. , G1 K/ K  u! b8 C0 x
  16. /*********************************************************************
    9 A7 J$ u: D" O) u! l
  17. *) T0 W- S" X" c: a  f) |, F6 @
  18. *       Static data
    . x5 y# U+ ?, z6 g0 T9 C
  19. */ j$ x$ i) O& G9 \3 D: D8 z) l
  20. **********************************************************************
    9 O; Q8 ~3 L' S: {
  21. */8 B: m3 b7 E: v0 L  @
  22. static FRAMEWIN_Handle  _hFrame;$ T, t! T- b( {7 s% m" D' ^
  23. static WM_CALLBACK*     _pcbOldFrame;# \& ]6 B9 O7 C2 y
  24. static char             _acMainText[100];& n- J. T- W! K$ T+ Z6 H
  25. static int              _LockClose = 1;
    6 o- `; {5 i) k% O+ [7 F  `

  26. " y; o) i, z6 P
  27. /*******************************************************************( `1 G& a& V1 j
  28. *
    0 K0 _7 ?+ F. @. ?8 ]; R
  29. *       Static code
    $ b5 @1 ~- H* F9 {7 h  D  Y
  30. *
    ( u/ Z7 X$ t' y6 V7 T9 i
  31. ********************************************************************
    0 }5 C3 [; K' r, v
  32. */
    2 n  ^: f6 W% T5 C& R6 s1 ^
  33. /*******************************************************************
      Q/ m/ X1 x1 k5 I
  34. *2 A  }5 w: d0 d5 w1 B) |. H+ v3 A
  35. *       _ChangeMainText5 u, N1 k7 t# U7 P. Y
  36. *
    0 E7 Z0 g8 d% j: O. R
  37. *  Sends a message to the background window and invalidate it, so
    % `% ~! Z: S  F. \/ d* B
  38. *  the callback of the background window display the new text.
    / n& z7 M$ \$ }2 V+ R4 x( y9 ]
  39. */' s$ C8 q4 M( s* X' \$ F+ q
  40. static void _ChangeMainText(char* pStr, int Delay) {(2)8 @# ~3 A7 {2 i; W: B2 c: Z
  41.   WM_MESSAGE Message;6 T+ y) K' A& L, ]
  42.   Message.MsgId  = MSG_CHANGE_MAIN_TEXT;1 v( Y- s/ P5 v3 B& M
  43.   Message.Data.p = pStr;( `$ p- C6 N8 i3 u. o4 x
  44.   GUI_Delay(Delay);% I1 ^( J# v1 r, J/ z
  45.   WM_SendMessage(WM_HBKWIN, &Message);+ K, |! u  ~4 Y$ v4 z" k4 d7 e
  46.   WM_InvalidateWindow(WM_HBKWIN);/ H1 Y6 Y, w* t3 P8 q% W
  47.   GUI_Delay(Delay/3);
    4 x0 M8 \2 \+ U( l3 _0 ?
  48. }& c7 T- z7 |' i4 t) G7 |3 }+ D

  49. ! H* p; [* n3 t/ R4 c
  50. /*******************************************************************
    , B0 h6 a( R% p( \( h6 q
  51. *
    1 |0 K+ i% c, u2 B7 m
  52. *       _cbChild
    % i' R" r8 y% _* j8 T3 M  f& B
  53. */: P0 E0 `" t; y7 C. R
  54. static void _cbChild(WM_MESSAGE * pMsg) {(3)
    5 o6 ^% `- G5 f2 g0 m; m4 d, ^
  55.   WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);1 o6 n. g! N) U( n: q5 a% Z
  56.   switch (pMsg->MsgId) {8 G0 o4 F$ l6 t3 c% c
  57.   case WM_PAINT:
    " x/ n" Z. q" h  j) F; H8 c2 D" N/ b
  58.     //
    : Y' O' b' D1 B" j0 p
  59.     // Handle the paint message
    / M$ H6 e) N8 `4 Z7 s! ]
  60.     //
    ; G) t; `, R, H
  61.     GUI_SetBkColor(GUI_WHITE);0 Q7 F, Q0 p7 F/ F
  62.     GUI_SetColor(GUI_BLACK);
    9 q5 f5 [7 q3 r0 H
  63.     GUI_SetFont(&GUI_FontComic24B_ASCII);6 i* a; z: ?6 ^: ^# c4 G) Q0 R
  64.     GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
    & m7 S: }; L" ?
  65.     GUI_Clear();
    5 A6 |$ Q% r% F1 S
  66.     GUI_DispStringHCenterAt("Client window",
    4 r) N6 f4 c, |9 e" n
  67.                             WM_GetWindowSizeX(hWin) / 2,
    * u( U0 H! R4 @* J, j
  68.                             WM_GetWindowSizeY(hWin) / 2);4 d7 f! R- I5 E
  69.     break;) l* f, F- [. I  p, I/ Q
  70.   default:
    / ]) f  U8 O  s& \) b
  71.     WM_DefaultProc(pMsg);
    % Z# t. M1 ?) x* i& W5 n( ]$ R0 h
  72.   }3 I! q% P- s/ Q3 r; I% k& k$ ~8 I
  73. }
    ( g$ q% z9 q7 Q* X- U1 _. ^

  74. 2 \! E: n' J" j9 R
  75. /*******************************************************************1 r/ Z3 d! s! s* p+ a" Y
  76. *
    2 h8 e; ?( S+ W4 v  N
  77. *       _cbFrame
    ) B1 |8 R6 K" I. n
  78. */
    " }# J( E; X5 M4 u
  79. static void _cbFrame(WM_MESSAGE * pMsg) {  (4)
    & j' ~3 z4 |# D7 P1 p  i
  80.   switch (pMsg->MsgId) {, K9 r) ]% E# }  N; \  N/ h, Z3 S
  81.   case WM_NOTIFY_PARENT:) |1 _' P* y6 @$ o1 X$ m0 O2 q
  82.     if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
    % E& ~+ j  Z) \1 f& [9 k4 T
  83.       int Id = WM_GetId(pMsg->hWinSrc);      // Id of widget& o9 B% P( u8 D! o
  84.       if (Id == GUI_ID_CLOSE) {0 Z. i' @0 ?! l6 u* w9 f, g
  85.         if (_LockClose) {
    * z. X$ m$ j, V# _# I' v
  86.           return;
    5 d) k/ z$ J5 L* g1 v
  87.         }( S( Y6 R" Q1 n% Y6 o
  88.         _hFrame = 0;
    ! o" X4 O5 }# B9 Q
  89.       }
    # T7 L- c. E# {
  90.     }
    6 Q( r; R( @" J) a! y
  91.     break;5 s2 x! j0 e( {$ f5 v3 b
  92.   }- Y, ]5 i5 r" z% _( w2 b" C. O6 F2 k
  93.   if (_pcbOldFrame) {
    # p# d. h& A! C
  94.     (*_pcbOldFrame)(pMsg);; j  ?& U& [5 b, G/ }
  95.   }$ Q4 j7 [3 ^5 `. j. K  C1 n  r5 x
  96. }5 w4 `% H; i* ]

  97. . r8 V3 m) K8 g( I2 L
  98. /*******************************************************************
    # W4 F4 d: S- X4 D3 q
  99. *
    0 y0 D3 V8 ?5 U9 A: u
  100. *       _cbBkWindow
    , o  h, b& r7 d5 C9 }  g: t( ]5 \5 a
  101. *  \1 A) B2 [/ b, A4 u
  102. * Function description
    1 ]# j& p* u6 x( t4 L# D
  103. *   This callback is necessary to redraw the background when
    ; m. g- l1 F. g& p
  104. *   frame window is moved
    8 t: l# Q  x  o$ j( d( s3 A
  105. */
    5 \' J8 D) u* K
  106. static void _cbBkWindow(WM_MESSAGE * pMsg) {(5)
    + J5 s4 X0 }: N9 X3 [7 D! z
  107.   switch (pMsg->MsgId) {1 e, |7 q, @1 O1 Q$ O
  108.     case MSG_CHANGE_MAIN_TEXT:3 \' Q, s$ _  v- F
  109.       strcpy(_acMainText, (char const *)pMsg->Data.p);
    " J& O2 |8 B! J4 j
  110.       WM_InvalidateWindow(pMsg->hWin);3 Y- v) m* x, Y) ~9 m  J
  111.       break;8 y- g6 c1 V6 j9 I4 k! [
  112.     case WM_PAINT:
    / J* }# x" {) g, q1 U- e
  113.       GUI_SetBkColor(GUI_BLACK);; ]. a7 X# s. t
  114.       GUI_Clear();
    ; @" D7 ~) I+ C5 t+ g7 @
  115.       GUI_SetColor(GUI_WHITE);, [2 y* H4 w8 g. v1 X+ @
  116.       GUI_SetFont(&GUI_Font24_ASCII);$ Z. o+ Q% }8 s
  117.       GUI_DispStringHCenterAt("WIDGET_FrameWin - Sample", 160, 5);3 `$ m+ u1 r8 Z6 V( x! c" V2 T
  118.       GUI_SetFont(&GUI_Font8x16);
    6 [* M3 {' s5 {9 o6 B$ e
  119.       GUI_DispStringHCenterAt(_acMainText, 160, 40);
    1 O$ }; w, P% o( ?2 a- @- f4 N. k. p
  120.       GUI_SetFont(&GUI_Font6x8);
    4 ^& e& q/ {( K4 R6 f6 L
  121.       GUI_DispStringHCenterAt("The function FRAMEWIN_Create creates both the\n"
    : d& |4 c/ `8 ~- |- ]) e' P
  122. "frame window and the client window.", 160, 190);
    4 b5 J2 h4 s) ]! _: Q- p. ~6 i6 M
  123.       break;9 `* Y: f; \' r# x. e6 @! A; b2 l6 H
  124.     default:1 O, b0 d! q3 @2 ], O
  125.       WM_DefaultProc(pMsg);
    7 o$ b' V4 d8 C% o) F
  126.   }
    6 E) [) g. P) D7 c6 I2 W: D1 L
  127. }7 l! H1 }; d) ?: j+ D" K

  128. ) C1 C9 \5 x- S2 `! N
  129. /*******************************************************************
    : e4 k; ], Y: Q$ g: f/ i$ z
  130. *
    . M8 d7 _# }2 D) j
  131. *       _DemoFramewin
    7 H1 B5 R$ ~  h3 f/ \5 |# b( `% C+ ?
  132. *
    : ?* E) N' k* ?  F
  133. * Function description/ R; b2 T8 }/ w/ B8 Y: q
  134. *   Creates the frame window and sets the callback for frame, child
    ) E& Q& \: M& w5 o6 k
  135. *   and background window6 N* y0 ^* f; }9 Y8 S; h4 `, c
  136. */2 u+ ]. j8 F5 r2 i1 Z: c: ^  G
  137. static void _DemoFramewin(void) {(6)
    ( y* b. n9 u( ?9 \- I
  138.   int i;
    - O3 ]. V' [/ ]( e7 ?3 c" F
  139.   char acInfoText[] = "-- sec to play with window";$ q# p7 X8 o5 T0 G2 r( ^
  140.   WM_HWIN hChild;
    ; q9 d' Q' d  P/ d5 F2 T( y4 t
  141. : c4 M& R( `  I! i
  142. 8 ]" S' n7 ~& R9 ^& V' H$ m
  143.   WM_SetCallback(WM_HBKWIN, _cbBkWindow);
    7 M2 M, P. K- g2 k7 }+ X, b
  144.   //
    6 o- N  N  ^' F1 p; o) ^
  145.   // Create and configure frame window8 m; r2 w- k2 J3 I
  146.   //
    0 N) i: s! P3 n6 \2 B# G. b/ c
  147.   _ChangeMainText("FRAMEWIN_Create", SPEED);
    $ D. y; r+ G" N/ J, @
  148.   _hFrame = FRAMEWIN_Create("Frame window", 0, WM_CF_SHOW, 50, 75, 220, 100);(7)/ j& t4 V5 j1 E' k/ \) `
  149.   _pcbOldFrame = WM_SetCallback(_hFrame, _cbFrame);(8)& g, ]$ O/ X7 l
  150.   hChild = WM_GetClientWindow(_hFrame);(9). o, ?5 @9 d% U) `% @
  151.   WM_SetCallback(hChild, _cbChild);(10)7 h- _+ B, I' k2 c  u! E% H9 W
  152.   FRAMEWIN_SetMoveable(_hFrame, 1);(11)
    1 }7 i' g1 W3 y: r% y- w
  153.   //
    3 b2 g, W, J; X' i
  154.   // Create buttons6 w3 a/ b0 e# \
  155.   //
    - M2 e1 q8 n, `2 h' n* D
  156.   FRAMEWIN_AddCloseButton(_hFrame, FRAMEWIN_BUTTON_LEFT, 0);(12)4 T5 H' C# }) m) `) k0 R2 }2 }3 c
  157.   FRAMEWIN_AddMaxButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 0);
    3 w1 e' \: u7 D* f8 B
  158.   FRAMEWIN_AddMinButton(_hFrame, FRAMEWIN_BUTTON_RIGHT, 2);
    ; C* l1 q: m( C- I/ I
  159.   //: {& r. P' C! e1 R0 L1 x( v
  160.   // Modify frame window attributes9 O0 q! r6 s$ [3 z! U# [- f
  161.   //
    $ k$ ^; X; s* l8 G
  162.   _ChangeMainText("FRAMEWIN_SetActive", SPEED);9 w6 b: H6 ?. F0 W5 u
  163.   FRAMEWIN_SetActive(_hFrame, 1);(13)
    8 w4 E; G* t4 o* V+ f6 t& y- M  `; s
  164.   _ChangeMainText("FRAMEWIN_SetFont", SPEED);
    1 A' p3 Y2 d3 S8 s+ U4 ^: S' j! e
  165.   FRAMEWIN_SetFont(_hFrame, &GUI_Font16B_ASCII); (14)
    ) g$ E+ H, t7 ^
  166.   FRAMEWIN_SetTitleHeight(_hFrame, 20);
    % o3 j% t- Q9 d6 t+ Y( z2 N+ B
  167.   _ChangeMainText("FRAMEWIN_SetTextColor", SPEED);! C/ i/ \& _# E
  168.   FRAMEWIN_SetTextColor(_hFrame, GUI_YELLOW); (15)
    % u' a/ Q4 @2 g
  169.   _ChangeMainText("FRAMEWIN_SetTextAlign", SPEED);
    + o& \& G& o- q$ v& I" X
  170.   FRAMEWIN_SetTextAlign(_hFrame, GUI_TA_HCENTER);(16)' G  C; W# f% I6 U" m) S, E6 F
  171.   _ChangeMainText("FRAMEWIN_Minimize", SPEED);
    - ~5 ^' O- H. @; m. o
  172.   FRAMEWIN_Minimize(_hFrame);(17)/ T0 @% ?9 U4 `! ]" |' f/ y
  173.   _ChangeMainText("FRAMEWIN_Maximize", SPEED);
    " K6 l& d% U. }
  174.   FRAMEWIN_Maximize(_hFrame);  (18)
    1 R# O9 ]% c$ m9 }/ Q
  175.   _ChangeMainText("FRAMEWIN_Restore", SPEED);9 N; ~. c1 _# W' e8 W% i! H9 T# F' u! W
  176.   FRAMEWIN_Restore(_hFrame);(19); A1 j  j  e* ~# |1 T- N, j
  177.   _ChangeMainText("FRAMEWIN_SetTitleVis", SPEED);
    ! d% R% x: ~/ [# o* ?7 K2 _% x
  178.   for (i = 0; i < 5; i++) {
    / H4 S4 y+ z2 H1 X; h% I* q
  179.     FRAMEWIN_SetTitleVis(_hFrame, 0);  (20)! o8 a( O% d; i. L6 O9 d$ n
  180.     GUI_Delay(200);# M/ Z8 ]  ]; O- J7 }  d4 H
  181.     FRAMEWIN_SetTitleVis(_hFrame, 1);
    " o; @5 |; A6 a# v2 o
  182.     GUI_Delay(200);
      W- j* h! H/ H
  183.   }0 ^7 U8 K. {" f! i+ q) X6 S
  184.   //0 m/ |+ v8 V3 S8 o, ~) }
  185.   // Time to play with frame window7 G6 e+ u$ W  }4 }
  186.   //
    % l/ V: t; ]5 ?1 y! S
  187.   _LockClose = 0;
    : w6 M+ [9 c+ J! s0 [  [
  188.   for (i = 250; (i > 0) && _hFrame; i--) {. q) G; C7 v' K% l4 s! p4 r
  189.     acInfoText[0] = '0' + ((i + 9) / 100);
    1 a* B: E0 B$ h8 e( i  |
  190.     acInfoText[1] = '0' + (((i + 9) / 10) % 10);- U" J5 N; U: @, F6 a
  191.     _ChangeMainText(acInfoText, 0);; ]7 {% Q& K8 Q6 j% |
  192.     GUI_Delay(100);
    ; a4 g$ i# p- |
  193.   }
    + a' x5 ^  g4 e. x% G8 C
  194.   if (_hFrame) {7 i- h+ }; M' ~
  195.     _ChangeMainText("FRAMEWIN_Delete", SPEED);
    7 n& B8 o+ p& W7 v1 D
  196.     FRAMEWIN_Delete(_hFrame);(21)
    2 X6 X" r9 p' e; D6 a3 I3 M" z* C9 _
  197.   } else {
    9 q' O1 i# A7 w( H8 `9 D
  198.     _ChangeMainText("", 50);
      K, K6 {$ B6 e' q: W7 V
  199.   }
    ! L* Q  C- x- Z1 G/ U2 o3 O
  200. }2 V! E* c3 K2 x) B( ~9 _0 d8 N
  201.   Q9 I8 W8 G! D  u8 s! P% m' m/ L
  202. /*********************************************************************+ O" e. @# |. j( k' t
  203. *
    / \# ]+ d9 c) j2 A4 v9 H
  204. *       Public code( ^4 {1 ~) s  J/ f" M1 S4 Z8 y* ]
  205. *
    ( ^* e. ?% g* t6 r- f$ p+ F
  206. **********************************************************************
    ( Q# E. a- A, _* {: a2 @" t) }+ p3 U1 e
  207. */
    # T# J4 M- ~* I' x, j1 Q0 y
  208. /*********************************************************************
    * d6 B& d7 z* R1 t& F( w' F! |
  209. *: U8 C1 B+ r0 ^$ w( J: b
  210. *       MainTask
    " B# W- B+ N5 P; `0 W; h+ i
  211. */
    5 c% s; `) ~. w
  212. void MainTask(void) {( c/ u* Y+ V7 f3 @9 D+ m6 k
  213.   GUI_Init();
    $ Z# l1 _) y* w% g
  214.   WM_EnableMemdev(WM_HBKWIN); (22)& \% V) W# y8 i. R( w1 P. Z5 G
  215.   while(1) {+ c' A& Y: C4 R$ Q" b' U, z
  216. _DemoFramewin();
    : w1 ^% v' ^% f
  217.   }  K# U/ z6 Q4 `( p. g
  218. }
复制代码
1. 自定义的一个回调消息类型。
2. 用于给桌面窗口发送自定义的回调函数消息类型。发送后将桌面窗口变得无效,然后系统就会去执行桌面窗口回调函数中的WM_PAINT消息。
3. 框架窗口中客户窗口的回调函数。
4. 框架窗口的回调函数。
5. 桌面窗口的回调函数。
6. 框架窗口中部分API函数的演示函数。
7. 创建框架窗口。
8. 设置框架窗口的回调函数。
9. 得到框架窗口中客户端窗口句柄。
10. 设置客户端窗口的回调函数。
11. 设置框架窗口可移动。
12. 为框架窗口添加最小化,最大化和关闭按钮。
13. 激活框架窗口。
14. 设置框架窗口中标题的字体。
15. 设置框架窗口中标题的颜色。
16. 设置框架窗口中标题文本的对齐。
17. 最小化框架窗口。
18. 最大化框架窗口。
19. 恢复最小化或最大化的框架窗口。
20. 设置框架窗口的标题可见。
21. 删除框架窗口。
22. 使能桌面窗口的内存设备。
   这个例子中变量_LockClose的作用也很重要,它的主要作用就是在演示框架窗口时锁住关闭按钮,防止在演示的时候,用户点击了关闭按钮。大家也特别注意框架窗口回调函数_cbFrame的处理。
实际显示效果如下:
44.6.png
44.3 总结
    本期教程主要是跟大家讲解了框架窗口的使用,希望大家可以把本期教程中讲的这个例子跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的框架窗口API,其它的API大家都可以试试。

0 {  y) F6 k! _& }
收藏 评论3 发布时间:2015-3-3 11:57

举报

3个回答
天使♀的☆宇★翼 回答时间:2015-3-4 10:26:10
学习学习,初学者看到这个感觉比较高深,确实挺感兴趣的
wyxy163@126.com 回答时间:2015-3-4 15:09:41
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-4 15:10:14
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版