对话框透明,只显示边框,看起来的效果就是一个矩形框。有checkbox控制是否显示,这个对话框怎么写?求大神指点。

解决方案 »

  1.   

    如果没有 Title 窗口就 移动不了了。void CTransDlgDlg::RgnSubtractCtrls(CRgn &rgn,int offX,int offY)
    {
    CWnd *pWnd=0;
    int ID[]={IDOK,IDC_BUTTON1,IDCANCEL};
    for(int jj=0;jj<sizeof(ID)/sizeof(int);jj++)
    {
    pWnd=GetDlgItem(ID[jj]);
    CRect rc;
    pWnd->GetWindowRect(&rc);
    ScreenToClient(&rc);
    rc.OffsetRect(offX,offY);
    CRgn ctlRgn;
    ctlRgn.CreateRectRgnIndirect(&rc);
    rgn.CombineRgn(&rgn,&ctlRgn,RGN_XOR);
    ctlRgn.DeleteObject();
    }
    } void CTransDlgDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    static BOOL sw=FALSE;
    if(!sw)
    {
    sw=TRUE;
    CRect rcWin;
    GetWindowRect(&rcWin);
    CRect rcClt;
    GetClientRect(&rcClt);
    ClientToScreen(&rcClt);
    //
    rcClt.OffsetRect(-rcWin.left,-rcWin.top);
    int offX=rcClt.left;
    int offY=rcClt.top;
    rcWin.OffsetRect(-rcWin.left,-rcWin.top);
    //
    CRgn tmp;
    tmp.CreateRectRgnIndirect(&rcClt);
    //
    RgnSubtractCtrls(tmp,offX,offY);
    //
    CRgn rgn;  
    rgn.CreateRectRgnIndirect(&rcWin);

    rgn.CombineRgn(&rgn, &tmp, RGN_DIFF);
    SetWindowRgn(rgn,TRUE);
    tmp.DeleteObject();
    rgn.DeleteObject();
    m_Trans.SetWindowText("不透明"); }
    else
    {
    sw=FALSE;
    SetWindowRgn(0,TRUE);
    m_Trans.SetWindowText("透明");
    }
    }BOOL CTransDlgDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    CRect rc;
    GetClientRect(&rc);
    pDC->FillSolidRect(&rc,RGB(255,200,200));
    return TRUE;
    //return CDialog::OnEraseBkgnd(pDC);
    }
      

  2.   

    m_Trans这个是什么类型的啊?
    不移动。不需要Title
      

  3.   

    CButton m_Trans;我的对话框上有 个 按钮
    int ID[]={IDOK,IDC_BUTTON1,IDCANCEL};
    这3个按钮 要 从 透明 rgn 减去,(即 3个按钮 不透明)
    m_Trans 就是 OnButton1() 
    1.窗口 减去 客户区。
    2.减去按钮
    3.主要:SetWindowRgn(rgn,TRUE);
      

  4.   

    OnNcPaint:
    {
    CDialog::OnNcPaint();// 先叫父类 画
    CWindowDC dc(this);
    Rect rcWin;
    GetWindowRect(reWin);
    rcWin.OffsetRect(-rcWin.TopLeft());
    CBrush br;
    br.CreateolidBrush(RGB(255,0,0));
    // 3 pixels
    dc.FrameRect(rcWin,&br);
    rcWin.DeflateRect(1,1);
    dc.FrameRect(rcWin,&br);
    rcWin.DeflateRect(1,1);
    dc.FrameRect(rcWin,&br);
    }