QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。
% Z! B8 x1 W, `( Q- q' ufile://------------------------------------------------------------------------
' {/ y% ?) Z- c  S9 R8 {! R<a>file://Unit1.h</A></P>$ f0 i: ]9 Z. D/ B! Y3 X
<>#ifndef Unit1H
0 Q5 X7 G7 t  B& W* I3 B#define Unit1H8 L/ Z1 @/ u0 o% ^5 R3 [
file://------------------------------------------------------------------------2 I. B" Q9 R9 J; R' w' n* L8 t
#include &lt;Classes.hpp&gt;2 T' n  D* b! f/ C
#include &lt;Controls.hpp&gt;
6 P: P( w! A, Y# k#include &lt;StdCtrls.hpp&gt;9 r: l' O4 ~+ Q
#include &lt;Forms.hpp&gt;
+ P3 ?8 b) {- Q+ H7 _#include &lt;ExtCtrls.hpp&gt;
0 u2 |" t1 L7 x/ L#include &lt;Graphics.hpp&gt;3 R( `6 |& I& X# I$ w
#include &lt;Menus.hpp&gt;" i1 u0 s  P5 V# V
#include &lt;Dialogs.hpp&gt;
' d8 z$ b8 ?3 j% o) w7 g8 W1 X; V#include &lt;ExtDlgs.hpp&gt;! B1 G' Z# p- c9 E9 j
file://---------------------------------------------------------------------------9 j, v( X6 X1 \+ N6 A
class TForm1 : public TForm: g. H- J2 @# ~, L6 {# Y& E  @* f
{) @$ t- P7 q! _) p; K3 X& W
__published:    // IDE-managed Components
0 ~0 j7 L" M. Y% F        TImage *Image1;
! a/ t8 ?# M& t! {& p* Z" C        TPopupMenu *PopupMenu1;
- t% r& c4 C# N, |" h7 v0 t+ v" K        TMenuItem *Exit1;
; f% X/ l5 T# K* j0 w        TOpenPictureDialog *OpenPictureDialog1;
8 n# W: [9 q5 i' J2 _! L" b        TMenuItem *Open1;
5 D+ z+ ?' Z" {( z! H  F1 q6 j        void __fastcall Exit1Click(TObject *Sender);
. c$ }9 _$ F' {5 m4 ~4 ?  Q; K        void __fastcall FormCreate(TObject *Sender);
3 d8 d* g: _- Z# i% T0 X* R        void __fastcall Image1MouseDown(TObject *Sender,0 M4 P" j- X( w: {3 Q! X& K
          TMouseButton Button, TShiftState Shift, int X, int Y);  S4 y. t, ]! f. d
        void __fastcall Open1Click(TObject *Sender);
' f0 ^5 `2 a  g3 H' q" f! fprivate:    // User declarations/ l2 K' }+ `8 _* Q9 \2 x" i- B
        void __fastcall BmpToRgn();  N8 V. x6 f1 p
public:        // User declarations
" Q& b' I! g! J3 [        __fastcall TForm1(TComponent* Owner);1 ]! }/ r% w3 R1 f" q1 z2 w' P
};
2 Z" g) J, L  n0 j/ h+ g3 a$ pfile://---------------------------------------------------------------------------5 l9 p& s, ?. L0 c6 z
extern PACKAGE TForm1 *Form1;
+ K. N% n4 y2 G% w, F+ z- Pfile://---------------------------------------------------------------------------4 S' B# O# f- S- |0 U  W; a
#endif</P>2 {; f& H+ v' Q" e# |, Y3 _
<>9 x# V9 G. i$ ~! I8 M) o7 C3 T
<a>file://unit1.cpp</A>
  v/ E' @. {2 ?" k7 E3 k" U# Jfile://---------------------------------------------------------------------------</P>
