QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。. M3 b+ O7 A9 l9 Y, e* v# p
file://------------------------------------------------------------------------
. H. \2 c- W- d( k<a>file://Unit1.h</A></P>& ]" C& K6 J8 S5 A" E
<>#ifndef Unit1H: k# Z- W9 e) x7 w0 L: P
#define Unit1H$ q5 ]- z" S" f9 Y
file://------------------------------------------------------------------------& @2 V% z+ Z" g5 G3 x0 c: e
#include &lt;Classes.hpp&gt;
' U1 y* l# l* A1 p* u& F4 A# [#include &lt;Controls.hpp&gt;
% {* v* x1 e9 j: d#include &lt;StdCtrls.hpp&gt;
- H. m0 y0 V7 i: D" D#include &lt;Forms.hpp&gt;7 U: v& L) y$ c* e+ D( ~
#include &lt;ExtCtrls.hpp&gt;
$ O% `! D" K( v+ X1 b( R3 Y/ A#include &lt;Graphics.hpp&gt;" R' P5 S7 \8 w- g  |% |! |
#include &lt;Menus.hpp&gt;* [/ X! m! U3 F, B* a1 g" q
#include &lt;Dialogs.hpp&gt;: p! \" T9 N; U  j( G
#include &lt;ExtDlgs.hpp&gt;9 O5 c; l5 o! z
file://---------------------------------------------------------------------------$ \8 M: O+ O# {1 t; N
class TForm1 : public TForm) }2 k. I# y1 a
{% N) B0 q0 B4 E- @# e- a
__published:    // IDE-managed Components
6 K- N8 y6 t5 G7 F+ _        TImage *Image1;4 m2 h5 B, q2 M+ J. J
        TPopupMenu *PopupMenu1;; K; D% Y2 x8 l# D% ~0 ], E
        TMenuItem *Exit1;
, N' B" E, A/ M+ j0 g        TOpenPictureDialog *OpenPictureDialog1;
% W0 j7 K, W# f        TMenuItem *Open1;7 I3 l+ C$ j7 w* t& f1 w" l8 h
        void __fastcall Exit1Click(TObject *Sender);
6 `- _# N0 M* A; m3 z  z( R5 N, j        void __fastcall FormCreate(TObject *Sender);
+ H5 ~8 Q+ f7 L9 Y8 f" E! I6 `        void __fastcall Image1MouseDown(TObject *Sender,/ k  f0 D3 z6 B# P" y
          TMouseButton Button, TShiftState Shift, int X, int Y);
0 i" i3 H" ]/ _: J" B' o) \        void __fastcall Open1Click(TObject *Sender);
$ f! ~+ ]  o0 ~& m' b! @/ n# Qprivate:    // User declarations/ R. E5 E; K1 q
        void __fastcall BmpToRgn();! A- r, T0 t& N/ X
