韩冰 发表于 2005-1-26 01:37

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

<P>以下源码是快速创建不规则窗体的,还可以移动。
file://------------------------------------------------------------------------
<a>file://Unit1.h</A></P>
<P>#ifndef Unit1H
#define Unit1H
file://------------------------------------------------------------------------
#include &lt;Classes.hpp&gt;
#include &lt;Controls.hpp&gt;
#include &lt;StdCtrls.hpp&gt;
#include &lt;Forms.hpp&gt;
#include &lt;ExtCtrls.hpp&gt;
#include &lt;Graphics.hpp&gt;
#include &lt;Menus.hpp&gt;
#include &lt;Dialogs.hpp&gt;
#include &lt;ExtDlgs.hpp&gt;
file://---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TImage *Image1;
        TPopupMenu *PopupMenu1;
        TMenuItem *Exit1;
        TOpenPictureDialog *OpenPictureDialog1;
        TMenuItem *Open1;
        void __fastcall Exit1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y);
        void __fastcall Open1Click(TObject *Sender);
private:    // User declarations
        void __fastcall BmpToRgn();
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
file://---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
file://---------------------------------------------------------------------------
#endif</P>
<P>
<a>file://unit1.cpp</A>
file://---------------------------------------------------------------------------</P>
<P>#include &lt;vcl.h&gt;
#pragma hdrstop</P>
<P>#include "Unit1.h"
file://---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
file://---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
file://---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
  Close();
}
file://---------------------------------------------------------------------------</P>
<P>void __fastcall TForm1::FormCreate(TObject *Sender)
{</P>
<P>BmpToRgn();
}
file://---------------------------------------------------------------------------</P>
<P>void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button == mbLeft)
        {
                ReleaseCapture();
                Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
        }
}
file://---------------------------------------------------------------------------
void __fastcall TForm1::BmpToRgn()
{
Image1-&gt;AutoSize=true;
Form1-&gt;AutoSize=true;
Form1-&gt;BorderStyle=bsNone;
TColor ColorKey=Image1-&gt;Canvas-&gt;Pixels;
int x,y;
int l,r;
POINT *a;
bool lb,rb;
HRGN WndRgn,TempRgn;</P>
<P>if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
{
  ShowMessage("申请内存失败!");
  exit(0);
}</P>
<P>l=0;r=Image1-&gt;Height*2-1;
WndRgn=CreateRectRgn(0,0,Image1-&gt;Width,Image1-&gt;Height);</P>
<P>for(y=0;y&lt;Image1-&gt;Height;y++)
{
  lb=true;
  for(x=0;x&lt;Image1-&gt;Width+1;x++)
    if(Image1-&gt;Canvas-&gt;Pixels!=ColorKey)
    {
      a.x=x;
      a.y=y;
      lb=false;
      break;
    }</P>
<P>  if(lb) a=a;
  l++;
  rb=true;</P>
<P>  for(x=Image1-&gt;Width;x&gt;=0;x--)
    if(Image1-&gt;Canvas-&gt;Pixels!=ColorKey)
      {
        a.x=x;
        a.y=y;
        rb=false;
        break;
      }
  if(rb) a=a;
  r--;
}</P>
<P>r=Image1-&gt;Height*2-1;
for(y=0;y&lt;Image1-&gt;Height-1;y++)
{
  for(x=a.x;x&lt;=a.x;x++)
    if(Image1-&gt;Canvas-&gt;Pixels==ColorKey)
    {
      TempRgn=CreateRectRgn(x,y,x+1,y+1);
      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
      DeleteObject(TempRgn);
    }
  r--;
}</P>
<P><a>Height*2,ALTERNATE">file://TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,ALTERNATE</A>);
TempRgn=CreatePolygonRgn(a,Image1-&gt;Height*2,WINDING);
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
DeleteObject(TempRgn);
delete a;
SetWindowRgn(Handle,WndRgn,true);
}</P>
<P>void __fastcall TForm1::Open1Click(TObject *Sender)
{
  if(OpenPictureDialog1-&gt;Execute())
  {
      Image1-&gt;Picture-&gt;LoadFromFile(OpenPictureDialog1-&gt;FileName);
      BmpToRgn();
  }
}
file://---------------------------------------------------------------------------</P>
<P>对啦,图片的背景色要相同。
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。</P>
<P>file://--------------------(一)为窗体背景增加渐变色(蓝)---------------
void __fastcall TForm1::FormPaint(省略)
{
    AnsiString ww;int bb;
    ww=AnsiString(Form1-&gt;Width/256);
    TRect MyRect;
    MyRect.left=0;
    for(bb=0;bb&lt;255;bb++)
    {
        Form1-&gt;Canvas-&gt;Brush-&gt;Color=(TColor)RGB(0,0,bb);
        MyRect.top=bb*(ww.ToInt());
        MyRect.right=Form1-&gt;Width;
        MyRect.bottom=(bb+1)*(ww.ToInt());
        Form1-&gt;Canvas-&gt;FillRect(MyRect);
    }
} </P>
<P>file://---------------透明窗体--------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TRect *rctClient,*rctFrame;
  HRGN hClient,hFrame;
  POINT *lpTL,*lpBR;
  rctFrame=new TRect;
  rctClient=new TRect;
  lpTL=new POINT;
  lpBR=new POINT;
  GetWindowRect(Form1-&gt;Handle,rctFrame);
  ::GetClientRect(Form1-&gt;Handle,rctClient);
  lpTL-&gt;x=rctFrame-&gt;Left;lpTL-&gt;y=rctFrame-&gt;Top;
  lpBR-&gt;x=rctFrame-&gt;Right;lpBR-&gt;y=rctFrame-&gt;Bottom;</P>
<P>  ::ScreenToClient(Form1-&gt;Handle,lpTL);
  ::ScreenToClient(Form1-&gt;Handle,lpBR);
  rctFrame-&gt;Left=lpTL-&gt;x;rctFrame-&gt;Top=lpTL-&gt;y;
  rctFrame-&gt;Right=lpBR-&gt;x;rctFrame-&gt;Bottom=lpBR-&gt;y;
  rctClient-&gt;Left=abs(rctFrame-&gt;Left);
  rctClient-&gt;Top=abs(rctFrame-&gt;Top);
  rctClient-&gt;Right=rctClient-&gt;Right+
                  abs(rctFrame-&gt;Left);
  rctClient-&gt;Bottom=rctClient-&gt;Bottom+
                    abs(rctFrame-&gt;Top);
  rctFrame-&gt;Right=rctFrame-&gt;Right+
                  abs(rctFrame-&gt;Left);
  rctFrame-&gt;Bottom=rctFrame-&gt;Bottom+
                  abs(rctFrame-&gt;top);
  rctFrame-&gt;Top=0;rctFrame-&gt;Left=0;</P>
<P>  hClient=CreateRectRgn(rctClient-&gt;Left,rctClient-&gt;Top,
                        rctClient-&gt;Right,rctClient-&gt;Bottom);
  hFrame=CreateRectRgn(rctFrame-&gt;left,rctFrame-&gt;Top,
                      rctFrame-&gt;Right,rctFrame-&gt;Bottom);
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
  SetWindowRgn(Form1-&gt;Handle,hFrame,true);</P>
<P>
  delete rctFrame;
  delete rctClient;
  delete lpTL,lpBR;</P>
<P>} </P>
页: [1]
查看完整版本: C++BUILDER中创建不规则窗体