QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。# z7 A8 G, K. U& r, i; r4 F
file://------------------------------------------------------------------------
% z( _1 R' m; Y" d( D4 [: K, D<a>file://Unit1.h</A></P>; M* M( j  D  I( Q
<>#ifndef Unit1H
0 U1 G4 [$ W. i! i" ]$ i- l# C#define Unit1H
, h3 L' O1 J9 nfile://------------------------------------------------------------------------9 p0 k1 ]" B0 E  h
#include &lt;Classes.hpp&gt;% v: L8 G6 u3 p' }# N3 T
#include &lt;Controls.hpp&gt;6 y' ]4 M: w4 D) {
#include &lt;StdCtrls.hpp&gt;3 z5 s) d* g* @" R& I. q  h; s* y: F
#include &lt;Forms.hpp&gt;# d" z& I  c0 E: [' s( R8 h; f% c
#include &lt;ExtCtrls.hpp&gt;
) O( T* `, O- \8 c2 `7 K- H#include &lt;Graphics.hpp&gt;6 e) G5 |+ x' S. r1 w! K! V* h
#include &lt;Menus.hpp&gt;- ]7 ~  ~2 d& L: [  a% J% l! H
#include &lt;Dialogs.hpp&gt;" r# _! Y; r8 B, W- v% L
#include &lt;ExtDlgs.hpp&gt;
  C* N0 _: o% k& H" cfile://---------------------------------------------------------------------------
% I& Q4 t; b2 K% K* Vclass TForm1 : public TForm
. ?! c  l4 u& V" U: q6 Y1 m8 G{
* s" N/ C5 O7 P- x5 J__published:    // IDE-managed Components6 s% j) M9 g- J  t& [( D  s" v4 z
        TImage *Image1;
" M7 R9 o3 F2 T  g- H        TPopupMenu *PopupMenu1;/ Z9 A( Z! g" U& y: y. h  F
        TMenuItem *Exit1;
( h: T+ {1 g& N0 h) j1 q" Y        TOpenPictureDialog *OpenPictureDialog1;1 V5 @3 F2 ]! z7 ?0 w, G: L/ G
        TMenuItem *Open1;
/ Z' }: w) J* J        void __fastcall Exit1Click(TObject *Sender);
; }( s8 c7 [( R) N3 @, Y        void __fastcall FormCreate(TObject *Sender);1 P+ Y( `) u' x; O" f, U4 ?
        void __fastcall Image1MouseDown(TObject *Sender,0 u3 J3 d$ C: j
          TMouseButton Button, TShiftState Shift, int X, int Y);
9 K/ X  b2 d% e6 t; i0 _! d9 D- D% b* d        void __fastcall Open1Click(TObject *Sender);
0 ~2 ^- q# S" {: e9 Yprivate:    // User declarations, h1 x! ]. }# c+ r
        void __fastcall BmpToRgn();0 J3 V5 N- b" W
public:        // User declarations! T8 j% q6 {* f" P4 ]
        __fastcall TForm1(TComponent* Owner);# t) L  ^6 P+ h8 Z2 B  l
};
& l: J- k/ ]) s+ o+ g, ^file://---------------------------------------------------------------------------( R- O& F; g7 M, N) l* @% j) {
extern PACKAGE TForm1 *Form1;
: Y+ o' U: Z+ X- C  W- N3 A# lfile://---------------------------------------------------------------------------( i# R' R4 p3 e2 ^( T
#endif</P>- w" P7 l" p% m
<>& k, b( a/ w3 j. u, y. [& }% e
<a>file://unit1.cpp</A>
6 v$ q& f$ h# P. H, pfile://---------------------------------------------------------------------------</P>
# K6 @, Q' r3 I2 F- n<>#include &lt;vcl.h&gt;6 d' D+ m* t) u* U- }# D4 {
#pragma hdrstop</P>
9 N- f$ t/ e( Z& m' k<>#include "Unit1.h"! i! J9 X, F# O3 [% Y0 S+ b' b7 _4 Y7 b
file://---------------------------------------------------------------------------
1 m2 U9 X- p2 E$ U#pragma package(smart_init)
( ], \) m4 N& a, f( E# n#pragma resource "*.dfm"; k- o$ m) p3 K) z
TForm1 *Form1;- y' I, F7 v2 K4 ]
file://---------------------------------------------------------------------------
) e, C3 h: E7 T$ @/ A* K+ B1 l__fastcall TForm1::TForm1(TComponent* Owner)
& b4 E* o" [7 S2 u; p        : TForm(Owner)8 f& h1 `: ]+ n6 _  [" _
{% G0 o' Q2 C$ U+ I5 e  m, [7 S
}! j- r! c( J0 a2 ^
file://---------------------------------------------------------------------------
, E& P3 T! I! m. c- ^# Vvoid __fastcall TForm1::Exit1Click(TObject *Sender)5 |/ S  V" e" Y: l: q8 J  W
{
' M4 t* L( H* r+ q6 |  Close();
/ D6 c* |5 S3 j& U3 F8 k}* s2 s- A1 d/ a# n; T$ g+ m1 g$ z
file://---------------------------------------------------------------------------</P>
3 o) ?% J4 Y( f8 P! R( }<>void __fastcall TForm1::FormCreate(TObject *Sender)$ k- c" }7 |* B- o% i, u- }
{</P>  ~; F6 A; K% o. p* p! H" D
<>BmpToRgn();
0 L7 S, L+ Z4 m# _( T}
- ]) a0 Z! X7 o# tfile://---------------------------------------------------------------------------</P>
8 ^5 O% a: K, V0 Y1 w5 ]* p<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,% ]: S/ b5 k4 x2 F
      TMouseButton Button, TShiftState Shift, int X, int Y)* L' Y4 e: N' l
{
9 Y* B' h3 d/ o2 Qif(Button == mbLeft)
  G! q, b  I% K7 V5 w        {
$ B* x3 Y: ^$ n! u5 V3 [+ e; J& s                ReleaseCapture();  X/ k. M! c) |* `* g/ E1 X
                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
) y! p' c# d: {( _. ?( q        }
( K3 P( R0 z% Y; N1 P" W}/ P& k; i/ A4 s( x
file://---------------------------------------------------------------------------
3 H! ~4 m( R6 g( L9 S7 \void __fastcall TForm1::BmpToRgn()
' O/ F& j' F8 V2 j5 ~{( ]( k) S0 v/ M8 r# I7 [2 j
Image1-&gt;AutoSize=true;
6 A- j, `0 R  RForm1-&gt;AutoSize=true;
% o7 w. S2 ?$ d! g7 m1 k5 LForm1-&gt;BorderStyle=bsNone;
- y2 T% ^+ V# Z+ GTColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];8 P$ y5 Z4 m1 Z/ `: y1 c% G
int x,y;7 p8 h5 |1 C. Z# b8 B$ b0 E
int l,r;
, T7 g) V, `5 t1 B& @. d: TPOINT *a;' G( f- ?& j2 D. z6 ?. o
bool lb,rb;
% w2 K$ r6 b9 gHRGN WndRgn,TempRgn;</P>
7 q$ c( L+ r: V+ m<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
( Q* R" j& v' z9 _' v{
# C6 m: j7 d2 K  u  ShowMessage("申请内存失败!");; u8 ?9 u, ^2 \, m- l( R
  exit(0);
1 R/ k" }* X3 i% N: B% o}</P>
$ l- S, _6 Q! R; [# V<>l=0;r=Image1-&gt;Height*2-1;
1 z2 g, A6 J* t+ p- z* OWndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>% M# z8 u. s- L3 W/ t
<>for(y=0;y&lt;Image1-&gt;Height;y++)  O) L# b/ N1 J4 G* c
{
7 e- T- m) f6 ^1 |) v  lb=true;- _: I9 {; V3 g, O+ i
  for(x=0;x&lt;Image1-&gt;Width+1;x++)
! Z0 l- s9 u0 I- w! z3 Y    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
- n( l4 \3 v1 j4 u4 Q. |! ]    {/ n, q9 E  u5 {  ^
      a[l].x=x;* M3 X1 W/ v; `  n
      a[l].y=y;
+ O0 a* u. B- L% h8 B1 r& z      lb=false;
! H$ M6 w0 u) ^6 f$ a      break;
9 q. M0 f  F8 V    }</P>$ a/ _9 D0 O1 ?9 R+ j1 r. d
<>  if(lb) a[l]=a[l-1];
* C$ y& ?# e4 f5 Z: {+ O( r  l++;$ Y3 J3 u0 C3 g( K
  rb=true;</P>3 ~: ?$ X1 n% Z  m6 \! l; s
<>  for(x=Image1-&gt;Width;x&gt;=0;x--). f6 l$ \: v' K2 W/ e
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
( b2 O' A% n9 ?, W7 p1 e      {+ M& {1 |6 p2 n/ e. {5 f# M
        a[r].x=x;
0 }4 K/ ?- W8 B        a[r].y=y;  L9 y% G- ?& {$ `  g& m
        rb=false;
7 l' F2 Z& I. c7 c        break;- @+ ?) h( i# A% k' c, d" u
      }# |  m6 z1 O0 M( t
  if(rb) a[r]=a[r+1];+ |' D7 b$ ]. y/ b& z
  r--;; j7 e9 M! _- o1 W& E* H
}</P>6 x3 B' W1 {9 m" Q- P& ^4 n1 v
<>r=Image1-&gt;Height*2-1;) L1 n) [9 C" Z5 w& o
for(y=0;y&lt;Image1-&gt;Height-1;y++); P& @- a% o- y$ ?( }4 Q
{/ l4 Z: q$ }% d) G& I
  for(x=a[y].x;x&lt;=a[r].x;x++)
) x$ l/ S" P$ j; E    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey). `& Y& t% C6 U1 s! c- C
    {
# K9 a; v1 ^- E3 k; N. N+ @- D# W1 b  {      TempRgn=CreateRectRgn(x,y,x+1,y+1);
, X- {  `0 A6 V/ H9 d. I( E, {      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
) ]8 m9 |+ D5 l, P( ]      DeleteObject(TempRgn);8 U) }; \6 L" Y4 p& e/ Z; c. S
    }
* _9 \. l7 Q6 `& G2 c0 {  r--;, w4 i) ^" p& s6 m" |/ b* h
}</P>
( R; D  }8 j* S4 m8 X, a  q1 c- V<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);/ Z) t1 V: D1 K# A3 f5 a1 n  V
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);! Z" Z; Z  N/ w' g2 W
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);) J* c! q0 Y0 @* p8 n
DeleteObject(TempRgn);
3 C0 M/ W" F: A: ^" |delete a;0 a$ C( k6 K% {/ |4 Z  R) c
SetWindowRgn(Handle,WndRgn,true);
  q) Q9 k. o. S' a: a" {}</P>" n+ z% N8 K1 k' q+ _9 Q; K3 C
