QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。3 p  U. M  x+ L" D" B4 D: M/ M, f4 S
file://------------------------------------------------------------------------1 J4 c0 a( e! y! s
<a>file://Unit1.h</A></P>* U2 i8 V# T8 s9 m' ]2 F' F
<>#ifndef Unit1H/ S8 G7 b! d0 i  `
#define Unit1H
5 ^' Y: c5 r( G1 Y$ Xfile://------------------------------------------------------------------------; \$ i- I/ I( _# \1 B, J+ ~  }. m
#include &lt;Classes.hpp&gt;, F1 M. N0 G. e
#include &lt;Controls.hpp&gt;( F- o( S# [5 x# e- A0 f1 r- {
#include &lt;StdCtrls.hpp&gt;' f& `5 S, S& C* Y
#include &lt;Forms.hpp&gt;3 v3 f# F8 R; v5 t
#include &lt;ExtCtrls.hpp&gt;
7 G  R! F# `1 |! Y9 h6 J- u. s#include &lt;Graphics.hpp&gt;
! x! H: ^# [9 J3 c! U8 H/ @#include &lt;Menus.hpp&gt;& ~* B' E2 T! ?6 ~
#include &lt;Dialogs.hpp&gt;) K: b( i! u; }# A3 R
#include &lt;ExtDlgs.hpp&gt;
; l5 A$ M4 Z) @" C+ j8 ufile://---------------------------------------------------------------------------- `' G( e" M% Q5 q2 z; X4 t" [
class TForm1 : public TForm4 m" k2 i) V7 g; Y7 h! t. G3 `
{, i+ y7 z0 O& }2 l# U9 O9 t+ t
__published:    // IDE-managed Components; e& g% ~# F7 U8 L
        TImage *Image1;: F4 h/ K( J8 F0 P8 A8 ~
        TPopupMenu *PopupMenu1;
2 f( z9 g+ I1 f: Z        TMenuItem *Exit1;
6 b# R3 H9 F: Q* @& m3 Q2 I9 {        TOpenPictureDialog *OpenPictureDialog1;  R& i5 l+ ?+ }  L0 a
        TMenuItem *Open1;
! ?' @( a# n& \$ i% v0 ^" {) @        void __fastcall Exit1Click(TObject *Sender);. V' K" v. Z  V/ Y$ J" _: N
        void __fastcall FormCreate(TObject *Sender);
: a" ~9 h" R/ A. e        void __fastcall Image1MouseDown(TObject *Sender,
% e. ^  Y2 E: J' Y* n          TMouseButton Button, TShiftState Shift, int X, int Y);
7 l0 P5 D4 {  d$ |" C9 y        void __fastcall Open1Click(TObject *Sender);
( T- y! q" K5 p  ~, i. L/ R4 fprivate:    // User declarations" N) z4 E/ g; o/ J- d* j
        void __fastcall BmpToRgn();1 n( O& Q# X. c0 Z9 |! ^( X8 {
public:        // User declarations7 b) q8 N! c7 ^" T  x- T
        __fastcall TForm1(TComponent* Owner);) k/ u  S% U, e+ I2 ^" `
};) ?9 N  D4 Y2 m
file://---------------------------------------------------------------------------
4 j/ a4 w- W& b0 V6 N6 V; Bextern PACKAGE TForm1 *Form1;
) @0 _9 d& H+ a0 S) S8 G. v. m( M, pfile://---------------------------------------------------------------------------0 V, L0 W2 s. R
#endif</P>
' I# _' P0 y% S7 F, n<>
( J( }9 a- y1 C8 b" Z6 n<a>file://unit1.cpp</A>" w; o6 x" J/ d" u% U0 m  }: w+ U$ B
file://---------------------------------------------------------------------------</P>5 u( X& H- T4 W
<>#include &lt;vcl.h&gt;4 j' k5 ?. j$ L! Z( ]
#pragma hdrstop</P>0 v' M$ n4 h$ k% l7 r: S
<>#include "Unit1.h") F; p! X0 |" p/ f
file://---------------------------------------------------------------------------
& k/ a2 ]+ `5 Y3 G" c2 @2 ~#pragma package(smart_init)2 e/ P, d: n* K( t
#pragma resource "*.dfm"
  Y$ b. ?0 o4 }TForm1 *Form1;) m& s* A! I$ o
file://---------------------------------------------------------------------------' o1 _  {& j  V7 B& n5 T
__fastcall TForm1::TForm1(TComponent* Owner)
) Q1 Z3 N3 U3 D, k# Z( x* }4 W5 Z3 S5 n; j        : TForm(Owner)( `( p3 R8 V! o6 [2 b6 I
{
/ Q; F7 v! x0 S' n# H7 _}: u0 E/ A  o( \
file://---------------------------------------------------------------------------
+ ~( B/ K4 S; l  Z/ yvoid __fastcall TForm1::Exit1Click(TObject *Sender)
8 a3 A. V/ q! U& k{' v& y- g- s( g
  Close();
8 B4 q) Y) v& m) p. I/ b}
* e# e+ ^. `# l! ?% T( ^file://---------------------------------------------------------------------------</P>
# Z- \% B) r' K# p7 d$ v<>void __fastcall TForm1::FormCreate(TObject *Sender), @  B: I, X8 `9 G; ^) q- M' O" k+ B8 r
{</P>
1 R) j' J. V& A' r$ D<>BmpToRgn();4 R3 g/ {) K2 D# T7 O
}
9 \# v2 R! V8 N) F& v6 P3 wfile://---------------------------------------------------------------------------</P>
/ U& H1 o  q# Y/ [  B; J<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,6 f0 x: ~) \! n( T
      TMouseButton Button, TShiftState Shift, int X, int Y)
