QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。4 ]' d* P; J, y  u/ @0 `
file://------------------------------------------------------------------------
+ o9 |) }& U9 r- \<a>file://Unit1.h</A></P>
% g- ^8 x+ E1 s8 v5 l<>#ifndef Unit1H" ^% D# V. M- e
#define Unit1H
! R  w+ W, M% E) t- Z; F* xfile://------------------------------------------------------------------------
4 g. u; L7 C" K9 H#include &lt;Classes.hpp&gt;
! f% P. e" w7 a" ?#include &lt;Controls.hpp&gt;
: o. f/ W  Y  {1 Y  M" v#include &lt;StdCtrls.hpp&gt;3 I$ d3 f" k# Q* o0 v, L% W
#include &lt;Forms.hpp&gt;
) ]2 k7 w7 x# {. I+ j, q$ U  k2 @#include &lt;ExtCtrls.hpp&gt;1 p0 B6 X0 Y4 m# B0 ~8 x7 R4 D; c3 z
#include &lt;Graphics.hpp&gt;
3 |! z% O" J! J* x% v#include &lt;Menus.hpp&gt;% {  P9 n5 `- m! N) `/ {2 w% S; N
#include &lt;Dialogs.hpp&gt;
* _& p( p4 Y0 t. `: ?/ n# @#include &lt;ExtDlgs.hpp&gt;% ^% Z6 t+ m9 Y( |# j1 q
file://---------------------------------------------------------------------------
6 {4 k1 b8 n# F- M& V1 K) C0 Fclass TForm1 : public TForm
- j2 r! B. X3 H" S{
' z9 P  U7 P' ?- ___published:    // IDE-managed Components
; z6 U; \5 ~$ I. V3 p$ C. N; S        TImage *Image1;( H9 _) M2 m* X
        TPopupMenu *PopupMenu1;/ n) r' P% {7 I( z) A9 [0 v
        TMenuItem *Exit1;
2 \% O5 Q7 r' T5 z8 G% u/ [+ E        TOpenPictureDialog *OpenPictureDialog1;
& X4 O/ t& P8 J% X        TMenuItem *Open1;
2 K8 n, M5 m* p% ?. |; v3 Z        void __fastcall Exit1Click(TObject *Sender);1 Z, v; R/ @( b6 L2 C1 O5 ]
        void __fastcall FormCreate(TObject *Sender);
7 `& b& U2 k% S, v& m6 c        void __fastcall Image1MouseDown(TObject *Sender,
9 f' u0 [( s8 q' F% `          TMouseButton Button, TShiftState Shift, int X, int Y);1 m! _7 l* a4 L! K* Y
        void __fastcall Open1Click(TObject *Sender);$ w7 G% ^! s) O
private:    // User declarations
+ k! J/ K5 V+ _4 O! Z- {; {2 D        void __fastcall BmpToRgn();( y' F7 b2 i; C! L3 S/ N0 @
public:        // User declarations1 T8 r, W2 B& c- O7 c
        __fastcall TForm1(TComponent* Owner);: N6 u' E9 ?9 u+ p& k7 u
};/ z5 i8 o$ z$ r5 }; G4 E# O' ~
file://---------------------------------------------------------------------------
3 r8 \) `/ k/ m, \extern PACKAGE TForm1 *Form1;
0 u! q2 ?3 [/ rfile://---------------------------------------------------------------------------8 ]- R  g8 k# O" h. `, x
#endif</P>+ _: h( n7 `! P/ n( {1 R8 `
<>+ Y. v% _/ j) G6 U- _3 K
<a>file://unit1.cpp</A>
6 G7 _1 w1 ^4 v! B  b) e+ Mfile://---------------------------------------------------------------------------</P>0 v7 o" I* U7 @- m4 v" s" @) [
<>#include &lt;vcl.h&gt;$ w3 W/ d2 \  _+ K' p2 c4 q  Z8 Y- [
#pragma hdrstop</P>8 d1 m( U8 H2 w1 O) o
<>#include "Unit1.h"- G/ O+ M8 ~1 Q) `  J3 E2 v
file://---------------------------------------------------------------------------2 M" ?, a% z* e3 c
#pragma package(smart_init)
6 O! L1 a, Z! D1 x& A/ @: g#pragma resource "*.dfm"
3 F; C7 U( F1 I/ xTForm1 *Form1;
0 c4 W8 K) Q. v3 d; kfile://---------------------------------------------------------------------------
7 F- X( x8 Y* B+ ?; P__fastcall TForm1::TForm1(TComponent* Owner)& E( |. }5 j( n, |8 w/ U
        : TForm(Owner)% ]4 f1 Z, M1 u3 o# O
{
1 O. G* z  b. O1 m}
# F* l) M+ m% n3 F% [8 y4 |* Qfile://---------------------------------------------------------------------------
" B" X7 b, y1 U+ `# w. _9 dvoid __fastcall TForm1::Exit1Click(TObject *Sender)% A' j4 V: a2 b9 E
{0 y% s. D9 d: H& y
  Close();
3 j" f7 |* j  h" V% d. C) z}
& @/ N: X, a' R- L0 a% \* f$ T" D. nfile://---------------------------------------------------------------------------</P>
- j1 F+ V- r+ w<>void __fastcall TForm1::FormCreate(TObject *Sender)
7 i+ |! [5 q4 K3 A/ R1 {{</P># Z- N$ [6 r" i& Y% }0 r: g3 a
<>BmpToRgn();
1 G) c5 a1 R8 J* Z+ e" d4 o. k0 }}
* X% e5 y! I$ w$ n6 Mfile://---------------------------------------------------------------------------</P>3 R; a- k9 `& t  h+ {6 Y
<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,: z3 T- R! g8 h0 P# E: U; _
      TMouseButton Button, TShiftState Shift, int X, int Y)/ @0 x3 u, B' H9 A  c1 q
{, g" s3 Y  Q7 p& N
if(Button == mbLeft)# V4 F! f. x* _: o5 R  S" T9 a
        {" L4 K$ A3 V" s: n, R
                ReleaseCapture();4 t! v, R% c4 p# ^
                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);0 l' k6 k3 \+ K8 U
        }3 F0 x+ Y8 \; d" d6 v
}
( f, Q' V6 j4 @% G- t1 V5 S: Cfile://---------------------------------------------------------------------------
' I  t6 E8 }0 n+ k4 \& k3 x' ?! {2 ?void __fastcall TForm1::BmpToRgn()) a1 ~/ l( K- |* O4 D7 [1 R
{
- q/ o6 [9 S5 {" N( eImage1-&gt;AutoSize=true;
: i; Z9 K8 Z! fForm1-&gt;AutoSize=true;
. M, ?6 H4 y7 q0 OForm1-&gt;BorderStyle=bsNone;* Z  D7 t6 o7 i' ^
TColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];8 V/ y7 A& Z- o3 S
int x,y;
/ H( m2 V  c  E* rint l,r;
% n' o$ S; ?+ J( P- a& @0 y& ePOINT *a;' Z5 b5 H& D0 n3 W. ~; v
bool lb,rb;
1 O9 c/ i" `. x, m8 g2 cHRGN WndRgn,TempRgn;</P>
6 X: k! t$ D# r<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL); d2 u( \$ H. |$ `0 {
{4 P+ N2 g+ l( y1 e4 S* ^; p
  ShowMessage("申请内存失败!");
2 {# f7 l* `; _# _0 y! c/ B  exit(0);9 j$ C8 T: C4 U% g5 f+ |4 J+ i
}</P>
' N. l! Z- ~" N% q8 d3 z8 f1 W<>l=0;r=Image1-&gt;Height*2-1;
* v1 }2 o; k3 V, _# T; L8 _/ BWndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>
5 ^: P, q  A3 B2 O2 G<>for(y=0;y&lt;Image1-&gt;Height;y++)  P1 O7 @9 Q) @
{' `& J' C1 O6 y( @& [) _
  lb=true;
: v: @6 p" f7 t2 J  for(x=0;x&lt;Image1-&gt;Width+1;x++)
& {. y8 K  m! a+ l$ s3 c    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
  O+ H- t; m' i) f6 v- d. h    {5 g6 }6 H  }& t4 H; v
      a[l].x=x;1 Y& q! W* _, X" s0 g  c" q) V
      a[l].y=y;% p, i; x" g# l2 @: z+ _
      lb=false;7 X- m$ A+ i0 S* v# T$ }: Q, `  t, n
      break;
+ {5 {3 M: X, y) [* N2 ^2 H% f    }</P>
. b5 X5 M; g) H* x; n2 ]7 L/ Q& D<>  if(lb) a[l]=a[l-1];8 p9 u0 [8 K5 _. C
  l++;
$ S" V/ U9 a  r1 M* g: L- z) m  rb=true;</P>( ?) m, t4 }( e: a% N3 U3 }
<>  for(x=Image1-&gt;Width;x&gt;=0;x--)
  y  V3 V7 x. z9 @2 `    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)0 z# [; r* z, S. k) a1 ]4 H
      {! S: w( O( z1 O. y$ o* b! y" Y% f( e
        a[r].x=x;& @9 O) k0 ~0 v
        a[r].y=y;% F0 F9 _: X; f9 y, P+ }  y4 j- G
        rb=false;6 v$ T5 q/ v2 R2 X' k. N# _
        break;
; M3 Z+ }! j5 s1 P+ H      }$ o. A2 G3 m6 l3 [1 m( k
  if(rb) a[r]=a[r+1];) Q3 p" w6 k" F5 e5 f% \& W4 s
  r--;. }! V8 i( W7 C& _: `3 C  Z2 [
}</P>
+ E% L; K9 x  @) K3 t1 q<>r=Image1-&gt;Height*2-1;( r, w- V& i# P: u5 K
for(y=0;y&lt;Image1-&gt;Height-1;y++)1 }+ D. Q$ n! E) ^$ G
{2 G; i" B7 U$ U, E
  for(x=a[y].x;x&lt;=a[r].x;x++)% b, t0 P: H5 U0 `; Z: o" V
    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)6 K) Z$ N6 R2 S* w7 \8 p
    {
/ l0 R3 R! J' w  s" o1 c/ s      TempRgn=CreateRectRgn(x,y,x+1,y+1);$ Q* S/ P8 F6 G3 Z% M  o2 E
      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
( z2 D, i7 S- ?( K      DeleteObject(TempRgn);4 y4 I/ p1 o+ i; P. v" F1 O% Y
    }% ^! j3 H: l: T3 B
  r--;$ X! g) c/ j  j% u9 h
}</P>
% p, Q1 _- z7 B" c<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);; ~$ x* v/ A: n4 x9 Z% x9 G% l
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);- Z3 z( B0 E7 R& Y, `5 u
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);) [7 L% A$ {5 N  {' Z. s
DeleteObject(TempRgn);
1 C; q/ S6 _2 y1 l" }delete a;
( A# l  q/ ]9 K4 YSetWindowRgn(Handle,WndRgn,true);
2 i* w5 Z( \$ V& |}</P>
% L/ C) v6 r% K# A7 ^  n: l+ C- b, ~<>void __fastcall TForm1::Open1Click(TObject *Sender)
8 l% p' L, S3 O- a3 u{/ u0 d0 Q2 I( F+ p- v8 D' T
  if(OpenPictureDialog1-&gt;Execute())7 U) L) L3 R; O- Z8 c! \: t, w
  {
9 V9 C0 O% c; }7 M      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);
" ^3 M0 r8 X; u" T- O$ B      BmpToRgn();
0 f5 W* b9 z- J' ^+ n  }
1 \: C+ W- x, j& c& q" D+ K$ N4 |}
+ ]& p( z5 f( i0 E0 H( cfile://---------------------------------------------------------------------------</P>
; P* m5 `1 \6 d! k* L<>对啦,图片的背景色要相同。
$ w9 W- M, t4 B& t, t- K; b1 y1 o图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>  u! y% r& X+ y! g; v$ P
<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------2 S: v! ~* l( L) ^3 z
void __fastcall TForm1::FormPaint(省略)( L* W, C* G0 l, l0 R
{
1 \# \. E# c: D# D  k' x    AnsiString ww;int bb;; w$ }+ b; D1 v- P1 a9 C; T& v
    ww=AnsiString(Form1-&gt;Width/256);
* k6 Q# W$ r8 A    TRect MyRect;) A0 i  @2 J  I; |8 O
    MyRect.left=0;& T. i6 j# e  t4 X) s! T
    for(bb=0;bb&lt;255;bb++)7 \, T9 l: v( C, [9 ]1 H
    {6 v# `9 C7 s" O
        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);
# Y$ d0 W; W# t7 T5 Z" Q+ g0 v4 `        MyRect.top=bb*(ww.ToInt());
. B' ^  I5 v' t        MyRect.right=Form1-&gt;Width;0 _" N' n) {9 d8 j1 d* F
        MyRect.bottom=(bb+1)*(ww.ToInt());5 W( Q. k5 `- k; @
        Form1-&gt;Canvas-&gt;FillRect(MyRect);
: \/ x0 W) r7 C& T1 ^) ?& }3 e    }
3 ?. _- y& r; R6 R0 d; X} </P>
8 j3 ?( V- a& t<>file://---------------透明窗体--------------------------
# r- |" e$ E1 W# s& G4 Zvoid __fastcall TForm1::Button1Click(TObject *Sender)7 D. q% D6 v1 |, i' C% {- T
{8 _: ~; W% D! O4 j5 ~
  TRect *rctClient,*rctFrame;
& f/ \- ?; V% {% ]0 }5 R  HRGN hClient,hFrame;' C* i+ u  ~( }
  POINT *lpTL,*lpBR;$ }* l5 R4 @' @/ l  d
  rctFrame=new TRect;
( b0 Q& p6 F$ k  F) Q( L+ \/ D  rctClient=new TRect;
' I7 H- X, T3 C  `2 c3 f( G! `! F  lpTL=new POINT;" i* ]% x, \8 ~: p3 k" V! m
  lpBR=new POINT;
5 A6 h& y- {. S. k* Q9 ?8 d  GetWindowRect(Form1-&gt;Handle,rctFrame);
0 m7 |, @& s8 l: x5 l4 n  ::GetClientRect(Form1-&gt;Handle,rctClient);
6 O2 h" K, |) {8 Y' c  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
* I) n' X: L$ l8 c  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
" F- \5 T* R' k0 i* ]# S3 D3 j<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);
5 z- K' V$ s  H& G  ::ScreenToClient(Form1-&gt;Handle,lpBR);
: K  _" n8 {& @" r; i: D, {* i  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;3 M& c( A# A% Y. D% F
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;
+ q  o& Z4 z7 f! F  rctClient-&gt;Left=abs(rctFrame-&gt;Left);
. `* N2 r  h8 M+ J. M, ~" X" }5 y' w  rctClient-&gt;Top=abs(rctFrame-&gt;Top);
- i- T9 w1 |7 k4 l  rctClient-&gt;Right=rctClient-&gt;Right+: b( _1 G6 a9 d) p6 C5 |( [
                  abs(rctFrame-&gt;Left);
$ ~; s$ g" a! C' w( p) _8 C. s  rctClient-&gt;Bottom=rctClient-&gt;Bottom+/ X! M3 H+ B5 }" _7 u4 z
                    abs(rctFrame-&gt;Top);
8 i+ n2 V5 J6 B+ z9 r* H, ]  rctFrame-&gt;Right=rctFrame-&gt;Right+2 ^' K1 |8 K$ N2 c) g
                  abs(rctFrame-&gt;Left);
6 I" c; f5 S1 A- s6 z  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+8 @" E& M2 G, H6 q. r! G
                  abs(rctFrame-&gt;top);
1 K2 L5 A8 `, L7 P* I- s) y0 i' P; F  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>
$ g# {! s. z" x+ a, d) D8 S. q- r8 [<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,
7 L: P9 h1 A9 }8 E                        rctClient-&gt;Right,rctClient-&gt;Bottom);3 \! o7 i" L2 T$ W7 ~; k& ]
  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,
1 c) C! \, m4 g9 A$ z" V                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);
0 g3 y1 ~, e7 N5 o  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
) u6 P3 {+ h8 D! o7 p  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>; i8 `  O6 Q7 M) i/ F
<>
2 E- `) h( V' t6 ?  W- x0 C5 o& E  delete rctFrame;' }  }' u- q% E% @9 ~
  delete rctClient;
6 S0 w- ~4 B7 M* }/ r  A  delete lpTL,lpBR;</P>
' }  n. ?  Z7 o: ^1 H+ h<>} </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-8-9 12:53 , Processed in 0.343042 second(s), 52 queries .

回顶部