<>void __fastcall TForm1::Open1Click(TObject *Sender)  R8 q9 `+ p. l7 i
{
0 L" O$ O: `' {7 R" i! ~7 h8 r  if(OpenPictureDialog1-&gt;Execute())! m' z: f; m3 ?5 u. E
  {6 r+ K2 R  ~, t9 |) @3 [
      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);+ o9 u9 G; I# [& g  x; @
      BmpToRgn();
0 ~- t9 ~" O" F' W& f  }, j. O! Z0 X  L
}
3 \/ X6 v6 E* K& X1 cfile://---------------------------------------------------------------------------</P>
- i, B* ^  b9 C1 a6 h8 t2 {<>对啦,图片的背景色要相同。' P) P  ?$ o* ?/ V
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
7 c9 [5 S) a/ m4 w. z/ O: _0 W<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------9 L2 l2 g+ L( j. L  `7 U" l
void __fastcall TForm1::FormPaint(省略)
1 r9 n, `2 z' ?; b9 m# K7 x  R6 |{! V2 U. n) m+ g0 m9 B& F
    AnsiString ww;int bb;0 e2 M  Y; {+ a) I7 o# U& p
    ww=AnsiString(Form1-&gt;Width/256);3 @9 Q7 O7 }8 A* O# g  x
    TRect MyRect;8 @1 B! z3 I3 o* a. r2 x$ V( U
    MyRect.left=0;8 S2 `( T. _" ^4 g# P( D
    for(bb=0;bb&lt;255;bb++)- F6 p* z/ R6 k
    {3 D8 i. A1 y/ Y) q
        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);" K6 w9 u& C5 r
        MyRect.top=bb*(ww.ToInt());/ D% ]$ D4 U, Z9 p( B
        MyRect.right=Form1-&gt;Width;& x1 U  K: I4 l0 A  Q
        MyRect.bottom=(bb+1)*(ww.ToInt());
4 {8 \6 o! n: z% b; h( ]5 t* q: O        Form1-&gt;Canvas-&gt;FillRect(MyRect);( `' O' [# g! R6 m
    }, D: L* C3 t0 U) u3 `
} </P>
9 S# Z( F# B3 Z+ z; ~- j. b<>file://---------------透明窗体--------------------------
2 X2 m* K+ P$ g! A8 n" M9 jvoid __fastcall TForm1::Button1Click(TObject *Sender)1 p/ M" m. l$ w/ p4 V$ y# n
{: @" j: M- r2 J* |6 u# y
  TRect *rctClient,*rctFrame;
0 ?4 o0 d( \+ C3 i! b  HRGN hClient,hFrame;
. _5 o( X# Y% F$ i0 }  POINT *lpTL,*lpBR;6 K: S# ^0 O( g6 w4 }+ x
  rctFrame=new TRect;3 v/ a/ d+ d  O. V& M9 K! _) e
  rctClient=new TRect;+ C2 J( E/ E: Q
  lpTL=new POINT;, b7 {! D. ^6 u
  lpBR=new POINT;& w8 q+ D% a+ ]- u) G7 X5 s
  GetWindowRect(Form1-&gt;Handle,rctFrame);
1 `& ^" p2 Q( W  ::GetClientRect(Form1-&gt;Handle,rctClient);
2 ^6 q/ N% f* H/ G8 V/ m$ C  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;9 _7 O; s% p$ C, z: \- g5 L
  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
/ |6 D  u) r. |4 q+ J! j<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);* \% s" w: B' \( E' j$ L9 g! G- B
  ::ScreenToClient(Form1-&gt;Handle,lpBR);
