QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。
8 X& b# P) W+ A) i5 I' Efile://------------------------------------------------------------------------. }. `# ^7 J$ P$ ]
<a>file://Unit1.h</A></P>$ V$ F! D5 ?& ]
<>#ifndef Unit1H# w% F* E' N2 b3 {) a7 x
#define Unit1H
, r3 p/ i  n, Z% R9 F2 _* tfile://------------------------------------------------------------------------8 G" V/ V% v. Y% A* o& q& G0 g
#include &lt;Classes.hpp&gt;3 s3 t, [4 g' c2 X& ^* y9 C5 m
#include &lt;Controls.hpp&gt;( m1 z+ S, R9 X1 {* f$ l9 n
#include &lt;StdCtrls.hpp&gt;
) p0 m' i, m5 \2 Q# g0 x2 i#include &lt;Forms.hpp&gt;
0 ~; t; V# ^$ O$ G# m+ v#include &lt;ExtCtrls.hpp&gt;& L) ~2 `' y+ b0 E& j
#include &lt;Graphics.hpp&gt;
3 [- N8 m" o1 L9 M+ X/ M0 N#include &lt;Menus.hpp&gt;
% A2 _1 a' X* {, d7 A2 \+ b& w- a#include &lt;Dialogs.hpp&gt;$ ?3 n& E' w6 j6 M
#include &lt;ExtDlgs.hpp&gt;
( M& e' ?; L, k4 nfile://---------------------------------------------------------------------------7 h1 l, r/ R% k! P6 f
class TForm1 : public TForm8 l# |0 J  ]/ K! E) [( b
{+ W8 T  P9 H: |; U! H
__published:    // IDE-managed Components
  ?, d0 g, Q) N0 |2 P8 s        TImage *Image1;3 X/ J; q9 Q7 S9 R! x+ V) T6 j( ^
        TPopupMenu *PopupMenu1;
' M& A( e7 h2 U$ G8 b$ t  O        TMenuItem *Exit1;
. A  ]) X# r2 {' f7 `' N        TOpenPictureDialog *OpenPictureDialog1;5 s) @# Z5 D' X2 H
        TMenuItem *Open1;2 H# J  ?. p# U( H/ N! p) H8 \
        void __fastcall Exit1Click(TObject *Sender);
) f$ z1 _7 i. Q# l: c( m        void __fastcall FormCreate(TObject *Sender);6 w6 Z& X* |( t# `3 h
        void __fastcall Image1MouseDown(TObject *Sender,
! p+ p: _' b+ S3 h) @6 y5 T          TMouseButton Button, TShiftState Shift, int X, int Y);# P- \0 K5 T9 @4 A' G
        void __fastcall Open1Click(TObject *Sender);
2 `- a& J) k# h- G5 [( N7 a% ~private:    // User declarations
9 X# ^* S9 b, V6 S5 P4 |        void __fastcall BmpToRgn();
2 [/ H9 u, v' i& s/ Ppublic:        // User declarations' L4 W! B2 _3 O( O  q2 W- C& b" j
        __fastcall TForm1(TComponent* Owner);
* I8 K& F' Y8 N; o2 I2 I};
0 `' W% m- Q7 o: y  z/ |file://---------------------------------------------------------------------------
7 V+ k$ }9 [; u4 J2 T3 x# Wextern PACKAGE TForm1 *Form1;3 b2 U2 P$ C3 Z* |6 q% K
file://---------------------------------------------------------------------------
' J8 R$ i$ g+ S6 g+ G5 R1 D#endif</P>
, K9 P4 o; i+ o/ M/ x/ o. E0 |<>
5 b- I7 {/ E2 ^7 N) W! Y<a>file://unit1.cpp</A>% m' `" j7 C1 ]: ]
file://---------------------------------------------------------------------------</P>
) |# P% Q" u4 ~( _# T. J6 s<>#include &lt;vcl.h&gt;
7 ?" p4 e& k  O9 I9 @: j2 m#pragma hdrstop</P>
. g2 |0 U7 f# c) C1 @- J7 B<>#include "Unit1.h"
1 @8 e7 {3 [7 |5 ufile://---------------------------------------------------------------------------
* e6 o+ U3 `7 V1 u#pragma package(smart_init)
5 a% J7 E& e: J$ J& a* \' V#pragma resource "*.dfm"# Q& `% ~0 n, F0 j0 D) @1 G
TForm1 *Form1;) H9 u; b5 }& T% e9 N2 p$ G, S
file://---------------------------------------------------------------------------
! h3 E/ T, B5 j: Z: Z__fastcall TForm1::TForm1(TComponent* Owner)
1 F- ?, M6 |5 N, r        : TForm(Owner)
% G- E# S  `. c, X{; o1 c) t+ ]0 r- V, }4 b
}1 e, O" J' W; Z  L" ?
file://---------------------------------------------------------------------------3 y, C" x( q# [
void __fastcall TForm1::Exit1Click(TObject *Sender)4 i% p. c/ c  x, F. B: `
{' e! e" y( A; V9 p
  Close();5 q! h7 |5 ?( E4 O" g- a
}/ h/ c1 A) |% D- u$ p( a
file://---------------------------------------------------------------------------</P>
" \7 m! |$ K" E( N3 `3 R. j<>void __fastcall TForm1::FormCreate(TObject *Sender)$ R3 f, n1 f+ n
{</P>+ l% O. ^% U8 @5 k; l
<>BmpToRgn();& p9 n" `6 a& |: ~% J6 V
}
3 U* U' H- j6 E) W1 Bfile://---------------------------------------------------------------------------</P>
% A4 o/ H7 F% x) j<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,: I8 z2 L- B( l% N# ^
      TMouseButton Button, TShiftState Shift, int X, int Y)