+ [- f* W* o+ p$ d" q* _{7 d1 M7 z) K, o
if(Button == mbLeft)# X# v$ a1 v# E9 z$ b. d- g
        {1 k) ~+ A& t6 z, j& _+ e
                ReleaseCapture();+ h  y1 r/ I' _5 a1 f
                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);' S2 ]! X1 O: Q7 p8 p
        }
' n4 l& W6 F& ~$ c1 s}8 ]" w9 f& j2 W6 p
file://---------------------------------------------------------------------------
8 Q( X$ c7 L7 T7 V1 `! Yvoid __fastcall TForm1::BmpToRgn()
  v) A7 B: u7 e( D+ J{
7 c7 j, j/ b/ K! q  sImage1-&gt;AutoSize=true;
. ]6 @, t! u5 X( T% l0 S2 uForm1-&gt;AutoSize=true;
8 J- s/ g5 h, J  H/ jForm1-&gt;BorderStyle=bsNone;2 X) c( I$ X7 I( @
TColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];6 w$ A/ U" ~0 ~/ L$ H
int x,y;& r( |7 X: y: ^& N
int l,r;
) \/ \3 x) V6 rPOINT *a;
0 s( h9 \- Y: S/ mbool lb,rb;  @9 s3 T0 H) x, q
HRGN WndRgn,TempRgn;</P>+ N" `4 _$ f# ?% v, k( ?7 O
<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)/ Q3 n) ^. _, y6 H) g6 |8 q' u0 W$ F
{
" t) H) V2 F! J: r  l( P& A  ShowMessage("申请内存失败!");3 _7 }' _* F" B5 y/ f4 O
  exit(0);
2 g9 [+ Y+ j1 U2 L+ X6 {}</P>9 ?4 u  d% u& E
<>l=0;r=Image1-&gt;Height*2-1;4 K2 ?! P  P6 y0 Z' x3 u
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>+ ^& O) v! P* \1 I0 D, y6 l
<>for(y=0;y&lt;Image1-&gt;Height;y++)4 F' G; {3 [; T
{( r) E+ f$ `2 |* }+ s3 _
  lb=true;
! e$ B4 d  `2 `6 n3 M  w9 H  for(x=0;x&lt;Image1-&gt;Width+1;x++)
3 U" ^5 m; p7 z5 ^# [    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
& }" ^+ I# j+ e, ?) c& [4 V    {( \9 Q+ q4 K. e3 Q  d4 {1 }  D8 `
      a[l].x=x;
' ~9 C! F8 D# U9 V$ q      a[l].y=y;' ?6 a2 t  V  O& `% x4 n7 T
      lb=false;( D% t# A7 i, C5 P, m
      break;2 P4 F( [0 q1 \  c: A* ^
    }</P>& R7 B6 P: h# M4 L0 _" M& ~8 `; Z  Z$ o
<>  if(lb) a[l]=a[l-1];
! P* h& K, K+ D3 W6 ?8 T3 j  l++;
) l% }$ e2 ~5 L% E" l  V  rb=true;</P>) s* u; w9 t- ?" n" o
<>  for(x=Image1-&gt;Width;x&gt;=0;x--)
; p, B1 p: }3 K" x' T    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey): e; s; l" k0 l* G/ Q4 }1 g
      {& @3 N) K: a# t) r( z
        a[r].x=x;$ ?; x- f3 ~. k& }' U& n. X
        a[r].y=y;) J& d* c( A3 V% ]
        rb=false;