0 i+ T- ~$ r! A+ b: A  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;# Y$ d- r5 R3 h
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;$ J& I! H9 \+ |% O8 M% B
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);* k, r# P4 l5 @! k& @
  rctClient-&gt;Top=abs(rctFrame-&gt;Top);" V* t' d; T) Q4 o  ]
  rctClient-&gt;Right=rctClient-&gt;Right+& M/ M% ^5 t& ?# ]& s% p* e
                  abs(rctFrame-&gt;Left);
" b4 u3 q: p4 q  rctClient-&gt;Bottom=rctClient-&gt;Bottom+$ o  y& ?2 b7 L6 ]5 E( `
                    abs(rctFrame-&gt;Top);
& H* N6 R& w# `9 m2 w, u6 E  rctFrame-&gt;Right=rctFrame-&gt;Right+5 Q! F, }" z' [/ Q! v+ y
                  abs(rctFrame-&gt;Left);
; O. R: v7 p: [6 c" W  i8 `' B4 |  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+) r6 y! n2 s- g$ f; B8 S; U
                  abs(rctFrame-&gt;top);: H1 k& u+ z  ?" I* G8 j
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>
; `8 w; o2 `+ F% `<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,% e* @8 x6 ~9 a; Z. L9 w5 k
                        rctClient-&gt;Right,rctClient-&gt;Bottom);
+ A$ J2 Z4 y) _9 ]! ~9 z5 e# L  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,
7 Z) |2 n) x! J; m) Y0 K2 J                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);" Y% q/ k; C- f. o0 z
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);; _# A3 ?4 U. }6 L% m) l3 v3 o
  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>
+ b" h% C4 A6 x9 _5 A8 E+ c' M$ {<>
' J2 @' H% z7 {  delete rctFrame;
& ?) d, W; S3 X5 n- w" n  delete rctClient;
* V% r+ c& ?5 L9 l/ J  n  delete lpTL,lpBR;</P>
6 k. Z4 n) a# u: Y( u& d$ ^5 l, 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-10-18 09:08 , Processed in 0.430711 second(s), 52 queries .

回顶部