不规则窗体的源码,我试过了,可以,速度挺快。。

SSTS 2001-05-14 01:24:00
加精
以下源码是快速创建不规则窗体的,还可以移动。
//------------------------------------------------------------------------
//Unit1.h

#ifndef Unit1H
#define Unit1H
//------------------------------------------------------------------------
#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>
//---------------------------------------------------------------------------
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);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


//unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

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

BmpToRgn();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button == mbLeft)
{
ReleaseCapture();
Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
}
//---------------------------------------------------------------------------
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--;
}

//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();
}
}
//---------------------------------------------------------------------------

对啦,图片的背景色要相同。
图片在IMAGE1的属性里加,不是在运行期通过LoadFromFile()加的。。
...全文
271 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunfeifan 2001-11-15
  • 打赏
  • 举报
回复
不过有什么用呢!
HUANG_JH 2001-09-15
  • 打赏
  • 举报
回复
不错
gqxs 2001-08-19
  • 打赏
  • 举报
回复
学习
ThankU 2001-08-19
  • 打赏
  • 举报
回复
谢谢,ilovebcb@163.com
weenyboy 2001-05-14
  • 打赏
  • 举报
回复
weenyboy@sina.com
来一份谢谢
millet 2001-05-14
  • 打赏
  • 举报
回复
to SSTS(铁冰):
你为大家做了贡献,也没有什么好表示的,送你50分吧。分数本来不算什么,但是聊表敬意!

请到此处拿分:
http://www.csdn.net/expert/topic/43/43167.shtm
SSTS 2001-05-14
  • 打赏
  • 举报
回复
这样我就不用发EMAIL给你啦,你们自己粘吧!!
SSTS 2001-05-14
  • 打赏
  • 举报
回复
//---------------透明窗体--------------------------
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;

}
SSTS 2001-05-14
  • 打赏
  • 举报
回复
//--------------------(一)为窗体背景增加渐变色(蓝)---------------
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);
}
}
jackfar 2001-05-14
  • 打赏
  • 举报
回复
是吗??
SSTS 2001-05-14
  • 打赏
  • 举报
回复
人还不少吗!
我怎么记得下这么多的EMAIL啊。
我原以为不会有人要的。。
因为就像上上上。。。。。面那们说的网上到处都是啊。。
不过想要的我尽量给!
我很少上网。
jackfar 2001-05-14
  • 打赏
  • 举报
回复
共20分,不要误会,怎么转???斑竹帮忙把分转一下。






。。。。
jackfar 2001-05-14
  • 打赏
  • 举报
回复
zzzemail@sina.com
当然我出10分,呵呵。。。。。。。。 还有 谁?
APIer 2001-05-14
  • 打赏
  • 举报
回复
这种东西网络上真是到处都有,几乎c程序员都做过吧:)
soyoung 2001-05-14
  • 打赏
  • 举报
回复
大家应该建议版主给这样的兄弟加分,
如果可以,先从我身上出!!!

iflyinsun@263.net


soyoung 2001-05-14
  • 打赏
  • 举报
回复
非常感谢!
iflyinsun@263.net
yuyulily 2001-05-14
  • 打赏
  • 举报
回复
谢谢 yu.hermit@sina.com
luhongjun 2001-05-14
  • 打赏
  • 举报
回复
luhongjun@yeah.net
谢谢。
millet 2001-05-14
  • 打赏
  • 举报
回复
呵呵,给我也来一份吧。
the_millet@sina.com
logical 2001-05-14
  • 打赏
  • 举报
回复
给我一个份好吗?luo_programmer@163.net
加载更多回复(6)

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