3 o' W7 {. ?4 a1 p1 r6 Q0 r{
9 Y' H) y( @8 E* bif(Button == mbLeft), p% R3 [( z, E% @1 @" r
        {9 C: e8 d+ N8 m- Q; F2 h3 j: F1 G5 q/ q
                ReleaseCapture();
# @( O2 b6 T* p                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);" i0 N& `: F& M0 N* g
        }- D* g6 G* T/ i1 V) D7 p
}
3 Q/ Z* C3 _) L- Pfile://---------------------------------------------------------------------------
. g  l& q( e8 G0 ^; avoid __fastcall TForm1::BmpToRgn()
- |8 q2 A% J& W) n7 }{
7 [, @8 R2 i# w/ E" Z- H; H7 fImage1-&gt;AutoSize=true;: B; W3 r4 x0 Q2 C* n2 R* T
Form1-&gt;AutoSize=true;
3 P+ l. _6 X5 X+ ?! mForm1-&gt;BorderStyle=bsNone;& I/ M2 P1 I7 Z' A: i2 T3 W; K, M
TColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];, P) k$ P" x3 F: @* V( H& N; j
int x,y;
2 h. q; T1 \& G4 V" F' B8 rint l,r;( k- `! N4 g' \3 i+ y
POINT *a;, D: r! M4 i# O3 Y+ |0 j
bool lb,rb;
0 A. l  x6 g! z! ?+ vHRGN WndRgn,TempRgn;</P>3 [5 k+ [/ g1 V
<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
0 f) g, N; i! T% R{4 k4 C5 o3 r" s& r) t1 l' p$ {
  ShowMessage("申请内存失败!");
8 f0 y# c& X/ T0 H  exit(0);
# z2 n9 I: q9 [! [( p}</P>
) u. F9 T# o. s<>l=0;r=Image1-&gt;Height*2-1;
- E3 z; |' u& W' B+ h1 |7 b( YWndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>7 n% H; Y4 j$ R; k& |4 ^
<>for(y=0;y&lt;Image1-&gt;Height;y++)2 }, T# p$ A5 d+ e. i
{1 L4 i  U- W% {6 B5 i# X3 b
  lb=true;, x! O! C; V! z# F) y% Y
  for(x=0;x&lt;Image1-&gt;Width+1;x++)3 P# n, ?8 r* p# I4 d( W& e
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
! g: r1 D+ C3 u, e9 z$ S5 v0 W    {8 x. r5 V( f2 w+ S& M  h
      a[l].x=x;. J9 s& ~$ W, v* L2 b; ?0 Y2 [
      a[l].y=y;# d/ _) a8 M* U" Y' ?7 m
      lb=false;( n( f/ E5 S! _/ A& L, w8 T  ~' D* x
      break;
  D# ?& I) \' L    }</P>
9 w2 o8 V3 N. A# y5 S<>  if(lb) a[l]=a[l-1];
- ?! T  O# t( V  l++;
9 e  }/ `3 n+ ?$ L. q1 a5 {  rb=true;</P>2 r( C, p& w- r7 G) y
<>  for(x=Image1-&gt;Width;x&gt;=0;x--)' j, F: A$ q8 S" b6 O
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)/ v4 c4 v+ O1 ~9 I
      {5 K* u  a! L. Y% ^# y5 G" e2 W* i
        a[r].x=x;
8 S, R  m: x+ B* \; V, A        a[r].y=y;. b9 v+ j$ @7 i9 \  B% w: @& Y7 n
        rb=false;8 e, R9 Q8 K: q" n+ r
        break;
& B% r6 U3 i+ r# V+ n0 D' N! n      }3 \, O- B0 G  C" ?, F. w2 N9 t, Q
  if(rb) a[r]=a[r+1];# S4 ?( z: d/ X8 P+ @
  r--;# N: _* r- g/ u- q* D& L, s3 X
}</P>1 M& \  e: A- e5 C. Z/ M$ r/ K
<>r=Image1-&gt;Height*2-1;* [) j3 n+ R! b
for(y=0;y&lt;Image1-&gt;Height-1;y++)
+ M' N0 o% ^$ M{
& \+ L7 H. u+ _9 G/ B- v% q. T  for(x=a[y].x;x&lt;=a[r].x;x++)  J* _# `9 I/ ]7 l: c" }8 A+ c0 h: j
    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey): G( z, w5 Y& Z5 P% O* w
    {
) v9 J( q' ~, {3 \3 `+ Z% Q& Z  h      TempRgn=CreateRectRgn(x,y,x+1,y+1);
: e( R  w0 t/ K5 k% i9 }      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);- G5 L3 G6 _7 F! }5 y& ~
      DeleteObject(TempRgn);/ M- Y  E" m/ w9 t3 U7 d& U0 L( n7 m
    }5 O, E8 p# \/ P+ Z
  r--;
" K/ Q5 d  f$ y) x2 t, X}</P>
* M8 l6 o# B, k& |<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);" A. q; |: D' Z2 \! w0 e% x
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
) u! h9 D  ?3 l  x- FCombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);% s$ b. \, \/ ^2 s8 W2 K% o
DeleteObject(TempRgn);% E2 i" v2 e/ C* B, q4 i
delete a;9 \: V6 [" ~  U' B) t3 N& B
SetWindowRgn(Handle,WndRgn,true);
0 P) Y/ }- I$ |9 G6 q- c}</P>
  K1 O7 R( X+ u, }/ F4 O5 L' s<>void __fastcall TForm1::Open1Click(TObject *Sender)5 v( }4 m) l, t
{
9 q! `9 g, {7 f4 ^  if(OpenPictureDialog1-&gt;Execute())
. v; D$ O) D! G% _  {
, k9 X. w( b2 z      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);+ Q9 y6 Y5 i' T0 y! t; A
      BmpToRgn();* z6 ~% [3 F0 D8 ~% L: {
  }
. ^% g2 V+ h9 k/ w4 }2 j/ N" r}
; w4 I5 n- V/ l3 r* r6 Wfile://---------------------------------------------------------------------------</P>/ L: m+ Z. L; v6 m
<>对啦,图片的背景色要相同。
% f0 G+ L' q8 I图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>' z/ C8 N$ g! U4 Z7 [2 r4 O$ y& j* z
<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------
6 L) }: h  O; N+ R/ `void __fastcall TForm1::FormPaint(省略)
9 J9 U0 q$ F7 h) {# X2 |/ Z{3 }/ b' j4 F3 q4 o" X
    AnsiString ww;int bb;/ m- m% P) _, y" ]- L  ]; {% v* N
    ww=AnsiString(Form1-&gt;Width/256);; {8 L3 x( h. _9 W) R+ U3 K* J
    TRect MyRect;! e* P- r8 \0 T2 N3 o7 z8 R0 p
    MyRect.left=0;# h+ N. B2 t( `- M0 I
    for(bb=0;bb&lt;255;bb++)
5 f$ V. J: d- K+ D/ E4 |6 `    {
1 |, C( }# U& v4 p0 R1 r6 [: ?        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);: O$ C0 L0 S' L7 d7 X7 e$ R& g
        MyRect.top=bb*(ww.ToInt());2 a9 i- Y) ?5 y+ A  q2 U
        MyRect.right=Form1-&gt;Width;
+ H; D* I' [5 o- R: h! @5 u        MyRect.bottom=(bb+1)*(ww.ToInt());
% ^3 u1 P( K! O: x) }) Z        Form1-&gt;Canvas-&gt;FillRect(MyRect);2 E; ?; ^2 [% i2 }7 P5 Y8 K* Q$ {
    }9 k; Z$ [& u1 S3 [" N' o9 e1 w
} </P>
- U! z1 d1 a* B8 c<>file://---------------透明窗体--------------------------) [, i; e6 G9 L0 O
void __fastcall TForm1::Button1Click(TObject *Sender)1 e4 }1 r7 t( g# U$ t5 m  E
{/ m( O" F: i$ ]$ e
  TRect *rctClient,*rctFrame;
. F$ Y, Y  [  Q( {' \. M  HRGN hClient,hFrame;
  A2 M" W8 V, Z4 j  POINT *lpTL,*lpBR;9 U0 {' w" W% W5 R( P) g
  rctFrame=new TRect;1 }5 T$ {) J4 f& C( d
  rctClient=new TRect;, F- P1 T  q: v' l" R$ F
  lpTL=new POINT;
2 z# r. r; {6 l  lpBR=new POINT;
- j+ F* T& J# T6 e# p+ C- S3 O  GetWindowRect(Form1-&gt;Handle,rctFrame);
5 n4 U9 z" c! Q( h  ::GetClientRect(Form1-&gt;Handle,rctClient);
% [1 U2 l# [4 Q) ?  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;' n; @3 X/ ^. l
  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>$ d0 Y, l$ g8 o$ B, m; ~
<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);2 u; O6 B( f/ w) c3 k+ W9 p
  ::ScreenToClient(Form1-&gt;Handle,lpBR);
6 E% w3 K$ ^4 p  _  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;2 u# [8 s( [/ G  r9 X) e, z7 z1 O+ f
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;; R( [* i! X" w3 G2 R
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);
' D& l+ g4 j' V( ]  rctClient-&gt;Top=abs(rctFrame-&gt;Top);5 @: V" h5 Z$ z" ?. ?$ J# m: J
  rctClient-&gt;Right=rctClient-&gt;Right+5 w0 ^  _' A- H& b* _1 I* y: [6 e
                  abs(rctFrame-&gt;Left);
' T6 W5 `7 ?2 K4 y9 @0 Q; e3 X  rctClient-&gt;Bottom=rctClient-&gt;Bottom+" I) H- `  R5 n/ _
                    abs(rctFrame-&gt;Top);
1 n1 i( Z/ p" j5 H7 ~  rctFrame-&gt;Right=rctFrame-&gt;Right+% B1 D8 t3 V/ ]1 G, m. ?/ N' C6 K
                  abs(rctFrame-&gt;Left);3 r1 n- `6 f/ w! ~
  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+
. w+ Y9 T1 q+ B6 e# _+ ^5 y                  abs(rctFrame-&gt;top);
9 U) s( ^! K) v- L" F% e  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>
4 w3 f9 r1 e' i% F2 ^2 e0 D6 D<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,
1 I4 S" z3 l9 L. N" y' D. O% h                        rctClient-&gt;Right,rctClient-&gt;Bottom);
) P) i/ J# H3 ~! d5 E  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,# a: h6 D' S; O  h
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);
% K3 z+ R6 y9 _& A  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
7 O& \' M3 Q! `/ m  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>8 c+ P2 E2 n. I3 `, q: m" O
<>
4 y- t  t* M6 t  delete rctFrame;
" D* l0 p, d5 d: b* t8 G  delete rctClient;6 C4 H& @1 @' o8 P7 s
  delete lpTL,lpBR;</P>/ l4 A4 d' c  t0 h9 N) Q* M0 N
<>} </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-7-17 22:02 , Processed in 0.440003 second(s), 52 queries .

回顶部