public:        // User declarations
' g. N5 P/ g$ w: q! p% |6 X; l% l0 ?        __fastcall TForm1(TComponent* Owner);
: ]3 Q( \/ A; W5 I% R' ~* k};9 P& Z. S! B' P, r
file://---------------------------------------------------------------------------% X) \' M* J% |) j& I
extern PACKAGE TForm1 *Form1;
: k! G0 [4 E/ j# X% Jfile://---------------------------------------------------------------------------
  j! \/ E  z5 v#endif</P>
+ f2 E+ t$ Z% y" U' ]' ?<>
6 q" e" k  Z' m6 }2 _" E& g8 ?<a>file://unit1.cpp</A>" y0 T. B5 c" o7 t- O5 X
file://---------------------------------------------------------------------------</P>  J+ y; G) M9 J) t2 _" a
<>#include &lt;vcl.h&gt;
/ w; |: `4 s* N! D#pragma hdrstop</P>; v7 p; C5 b0 F; ~( _
<>#include "Unit1.h"% X6 ?* L# |9 t# e1 k
file://---------------------------------------------------------------------------
( O9 g+ v9 K, R% `3 h#pragma package(smart_init)
( {7 G6 u, b) w4 F( U; S& ?1 \7 q#pragma resource "*.dfm"
+ ]& C8 f. g' j8 a5 \4 _1 g' M) M5 i' YTForm1 *Form1;
1 a  I$ T: U) [* W: }* D# Ofile://---------------------------------------------------------------------------
( k1 n% R* l+ I3 ~9 \6 u__fastcall TForm1::TForm1(TComponent* Owner)2 k9 @0 C+ j5 }6 E$ T6 N
        : TForm(Owner)
: a) p8 q, x+ ]{
' A( M" l7 O9 b}
$ D8 E7 P1 p6 _- b- [6 nfile://---------------------------------------------------------------------------
0 V+ |' E, X. mvoid __fastcall TForm1::Exit1Click(TObject *Sender)
9 T! F3 W9 w" A{
9 a! g; F( _0 ^# o3 o5 Z$ _, T2 I  Close();8 m% I- h* E' F4 J- V! ~) j# b
}
4 O7 S. H, Y( W: b, _) y+ Nfile://---------------------------------------------------------------------------</P>
+ J9 i4 }6 f* t, s! Y: c' {5 _: ~4 t, b<>void __fastcall TForm1::FormCreate(TObject *Sender)4 I9 m- Z/ C! u# [! j
{</P>
# _- g1 _' r. e+ n1 \1 J3 K<>BmpToRgn();. x  A) L0 a4 V" R- y
}
4 f4 i  i2 ~- C4 Z. ^2 }# vfile://---------------------------------------------------------------------------</P>
, g  b7 }7 f# [+ G9 G9 l<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,: I2 W- r; C. p- @4 K$ V2 ^
      TMouseButton Button, TShiftState Shift, int X, int Y)
