QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。
% ]. p2 {4 k7 d0 d; P, G: Rfile://------------------------------------------------------------------------7 t, f$ J. R, _; {0 B
<a>file://Unit1.h</A></P>7 P' M. M( @' |8 {
<>#ifndef Unit1H
/ Y( t$ z4 J  W#define Unit1H
/ _% g- S* L  D. ~* h( |file://------------------------------------------------------------------------
; n1 k1 q% m4 [7 s: L#include &lt;Classes.hpp&gt;" |/ r% C6 \0 I8 c$ i
#include &lt;Controls.hpp&gt;
5 b% E, O! B! j2 e! K#include &lt;StdCtrls.hpp&gt;0 d* A9 ~& Z3 Y0 E8 y1 N! ?
#include &lt;Forms.hpp&gt;; b! z4 m! R) l. z& E: d; a
#include &lt;ExtCtrls.hpp&gt;) t' ?3 M9 S6 g8 }9 K5 Y; {
#include &lt;Graphics.hpp&gt;6 F: y$ r7 ^' \1 I  T1 }
#include &lt;Menus.hpp&gt;0 k/ b) c( v+ @# |: W+ h
#include &lt;Dialogs.hpp&gt;
; R. [7 n2 M! n$ |% Z#include &lt;ExtDlgs.hpp&gt;. K1 z. j7 _) A( B4 S! X
file://---------------------------------------------------------------------------1 @0 J8 ~# h+ |: [; P
class TForm1 : public TForm
: _' [8 a" N" u- |* s7 S* o1 W{0 o8 `4 U0 s3 `: z" @
__published:    // IDE-managed Components' V6 b9 Y( A3 K6 A
        TImage *Image1;& L. t" n5 ?- l2 e% H5 v
        TPopupMenu *PopupMenu1;) q( f+ r0 u/ b/ M# D$ h# C
        TMenuItem *Exit1;* a( |9 K& V* U1 N
        TOpenPictureDialog *OpenPictureDialog1;
4 [' q, B* u, c: I; ?1 D        TMenuItem *Open1;- J7 y8 p. b; \! `/ P/ u' x
        void __fastcall Exit1Click(TObject *Sender);
8 e; [" R  I. `' {        void __fastcall FormCreate(TObject *Sender);
9 @/ }. T8 C* f& ]# d        void __fastcall Image1MouseDown(TObject *Sender,
5 Z2 b, X2 t6 K4 e! v7 h4 w4 r* J          TMouseButton Button, TShiftState Shift, int X, int Y);, s( B$ s5 v4 n
        void __fastcall Open1Click(TObject *Sender);
2 [( ~* K( n; d+ T; o% m; cprivate:    // User declarations, Y9 o+ o! t0 _& w, B
        void __fastcall BmpToRgn();/ Q7 R( `4 L! s- F' G4 A
public:        // User declarations* e) C% D7 F, `  M- H, |- n
        __fastcall TForm1(TComponent* Owner);) W; v( t& L8 k% h6 e
};
. l- k4 i( f- E! c+ Wfile://---------------------------------------------------------------------------
  c0 Y0 T! U0 x3 e/ N; Q' J2 s$ F% Nextern PACKAGE TForm1 *Form1;! L5 x) F/ h( Q* b7 q, R$ a3 O
file://---------------------------------------------------------------------------0 Y" |: U+ ~% z2 K/ s0 J& i) R, s
#endif</P>
# N: v! S: I0 d, f6 B3 g1 l<>6 B9 Z( Z$ F9 |& L9 q7 I
<a>file://unit1.cpp</A>
- K- }7 ^& ^2 S$ x! \4 o. @file://---------------------------------------------------------------------------</P>9 \: x+ d( ~+ ^# ?, }
<>#include &lt;vcl.h&gt;. G9 L5 q6 p  `; H* A
#pragma hdrstop</P>( F5 P& G$ i, U6 {+ j
<>#include "Unit1.h"
' A2 d. W  P9 q5 Q# y  k  w9 ~& vfile://---------------------------------------------------------------------------; E  F5 U# `/ C7 Z- K' Z# S
#pragma package(smart_init)
. t& I# {3 n& w" L% r1 ]#pragma resource "*.dfm"
. q$ M# h$ g$ z2 I! g& _TForm1 *Form1;
( f$ H) p6 G4 j  Qfile://---------------------------------------------------------------------------
( Q% p: \: z) k& L4 l( ___fastcall TForm1::TForm1(TComponent* Owner)% v) ~: H" t* a1 f3 R4 s$ N
        : TForm(Owner)$ `# E- l4 z( A2 e" {) u0 O
{
8 ~$ [* S( W( u* i( x8 {}  c5 h2 W, }- t0 G; j
file://---------------------------------------------------------------------------- `  b$ |5 y6 ]/ Q) t4 r+ |
void __fastcall TForm1::Exit1Click(TObject *Sender); T8 _1 T: M' i
{
* a& x0 ~" C) z# ?* Z  Close();
! ]) y4 d8 Q8 b0 s& K% [7 X}/ w8 U% h( U! I  g2 M7 R
file://---------------------------------------------------------------------------</P>) M. s: Q+ r9 T! K3 P- u
<>void __fastcall TForm1::FormCreate(TObject *Sender)
* W6 Q7 z7 [" H3 |9 q/ b& r{</P>
3 a+ W% q3 {, m6 X( V<>BmpToRgn();
  I6 D6 u* B: E3 r}
4 m7 c, ^7 z0 e' D2 H/ b# yfile://---------------------------------------------------------------------------</P>
; J& I4 h& T+ q* i<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,$ d1 }& l3 v$ C* t3 E) H
      TMouseButton Button, TShiftState Shift, int X, int Y)
0 ~0 m' y6 t7 l, g! M{
' I0 N( ~3 K; @, a' s& b; Wif(Button == mbLeft)
* n  [# b8 w/ a        {0 A% E/ d# j7 ]. k7 n
                ReleaseCapture();
. P; }: j  s9 S+ R                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);7 O) q" d/ y6 q. q
        }
' X7 p: S! T" Z; ]* V3 p' w}
5 K* E! F+ Q. ^$ W. |' }file://---------------------------------------------------------------------------
/ z6 q- d) `) E% s% jvoid __fastcall TForm1::BmpToRgn()
. Z* ~1 |6 U6 X% u{: N9 n8 a( [. m2 C- v! k5 x2 U& W
Image1-&gt;AutoSize=true;
6 R  |, c  U2 KForm1-&gt;AutoSize=true;
; L$ j$ K$ a5 N! w: e* N+ j8 [1 \  CForm1-&gt;BorderStyle=bsNone;0 U6 G5 k3 r# `8 K
TColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];
6 q8 u/ L# ?0 V6 k, D( H  M8 h9 c; Tint x,y;" l& e7 m' q* O$ E& d
int l,r;8 A6 m; M: Q2 Y' U: F- B& t
POINT *a;8 N0 @7 Q9 Q9 M6 v5 {1 K9 s+ Z
bool lb,rb;) G, c# L8 S2 r
HRGN WndRgn,TempRgn;</P>( g. k( ?$ ?- u5 f3 r+ o9 y# _1 J3 N
<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
( ]8 H& d& v8 i" j% M3 H4 Z/ p{5 X1 f7 H' E, S/ S7 {
  ShowMessage("申请内存失败!");  D4 B4 s9 D0 s- P, R1 ^& [* ^
  exit(0);, K# \; t8 C  d4 h2 n
}</P>
( A) U8 p+ |( T* G2 n<>l=0;r=Image1-&gt;Height*2-1;- m$ m, y8 v; K7 ?; e
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>( Y# v, G: p, Z' ^/ ~  A" R9 U  t
<>for(y=0;y&lt;Image1-&gt;Height;y++)3 ]" R7 V/ \3 g8 Z2 t# B; Y; N
{3 b9 ~" e5 s" t- w' ^: x
  lb=true;
: z" v0 ?6 d$ \: f2 Q) `6 r  for(x=0;x&lt;Image1-&gt;Width+1;x++)% J7 x( y! U) _4 R. T4 w
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)1 z  l1 W. l, d, `% f, X: Z, ?
    {
& R% K( {  j) e3 `      a[l].x=x;9 v& f' v# z4 D" d; t7 ~& x
      a[l].y=y;
: l+ {$ i6 k' q      lb=false;8 `/ m: x% z  I3 G9 E
      break;9 `" T7 M' Z0 l( B$ @; Z
    }</P>
$ e% _* e0 }: l7 H& L! ^- l<>  if(lb) a[l]=a[l-1];
* \  H/ _" [* k  U; {  l++;1 j# u& D# p' g& h7 N( `( v
  rb=true;</P>
- A6 s+ @( k/ m5 h, u* Z( _/ |<>  for(x=Image1-&gt;Width;x&gt;=0;x--)
2 M: z; ^  }" m: r  \7 z% L4 j    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)1 l- z3 ^  X8 L. k( S6 u  W; ~
      {
; v2 m' s' r) ~        a[r].x=x;- A! m9 j% f9 n( K/ m
        a[r].y=y;0 D; O1 Y& O1 a8 ?/ ?. @# s) s  h
        rb=false;# v7 e4 P" J( Q* E* f* D
        break;3 v; q  N4 x- ]
      }5 l$ ]" M& W! R# N9 G2 N  P
  if(rb) a[r]=a[r+1];
6 y" X0 _* a% u+ }  r--;( a7 H5 W5 e9 O! a3 p9 Z
}</P>
. Z. I- o4 U( o, |. I<>r=Image1-&gt;Height*2-1;9 |8 [0 G# E  f
for(y=0;y&lt;Image1-&gt;Height-1;y++)
! i  j. N. a7 n$ x$ c{
/ p6 b- m, s( r4 q2 X9 y$ {  for(x=a[y].x;x&lt;=a[r].x;x++)" X* y+ v6 i% T* g, i2 ]
    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)5 I" j% s5 ]! |/ P* H# r. f$ a
    {
5 l/ u, [; D$ b) x# H* g      TempRgn=CreateRectRgn(x,y,x+1,y+1);$ G3 L* q5 ^" e" }) _: n6 O' V, y$ X
      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);% m: k$ }$ H) j
      DeleteObject(TempRgn);
6 E  Y( O& B6 d- d    }, G" S4 ~9 w" T+ V% {- `
  r--;1 _* i% k4 Z: N8 K; S
}</P>
; O( Q% r0 d+ f% g7 ~3 d<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);
9 h( d9 n+ K- Z1 i/ u: M) f. U/ U0 W5 w0 vTempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);5 V: G: J& {# U0 n: p. b4 U, v
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);$ v% T. O# [& C4 b
DeleteObject(TempRgn);
$ Z( h  X" N  w4 H. @1 ndelete a;
! B+ i  \+ W4 v' e: U2 iSetWindowRgn(Handle,WndRgn,true);- ^/ |4 m6 y7 w! c
}</P>
) H# q6 Q: k% i3 S+ B4 P: [<>void __fastcall TForm1::Open1Click(TObject *Sender)# C7 y) z: o' S7 }( A$ W
{' v* f# j  Z! T+ g0 b" T
  if(OpenPictureDialog1-&gt;Execute())
# C  T' k0 [) I1 t  {
! t/ I0 f, ?: u* f+ n2 X- @      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);( x$ N- C$ e0 ?4 P) \! d' S( v
      BmpToRgn();5 c" Q/ K0 D& l8 e: i! m, i
  }
6 O) t$ ^3 |1 V" W8 J5 N" i  q9 r}  l2 A) z  k  n4 Y
file://---------------------------------------------------------------------------</P>
& k1 M+ {/ a# ]' D3 w3 V<>对啦,图片的背景色要相同。
1 w# L$ x" T9 U  K0 l8 W图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
9 O  ?: g0 Q; ?, q- n! E<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------
; H9 K7 P- S: |) ?* w8 Lvoid __fastcall TForm1::FormPaint(省略)+ f" d$ f+ K0 D9 x5 J" {' J
{) n/ o2 p2 s# k6 T! W
    AnsiString ww;int bb;) B# p! p5 @: D* ~9 M- f# [
    ww=AnsiString(Form1-&gt;Width/256);
1 L8 i8 O' v: L1 N    TRect MyRect;
7 C3 \' t5 N' z    MyRect.left=0;, o( o" d9 m5 v4 b
    for(bb=0;bb&lt;255;bb++), S1 E: g5 L1 ~' b. K" J% S
    {
- l7 P0 p! m# c' a$ K        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);% l2 d1 @7 u8 V0 K" U
        MyRect.top=bb*(ww.ToInt());
1 d! a# N, `, x( |5 h; M9 G, s& z7 Q        MyRect.right=Form1-&gt;Width;
8 N( v; k1 H. U' P% q# k: U        MyRect.bottom=(bb+1)*(ww.ToInt());- i4 d9 z" n8 Z: w6 }- H
        Form1-&gt;Canvas-&gt;FillRect(MyRect);
) D' m- b/ b) a6 I1 w    }) K9 p) ^' b1 S5 J: d
} </P>8 ~% _' W% i0 |* g! i  @1 F& T
<>file://---------------透明窗体--------------------------0 V+ t" y, P5 l% u9 @
void __fastcall TForm1::Button1Click(TObject *Sender)% I, \( J! [) ?4 m5 A; H7 O
{
" D1 Z# o5 o: _6 Z  T) P% ~8 Q  TRect *rctClient,*rctFrame;
6 `% q0 j2 h2 W: P- `3 x( J  HRGN hClient,hFrame;
$ |, v5 |. e3 X1 O  POINT *lpTL,*lpBR;. C5 ]2 L# i; R0 O" }. m' W% ]% a
  rctFrame=new TRect;
7 r( ?6 `* t. }" {/ x" N  rctClient=new TRect;$ F$ Y+ m3 ?. ]" X( T5 v4 v; F
  lpTL=new POINT;" R3 }% O  w" A1 L# }. x- N0 d
  lpBR=new POINT;
! _+ l% Z% R% _* c  w- z6 h  GetWindowRect(Form1-&gt;Handle,rctFrame);/ m% z9 t' x. f( \5 U( ?3 `1 C1 A. F
  ::GetClientRect(Form1-&gt;Handle,rctClient);/ A' a  [! b4 o/ m7 S7 ]& _2 s9 L
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
6 [2 B5 D3 a3 ]4 B0 S, `6 \4 x  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
( X3 [/ X: v' K$ U$ F2 N<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);
& Q  o9 F+ |, r$ w: w, O$ y/ j! V  ::ScreenToClient(Form1-&gt;Handle,lpBR);& D; T2 |# c0 E$ N$ ^( L& s. I
  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;' ?% c, b* s) M
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;
, B4 z! a7 d9 i2 A/ u- t$ S  rctClient-&gt;Left=abs(rctFrame-&gt;Left);
  `/ b0 D2 K; Z8 ?* {+ A6 C/ t! e  rctClient-&gt;Top=abs(rctFrame-&gt;Top);
4 z+ w! S, R( K* i  rctClient-&gt;Right=rctClient-&gt;Right+& S6 {8 {4 [0 A$ N, m$ M( J. ^& M
                  abs(rctFrame-&gt;Left);
- m( [; e# O" B# c4 `  r  rctClient-&gt;Bottom=rctClient-&gt;Bottom+3 E" \( m* h/ x8 g4 P& `7 T
                    abs(rctFrame-&gt;Top);) \4 Q0 X1 R, k8 q
  rctFrame-&gt;Right=rctFrame-&gt;Right+
* k" ?" |; i% r; _) @* \                  abs(rctFrame-&gt;Left);
2 z$ k2 E9 Z' M6 u  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+
' }/ d* D& e& W+ D( j, v                  abs(rctFrame-&gt;top);% ^0 V- {) U/ W4 q* Q$ ^
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>& }: V( j3 \: `3 Y* o5 x
<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,: w' |$ i$ e$ e2 ^5 Z1 c
                        rctClient-&gt;Right,rctClient-&gt;Bottom);0 N1 R# ^' l7 [8 q" f) N) ]
  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,
$ U% W0 N; m6 B. K/ A                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);
5 h3 \0 u" n* u& D  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
' x& G/ y) M- U; m8 f% Z  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P># t( o. i! ?* l7 `/ E
<>
8 F9 \# J& d. X$ n8 K% r  O  delete rctFrame;6 C* B8 u6 }) l" m
  delete rctClient;' d) v3 o( {# |& S- M, Y
  delete lpTL,lpBR;</P>
# _. H3 O. V4 {0 ?  B- y% 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-4-19 15:25 , Processed in 0.443971 second(s), 52 queries .

回顶部