动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   程序开发 → 阅读文章

 C++BUILDER中一些实现界面效果的技巧

作者来源: 
阅读 数 661 人次 , 2006-4-29 10:13:00 


以下源码是快速创建不规则窗体的,还可以移动。
#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

#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--;
}

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


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

(/一)为窗体背景增加渐变色(蓝)---------------
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);
}
}


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;

}
  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:C++Builder如何响应消息及自定义消息
· 下一篇:BCB和Oracle结合构造C/S系统时千年问题
· Java多线程程序设计初步
· 基于UML的短消息计费系统的分析与设计
· 设计模式之Visitor
· 超线程多核心下Java多线程编程技术分析
· 整合的便捷!将SP2与Windows XP光盘合二为一


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077