9 k4 |, E( |/ W/ {5 X{
4 j' N! F, N6 C; Cif(Button == mbLeft)& }: }. I' a) ]1 a
        {
, C7 @' d" q$ W                ReleaseCapture();
# i* G5 t3 }8 u& y8 M$ g                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
3 e0 K5 P9 C# s3 K        }
5 n& e; G! B2 Y- ^$ J/ u# m}! p3 h/ I+ ~# z! u9 B# e
file://---------------------------------------------------------------------------
" Z1 m# A5 |5 Q2 B& @void __fastcall TForm1::BmpToRgn()6 J/ q& B/ ?6 M0 P/ D$ t0 l& w
{
: x# k2 [/ i. m- F# DImage1-&gt;AutoSize=true;, ?( |' A7 t" \: S3 @; H: N
Form1-&gt;AutoSize=true;6 p, T# T4 k: s% z* L
Form1-&gt;BorderStyle=bsNone;
/ v, f9 p9 f. N6 Z% k! i" J4 KTColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];3 k0 S2 K8 q- C
int x,y;- w" G3 p* i! f$ d4 L( U) s  R
int l,r;
( Q& I& \6 t6 L2 z% T, y9 A# \POINT *a;
% z* Z' v8 R" K$ m# j; obool lb,rb;- }9 j, l7 K/ C7 a+ H
HRGN WndRgn,TempRgn;</P>
9 T5 Z' y; p# q5 @<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL), U' Q9 D7 _0 J% J0 \
{
7 d9 E4 z% b  @5 W/ J  ShowMessage("申请内存失败!");/ R$ F5 D, U% h% f
  exit(0);* `, c8 H% R" l. F% q$ F7 V
}</P>
8 c: B2 s' I6 x& z' b0 z<>l=0;r=Image1-&gt;Height*2-1;5 ^) x' L; d: j, _
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>: k( J) M6 l  F" D
<>for(y=0;y&lt;Image1-&gt;Height;y++)
' E8 U  L' g' ?2 L# ?{
! K$ `0 n" {8 p, k& C  U5 U' Y/ g  lb=true;
. k% `  S) ~3 H3 U( j' A  for(x=0;x&lt;Image1-&gt;Width+1;x++)
1 b1 M9 k8 N9 ~    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
! t1 t% Z" y& B7 R- q5 v    {
& I1 w* k; b! M$ g! w      a[l].x=x;: G' o: d, e) u/ v
      a[l].y=y;
7 i: u( T" k! c      lb=false;
# X5 w0 y; z' _! P, y      break;. U) H/ o- K3 r4 m7 ^) z9 b
    }</P>0 _; d' `" B: ^: f5 e) V
<>  if(lb) a[l]=a[l-1];
9 _$ F6 d& m6 U* k3 q) m  n  l++;# g- Z4 l7 t$ X) _" Z+ {8 Z% q/ f
  rb=true;</P>! x+ r: ^& O( W2 H/ s- O
<>  for(x=Image1-&gt;Width;x&gt;=0;x--)( X3 ^' m+ K. j. W
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
7 J$ T& q) O2 t" H" Y      {
. P" N5 q7 o$ K. N# D$ ^6 ~        a[r].x=x;- i: x* t5 n. u7 U
        a[r].y=y;
/ v# z1 q/ [  Q: s: p% N3 J/ y+ k        rb=false;
' }$ D. R% F8 C        break;
3 K) J; O! U7 G4 n      }
( B+ d$ {# |1 g  if(rb) a[r]=a[r+1];$ ^* D# g* X: X! C. z
  r--;
: E  l8 ^  T# _6 s' ]1 }3 u& v}</P>
" V8 e% B+ o4 [" t8 X7 H) s<>r=Image1-&gt;Height*2-1;
' z3 p) W% {1 R$ z# D: M# z' Gfor(y=0;y&lt;Image1-&gt;Height-1;y++)
: L! ]8 O, |; o" d. w) g9 ?{9 P* I2 c, A+ u$ r& R
  for(x=a[y].x;x&lt;=a[r].x;x++)
4 D9 ?, ?! l. x- l( b" I' O5 `- H0 P    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)
/ P3 [9 O- B2 l" ]/ Y/ [    {
, W( l5 ~( l, h) X0 |" B. r$ z      TempRgn=CreateRectRgn(x,y,x+1,y+1);" M" S2 T5 a, [) }/ {" f
      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);1 ~' U, C3 i) U' s2 G+ k! r, }9 |
      DeleteObject(TempRgn);% Q5 U& l+ H0 j( x( f3 c
    }2 l  P. t" h; v9 F( e0 X2 g# v
  r--;) A- p6 v& N; J- F
}</P>; C7 f  X, O0 C7 p: ]. s9 u1 r/ D8 I
<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);( I; X4 F& Z( L4 B8 V  o5 H1 v* @
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
. c/ K; ~8 [4 {6 ~3 M; CCombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);8 o+ b) a! }- L
DeleteObject(TempRgn);
8 O$ I2 u4 T/ d$ k( |6 ^( `delete a;
# d' c! S6 b  XSetWindowRgn(Handle,WndRgn,true);
$ P5 m9 R6 j; V1 ]}</P>: D! c8 h* w6 o" V+ n8 n; W
<>void __fastcall TForm1::Open1Click(TObject *Sender)$ i. t" i4 X6 m7 |3 j! w7 T* C
{; u+ ]. p, V% ^' d5 I1 U( _$ s, n5 P
  if(OpenPictureDialog1-&gt;Execute())& N- ]2 y3 n$ N5 b
  {
0 Z2 i& }/ J+ U+ R4 e# d      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);
" {, q! W" x; t4 q' K      BmpToRgn();
- V, D! ^* e! v7 S9 @  }6 n8 J. `- h# c. p- p& U
}+ ~  A" P( R! q1 `7 C: J
file://---------------------------------------------------------------------------</P>; T' _5 l- Q0 q4 O4 Y& ]" y
<>对啦,图片的背景色要相同。5 L% a4 A* W" |5 v6 B2 f( C3 O
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
. w3 w( o& m5 S# R2 b& s. E<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------4 z- p6 t1 X+ A% b1 i8 |" K
void __fastcall TForm1::FormPaint(省略)
; W6 r& Y$ h+ j8 Z4 \, z$ M{; H: C/ K( N0 z. D1 o
    AnsiString ww;int bb;8 R- h, x+ v- Q
    ww=AnsiString(Form1-&gt;Width/256);! `' V' @2 m: \) {/ a
    TRect MyRect;
& J( h. b' s* N) V    MyRect.left=0;( o6 ~% }  s: a; T1 K' w% ~( M
    for(bb=0;bb&lt;255;bb++)! K4 K  L0 D  d1 l& @5 |* E# {! O
    {
) o2 w8 V* w8 T; ?( x! X        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);6 X% O% E' n! u8 a$ {
        MyRect.top=bb*(ww.ToInt());4 B1 }8 N0 P: H, t  y8 `8 k
        MyRect.right=Form1-&gt;Width;
3 `$ e  b3 _" {3 ~        MyRect.bottom=(bb+1)*(ww.ToInt());
: Z' p/ P( }7 q6 E8 l+ N' M) ]. b        Form1-&gt;Canvas-&gt;FillRect(MyRect);$ [  b/ [) u3 c, z8 h5 l
    }
6 m8 D8 {1 E9 w' n) @4 ]/ l} </P>
  B) b" B& y# q7 A! _. O<>file://---------------透明窗体--------------------------
) n. r& ~# G2 A5 o& yvoid __fastcall TForm1::Button1Click(TObject *Sender)
/ h4 B  d( U# C2 L8 j{
- m" l; L# j  c( ~  TRect *rctClient,*rctFrame;# o$ P' W8 D& y3 W
  HRGN hClient,hFrame;
2 S: @7 X+ K4 Y% s7 X  POINT *lpTL,*lpBR;7 W( x& l" r# g' L0 w! J
  rctFrame=new TRect;9 r( }& |- }$ G
  rctClient=new TRect;) y6 R: V& ]. n, v
  lpTL=new POINT;5 q$ b8 K4 R6 Q  W# ~2 k
  lpBR=new POINT;
+ W2 k6 i( V! t  GetWindowRect(Form1-&gt;Handle,rctFrame);
8 x+ r5 J2 X+ i$ D0 C  ::GetClientRect(Form1-&gt;Handle,rctClient);2 p1 ~9 i& t5 e+ v
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;1 }9 v+ b" Z" S1 _+ ^  o9 T' ]
  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>! s. _% \0 f- G; q
<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);
  S5 P, _" {. O6 T  ::ScreenToClient(Form1-&gt;Handle,lpBR);
9 {: C+ ]* w* \3 X8 F" h) A  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;" a* N5 H6 |# ^# I4 }, _/ b
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;9 o# S4 N' `1 Y0 N6 l! F. [7 ]
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);
) @' U; S4 X0 I# J0 E3 w7 B  rctClient-&gt;Top=abs(rctFrame-&gt;Top);
# C/ q7 K5 W9 i3 w  b3 E  rctClient-&gt;Right=rctClient-&gt;Right+
6 f, G7 j- R7 M9 Z& k$ o                  abs(rctFrame-&gt;Left);
& N6 v- `) T2 E- L/ g+ P3 u  rctClient-&gt;Bottom=rctClient-&gt;Bottom+6 r  d+ q' v& A5 M6 ]/ O: y0 K9 _
                    abs(rctFrame-&gt;Top);1 B( N6 }, M9 [' C! X6 `% ~
  rctFrame-&gt;Right=rctFrame-&gt;Right+
! L* e1 v  s9 z( q/ O" `                  abs(rctFrame-&gt;Left);+ [+ }6 J) Z# J% O  M! O
  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+1 {9 q( ^: r' o0 w+ x
                  abs(rctFrame-&gt;top);( j% K) x5 w* e& W7 g3 l3 n
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>( @: T; M% A5 d
<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,
4 b2 H% [/ D/ [3 U4 T* z                        rctClient-&gt;Right,rctClient-&gt;Bottom);/ R' h6 \9 Y. x
  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,
0 E0 M. F# s. g; }" z6 l8 W5 P                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);" H; N4 [; N7 n) n, D3 V( _: C
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);' ]3 z8 ?% a. F) A) h, G3 I& I! }
  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>
) a7 z2 c5 j' Q1 H* R<>
; W5 H; S0 t5 ^1 c6 c/ a  delete rctFrame;
2 C, Z$ f" m* _8 D/ ?; r  delete rctClient;
" F9 ]6 G; ~  O" k! Q+ P, Q  delete lpTL,lpBR;</P>+ {4 u! {3 P: i, `" W  v3 z/ T
<>} </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, 2025-8-2 06:33 , Processed in 0.362477 second(s), 52 queries .

回顶部