数学建模社区-数学中国

标题: Label的使用技巧(由ilikenba收集、整理、调试通过) [打印本页]

作者: ilikenba    时间: 2004-6-23 17:31
标题: Label的使用技巧(由ilikenba收集、整理、调试通过)
1.Label控件显示多行文本! S. Z/ f9 T4 J' L2 }$ d" F1 v
  可以直接给Label的Caption属性赋给带有换行符或回车符的字符串!下面三个例子产生同样的效果:5 Z7 W$ [7 ]5 e/ o# X# [
  Label1->Caption="第一行\n第二行\n第三行";
/ L3 x6 Q0 B( h5 H' ?  Label1->Caption="第一行\r第二行\r第三行";# K0 s5 f8 C. O7 j* k, N7 n7 y& M
  Label1->Caption="第一行\r\n第二行\r\n第三行";0 Q+ c0 j4 R' o4 T+ C  U9 j' n
  但注意这样赋多行的值只在运行的时候有效,在对Label的静态设计中,直接在Caption属性中输入5 B: Q8 u( O, b- s+ x
  "\r","\n"是没有用的,设计系统并没有对这些特殊字符作处理!
3 o- u8 P4 u! G. N& ~2.Label控件显示超长文本时自动换行- W1 O! Q' H! J" C/ \
  只要对Label的两个属性进行修改。8 X, |! n, l% t
  第一个是AutoSize,将它设为False,然后将Label的高度和宽度进行调整,适应要显示的区域!! m/ i/ q2 T& J/ L
  第二个是WordWrap,将它设为True。
. a4 g5 E( C2 H3 s  注意对于英文的显示是以单词为单位的,即不能把一个单词分两行显示,即使已经到了边界了,- X% @. N. Y. q# f  O
  这时的显示应以空格区分多个单词!  S: @' B$ c. R; _1 E
3.使Label控件上的文字纵向显示/ }% G9 ]' S2 g7 i% Y. n$ m
  最直接的方法是改变字体的旋转度和方向!2 B& i7 E( H4 w( D: O+ Y! q
  下面这些代码实现了旋转的功能:- O2 C/ Y2 y" Q. w
  void __fastcall TForm1::Button1Click(TObject *Sender)$ H7 K/ b7 N  I( [1 |. g4 \
  {
8 o7 ]+ [% P2 @) ^$ J, ^% i8 e    TFont *font;( b( ]% z8 ^# Y  J' W
    LOGFONT logfont;
4 t2 G. R0 l& c6 r    font=new TFont;4 Z, F7 J4 o2 o& H
    font->Assign(Label1->Font);
& Z2 e& [7 _- N& z# Q, m3 b    GetObject(font->Handle,sizeof(LOGFONT),&logfont);0 M3 A/ t1 k' h( a
    logfont.lfEscapement=-900;
8 j! a9 D3 P- O. r6 I4 T    logfont.lfOrientation=-900;
3 v3 T7 O  e9 C& K    font->Handle=CreateFontIndirect(&logfont);- v/ f/ i" g4 @5 N: m; r
    Label1->Font=font;
$ D5 O8 G' O1 H7 G! W; x    delete font;6 r8 d3 R4 s+ s/ Z$ q. X( j2 r
    Label1-&gt;Caption="矩阵论坛<a href="http://www.matrixstudio.org" target="_blank" >www.matrixstudio.org</A>";1 {% E& H$ K" J
  }, t' X9 `' |9 M, @
  这里要将Label的AutoSize设为False,然后将Label的高度和宽度进行调整,适应要显示的区域!
/ h% L5 }. {6 k. y+ O  将Alignment设为taCenter。
% j, B7 X8 x) L/ L5 d/ M% F  , S- ]' r4 H- E  l8 s' D
  还有一种纵向显示的方式,字体不用旋转,利用Label可以显示多行文本的方法,将标签要显示的: r" z( H5 J) T/ F
  Caption字符串进行分拆,变成多行文本。在进行分拆时,注意汉字是双字节的,分拆时要将汉字
  F( B- i  x* U+ s& T  识别出来,整体分拆,否则会出现乱码!
; D' v7 W7 b! X$ `9 T  下面的代码实现了这个功能:: }7 s/ A7 K/ E0 l: K8 W5 T) }
  void __fastcall TForm1::Button1Click(TObject *Sender)! g* _4 y) ^* L% [- U
  {! C3 l5 J( \* C' y, s- M# C& B" b: I0 @
    Label1-&gt;Caption=VString(Label1-&gt;Caption);
& g& D- ?9 z7 Q8 w" |# ]/ x  }
8 k; t4 ~% t2 Z7 Z( e% x' F3 S  //---------------------------------------------------------------------------
4 k( \4 X/ x( [5 Y* E  AnsiString __fastcall TForm1::VString(AnsiString ss)
0 x0 a1 B8 ]( Z: w. U  {* @$ a9 Q- ^* k% |0 M
    AnsiString ass;
' R' i, }1 G6 N# ]( f% ^5 h1 l    int ii,ll;. i6 h" y9 V, f; `/ d4 Y9 J
    unsigned char cc;" ]  r, {6 ^% r
    ass="";
3 z" e9 A9 r, C! ?) G    ll=ss.Length();% o% f* j$ S9 H3 M* t" I
    for(ii=0;ii&lt;ll;ii++)  h5 u5 k: B+ v) n( [+ V+ t
    {# T/ S7 z' _0 M" A- F5 h1 {8 A" B
       cc=ss.c_str()[ii];: _/ _' ^9 A9 w& U' g; p
       if(cc&gt;0xa0)
) O9 \- ?9 [" S' U       {
) d6 Y  q/ U# G3 D) Y* _         ass=ass+ss.SubString(ii+1,2)+"\n";
, v6 i! T  g# P% P) v/ w. C+ z) p         ii++;4 V' Y( g* p4 {* }
       }' I3 T: R  T, Y5 Z3 ]. f9 J
       else4 b7 f; j3 Z% F* j/ y, R: a) X- C; v
       {
- x5 x2 N8 ^- x3 H         ass=ass+ss.SubString(ii+1,1)+"\n";+ G: w0 {, G; A! c3 K
       }
; j- v' U* |1 |$ @" M$ i0 W5 [    }3 k7 N+ f# D- {# }2 n3 j
    return ass;
* v" L$ a0 e! P& _& i& T+ {: t  }8 _% l: B$ k+ H# j/ N3 n. ~  ^) |# M
  这里要将Label的AutoSize设为False,然后将Label的高度和宽度进行调整,适应要显示的区域!+ O/ f1 K& n1 _7 |7 ^; N3 n- ~
4.鼠标指向Label控件时改变说明文字的颜色; C* T! {1 z4 n" }3 x' d
  通过Label的MouseMove事件,媒举所有控件,将名称和鼠标经过的控件相同的Label的字体颜色变成2 [/ [% ?1 x% |1 c4 U) G8 J" l
  红色,其他的字体颜色变成黑色!
! T$ U6 k$ P2 P& L6 c) `  下面的代码实现了这个功能:+ R, [% s. H5 \1 g! @! A+ u/ T; T
  void __fastcall TForm1::Test(TObject *Sender)3 i# @6 o0 w) u$ }- u( j, e
  {0 c+ P3 w' l' D! ^
    int i;& h( W3 s7 X# u6 J8 Q+ R$ Q
    TLabel *lb;2 P) s: G; t0 K! ]1 A/ }/ `
    AnsiString ss1,ss2;
; h5 w( ?* ?: q! H/ t( Z% n    ss1=Sender-&gt;ClassName();//获取参数的类型
* h5 v0 a' B" K1 \, s    if(ss1!="TLabel")return;//如果不是标签不处理$ e! o" N6 y8 E. d. K, D; I/ r
    lb=(TLabel*)Sender;
" Z/ |/ E  I: I1 s    ss1=lb-&gt;Name;
- @6 v/ R! Z2 O* S    for(i=0;i&lt;ControlCount;i++)# g/ v! G: w( W0 ~& I
    {
1 I2 z) X9 f3 a& P      lb=(TLabel *)Controls;' x7 v- j+ Y( _) ^9 E
      ss2=lb-&gt;Name;6 c  ], K! q, t  ^3 I6 G- e2 D  A
      if(ss1==ss2)9 R: `  K9 B" U7 q2 \! B
         lb-&gt;Font-&gt;Color=clRed;: B: G" x0 @4 h
      else5 R1 o1 n5 S* x: e: m" D
         lb-&gt;Font-&gt;Color=clBlack;' D. t1 k/ V! K4 _" K' V
    }# u8 F5 w$ P: C5 d. u
  }
- ~' v+ C+ N7 J: u( w' Y  //---------------------------------------------------------------------------! h! k, ]* f/ D7 M1 t
  void __fastcall TForm1:abel1MouseMove(TObject *Sender, TShiftState Shift,( \) d6 E3 `. f9 {* z+ `/ Z- R5 f
      int X, int Y)( \# }9 I: Y& b* b
  {, c) b5 |# z/ y3 U: P
     Test(Sender);9 d: J; f( v% ~1 j
  }




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5