C++BUILDER中一些实现界面效果的技巧。。不规则窗体等等。。

原创 2001年05月19日 00:47:00

以下源码是快速创建不规则窗体的,还可以移动。
file://------------------------------------------------------------------------
file://Unit1.h

#ifndef Unit1H
#define Unit1H
file://------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <ExtDlgs.hpp>
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


file://unit1.cpp
file://---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#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://---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{

BmpToRgn();
}
file://---------------------------------------------------------------------------

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->AutoSize=true;
Form1->AutoSize=true;
Form1->BorderStyle=bsNone;
TColor ColorKey=Image1->Canvas->Pixels[0][0];
int x,y;
int l,r;
POINT *a;
bool lb,rb;
HRGN WndRgn,TempRgn;

if((a=(POINT *)malloc(Width*2*(sizeof(POINT))))==NULL)
{
  ShowMessage("申请内存失败!");
  exit(0);
}

l=0;r=Image1->Height*2-1;
WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);

for(y=0;y<Image1->Height;y++)
{
  lb=true;
  for(x=0;x<Image1->Width+1;x++)
    if(Image1->Canvas->Pixels[x][y]!=ColorKey)
    {
      a[l].x=x;
      a[l].y=y;
      lb=false;
      break;
    }

  if(lb) a[l]=a[l-1];
  l++;
  rb=true;

  for(x=Image1->Width;x>=0;x--)
    if(Image1->Canvas->Pixels[x][y]!=ColorKey)
      {
        a[r].x=x;
        a[r].y=y;
        rb=false;
        break;
      }
  if(rb) a[r]=a[r+1];
  r--;
}

r=Image1->Height*2-1;
for(y=0;y<Image1->Height-1;y++)
{
  for(x=a[y].x;x<=a[r].x;x++)
    if(Image1->Canvas->Pixels[x][y]==ColorKey)
    {
      TempRgn=CreateRectRgn(x,y,x+1,y+1);
      CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR);
      DeleteObject(TempRgn);
    }
  r--;
}

file://TempRgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE);
TempRgn=CreatePolygonRgn(a,Image1->Height*2,WINDING);
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
DeleteObject(TempRgn);
delete a;
SetWindowRgn(Handle,WndRgn,true);
}

void __fastcall TForm1::Open1Click(TObject *Sender)
{
  if(OpenPictureDialog1->Execute())
  {
      Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
      BmpToRgn();
  }
}
file://---------------------------------------------------------------------------

对啦,图片的背景色要相同。
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。

file://--------------------(一)为窗体背景增加渐变色(蓝)---------------
void __fastcall TForm1::FormPaint(省略)
{
    AnsiString ww;int bb;
    ww=AnsiString(Form1->Width/256);
    TRect MyRect;
    MyRect.left=0;
    for(bb=0;bb<255;bb++)
    {
        Form1->Canvas->Brush->Color=(TColor)RGB(0,0,bb);
        MyRect.top=bb*(ww.ToInt());
        MyRect.right=Form1->Width;
        MyRect.bottom=(bb+1)*(ww.ToInt());
        Form1->Canvas->FillRect(MyRect);
    }
}

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->Handle,rctFrame);
  ::GetClientRect(Form1->Handle,rctClient);
  lpTL->x=rctFrame->Left;lpTL->y=rctFrame->Top;
  lpBR->x=rctFrame->Right;lpBR->y=rctFrame->Bottom;

  ::ScreenToClient(Form1->Handle,lpTL);
  ::ScreenToClient(Form1->Handle,lpBR);
  rctFrame->Left=lpTL->x;rctFrame->Top=lpTL->y;
  rctFrame->Right=lpBR->x;rctFrame->Bottom=lpBR->y;
  rctClient->Left=abs(rctFrame->Left);
  rctClient->Top=abs(rctFrame->Top);
  rctClient->Right=rctClient->Right+
                  abs(rctFrame->Left);
  rctClient->Bottom=rctClient->Bottom+
                    abs(rctFrame->Top);
  rctFrame->Right=rctFrame->Right+
                  abs(rctFrame->Left);
  rctFrame->Bottom=rctFrame->Bottom+
                  abs(rctFrame->top);
  rctFrame->Top=0;rctFrame->Left=0;

  hClient=CreateRectRgn(rctClient->Left,rctClient->Top,
                        rctClient->Right,rctClient->Bottom);
  hFrame=CreateRectRgn(rctFrame->left,rctFrame->Top,
                      rctFrame->Right,rctFrame->Bottom);
  CombineRgn(hFrame,hClient,hFrame,RGN_XOR);
  SetWindowRgn(Form1->Handle,hFrame,true);


  delete rctFrame;
  delete rctClient;
  delete lpTL,lpBR;

}

