QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>以下源码是快速创建不规则窗体的,还可以移动。/ k. k3 @! v: N- k6 L
file://------------------------------------------------------------------------# q4 |# _( ]6 e- C7 X
<a>file://Unit1.h</A></P>2 `) |  v' F/ w- s( ~
<>#ifndef Unit1H: w# e; K# K, @" T
#define Unit1H/ a; O" _) h" D9 k9 N
file://------------------------------------------------------------------------
7 y0 c& N) i& y( T! m! N#include &lt;Classes.hpp&gt;
8 N$ X" M/ g4 h) `2 X#include &lt;Controls.hpp&gt;
" a0 _: Z* W, s7 ^5 ^9 d& M#include &lt;StdCtrls.hpp&gt;$ ~; K, j. I# }/ w0 `
#include &lt;Forms.hpp&gt;) k3 O. W/ }. d5 l# T8 d0 n9 t
#include &lt;ExtCtrls.hpp&gt;
, B: W( O2 \1 z9 A" _# P#include &lt;Graphics.hpp&gt;4 s/ b8 Z6 }0 }- j
#include &lt;Menus.hpp&gt;+ l! Z+ s- u8 V
#include &lt;Dialogs.hpp&gt;2 p1 s6 [! k: o8 ^- {
#include &lt;ExtDlgs.hpp&gt;/ [/ w3 Z' ]& c2 j) m: ~
file://---------------------------------------------------------------------------( X! N6 h" w& ^3 U( T& R# o
class TForm1 : public TForm1 H, l, e6 t+ f" R  {
{
( s- A, B  X. m' t__published:    // IDE-managed Components
5 ~. |4 z( F2 I2 r2 D; K/ F6 d. t        TImage *Image1;
5 V; j6 z0 T5 K) f        TPopupMenu *PopupMenu1;
; C7 @" p% I2 ^% @        TMenuItem *Exit1;/ T$ Z* h' _- A6 R; _
        TOpenPictureDialog *OpenPictureDialog1;
( _. ~( f4 p7 F        TMenuItem *Open1;5 Y6 a/ C  O+ v. @
        void __fastcall Exit1Click(TObject *Sender);
! K5 p6 R* B, {( q: i5 E        void __fastcall FormCreate(TObject *Sender);' O2 }3 C5 M4 Y, z" i! a& ^  v4 f5 Y
        void __fastcall Image1MouseDown(TObject *Sender,
8 j  X) K7 @) |          TMouseButton Button, TShiftState Shift, int X, int Y);
; _! F" y5 i  y* j        void __fastcall Open1Click(TObject *Sender);( ?( m, X; o, _* u2 f
private:    // User declarations' P" m  Q: d" Z' a
        void __fastcall BmpToRgn();
% N% V. Y# N; l4 y8 i# Opublic:        // User declarations' ~) X# d- u: Z: g( d
        __fastcall TForm1(TComponent* Owner);; a6 e; O; d  V/ N) X
};
: y# g) H1 b0 n: u" ^: Zfile://---------------------------------------------------------------------------
9 L" j" U; s3 Q9 t# x, |) l1 lextern PACKAGE TForm1 *Form1;( h8 a' u& g: {2 G
file://---------------------------------------------------------------------------
0 H$ p* J' _' }; p#endif</P>
$ ~5 }& R. I+ j1 B<>! l6 X0 U" j6 s3 W9 R! r0 I+ i
<a>file://unit1.cpp</A>' [2 X3 g6 c1 }; V6 Q* R* e4 z
file://---------------------------------------------------------------------------</P>0 P, [, k1 d& G  D3 g
<>#include &lt;vcl.h&gt;4 Z; s: f' G2 i. \
#pragma hdrstop</P>4 `% s8 U; ~8 F7 s" m( i6 |+ }
<>#include "Unit1.h"4 ~* Q4 x% ]  q; `3 P/ M
file://---------------------------------------------------------------------------
9 B! ~( y4 t$ v/ Q6 v7 @$ h) E7 Q#pragma package(smart_init)7 `' W* B* H6 U! e% M; U
#pragma resource "*.dfm"- o+ r* I+ O' x* T% ~% \- {
TForm1 *Form1;
8 [5 t3 C# g! ^1 Z0 Cfile://---------------------------------------------------------------------------/ A( Z  E0 j. S/ y6 u4 ~/ O
__fastcall TForm1::TForm1(TComponent* Owner)
( i) p! x! @0 R) q        : TForm(Owner)
7 }* e- a3 a- M/ N, o6 B{
2 ^- N/ U( J+ |6 A/ O! k5 B+ P% e}% }3 \& }2 D5 R0 r8 K
file://---------------------------------------------------------------------------% l# u) F2 |" w$ {- }
void __fastcall TForm1::Exit1Click(TObject *Sender)
+ N3 W4 ^$ p! }{$ j4 [! ]- Z, F" x0 T5 ~5 a
  Close();" T1 t+ s% E* X" \, ?- C
}
/ c8 A) C1 W: h  s8 d5 i2 u3 Ifile://---------------------------------------------------------------------------</P>
7 m4 V) B% v0 I0 V( |<>void __fastcall TForm1::FormCreate(TObject *Sender)4 y' E  ?8 \9 k  }6 Y5 Y1 |. K9 z
{</P>
) ~6 g# ]2 N. W6 M' D7 L<>BmpToRgn();9 ?7 V& p; N: J& r
}9 D3 _3 o0 i$ h8 J8 D% X
file://---------------------------------------------------------------------------</P>' `" i1 ^1 ]) |. @8 E8 `+ c5 C+ `
<>void __fastcall TForm1::Image1MouseDown(TObject *Sender,3 g. _( m/ I! g6 F# ^+ {
      TMouseButton Button, TShiftState Shift, int X, int Y)* J' ?' @0 |% e+ n& f. p
{
- {* R; j' |8 Kif(Button == mbLeft)
8 ]# ?5 S) [) }        {
( {) s: z2 _" C2 y                ReleaseCapture();! [- h: q; V4 U0 h8 `! t' a
                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);, F" z8 N$ a8 M7 k7 J. E8 j
        }
; L' D2 G9 v4 p  V; T}
1 Z% k1 a% x8 v6 @" \( Gfile://---------------------------------------------------------------------------% W' Z* }% ~: L5 G6 Z# g: q
void __fastcall TForm1::BmpToRgn()
3 U* ]4 f' _: @2 C% \8 S{
, c7 B2 \- Z% s5 J2 |Image1-&gt;AutoSize=true;1 D; ]* V- b! y
Form1-&gt;AutoSize=true;
# D$ [$ g& Q# {0 @6 b/ d' vForm1-&gt;BorderStyle=bsNone;
* o$ ~+ y7 h) V9 D4 n* HTColor ColorKey=Image1-&gt;Canvas-&gtixels[0][0];, H, @1 f2 ]. E1 M4 o( a2 l- T8 ]% A' @
int x,y;3 l( H9 K( m( G; Y' t# k
int l,r;
9 W3 q2 M  R. {; _) p: o2 _2 OPOINT *a;% A8 H( f( a" R
bool lb,rb;
9 [* @- Y9 V7 r1 u1 f* A/ A1 \HRGN WndRgn,TempRgn;</P>
1 W  h, U3 m# h5 u4 w5 @: ]. e/ T<>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)- K* u; _0 Z% k. Z6 V1 b+ j
{) H( O" L' t$ N- E( |) U9 V
  ShowMessage("申请内存失败!");* V# b4 A+ q: m; n3 W& w' S9 G3 ~
  exit(0);
9 L0 j4 G5 Q% D}</P>; C& f: @9 g9 g' Z
<>l=0;r=Image1-&gt;Height*2-1;! C% w" ^& G+ n) e8 G
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>
! x! m$ q4 R6 |9 Y<>for(y=0;y&lt;Image1-&gt;Height;y++)
% E5 W, A$ h- C, ]{
) C+ k: Y0 [! J; I3 U; i  lb=true;
: A' y1 [7 a4 K7 H; }  for(x=0;x&lt;Image1-&gt;Width+1;x++)
9 L* d! W& ]& X8 @' I    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
7 U3 S- @+ |. M" k    {
5 V7 X9 G( W. d      a[l].x=x;
" w/ q: d' G7 W" f6 U  J      a[l].y=y;1 }2 q) G7 v8 B# _
      lb=false;
* W$ s/ p: Z' m0 K9 n6 j      break;
$ i) F8 c( B8 h9 v    }</P>
5 ?9 \' M! x% g7 ?; Y<>  if(lb) a[l]=a[l-1];, @& @5 j: H/ W7 q2 S
  l++;
% _3 y, {9 u# T* |6 L  rb=true;</P>
2 f8 _" G9 v1 ?8 \  R- V<>  for(x=Image1-&gt;Width;x&gt;=0;x--)* V8 j! T) q% T. |1 x3 K9 |9 J
    if(Image1-&gt;Canvas-&gtixels[x][y]!=ColorKey)
0 ^* A, c: V( q# Z1 p      {  t6 Y# z$ I" }
        a[r].x=x;
& Q2 H' b# t/ X1 u3 r8 N. k6 U        a[r].y=y;
! R- _  K- K7 F. T/ Y        rb=false;
2 {7 ?$ }9 i( N9 f        break;
1 G$ _% g8 |, [6 ]1 C" c" Y4 N      }" k$ X3 `: T; S0 C
  if(rb) a[r]=a[r+1];) A; Y# n6 k/ H  C
  r--;+ I# y8 \2 m5 f9 K0 c$ T+ N' Q
}</P>/ p. d5 `  X4 o4 m) C2 f
<>r=Image1-&gt;Height*2-1;& M8 D; P5 j- g4 Y6 C
for(y=0;y&lt;Image1-&gt;Height-1;y++)7 i# n8 m) m# s% U+ }
{' G9 ?5 {! _! ]+ I7 @: H3 [
  for(x=a[y].x;x&lt;=a[r].x;x++)
2 o2 j, J$ g- B7 C# u    if(Image1-&gt;Canvas-&gtixels[x][y]==ColorKey)6 ^9 a7 y  U7 L1 A$ R" H
    {
# S0 B! L5 `# q      TempRgn=CreateRectRgn(x,y,x+1,y+1);
) T6 B3 O3 j1 x+ F      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
* e& T5 {; s0 N/ z) g3 v: e$ A1 I      DeleteObject(TempRgn);
5 E; h, s- ~0 Q+ {: q" ]9 R    }! V; A* c; j7 j$ v
  r--;
8 J, R& J- r3 G( Q# {}</P>
2 [4 V' O& N1 j5 G5 `<><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);$ p9 e( o" r( F7 |  C, o1 w( @
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
8 S. o8 b) \" _% G+ s9 t- \CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
. u0 n* P! F" h+ L8 p9 JDeleteObject(TempRgn);
: g2 m/ w0 g! Wdelete a;
8 J+ S# L" \7 Q+ M- QSetWindowRgn(Handle,WndRgn,true);
% ?( t; M" e* o}</P>0 v- N5 l' R  A1 H2 U& M
<>void __fastcall TForm1::Open1Click(TObject *Sender). @- P7 @3 R9 Z7 m
{
/ I# M4 S) K" W7 _7 V  Y  if(OpenPictureDialog1-&gt;Execute())2 w; A" d  @. [; D) \( k
  {( }5 ~/ D1 M+ r  f! n/ k& w
      Image1-&gticture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);2 `! k# @8 R0 e" D; _  J( E
      BmpToRgn();
! Z7 O/ ]' @. N/ @3 E  }
  i$ O5 |* {& r% W, I. @}- z( ^0 g3 y& G$ L
file://---------------------------------------------------------------------------</P>
5 Z4 x2 i2 \; L, w) V<>对啦,图片的背景色要相同。- q/ i& o( z7 J! e, @3 q/ R
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
" Q) T. r& X; ?# E<>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------$ ]% V6 U& d. M# f3 k
void __fastcall TForm1::FormPaint(省略)! \* `" X9 ?8 r. w* H6 J
{
/ d& @- D0 I/ {. O& Q' Y+ A, u    AnsiString ww;int bb;' ~0 b$ h. i  C5 ]& G/ W2 c
    ww=AnsiString(Form1-&gt;Width/256);
: F2 @% n, ^' B3 x) d9 A    TRect MyRect;
0 Y: Z+ F) {! r    MyRect.left=0;" B& H' Z6 |3 d# P# [; w
    for(bb=0;bb&lt;255;bb++)9 Q4 T5 e. w3 U. g$ s7 @2 h% l
    {
. A  O9 g7 S# j, n4 I        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);! C  P9 K, X5 z/ o& B# T+ e
        MyRect.top=bb*(ww.ToInt());
8 @/ W: u$ D; J6 u5 p- B        MyRect.right=Form1-&gt;Width;! s9 W8 r1 p6 d" p
        MyRect.bottom=(bb+1)*(ww.ToInt());& l2 G% b# y5 I
        Form1-&gt;Canvas-&gt;FillRect(MyRect);
9 j+ B+ Z1 D+ o' r    }
0 a) k* H2 M, }: v0 ^0 d# e% L; z} </P>! V& }4 B* e2 ~" \
<>file://---------------透明窗体--------------------------: @$ S& b3 E" s/ p
void __fastcall TForm1::Button1Click(TObject *Sender)! P8 F2 n3 G5 b3 t5 T/ O
{' [$ s6 D0 A7 b- ]" \3 U3 o  ?
  TRect *rctClient,*rctFrame;
% w2 m1 ]1 |% ^  HRGN hClient,hFrame;2 |5 [3 |$ G. I7 i( D9 J
  POINT *lpTL,*lpBR;
7 S# K1 Y2 z& b! i" j$ u% G; S  rctFrame=new TRect;
2 H7 @( B2 |! i$ K. B% f( J- @$ v' a+ a  rctClient=new TRect;
' K) U, p$ g" H% ~3 ~: x0 ^" C  lpTL=new POINT;
* @, P4 m' T0 _; e% m6 W* g2 {% @1 E9 u1 f  lpBR=new POINT;# {" `6 o6 S) @" z1 N
  GetWindowRect(Form1-&gt;Handle,rctFrame);
+ L: _6 g  D* G  ::GetClientRect(Form1-&gt;Handle,rctClient);6 X, `" B* \! [" b
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
" P, y7 c; Z+ U" Y$ Y7 k0 M+ o5 R  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>2 f5 m6 b8 Y. T# M" s$ {
<>  ::ScreenToClient(Form1-&gt;Handle,lpTL);; Z  X  w  S/ l/ j% y4 p
  ::ScreenToClient(Form1-&gt;Handle,lpBR);! I0 C6 p' t& T4 h" ^
  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;; |+ @6 ~% C2 Y- d, C7 H1 M+ x
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;# z. o  z5 V/ i& C  r& X3 z; `
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);7 R& l/ y# r" u; q+ n
  rctClient-&gt;Top=abs(rctFrame-&gt;Top);2 I2 c+ {& @7 N$ u" Q+ C
  rctClient-&gt;Right=rctClient-&gt;Right+
  |& l, x& d, a* E3 {) ^/ I                  abs(rctFrame-&gt;Left);
" u4 ]  y+ m6 |9 _3 H  rctClient-&gt;Bottom=rctClient-&gt;Bottom+3 v1 k5 J8 i- j( Q1 Z" f2 E
                    abs(rctFrame-&gt;Top);) X2 F4 `% K3 H! l/ Y% j
  rctFrame-&gt;Right=rctFrame-&gt;Right+
  ^) S. U, n9 n: S7 S7 C                  abs(rctFrame-&gt;Left);
, o& b4 _$ B: o( v4 E1 K) Q  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+
1 M, Y1 o7 L$ G6 }3 U                  abs(rctFrame-&gt;top);" z3 B/ [% f; S" U% @/ G( B
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>0 W% a6 V* G$ T8 r
<>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,$ }7 n7 \1 X- m; C# ?+ \) ?
                        rctClient-&gt;Right,rctClient-&gt;Bottom);3 G1 z( w& b& g6 O
  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,6 O7 ?; M$ D$ h! N0 I0 B; J
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);
* K, M; O4 J( @- j, l7 E, Z& D: l  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);" y; O. f5 Y; U5 s/ l8 c
  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>8 u9 d  `0 f* h7 {% a. z" a
<>4 G# S! O2 O5 C3 Q
  delete rctFrame;
' e' `7 n' j7 S1 O  delete rctClient;
. s9 q! U, P! t" p  delete lpTL,lpBR;</P>* d  x" q( `' n6 h2 G8 R% q
<>} </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-8-1 00:22 , Processed in 0.474771 second(s), 51 queries .

回顶部