QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。& K# e* ]3 L' T% i, D# Q$ j
file://------------------------------------------------------------------------
' ^7 T: y) Y* [# k3 E! V2 z<a>file://Unit1.h</A></P>) t9 [0 o9 T* e) ~( |) L
<>#ifndef Unit1H
4 h1 o& x8 C+ I' q/ o5 |! M+ j#define Unit1H1 C" U, d) ^2 ~2 _) |
file://------------------------------------------------------------------------2 N' n0 c" x% I0 k6 k9 u
#include &lt;Classes.hpp&gt;
0 q5 R9 x* P  N+ T. c2 I7 G#include &lt;Controls.hpp&gt;
, X9 i" f% |7 C3 V5 V( t  J* `#include &lt;StdCtrls.hpp&gt;
7 e" w( E9 T" t) \3 \! @#include &lt;Forms.hpp&gt;2 h" f5 G/ F: V' ~
#include &lt;ExtCtrls.hpp&gt;8 c5 o% a* R, @9 |- n' Q. n
#include &lt;Graphics.hpp&gt;- K8 ^/ G  i. T2 ?
#include &lt;Menus.hpp&gt;
: ?* @9 ?7 O. O% `#include &lt;Dialogs.hpp&gt;/ d6 }' c6 g+ k, h/ E2 V& L" r. X
#include &lt;ExtDlgs.hpp&gt;
4 Y6 T# m' n0 q7 s8 ]file://---------------------------------------------------------------------------
1 i. ~+ M# B4 H! u, e. Xclass TForm1 : public TForm* ?, e0 w8 a: Y& J
{
' I' i$ D% W. t: y__published:    // IDE-managed Components
* x; v! {/ h' d5 r5 V2 A        TImage *Image1;
* e6 D* p. u+ _& W; G+ T        TPopupMenu *PopupMenu1;& v( e/ U$ u4 ~) X& g- W$ n
        TMenuItem *Exit1;
$ N# T, G* N7 j6 V* ?; o        TOpenPictureDialog *OpenPictureDialog1;
6 k! T! t0 W) ^% o1 G9 R/ m        TMenuItem *Open1;
/ _+ e$ f7 `8 H" z) K" @% c        void __fastcall Exit1Click(TObject *Sender);
  r+ p5 b: o( I. u        void __fastcall FormCreate(TObject *Sender);
" I' |' @7 ?' J, _8 u        void __fastcall Image1MouseDown(TObject *Sender,
0 q1 e& x6 w/ ~1 a          TMouseButton Button, TShiftState Shift, int X, int Y);
( ~0 B5 T* i; h, D        void __fastcall Open1Click(TObject *Sender);; c. }$ O) K( t6 ^" q
private:    // User declarations5 |+ ?  S7 g  \9 {7 [+ N4 g
        void __fastcall BmpToRgn();4 J! u& j/ G7 j5 R/ e, i4 g" R
public:        // User declarations  u" B2 J5 C2 _
        __fastcall TForm1(TComponent* Owner);
' L) n: M6 X: D! e% {};
5 S0 `$ E4 ^8 Z6 s- tfile://---------------------------------------------------------------------------
7 J6 {+ k! V1 n6 \% {extern PACKAGE TForm1 *Form1;
& ]% i, p; X' b( ]; W4 X$ ^file://---------------------------------------------------------------------------
7 n1 Q" Z2 B9 g! ?7 I#endif</P>- c: Y9 W$ A% u7 b6 Z5 T
<>8 {, B+ [& O, j+ M
<a>file://unit1.cpp</A>
5 U' |+ ~- p0 O! U1 Hfile://---------------------------------------------------------------------------</P>
- J' ]3 k/ |7 X1 Y<>#include &lt;vcl.h&gt;
' T3 e0 J! f$ M* }#pragma hdrstop</P>
% O3 o* s. I: ^% W5 T<>#include "Unit1.h"
; r& f' U( h/ X/ ^3 sfile://---------------------------------------------------------------------------
7 i' i4 G& D, ]; ]$ ?1 }. x) _#pragma package(smart_init)
5 O$ u% R% v( N/ q$ D. q#pragma resource "*.dfm"
( w- Z! Z0 r2 X# F+ UTForm1 *Form1;
9 |% A, z* w8 s7 d0 `' h* [file://---------------------------------------------------------------------------
- f4 d* Z) u; @# Q. N, y" x) y  V, s__fastcall TForm1::TForm1(TComponent* Owner)% I& H8 Q# `8 m1 H( p+ v, B
        : TForm(Owner)