MFC界面编程1:GDI+实现不规则窗体

先来看一下实现的效果,下图中那个娃娃就是我们要实现的不规则窗体啦~ 1. GDI+配置及初始化(VS2013)VS2013上已经有了GDI+支持,不用单独下载安装包了。现在只需项目中引入gdiplu...
  • elaine_bao
  • elaine_bao
  • 2016年06月04日 23:04
  • 2135

Qt不规则界面及组件的实现

先来看一下界面效果:                      实际上界面是一个400*300,空白的部分是透明的,不显示的,完成这样一个界面有两种方法: 1::准备一张要显示的图片,和一张掩码图片,...
  • qq_16952303
  • qq_16952303
  • 2016年04月11日 12:47
  • 1028

QT5自定义界面(规则与不规则窗体)

QT5自定义界面,规则与不规则窗体
  • CSDN_SXL
  • CSDN_SXL
  • 2016年01月26日 13:42
  • 6853

QT实现不规则窗体和透明窗体

不规则窗体的实现有两种方式: 一种是设置窗体的掩码图像; 另一种是设置窗体背景透明,然后重写其绘图函数,将背景图绘制上去。   第一种方式: 首先要准备两张图像,一张是要...
  • qustdjx
  • qustdjx
  • 2014年07月18日 09:25
  • 1328

WPF创建不规则窗体并实现阴影效果

方法一:使用png图片作为窗体背景。 直接看代码好了:
  • Qian_F
  • Qian_F
  • 2014年06月06日 17:32
  • 5317

java实现不规则窗体

前段时间想弄个不规则窗体,就像游戏启动的那样。于是上网搜了一下,网上说的是用一个com.sun.awt.AWTUtilities类来实现,结果我发现这个类是JDK6里才有的,我用的是JDK1.8,根本...
  • qq_33222871
  • qq_33222871
  • 2016年02月23日 14:28
  • 368

[QT编程]QT实现不规则窗体和透明窗体

[QT编程]QT实现不规则窗体和透明窗体 不规则窗体的实现有两种方式: 一种是设置窗体的掩码图像; 另一种是设置窗体背景透明,然后重写其绘图函数,将背景图绘制上去。   第一种方式: ...
  • oMingZi12345678
  • oMingZi12345678
  • 2013年10月18日 16:16
  • 1398

DUILIB创建不规则窗体

声明:原始方法部分已经废弃,现在有更好的办法来实现DUILIB加载PNG图片,为保持学习的渐进性,我还是保留了原始方法部分的博文与代码,大家没有必要看原始部分了,直接看新方法部分吧; 新方法 ...
  • harvic880925
  • harvic880925
  • 2013年05月14日 15:00
  • 8047

Swing 不规则窗体的制作

终极解决之道 经过反复的研究探索,终于获得了一个完美的解决方法:不用shape、不用抓图、不用workaround,真正的、彻底的、完全的、随意的在桌面上任意绘图、涂鸦、撒野,真正的属于程序员的Fr...
  • weiioy
  • weiioy
  • 2013年08月23日 19:13
  • 1744

C++Builder 资料库

转自:  1.怎样在C++Builder中创建使用DLL  2.用C++Bulider在WIN.INI中保存信息  3.如何在C++Builder中检测硬件  4.C++Builder如何...
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2014年09月02日 14:16
  • 2333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++BUILDER中一些实现界面效果的技巧。。不规则窗体等等。。
举报原因:
原因补充:

(最多只允许输入30个字)