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