' S4 _5 o9 \0 Y3 \$ d2 I{
. Y+ r  ]9 a& J7 h6 Z. L5 Y}8 y* t" ~$ w9 S5 G  Y. _* r. b3 A
file://---------------------------------------------------------------------------
' g" F* L; Q+ {void __fastcall TForm1::Exit1Click(TObject *Sender); m5 G- M: c9 r
{; u4 {. L, C, m: u; y1 ?
  Close();, ]% `0 W1 J0 x2 H- O! _) |
}
1 {! x7 J1 ?( z: R/ |! n- Z3 nfile://---------------------------------------------------------------------------</P>9 F8 c& D+ ?4 l5 \. I3 Z
<>void __fastcall TForm1::FormCreate(TObject *Sender)
* y0 O1 W9 {: ]9 @( W{</P>
( k$ T+ P6 r9 k" R2 S  S<>BmpToRgn();
7 b' d: H& L. j. }4 |0 i+ t/ s}" A# C+ z0 n- G
file://---------------------------------------------------------------------------</P>
: W& x# J2 J" u% R* U7 N) O  A<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,; W+ ~! L" X7 F) r, s+ M; b" o9 m
      TMouseButton Button, TShiftState Shift, int X, int Y)
2 F9 y! s; C: w6 U( i{- k, H1 E  z' ^
if(Button == mbLeft), A& M6 n: }( t1 z
        {
2 H0 e- P/ _" [2 q( _/ K( z                ReleaseCapture();
2 \, ^3 v* W. h3 \  P' l# X                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
, k: y- ~/ U6 r7 ^5 f        }+ ^: M4 ^: H3 u
}
, L9 Y) I, f) J+ Rfile://---------------------------------------------------------------------------
, O- t$ f6 l9 G2 n: I5 e7 r+ @void __fastcall TForm1::BmpToRgn()
: l0 K6 ~- k; K% u3 u: Y' v0 E{# B, h. |" i1 l
Image1-&gt;AutoSize=true;
' n. [$ M- {4 i  A' v3 f/ VForm1-&gt;AutoSize=true;+ e6 {# a1 D7 l% D
Form1-&gt;BorderStyle=bsNone;6 w/ g& s) G$ y' Q
TColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];
  v- |5 c; r- X, b2 I4 Pint x,y;
  ?9 P7 V( c& ?: k6 q0 Bint l,r;
4 l% p) E, s5 B+ Q5 @POINT *a;, z% s9 w  O  z" p
bool lb,rb;9 ]4 V7 M* d7 o9 [9 b$ z
HRGN WndRgn,TempRgn;</P>% W5 ^! w3 B! M
<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
! H8 L, Q0 n9 J5 \4 T4 Q3 n, e+ C{  P. j. _! A9 T
  ShowMessage("申请内存失败!");
' @2 [% Z5 j4 a: ]6 `( B% I  exit(0);: N. |" P- x6 E3 e6 g9 a  |
}</P>
5 @# x" |0 z9 J# A- K& Y; }" n7 J<>l=0;r=Image1-&gt;Height*2-1;4 |" G; p* L% k# F+ E" z# n1 b
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>- o$ A) u* [7 e+ s
<>for(y=0;y&lt;Image1-&gt;Height;y++)0 _- Z9 c1 f5 @% |/ f( r9 @
{
; b- v. I7 l; w' n) a2 k& z/ Y) v. x  lb=true;
+ W. v5 [; j5 D& x1 ^  for(x=0;x&lt;Image1-&gt;Width+1;x++), ]+ ^3 W  a. u) z
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)  y. D/ A9 A6 P. t5 w5 l1 Y/ Z
    {7 |) l5 T3 z7 x2 W4 ]& b" d
      a[l].x=x;) [9 d2 t* ^' H+ y/ p9 i) e
      a[l].y=y;
' x& [0 Z9 n0 L. q9 ~5 ^6 x      lb=false;5 `. A& E, V; v3 T* g' F& I+ O3 [
      break;! X& w7 J' L2 z' n: D+ V4 p
    }</P>. ?" m2 q+ D5 B2 r9 v( {
<>  if(lb) a[l]=a[l-1];* W2 L+ x3 E: O& n
  l++;
4 M( u; M. s& ^/ J  rb=true;</P>
( w( a$ T/ c, t/ _9 h<>  for(x=Image1-&gt;Width;x&gt;=0;x--)
: n! g* ~* U' {. {. v    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)! N/ T( e/ o9 N+ e
      {
7 E9 `  x+ E" [7 k7 e        a[r].x=x;
$ F, ]/ s" i& r8 ]        a[r].y=y;
, F1 u% r4 L: d3 ~" s+ B5 }        rb=false;" A  z2 W+ u: K, N7 F/ X
        break;7 F, n! `5 h1 k/ t) B
      }
% I6 C. u# F' \  if(rb) a[r]=a[r+1];# \3 [, v: H3 {  x6 h+ b9 Z$ H$ V! k
  r--;
6 l+ g5 \- H4 o. V! I1 d$ |}</P>8 w1 t1 I1 f6 C" e7 k& L9 ?
<>r=Image1-&gt;Height*2-1;( q* t7 L* t7 G9 W  {
for(y=0;y&lt;Image1-&gt;Height-1;y++)
5 }8 F3 z5 J* G2 r! B+ p{
: g& v/ a# H- G! g, @  for(x=a[y].x;x&lt;=a[r].x;x++): L5 q! ~# ]* R8 E6 X
    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)6 K* [5 M# ^) L. @$ `6 U8 a# q
    {/ [7 G* R+ R- S1 d& L* x# w
      TempRgn=CreateRectRgn(x,y,x+1,y+1);
8 O  q; c  J/ a      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
! |3 U3 b$ u- H6 A      DeleteObject(TempRgn);  G  K9 }+ c/ _0 N& ^
    }
# S' H3 x4 o( P+ U  r--;1 J5 K  }# @& k. K# J9 C
}</P>! Z5 k+ a0 X, b
<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);
+ v' A+ y: E( u; s; @4 n2 LTempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
7 M$ D  M& M! C5 k& }CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
. F8 K- I: V- T% O0 q- G/ PDeleteObject(TempRgn);$ R: [) P# k; [
delete a;( {) W& H8 [  K
SetWindowRgn(Handle,WndRgn,true);
1 F) t8 Q$ h" }! N3 K! ~5 l}</P>5 {, F7 d" k: w
<>void __fastcall TForm1::Open1Click(TObject *Sender)
3 c$ ~" E/ K2 [( d' X: T{! w6 d/ m2 }. ^$ M( A
  if(OpenPictureDialog1-&gt;Execute())
9 F0 u( \/ ?* u# K& E( k  {
4 L# C" m6 [0 h; K7 f, P      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);
4 }( B* Y5 S0 H* \" `9 T3 J      BmpToRgn();
6 q8 c6 j6 X4 |  }
& a/ o4 A2 y4 a* j}
/ ^7 `6 G# {* G; O; t$ i/ rfile://---------------------------------------------------------------------------</P>5 b, b3 b! C6 e5 N
<>对啦,图片的背景色要相同。0 G: x' k0 U. Q; M2 h
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
7 @: E4 R( m* D" \* g! w<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------4 y3 n/ d: M6 o. l% b" w
void __fastcall TForm1::FormPaint(省略)* x5 D8 D9 J# H4 l2 M
{  A- P$ X( U* y6 c8 ~% g
    AnsiString ww;int bb;
) G7 u- l) `( ^: s/ N$ h0 m0 E8 v5 t    ww=AnsiString(Form1-&gt;Width/256);( G' C% i+ [8 T; h) K' g$ q$ u
    TRect MyRect;- z+ D5 x) s, f9 d9 i
    MyRect.left=0;% [6 I+ w* R( t: x7 t8 P+ ?
    for(bb=0;bb&lt;255;bb++)
$ D- O9 ]. C' A& k3 O4 d; g  z    {
3 \% I3 t$ w- v3 y        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);: e* s. C3 i9 j5 W, ]+ R+ w2 s
        MyRect.top=bb*(ww.ToInt());$ C) e, `, y! j, J# J, k6 ?
        MyRect.right=Form1-&gt;Width;9 d; G- Y- h0 @. s* _9 L* I
        MyRect.bottom=(bb+1)*(ww.ToInt());8 X5 u4 `4 F  O& F! x3 V5 f$ G
        Form1-&gt;Canvas-&gt;FillRect(MyRect);0 l: Y/ B6 a) w. x. ^
    }- J. m% T* {1 a3 U; s: |0 C: g
} </P>
" {6 o4 y) d: `<>file://---------------透明窗体--------------------------+ l. i# C+ f+ J6 B' `
void __fastcall TForm1::Button1Click(TObject *Sender): J" W; A3 t" ~5 f+ Y! o) `
{
8 x/ E/ k/ s( x: \  TRect *rctClient,*rctFrame;
3 V/ W' J9 O* F8 R5 c& j  HRGN hClient,hFrame;4 v! t! X% |& V% S; ]: A# Q
  POINT *lpTL,*lpBR;
6 C5 _2 ]& [: O! h. R; Z& Y$ V: h  rctFrame=new TRect;
6 _4 v4 r/ {! k  rctClient=new TRect;  @& _3 N( ^4 W5 Q* r
  lpTL=new POINT;
6 M) @8 [) m* h1 W$ k1 {7 w9 }  lpBR=new POINT;4 |/ u3 n9 i4 F2 j8 m* I
  GetWindowRect(Form1-&gt;Handle,rctFrame);! @7 D8 L+ E& }" B# ~" G
  ::GetClientRect(Form1-&gt;Handle,rctClient);; ]( M/ Z& a) k: c
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
! ~3 [( n4 n  E  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
0 N1 I0 x3 K; D. S! Y<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);! O3 ^# b+ a7 v1 c- A$ y4 c9 L! k
  ::ScreenToClient(Form1-&gt;Handle,lpBR);
& w9 N- r7 v+ ], s  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;) [1 x+ I, B5 r+ r+ B
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;) A# ?) O& D+ q% _* y& y
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);% `" B& p: i8 h6 e" O  l
  rctClient-&gt;Top=abs(rctFrame-&gt;Top);! x6 q/ ~3 E- d0 |7 X
  rctClient-&gt;Right=rctClient-&gt;Right+