8 d9 X: M6 S7 ?4 [; Z- X# G) V0 G* |<>#include &lt;vcl.h&gt;1 B  G; F9 y% Z" B
#pragma hdrstop</P>& r2 f) A2 z0 F" n' Z
<>#include "Unit1.h"
- n5 g3 l! I/ wfile://---------------------------------------------------------------------------" b$ O: L! ]- o+ \: `0 M9 \$ [* N" a
#pragma package(smart_init)
7 L8 m2 `6 t4 O( C# `& F#pragma resource "*.dfm"- k5 m5 ?, ]; ^
TForm1 *Form1;$ \& J6 `* ]* J( @! P  \
file://---------------------------------------------------------------------------; B# U  M# H+ A/ B0 n" |0 J
__fastcall TForm1::TForm1(TComponent* Owner)
" E+ N7 V& V! M; X/ R5 @- A  i        : TForm(Owner)( M6 R9 O" F; g' R' E& x5 Y5 X7 ^
{/ n2 j1 N. q; j  m
}
! _* ~% q  _6 d9 u) r7 F4 qfile://---------------------------------------------------------------------------/ `* `: S. |5 I- o
void __fastcall TForm1::Exit1Click(TObject *Sender), i/ z: @5 D$ G& E* ?: \- _
{
5 u5 u% i, I) d5 ~  Close();( P* T" k! ~% r: a3 o( r2 h* P2 U* h
}8 x! p$ [9 I8 M
file://---------------------------------------------------------------------------</P>- M% z6 j  \4 i; }7 R
<>void __fastcall TForm1::FormCreate(TObject *Sender)  ^! t. r1 C1 R. m2 A
{</P>
' n/ O$ j2 C/ R% P/ Q: i<>BmpToRgn();; k) [; O8 u( B
}8 E" s% `" M# @( Z% h4 k, f# \
file://---------------------------------------------------------------------------</P>6 u+ O8 s0 |! o+ i! l
<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,
5 I% Q! x3 l9 O4 |; Q. ^      TMouseButton Button, TShiftState Shift, int X, int Y)
4 M: T' M6 [, H4 S3 v7 n  q" L% @{- [0 Z8 g+ w5 B, k$ F& @
if(Button == mbLeft)* ?2 T# e& d7 n
        {
) a( {, U9 i! Q1 ~* ~                ReleaseCapture();
4 r% `. i6 h& s# c0 s0 V                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
; N" s: P& O! c( g% ~        }* T! G8 O) b' e( Y+ M
}
- P7 a' k. g7 B3 c0 f; afile://---------------------------------------------------------------------------1 X# Z1 T) p9 X- R7 v3 F) X
void __fastcall TForm1::BmpToRgn()1 g) k# b) N% ^; Z
{
9 y5 t. u0 y2 O, ~6 m: D8 l0 w: nImage1-&gt;AutoSize=true;2 C& |8 ~! c6 B% e- E
Form1-&gt;AutoSize=true;
; d2 {$ B" a" o; h) LForm1-&gt;BorderStyle=bsNone;
# n) z4 u3 A1 U0 rTColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];; e$ |6 G( K$ B/ f7 l; J6 `% G
int x,y;6 j, v% Z* g9 Z* A) T* f8 o
int l,r;6 m6 M! I7 G0 V" Q7 ?, h+ E
POINT *a;
* U; B+ k  d8 Xbool lb,rb;- A1 _+ @( k- e1 {  G, e
HRGN WndRgn,TempRgn;</P>0 @  _/ H  {& ^; {
<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)4 K: f% \! @" @) P2 T5 A# J
{! X2 d6 U1 C! Z
  ShowMessage("申请内存失败!");
; r2 `9 ]0 t0 E# }. \& Y* Y  exit(0);
' x3 ^$ ~) a  P& F# \0 u/ t/ X}</P>
5 R8 X2 `9 g% K; ~5 Z% K0 f<>l=0;r=Image1-&gt;Height*2-1;
$ I9 I" J! v+ v& TWndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>8 A( {. U1 Q' v  c9 d8 U
<>for(y=0;y&lt;Image1-&gt;Height;y++)7 F2 h) H6 J0 w) @1 X$ ]" |) S
{2 p2 D( b/ @3 P0 E
  lb=true;
6 n% B+ K! k. U/ d0 ?# G, u  for(x=0;x&lt;Image1-&gt;Width+1;x++)
2 u4 J3 h! N4 m& y; s& Z    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)* J$ m4 B* u: p/ H
    {* |; E" V9 }5 I) X* b5 O
      a[l].x=x;
, }7 R( C0 D! J8 a! S      a[l].y=y;
- G$ N' |* o  q( L      lb=false;
  N9 e1 l7 ^# S      break;
3 K( s: u& |* F, h- p/ u' }    }</P>
" s  h1 R4 Y& ]4 G6 ^<>  if(lb) a[l]=a[l-1];
/ i- @0 W* H: [( K+ M+ S  l++;
" v- B8 T3 N" v  rb=true;</P>
" d- S* P6 u6 f- T4 x<>  for(x=Image1-&gt;Width;x&gt;=0;x--)
5 ]5 S' M7 a  t    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
/ W( J1 h% k/ y7 }      {; D( T( P3 ^% m
        a[r].x=x;( M, H2 R( s9 n, {+ ^0 E$ v- r# x
        a[r].y=y;2 {3 \3 y$ Q+ h: I: G) P% n, ^
        rb=false;2 D5 Q$ T0 ^# d: x, X- E2 H
        break;6 m- o/ x' [3 u& I( J7 p6 \
      }* M) H5 m- b7 A+ a2 N6 S
  if(rb) a[r]=a[r+1];; a9 |# }3 c& M, A2 x$ z& x
  r--;! ]3 j$ ?6 i$ B4 ?
}</P>$ [- V% m2 h" E/ a1 o! Z& j5 v
<>r=Image1-&gt;Height*2-1;
! p1 @# b9 W9 A: Y7 Q( Lfor(y=0;y&lt;Image1-&gt;Height-1;y++)
5 F+ q, s+ B" u. Y* O{/ N# N/ @/ Z- I0 y. `1 A( I
  for(x=a[y].x;x&lt;=a[r].x;x++)) \9 ]- H+ S5 H
    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)
6 M, f1 o6 P& {; |3 h$ c$ J" p    {$ R* e* _8 c4 ^8 ]
      TempRgn=CreateRectRgn(x,y,x+1,y+1);
4 X3 U4 E- y! w" a) q9 i, C      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);; Q2 s: P' E, l6 r
      DeleteObject(TempRgn);
# _& e/ W: v$ d7 @% ^    }
' F0 G4 P" q& j1 j  Y- Z  r--;# E% j# U6 m# \- u7 N( D
}</P>
$ v" J- c6 M7 x7 L; }<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);
9 R* n% M- ~2 OTempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
5 N3 b1 _8 k. T2 yCombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
) D6 Y2 m8 l0 T# PDeleteObject(TempRgn);. u& E  t$ i1 }) W
delete a;# |) V2 v% j# P/ Y& q4 x
SetWindowRgn(Handle,WndRgn,true);' Y! [; ]  g# K3 j# p
}</P>
0 F; J+ K" E* y' m& o' ?( Y<>void __fastcall TForm1::Open1Click(TObject *Sender)3 @  f$ U1 \( a( M! _. H! n
{
$ R( N, M5 v0 I# ?% L' j  if(OpenPictureDialog1-&gt;Execute())
$ I8 n6 j) ?- g1 }  {
1 X2 f7 S9 S( A* {1 _. X7 P# |- f      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);! A% t0 Z) ]4 B' _
      BmpToRgn();
0 r# Y! C' }% p7 j/ m- F  }- m1 K% W( t% L
}
1 _) C2 W0 u6 afile://---------------------------------------------------------------------------</P>% a9 e3 L. g. K. C; H2 Y
<>对啦,图片的背景色要相同。
' o3 o, G7 O2 h$ I, _8 @' ^图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>$ V- o. h. Q8 h
<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------6 N6 Y: [; J3 E9 B% F
void __fastcall TForm1::FormPaint(省略)6 @9 ]$ q! K) f; Z  ]. m3 z5 c" P
{) B9 V9 J7 }+ L
    AnsiString ww;int bb;+ _9 Z; ?6 ]0 O7 ]% L- }
    ww=AnsiString(Form1-&gt;Width/256);9 ]5 H% |" k, ^# {3 G
    TRect MyRect;$ [' U) s6 ?  f0 t# D8 V
    MyRect.left=0;7 m" _, m3 p2 L8 @+ u; h
    for(bb=0;bb&lt;255;bb++)+ C* c! h* q) U, O- \
    {
8 K4 G" u2 X" g" Q& f- k* h4 I2 t1 P        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);& V- `6 ]0 p/ Y, f1 f0 {* F4 m
        MyRect.top=bb*(ww.ToInt());
$ X, d( ^6 H: x  X, r6 E        MyRect.right=Form1-&gt;Width;0 S) p; N& R7 h- [( m" E  E  S0 f8 U
        MyRect.bottom=(bb+1)*(ww.ToInt());5 W) I* |+ c8 W& j4 C5 z& Q7 Z* e
        Form1-&gt;Canvas-&gt;FillRect(MyRect);" [3 V8 E$ n; V& J
    }
) \) F" o, X5 F  q} </P>
/ `! l. i  \; ^: w! B" g7 S* Y<>file://---------------透明窗体--------------------------
0 B( }$ E9 B! a. ~8 l" s$ d8 l2 qvoid __fastcall TForm1::Button1Click(TObject *Sender)
* C  k% R- x4 ^! N  f. E6 }" h{
6 D, |4 o3 l) G' l$ Z$ K* c  TRect *rctClient,*rctFrame;
# R3 R) @- w5 \9 D6 l  HRGN hClient,hFrame;$ p! r( Z' U5 c- }  F9 C/ ^
  POINT *lpTL,*lpBR;
. Y6 b1 [$ J! L' {3 z: R7 j. Z5 k8 Y  rctFrame=new TRect;) y# k4 o! P/ Q& v2 u5 R
  rctClient=new TRect;' e/ O  f" T! t& l8 @; h5 w
  lpTL=new POINT;- C9 b' Y* A& f. x3 X
  lpBR=new POINT;
! F" e' }# R6 H9 f7 P# X: L" T0 h  GetWindowRect(Form1-&gt;Handle,rctFrame);3 a+ X3 |  d" p& P& @
  ::GetClientRect(Form1-&gt;Handle,rctClient);0 b' T7 @8 y  w' Q: h; P
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
& m- ?  F2 M. h. U+ }3 q$ P) a  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
$ G, [4 n- |6 b+ |. d% P) P  h# f<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);) m# z8 G/ m0 v
  ::ScreenToClient(Form1-&gt;Handle,lpBR);
. U* x- M* I7 g+ N1 o/ R8 |  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;
9 O( a2 o3 M4 R; l  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;0 h; g. Y4 m0 t% u
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);% `: l1 j$ L, w/ E
  rctClient-&gt;Top=abs(rctFrame-&gt;Top);