6 Z7 A% k$ v0 R: A9 T) d* L        break;, s+ u& b' M* |. o. o' `
      }$ O# W& D3 u$ V
  if(rb) a[r]=a[r+1];- |" {( C- O; n$ `  y4 q* ]9 N( M) Y& i& `
  r--;
3 F+ L( A+ M) \/ S5 m4 }1 }1 j" i2 I}</P>- U: N( C/ S. H& D$ S/ \* @3 ^
<>r=Image1-&gt;Height*2-1;
# \3 K7 ?+ A# t4 v! `0 |+ M6 Wfor(y=0;y&lt;Image1-&gt;Height-1;y++)
- G! X5 O( e# `+ E5 l5 y3 P{) T9 V# t1 L0 [
  for(x=a[y].x;x&lt;=a[r].x;x++)
! D! R& m$ u9 ^; A  d7 u5 f    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)( d8 b  [. h; v+ o7 A$ g1 E& q1 z
    {
0 x% s! @; d7 B& `* t; T9 g( ^4 B      TempRgn=CreateRectRgn(x,y,x+1,y+1);( q' i) W6 {& @' x) Z' c' v( t
      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
" w: w. p$ r* ]2 `7 G# M( L      DeleteObject(TempRgn);
/ R/ N, c" v$ z; v7 y3 ?" M    }
. j6 N3 K! B+ t9 g# L  r--;& d& H6 r: ?+ h+ ]$ V. Y% A
}</P>% |' `+ F* w0 j
<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);: I9 m. k; ]7 y" |
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);5 P5 v7 T% F/ }& z1 _
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);3 K* {- |: @- W9 Q0 H, b
DeleteObject(TempRgn);
9 s4 g. |% H8 N& |7 t$ C0 i) rdelete a;
- K) Y. o4 B' z/ w4 KSetWindowRgn(Handle,WndRgn,true);. A4 T- X$ h7 A1 G: `
}</P>: R% l, h; k2 p8 M, S4 X, o
<>void __fastcall TForm1::Open1Click(TObject *Sender)) U8 X0 |6 ?" s5 ]6 K; i5 |0 ?
{" U0 i  ]' W" R4 E
  if(OpenPictureDialog1-&gt;Execute())
. C3 m. B/ f  }1 |! `& V  d  {, m/ _9 ^: [  B1 u
      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);4 E: B1 \. ^( M
      BmpToRgn();3 u: F  T* d4 Y1 @5 c$ V5 \0 @1 c3 ]
  }
/ S+ f: w1 K& n( t}* V0 q2 H1 e# Z5 D) T- {8 w/ F7 a
file://---------------------------------------------------------------------------</P>. f! Y2 k  i7 E. L; Y4 v
<>对啦,图片的背景色要相同。
7 l- g- j( c9 `! k图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
2 w2 y, h+ p* N! [4 ]<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------
2 C. k: H) q( u: a+ P8 o, ivoid __fastcall TForm1::FormPaint(省略)) |" N& P) V( x5 {$ {, P$ _- T. `
{
4 N' X( q, P' @    AnsiString ww;int bb;$ t8 C9 e( C3 b7 [% [( K# H% o& F
    ww=AnsiString(Form1-&gt;Width/256);3 g# D% n7 [) ]3 [& [
    TRect MyRect;9 ^/ j2 ^2 v6 y6 ^" z3 F
    MyRect.left=0;
# H9 R: ?7 v. I" M5 j* @    for(bb=0;bb&lt;255;bb++)
7 o8 I4 W/ ?% H" q3 k1 L    {
- w6 \' b, `, R5 f        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);/ ^* w: |) R1 P! `; x# ~
        MyRect.top=bb*(ww.ToInt());$ n3 w1 p9 w- ]" e! U
        MyRect.right=Form1-&gt;Width;
" |0 e) y! J. N. t        MyRect.bottom=(bb+1)*(ww.ToInt());
# e0 M3 z' ?1 _        Form1-&gt;Canvas-&gt;FillRect(MyRect);
- C: ~2 J3 O* h: s) C) }3 ?    }
  I/ q) C" T8 D2 [5 B! L' @9 n! n' @} </P>  w+ @1 o2 ~* [! i