7 `9 D3 C% U. |( n                  abs(rctFrame-&gt;Left);
4 T$ ^. ]: v, b# @/ k5 d6 N  rctClient-&gt;Bottom=rctClient-&gt;Bottom+
5 m9 L- s6 I/ |! o* c" \                    abs(rctFrame-&gt;Top);
$ l$ A( t! f. }7 M9 E1 I  rctFrame-&gt;Right=rctFrame-&gt;Right+
/ N5 {7 @3 C' I1 N2 _                  abs(rctFrame-&gt;Left);
4 ]1 q8 b/ t$ `  z  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+& {) e* R! d$ c  I# y6 d
                  abs(rctFrame-&gt;top);5 X* y- g( }! L; y' ~) H$ I
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>, s$ z# a% |) q; r  q
<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,
% ]) P2 W6 a% v+ m" A                        rctClient-&gt;Right,rctClient-&gt;Bottom);
# F* f" M' O/ s* n6 m6 e- E% @  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,- N% n+ n$ U" C( g
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);
) [) K! k1 \. r9 V3 k" H  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
5 N1 h( E+ f6 o5 y0 m' X  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>3 u) n8 S/ @7 b. D, e3 I/ F
<>
* x( A  o' ?2 p  delete rctFrame;# Y! x1 n5 d: p& p# g, Z9 Y
  delete rctClient;
8 ~" s: u4 ~  j. G. {  delete lpTL,lpBR;</P>
$ R, l# {+ ~( w/ ~& L( I<>} </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-9-17 01:45 , Processed in 0.278722 second(s), 52 queries .

回顶部