主题:[请教]请教各位高手在BCB中如何创建不规则窗体啊
heminking
[专家分:30] 发布于 2006-12-31 18:34:00
[请教]请教各位高手
在BCB中如何创建不规则窗体啊!!!
回复列表 (共4个回复)
沙发
jd9945 [专家分:20] 发布于 2007-01-25 20:17:00
利用API 函数
板凳
jean [专家分:20] 发布于 2007-04-07 13:57:00
转贴一篇文章,请参考一下:
将Form裁切成为米老鼠形状窗口:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
/*----------------------------------------
//C++Builder专家社区www.3322ee.com原创文章
//转载请保留本版权信息,谢谢合作
----------------------------------------*/
//先取得窗口风格性质
DWORD dwStyle = ::GetWindowLong(Handle, GWL_STYLE);
//去除窗口的标题栏性质
dwStyle &= ~WS_CAPTION;
//再将无标题栏的风格重新设回窗口
::SetWindowLong(Handle, GWL_STYLE, dwStyle);
RECT r;
//取得指定窗口范围、位置
::GetClientRect(Handle, &r);
//建立两个椭圆形位置与范围
HRGN hRgn1 = ::CreateEllipticRgn(2, 2, r.right/6*2, r.bottom/6*2);
HRGN hRgn2 = ::CreateEllipticRgn(r.right/6*4, 2, r.right, r.bottom/6*2);
//再结合此两个椭圆形位置与范围
::CombineRgn(hRgn1,hRgn1,hRgn2,RGN_OR);
//另建立一个椭圆形位置与范围
HRGN hRgn3 = ::CreateEllipticRgn(r.right/6, r.bottom/6, r.right/6*5, r.bottom);
//再结合此两个椭圆形位置与范围
::CombineRgn(hRgn1,hRgn1,hRgn3,RGN_OR);
//设回指定窗口的显示范围
::SetWindowRgn(Handle, hRgn1, TRUE);
::SetProp(Handle, "region", hRgn1);
//将窗口设为橙色
/*----------------------------------------
//C++Builder专家社区www.3322ee.com原创文章
//转载请保留本版权信息,谢谢合作
----------------------------------------*/
Color = (TColor)RGB(255,200,140);
//并将关闭窗口的按钮位置居中
Button1->Left = (Width-Button1->Width)/2;
Button1->Top = (Height-Button1->Height)/2;
}
//---------------------------------------------------------------------------
//按住橙色区域,即可移动Form1
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{//释放鼠标的捕捉,并送出按住窗口移动,如同按住标题栏移动窗口的信息
::ReleaseCapture();
SNDMSG(Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
//---------------------------------------------------------------------------
//取代关闭窗口的功能
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
3 楼
jingzhongrong [专家分:0] 发布于 2007-04-25 14:09:00
用GDI+画
int __fastcall TForm1::SetTransparent(LPWSTR lpSkinFile, int nTran)
{
//Load picture use GDI+
m_Image = Gdiplus::Image::FromFile(lpSkinFile);
//改变窗体大小
Width = m_Image->GetWidth();
Height = m_Image->GetHeight();
//建立前景
HDC hdcTemp = GetDC(0);
m_hdcMemory = CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp,m_Image->GetWidth(),m_Image->GetHeight());
SelectObject(m_hdcMemory, hBitMap);
//Alpha值
if (nTran<0 || nTran >100)
nTran = 100;
m_Blend.SourceConstantAlpha = int(nTran * 2.55); // 1~255
//
HDC hdcScreen = ::GetDC(0);
RECT rct;
GetWindowRect(Handle, &rct);
//
POINT ptWinPos = {rct.left, rct.top};
Gdiplus::Graphics graph(m_hdcMemory);
// 63 63 72 75 6E 2E 63 6F 6D
graph.DrawImage(m_Image, 0, 0, m_Image->GetWidth(), m_Image->GetHeight());
//
SIZE sizeWindow = {m_Image->GetWidth(), m_Image->GetHeight()};
POINT ptSrc = {0, 0};
//设置窗口样式
DWORD dwExStyle = GetWindowLong(Handle, GWL_EXSTYLE);
if((dwExStyle & 0x80000) != 0x80000)
SetWindowLong(Handle, GWL_EXSTYLE, dwExStyle ^ 0x80000);
//显示alpha透明通道
BOOL bRet = UpdateLayeredWindow(Handle, hdcScreen, &ptWinPos,
&sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2);
graph.ReleaseHDC(m_hdcMemory);
ReleaseDC(0, hdcScreen);
hdcScreen = NULL;
ReleaseDC(0, hdcTemp);
hdcTemp = NULL;
DeleteObject(hBitMap);
DeleteDC(m_hdcMemory);
m_hdcMemory = NULL;
m_Image = NULL;
return bRet;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
BorderStyle = bsNone;
// 初始化 GDI+
GdiplusStartup(&m_GdiplusToken, &m_GdiplusStartupInput, NULL);
m_Blend.BlendOp = 0;
m_Blend.BlendFlags = 0;
m_Blend.AlphaFormat = 1;
m_Blend.SourceConstantAlpha = 255; // AC_SRC_ALPHA
if(FileExists(ExtractFilePath(Application->ExeName) +"\\About.png"))
{
if(FileExists(ExtractFilePath(Application->ExeName) + "\\Settings"))
{
TStringList *setting = new TStringList;
setting->LoadFromFile(ExtractFilePath(Application->ExeName) + "\\Settings");
value = StrToInt(setting->Strings[0]);
int i = StrToInt(setting->Strings[1]);
staytime = StrToInt(setting->Strings[2]);
if(i==0)
{
splash = false;
SetTransparent(WideString(ExtractFilePath(Application->ExeName)+"\\About.png"), 1);
now = 1;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); //top most
timer1->Enabled = true;
}
else
{
splash = true;
SetTransparent(WideString(ExtractFilePath(Application->ExeName)+"\\About.png"), 1);
now = 1;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); //top most
if(staytime <= 0 || staytime >= 60)
{
staytime = 5;
}
timer1->Enabled = true;
closing = false;
}
}
}
else
{
Close();
}
}
4 楼
jingzhongrong [专家分:0] 发布于 2007-04-25 14:10:00
要程序的话来找我拿
适用Splash 或者
About对话框
使用png图片显示,可以设定显示多少秒后关闭。
我来回复