回 帖 发 新 帖 刷新版面

主题:[请教]请教各位高手在BCB中如何创建不规则窗体啊

[请教]请教各位高手
在BCB中如何创建不规则窗体啊!!!

回复列表 (共4个回复)

沙发

利用API 函数

板凳

转贴一篇文章,请参考一下:


将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 楼

用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 楼

要程序的话来找我拿

适用Splash 或者
    About对话框

使用png图片显示,可以设定显示多少秒后关闭。

我来回复

您尚未登录,请登录后再回复。点此登录或注册