数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-6-23 17:31
标题: Label的使用技巧(由ilikenba收集、整理、调试通过)
1.Label控件显示多行文本
2 ^+ ?9 o4 B3 {! r  可以直接给Label的Caption属性赋给带有换行符或回车符的字符串!下面三个例子产生同样的效果:' h8 t" f1 f# |* b
  Label1->Caption="第一行\n第二行\n第三行";
. D! X) \* v, v6 f  Label1->Caption="第一行\r第二行\r第三行";0 ^7 B, m) g! }4 G5 W
  Label1->Caption="第一行\r\n第二行\r\n第三行";
/ j! M9 H8 Z7 R& s! S  但注意这样赋多行的值只在运行的时候有效,在对Label的静态设计中,直接在Caption属性中输入* {! t/ V- l# a5 l0 G3 M
  "\r","\n"是没有用的,设计系统并没有对这些特殊字符作处理!
- u& y0 N5 o1 B% e/ T2.Label控件显示超长文本时自动换行3 @8 A9 Y# @1 G* f$ m+ X2 ]
  只要对Label的两个属性进行修改。
' o% Y0 l( G3 \; S% U  第一个是AutoSize,将它设为False,然后将Label的高度和宽度进行调整,适应要显示的区域!
* |  X8 Z" [, G" T. E7 M  第二个是WordWrap,将它设为True。
# g& S% K1 {8 K4 ~' U; N- L  z1 `  注意对于英文的显示是以单词为单位的,即不能把一个单词分两行显示,即使已经到了边界了,, q+ {5 r7 K8 O. L
  这时的显示应以空格区分多个单词!
' ]4 g8 F/ a; Z, A$ w$ B; G7 c3.使Label控件上的文字纵向显示
5 R0 q3 U- J; F8 k# c  最直接的方法是改变字体的旋转度和方向!- R2 B% r4 j5 E7 G
  下面这些代码实现了旋转的功能:
, _  I! \6 [8 X3 k$ S4 K5 [  void __fastcall TForm1::Button1Click(TObject *Sender)
% D5 @- J- |9 J. ~  {5 ^* Q& Z8 {4 A& ^
    TFont *font;
$ o2 L0 ^$ F2 @: C9 L9 `    LOGFONT logfont;, k, o. m7 w' l! ]2 N4 V9 G/ J
    font=new TFont;
1 H# F- n! M0 }2 y" {% e2 p    font->Assign(Label1->Font);
1 U  O$ \9 M4 k1 v$ O! k    GetObject(font->Handle,sizeof(LOGFONT),&logfont);0 K( s: U( X; v5 ^
    logfont.lfEscapement=-900;
' R6 [* l! H2 w6 \    logfont.lfOrientation=-900;3 D+ Z% z* c) j4 O9 H9 r. t
    font->Handle=CreateFontIndirect(&logfont);
7 W+ s0 j0 v  [    Label1->Font=font;
. [  x+ n0 X! m. P/ C# E. Z    delete font;* {$ [1 r' s6 e2 f. O
    Label1-&gt;Caption="矩阵论坛<a href="http://www.matrixstudio.org" target="_blank" >www.matrixstudio.org</A>";
, K/ B/ F: F' G% L  }
' p) R( W, s# ?$ i3 i4 }/ i* r  这里要将Label的AutoSize设为False,然后将Label的高度和宽度进行调整,适应要显示的区域!
8 d  N0 `1 g9 _7 U8 F2 {  将Alignment设为taCenter。* }" t- r( `$ c1 ^( t3 B8 k$ l) J. g
  
. R7 j8 ~; c' ~8 e+ i, C3 ~$ n  还有一种纵向显示的方式,字体不用旋转,利用Label可以显示多行文本的方法,将标签要显示的8 S4 I% |7 z5 ?' d$ s8 U
  Caption字符串进行分拆,变成多行文本。在进行分拆时,注意汉字是双字节的,分拆时要将汉字
5 w! E% g9 y3 B1 v$ Z0 z3 |/ \. Z  N  识别出来,整体分拆,否则会出现乱码!
8 v7 V- M: H6 w: T( f8 @  下面的代码实现了这个功能:3 m6 n  t+ a  [$ C/ {) R
  void __fastcall TForm1::Button1Click(TObject *Sender)- _) w3 J1 o9 Q  I
  {
' g2 k8 v$ N2 x+ x6 @9 V    Label1-&gt;Caption=VString(Label1-&gt;Caption);1 f- q- p4 M! q* _; G9 V
  }
& P) i! s& A3 e! u, f; f6 O  //---------------------------------------------------------------------------, B# j5 j. {6 ?" C4 H+ U
  AnsiString __fastcall TForm1::VString(AnsiString ss)6 [+ f9 r2 o% Q7 W
  {$ v2 O) F1 k2 ~4 g$ r3 o
    AnsiString ass;& d6 Y6 X6 n, u3 z
    int ii,ll;+ v# I/ Q4 L+ }9 j9 I: g7 O  Y* o( \9 Z$ Q
    unsigned char cc;' }- z( H( ?+ j  l' _- ^2 I
    ass="";5 u4 c$ e1 E" W
    ll=ss.Length();
1 O8 u) B5 P5 a    for(ii=0;ii&lt;ll;ii++)% q4 |! H# u4 F( q5 m) a
    {4 g! L6 a, p  y( u! W
       cc=ss.c_str()[ii];
% d3 b# M2 @: t; B       if(cc&gt;0xa0)
: J$ G) p3 s7 Z+ z3 t4 w       {
9 q. k8 d# n! V7 g         ass=ass+ss.SubString(ii+1,2)+"\n";- B6 J& C4 Z" y9 p& n6 \. i
         ii++;" F: o* r( ]) u+ V% P0 w$ a
       }
) l. ~* p& O9 I' b9 i       else, U/ j& l6 s) ?; W
       {
6 P4 Z# h" y, O1 m         ass=ass+ss.SubString(ii+1,1)+"\n";
" p. a/ B- t* ?3 P9 M       }8 ?6 v; ~! O- Z: }* C- a
    }
) I/ H' @* i- v  p# Q1 Q    return ass;
& z6 h3 q7 F" r3 O  }7 g; M# e- ~& G/ Y
  这里要将Label的AutoSize设为False,然后将Label的高度和宽度进行调整,适应要显示的区域!# e/ a  b8 I4 `& J  f
4.鼠标指向Label控件时改变说明文字的颜色' a* ?2 l  H1 W# Q0 b# M
  通过Label的MouseMove事件,媒举所有控件,将名称和鼠标经过的控件相同的Label的字体颜色变成: D6 q4 R/ }- O# {; K
  红色,其他的字体颜色变成黑色!, Z( ?; a6 c% Y# Q" Y* ~
  下面的代码实现了这个功能:+ f' b  g7 M& a; l1 S* r) Q
  void __fastcall TForm1::Test(TObject *Sender)
4 \8 L8 K* F" x3 U6 Y  {5 U8 q1 R, J$ X0 Y4 y
    int i;
5 _, O9 y9 ]5 W- G    TLabel *lb;
: Q1 a* a8 g0 A+ w2 N' f8 t    AnsiString ss1,ss2;7 H+ N: H& u/ x. R
    ss1=Sender-&gt;ClassName();//获取参数的类型0 H7 Y% Y5 J" n9 `4 B
    if(ss1!="TLabel")return;//如果不是标签不处理) [* f& N$ J& G0 x! Y& `
    lb=(TLabel*)Sender;( V9 z* m# ]$ g7 N# D3 a
    ss1=lb-&gt;Name;
5 k7 F1 _! M/ T/ L. E9 X" ]# z5 C    for(i=0;i&lt;ControlCount;i++)
" P: s: |: }0 J; f    {
( k0 h$ ~+ |( b( T4 o      lb=(TLabel *)Controls;
0 M- N/ v0 B6 g9 }  {8 _3 y1 n! M      ss2=lb-&gt;Name;
. j& z# _, W9 K, j7 p      if(ss1==ss2), K/ J& s" L9 d) Y
         lb-&gt;Font-&gt;Color=clRed;" @, W2 Y* B& T9 [; k1 k
      else& L5 c( T! Y$ G
         lb-&gt;Font-&gt;Color=clBlack;
1 P8 p. X, i/ Z/ V# t3 p    }; w; ^2 y0 b0 e2 P
  }) N4 S8 j5 E2 E! k; l9 c
  //---------------------------------------------------------------------------! N: q% m. X" a1 G" K% X  {: ~
  void __fastcall TForm1:abel1MouseMove(TObject *Sender, TShiftState Shift,
' p0 P. x9 h& C/ @      int X, int Y)1 g2 |, h, W5 }/ W9 ^
  {
  b* E, c6 {, `     Test(Sender);
5 g+ ]( k( p+ g1 N% H/ @  }




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