QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3597|回复: 0
打印 上一主题 下一主题

C++BUILDER中创建不规则窗体

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。
. c9 W. R7 e; _file://------------------------------------------------------------------------3 K3 C- Y% H7 c: D
<a>file://Unit1.h</A></P>
8 t' u6 a0 N- D( c<>#ifndef Unit1H
1 O! |) F. O6 L* ]3 C8 O6 R#define Unit1H
1 |3 ?  |' T' bfile://------------------------------------------------------------------------
* }* U. m9 J; |4 X: {6 M0 A! Z#include &lt;Classes.hpp&gt;
: L: {* Q' b* U- v0 s, ]0 |: t#include &lt;Controls.hpp&gt;
3 p) }2 x0 {7 K: X* y* G6 k. k; E#include &lt;StdCtrls.hpp&gt;
! D, _- r8 P8 y: B% C#include &lt;Forms.hpp&gt;+ H2 `+ H3 @9 j/ c
#include &lt;ExtCtrls.hpp&gt;
* k2 I3 S8 e+ n6 p. `2 l#include &lt;Graphics.hpp&gt;/ W  r# Y% ?( M, w# \7 v* U
#include &lt;Menus.hpp&gt;5 a0 u- L6 y( V: ]8 K  U- |
#include &lt;Dialogs.hpp&gt;5 r* N+ k. ]/ |( R( i! u
#include &lt;ExtDlgs.hpp&gt;
6 j0 H1 p6 z* @9 A8 ofile://---------------------------------------------------------------------------; P0 z7 ~" K. f5 B; y; v4 W. s
class TForm1 : public TForm
8 O, m6 ]" P+ D/ U{
& l4 ]* ~$ \* T. m% d& p__published:    // IDE-managed Components6 y- _5 M& @( P, A9 `4 o
        TImage *Image1;
0 x- V& o" s, p5 m+ W& `        TPopupMenu *PopupMenu1;
6 x" s6 e8 s8 N+ Q" n" ?% L        TMenuItem *Exit1;4 e. |' B8 N. N! X8 R* W0 [
        TOpenPictureDialog *OpenPictureDialog1;  Y7 B3 K0 v& }; }4 H9 N
        TMenuItem *Open1;4 _  @+ r8 n8 L) C9 h' g
        void __fastcall Exit1Click(TObject *Sender);; c9 y& c+ j+ ]5 _9 V/ b# ]0 Z- m
        void __fastcall FormCreate(TObject *Sender);. w0 ]7 R3 @+ n
        void __fastcall Image1MouseDown(TObject *Sender,
" \7 j+ D% d( n4 O' }          TMouseButton Button, TShiftState Shift, int X, int Y);
7 r9 e7 \5 E* {        void __fastcall Open1Click(TObject *Sender);' Q  E. M4 a! D! D, D4 O6 H# G
private:    // User declarations
+ l: \/ C* T0 C# d/ j        void __fastcall BmpToRgn();
- U/ B/ i& E1 H9 _4 E5 rpublic:        // User declarations
9 J. C$ ?% s/ g5 Q% s1 r3 }9 X, U$ V        __fastcall TForm1(TComponent* Owner);6 k$ w& s4 M4 [7 N6 n
};6 \( I) O' F) `
file://---------------------------------------------------------------------------
# Z, T/ x9 E# \3 ~* Eextern PACKAGE TForm1 *Form1;* }7 c7 u  U) }. T. j) o0 Y( @6 S
file://---------------------------------------------------------------------------, [9 B- |) I: r5 ?$ y
#endif</P>
& o+ i0 m& r. C6 o% [<>
* p+ N6 q* j+ x4 p" F<a>file://unit1.cpp</A>& D) b, R5 L+ V2 ?5 a
file://---------------------------------------------------------------------------</P>
' w0 K, G  ^( \% d  x! e<>#include &lt;vcl.h&gt;
  f- K& {: f  I1 T" g#pragma hdrstop</P>2 h, S# o7 I9 x' [
<>#include "Unit1.h"
8 K$ y3 P: e% L( f( ]1 K) N9 rfile://---------------------------------------------------------------------------" g3 e) T4 s& f, L! O9 x& C
#pragma package(smart_init)% }, w, l# u4 I, q# @
#pragma resource "*.dfm"
0 u% V$ d; @) B4 O" e& Z4 I: STForm1 *Form1;
; E- r5 [: p- B, T$ N. P% [- Efile://---------------------------------------------------------------------------
8 Y- K% `6 d* U__fastcall TForm1::TForm1(TComponent* Owner): T! M5 K6 ?0 V+ ^* n- J' z+ z5 T* s8 J
        : TForm(Owner)
3 |  a$ k& F6 p. i4 G' L+ z{9 b# v" I0 Q9 {. t, ~6 @! q
}
$ Z4 U7 S/ m% efile://---------------------------------------------------------------------------- U5 D6 W5 }: L. h" V
void __fastcall TForm1::Exit1Click(TObject *Sender)8 `2 S3 [6 I; M! }& T5 J7 M1 V
{
5 y- G- y1 @! v+ d6 A9 E4 R1 \; k  Close();$ {  U  p1 o& {2 \
}
- F) R& J. Z1 d0 R! ?2 _8 L$ w; sfile://---------------------------------------------------------------------------</P>8 D4 S. k' M7 c2 K# H
<>void __fastcall TForm1::FormCreate(TObject *Sender)) s7 j; ^4 J4 }. a# R  ]
{</P>
# I. X& f; a* H2 ~& [# q<>BmpToRgn();
  @' H* D3 ?/ A6 ?}& h  ?* U$ L1 {$ M; H( M
file://---------------------------------------------------------------------------</P>8 N5 C- p* e( s% A" \* G3 ]
<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,0 W: [+ W2 |1 q" q. O
      TMouseButton Button, TShiftState Shift, int X, int Y)
+ f7 N& |& }1 g# f8 |& u2 w! ?{
% k/ Z! i& F% X; |& uif(Button == mbLeft)- q4 ^7 I% d0 r: F
        {2 O# E) |  k7 j1 d) t' r+ F
                ReleaseCapture();+ U* o" x( H" P" d
                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);  \& n3 g! U+ T9 i; w
        }& N( t8 H7 Z+ A* n! A% v/ H% T
}) Y/ W5 c2 ^- }5 a
file://---------------------------------------------------------------------------
/ p0 L6 P: p4 ?. X/ P5 tvoid __fastcall TForm1::BmpToRgn()5 G% b1 u+ D0 [
{
# \5 }* `% f) Q% h# B- P6 I* q% mImage1-&gt;AutoSize=true;
5 s5 E" Q0 T+ u& u/ iForm1-&gt;AutoSize=true;
: T* b& V) s7 g1 Y: ^Form1-&gt;BorderStyle=bsNone;
5 F, h9 q" e: n: V% yTColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];
9 M0 i' Z" p# C) \int x,y;: Q2 w% O; D# `) k
int l,r;
; H! m" @3 Y: ?POINT *a;9 p, u- G- j: n4 U4 }
bool lb,rb;* J1 G. x' f& q( Y. b1 m7 h
HRGN WndRgn,TempRgn;</P>
- o6 r8 F8 W- C& M6 u3 r; J& y<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)1 B- ^, U. I" C: k3 R
{- H+ G3 y2 R3 K( y) m8 j
  ShowMessage("申请内存失败!");
4 j% q9 d2 @  c" L8 Y  exit(0);/ l6 c0 e8 L  T% h
}</P>
' K' F$ W# c6 L% f+ `' q<>l=0;r=Image1-&gt;Height*2-1;* j- N1 f+ }7 S; R$ ?* F
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>
8 I  s4 i7 }0 E, L: ~<>for(y=0;y&lt;Image1-&gt;Height;y++)
, s/ h; E; R1 |, U. b{
3 L/ }+ Q& T7 o3 s  lb=true;
) B: @6 ]0 s& M8 Z1 T- d  for(x=0;x&lt;Image1-&gt;Width+1;x++), W. I0 w0 c2 }
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)3 B2 A; Q' L* B, x2 f4 ]7 b
    {% Q% R% ~( R! Q2 r, q6 O8 C0 t  [- L
      a[l].x=x;
1 T2 o( o: O5 Y" J7 T4 s      a[l].y=y;6 ~9 ~& }' z7 |
      lb=false;( N! }# V! C/ p7 z
      break;
8 y4 A& n  @0 a2 V- o- h' [    }</P>3 ?4 C, t, j& u. T; \" _9 |
<>  if(lb) a[l]=a[l-1];- I  ]( O# N+ T- A0 J0 r- V
  l++;) V0 N3 O* _' j
  rb=true;</P>7 _6 ^4 @2 B. j4 c
<>  for(x=Image1-&gt;Width;x&gt;=0;x--)
7 U  \. _" w  y2 v1 H  v: H! H. r$ k    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)7 q2 K' n+ J; e( g1 z3 }, S& X8 E
      {1 k) N8 G5 P+ |5 P  W# U; }
        a[r].x=x;3 l" P, m/ P  U, f) B3 |+ {& [
        a[r].y=y;8 J: j2 q) H8 r6 G! c
        rb=false;
; e$ r3 C) A9 v' f        break;
: B  @. U( R  u; v      }: R1 _; \1 F+ b& ~! M6 l! M
  if(rb) a[r]=a[r+1];7 ]% e6 N# Q6 E* T
  r--;7 F7 l7 B! [( v4 H. m3 X& z4 [
}</P>
( E2 v3 L2 v2 @0 ^! q<>r=Image1-&gt;Height*2-1;5 X* a! S1 S) l# i/ T$ J5 ^
for(y=0;y&lt;Image1-&gt;Height-1;y++)( X1 z1 M! U+ g* U  D/ z2 t. i
{
0 L( V2 p+ a/ U7 _  b& Y+ c  for(x=a[y].x;x&lt;=a[r].x;x++)- g& h: n' y; ]# ^- m- X- z
    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)7 w  j& ]2 Z" C2 |$ |
    {2 C( l; H8 [% B( B& z
      TempRgn=CreateRectRgn(x,y,x+1,y+1);
% t4 v6 N( q3 A# R      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);3 z; m% h) `8 `8 m, S
      DeleteObject(TempRgn);: p. i  W5 w# L: o! R3 j
    }
$ R. e  U6 X8 ?, O; I  r--;
+ O! n% z2 s& S/ D  E5 c}</P>9 t; I( Y6 p2 b; T" q
<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);; [0 m& g0 u3 ~$ O0 d
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
8 T+ n3 d/ l, @9 ICombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);/ c) S( @& A! Q& p1 y
DeleteObject(TempRgn);' b) ~, L2 d* q# G5 c: q: e
delete a;* @' y! `2 R1 p0 Y( ~( y! f
SetWindowRgn(Handle,WndRgn,true);3 U9 R/ \( }6 V" T7 E2 q
}</P>% z4 r, D! Y+ O  \7 x
<>void __fastcall TForm1::Open1Click(TObject *Sender)9 {8 y- ~/ ]" U3 K2 c8 ]0 f9 i: a
{: j4 g' P; V' X
  if(OpenPictureDialog1-&gt;Execute())
- R7 V) Y* q6 F# G% b+ g  {
* W3 Q" F8 |+ B      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);3 v$ r  ]6 m! J
      BmpToRgn();& l5 u( V! O! S9 h9 `
  }; ^+ t0 |; D/ U9 Q( Y9 W* U( H( h; e
}
& D: t5 i4 R% m# Y. t+ Wfile://---------------------------------------------------------------------------</P>2 v0 z* z/ `& C
<>对啦,图片的背景色要相同。
% V* h, ], U# d4 ~& N8 A图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>2 E7 H+ j4 y2 n
<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------  T- z; @- X  \2 v
void __fastcall TForm1::FormPaint(省略)
: c9 \* U( F) l7 ?- ^! `$ a; n+ T{1 M+ D( N  M+ N0 c% x( N
    AnsiString ww;int bb;
' o  ~' i$ M( E7 Z7 s# S7 B* y    ww=AnsiString(Form1-&gt;Width/256);
& M8 g4 V+ W+ u$ Y2 I    TRect MyRect;
4 s8 t* t+ K! I7 N2 r! B    MyRect.left=0;/ D% _1 l  O5 F' ~/ D
    for(bb=0;bb&lt;255;bb++)
0 c4 y8 U2 w' A3 g. ]5 B8 ~3 E    {
9 d! u: B, @) n8 e: A        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);
. H% O- Q; s- O" v7 p6 \0 I% `        MyRect.top=bb*(ww.ToInt());
2 F8 e. u4 l8 f1 k/ h0 \( w& T        MyRect.right=Form1-&gt;Width;4 }9 Y7 {& G; ^6 z% A# Y
        MyRect.bottom=(bb+1)*(ww.ToInt());0 \" Q- e, `  l4 [  r
        Form1-&gt;Canvas-&gt;FillRect(MyRect);
% |) o2 N* Z. s    }3 ?( j- w* C4 u
} </P>
+ N. _7 U& G& N* Y& t2 K<>file://---------------透明窗体--------------------------
9 k3 s) M3 X" V* w+ Z! Jvoid __fastcall TForm1::Button1Click(TObject *Sender)
2 C( A* T9 {  Y, k% m( t{
5 h, ?' A0 k. z4 q! s  TRect *rctClient,*rctFrame;: k3 t$ E" Y/ N
  HRGN hClient,hFrame;
* _+ g0 ?; q+ s+ e% f$ q  POINT *lpTL,*lpBR;
; L$ z: B2 ~3 F( d2 r/ P% f  rctFrame=new TRect;
  l- [# y- `( T1 H: g$ Q4 [  rctClient=new TRect;( l; S/ Q7 r0 v. f$ m$ w/ m
  lpTL=new POINT;6 d- l2 m; E6 `9 ~. F( U7 E: b
  lpBR=new POINT;
. {' S! |" U# ]& T  GetWindowRect(Form1-&gt;Handle,rctFrame);
4 s) C4 ?0 j: s7 p  ::GetClientRect(Form1-&gt;Handle,rctClient);- k+ N! q2 R+ }1 M# r: H9 }
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;3 g8 C2 s8 W' h: T6 r. m* {0 m
  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
9 {8 r2 |6 X, e9 Z* M<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);
: G, K9 M, \* W1 F% D  ::ScreenToClient(Form1-&gt;Handle,lpBR);
1 M# x: O- B& Q- J. g, S: Z  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;
" ?5 p7 B* U: c; a0 P  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;
/ _* L1 N, R8 u9 W  rctClient-&gt;Left=abs(rctFrame-&gt;Left);
: `8 A8 O. \. P/ P7 ?  rctClient-&gt;Top=abs(rctFrame-&gt;Top);5 f. l! W7 s( C" d- h# G! M
  rctClient-&gt;Right=rctClient-&gt;Right+
: w, F9 i4 ?- A# z                  abs(rctFrame-&gt;Left);" j1 A: g# |! d. @2 h2 Y+ Z
  rctClient-&gt;Bottom=rctClient-&gt;Bottom+. i/ r2 W8 j$ ]. N7 u  M
                    abs(rctFrame-&gt;Top);2 r, l" M: p" j8 y9 P
  rctFrame-&gt;Right=rctFrame-&gt;Right+
( Y& J8 _0 f2 E# f5 T                  abs(rctFrame-&gt;Left);! s9 [9 M: m) B( O. ~7 B. l$ A  f0 s
  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+9 W, L; ~: X) k- O' n0 r) ^' k
                  abs(rctFrame-&gt;top);
$ }5 z3 @" M( C  g! h7 a9 Q7 Z  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>
8 N+ T- \2 n( U- n7 F<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,- z; Q0 w: X3 F6 x
                        rctClient-&gt;Right,rctClient-&gt;Bottom);
3 x& I" _; E) W+ i2 Y  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,' P* [5 v1 W; f- I9 b! X8 f; b
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);( i: U" \! D0 c, C
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
( l7 l; g, Z0 j) M2 J/ g2 t2 `  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>
9 k  p2 L9 x+ R2 F; R<>
+ K1 s# |4 S7 Z* s  delete rctFrame;
1 @; @& ^2 F0 ]- O) v+ Z" @. R  delete rctClient;* S$ a& ^; T/ `% {8 w, v
  delete lpTL,lpBR;</P>& p9 |' R% \* v( E6 `& K
<>} </P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-14 13:01 , Processed in 0.600541 second(s), 52 queries .

回顶部