<>file://---------------透明窗体--------------------------" S8 U1 H$ H% a& F  o7 w
void __fastcall TForm1::Button1Click(TObject *Sender)
* W% D/ z% e1 s& R5 L{; k+ q  h7 a- ^1 v
  TRect *rctClient,*rctFrame;1 |7 c' B' `- M# |- L
  HRGN hClient,hFrame;* s' L/ @% y/ j! }: b, Z4 J$ X
  POINT *lpTL,*lpBR;. X+ u$ m9 B0 z" r0 w* C7 c7 [$ P
  rctFrame=new TRect;4 E0 g% p9 u8 o
  rctClient=new TRect;
3 u) h2 X6 I8 _6 f' d$ j- G. z  lpTL=new POINT;& L- D5 c& d+ E% @; b
  lpBR=new POINT;
5 ?2 Y* B" Y) h! O" }  GetWindowRect(Form1-&gt;Handle,rctFrame);2 I& i  C+ q' s' V0 c. ?
  ::GetClientRect(Form1-&gt;Handle,rctClient);
6 }5 w, T9 G1 I+ \" Y7 e  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
. ~0 R- ]5 S. o  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>4 P" [! x* S% u9 \; O+ J9 y
<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);. N3 x4 V  I: {1 \% T7 Y& h7 F4 T
  ::ScreenToClient(Form1-&gt;Handle,lpBR);
  a/ v& r' F, _6 b3 Y6 Q$ H  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;4 D0 y! K4 t- v
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;
$ I  `# ?$ k& K( w  k! N  rctClient-&gt;Left=abs(rctFrame-&gt;Left);8 Q6 l  h3 a; u  s8 |8 z6 o! p0 ~( k
  rctClient-&gt;Top=abs(rctFrame-&gt;Top);6 [' P% u. `) t* g- H
  rctClient-&gt;Right=rctClient-&gt;Right++ L4 ?9 k7 l& k/ z5 q( p
                  abs(rctFrame-&gt;Left);
* ~: `2 N% P* X  rctClient-&gt;Bottom=rctClient-&gt;Bottom+3 _" z& s- ^0 C  D$ O) D, S2 g
                    abs(rctFrame-&gt;Top);9 Z/ `  f6 K8 Q( D2 C% i
  rctFrame-&gt;Right=rctFrame-&gt;Right+
* z9 h& a/ V% @; C2 n                  abs(rctFrame-&gt;Left);
- Z! N) S# d+ M* i  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+
2 E  F7 Q( X& F( }- q$ F4 S7 X                  abs(rctFrame-&gt;top);6 V, E2 ~; @- G7 o
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>* }0 W% x" y- S, Q9 q+ Q
<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,% a! S, ]! b6 e  Y( ^
                        rctClient-&gt;Right,rctClient-&gt;Bottom);
  m; I5 D5 h$ ]9 u+ _; ^  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,* L3 k+ W/ f+ q* O7 }& @
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);1 x, c5 k. A; B. s. g# M; v5 T
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
1 o4 m& ?5 R# c2 P  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>
8 p0 k3 L. }4 @$ y8 v$ Z<>
! v9 T% }) Y/ C4 x5 ~+ V; J  delete rctFrame;
7 c4 ~( ~& N4 L) b+ G  delete rctClient;5 Z2 M% a1 [0 [+ s0 C' w2 p7 r0 x
  delete lpTL,lpBR;</P>
9 ?  R, x( a) U<>} </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-6-13 00:17 , Processed in 0.656323 second(s), 51 queries .

回顶部