* C! q# o6 z( `. d1 p  rctClient-&gt;Right=rctClient-&gt;Right+5 O' ?: o: a) c2 v3 r- U+ b3 B, K% d
                  abs(rctFrame-&gt;Left);. v% c( \7 a" u. c7 T
  rctClient-&gt;Bottom=rctClient-&gt;Bottom++ Q' A- R4 z' t/ i5 I, ?% }2 V
                    abs(rctFrame-&gt;Top);" p* T- ]/ S' Y/ `# Z
  rctFrame-&gt;Right=rctFrame-&gt;Right+
4 O4 _6 m" `4 G                  abs(rctFrame-&gt;Left);" {. g0 u2 H) r( t& h
  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+7 k1 G$ P; S/ K9 D
                  abs(rctFrame-&gt;top);
7 C& E0 ^3 F2 U! A; i, T4 V  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>
  ^& L  L: ~2 `6 ?' x1 ]. ~( {<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,# X3 ]  A& Z4 p  C/ T9 z8 s
                        rctClient-&gt;Right,rctClient-&gt;Bottom);
9 N- K. A; m. y  f  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,6 V4 f: \# r: [' E1 |
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);3 |5 K- i$ s, u8 s' y
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);9 \! X* i8 e8 N3 I
  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>' A' Y% X6 Q& j$ H6 }9 _: U
<>
# d* l; N& M! h, i  delete rctFrame;
2 y# I% R; \) b, J2 H3 U6 g  delete rctClient;6 e9 }5 S- A1 |( y4 T
  delete lpTL,lpBR;</P>
! {; @$ F1 r: c6 b. f" 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, 2026-7-17 19:20 , Processed in 0.286097 second(s), 52 queries .

回顶部