我有一张PNG图片,边缘是透明的,其他的地方不透明。将这幅图片作为对话框的背景时,其他地方显示正常,但是边缘变成了黑色,不知道有没有办法解决这个问题?

解决方案 »

  1.   

    贴代码?
    你是在什么函数中贴图的?
    OnPaint? OnEraseBkgnd ?
      

  2.   

    lz是不是想让PNG透明不显示,我也在找,但是我试过了BMP可以,PNG试了效果和你一样,我用的是CRgn
    搞的。大家有解决方法发我一份啊[email protected]
      

  3.   

    png图片是这样的,你用微软自带的那个画图工具打开,就是绘制到对话框上的效果。
    如果你要显示正常,用gdi+绘制。
      

  4.   

    BOOL CResManager::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: Add your message handler code here and/or call default CRect rect;
    GetClientRect(&rect); //利用颜色过滤四角
    //CBrush brush;
    //brush.CreateSolidBrush(RGB(255,0,0));
    //pDC->FillRect(&rect, &brush);
    //brush.DeleteObject();
    //this->SetLayeredWindowAttributes(RGB(255,0,0), 255, LWA_COLORKEY); //------ 绘制工具栏部分的背景图片
    Graphics graphics(pDC->GetSafeHdc());
    int x = rect.left;
    int y = rect.top;
    int width = 100;
    int height = 100; graphics.DrawImage(m_pImageTitleLeft, Rect(x, y, width, height)); return TRUE; //return CDialog::OnEraseBkgnd(pDC);
    }其中,m_pImageTitleLeft是Image*指针,利用这个指针加载的Png图片。
      

  5.   

    显示透明图片,用gdi+可以。我试过,代码如下(OnEraseBkgnd中),看看对你有用吗?
    //使用gdi+显示图像
    Graphics graphics(pDC->m_hDC);
    Image image("文件路径",FALSE);
    graphics.DrawImage(&image,0,0);
      

  6.   

    显示透明图片,用gdi+可以。我试过,代码如下(OnEraseBkgnd中),看看对你有用吗?
    //使用gdi+显示图像
    Graphics graphics(pDC->m_hDC);
    Image image("文件路径",FALSE);
    graphics.DrawImage(&image,0,0);
      

  7.   


    你的代码和我的代码是一样的,应该不是代码的问题,主要是图片的透明部分,而且是渐变透明的,移动的时候会留下残影。所以我用了this->SetLayeredWindowAttributes(RGB(0,0,0), 255, LWA_COLORKEY);函数,将整个窗口的属性改了,一改之后边框变黑了。我的同事说把对话框改成透明属性,但是好像还是不行
      

  8.   

    使用二次缓存和upsatelayeredwindow 就可以解决.先绘制到MemDC中,再帖到当前窗口DC上,this->SetLayeredWindowAttributes(RGB(0,0,0), 255, LWA_COLORKEY); 会将整个图片设为完全透明效果,图片以外的部分会受到影响...下面代码供参考.void CGDIPNGDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    //MessageBox("aa");
    HDC hdcTemp = GetDC()->m_hDC;
    m_hdcMemory = CreateCompatibleDC(hdcTemp);
    HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp, m_BakWidth, m_BakHeight);
    SelectObject(m_hdcMemory, hBitMap);

    // m_Blend.SourceConstantAlpha=100;                              // 窗口透明度最大为255,最小为0
    HDC hdcScreen = ::GetDC(m_hWnd);
    RECT rct;
    GetWindowRect(&rct);
    POINT ptWinPos = {rct.left, rct.top};

    Graphics graph(m_hdcMemory);
    Rect destinationRect(0, 0, 1 * m_BakWidth, 1* m_BakHeight);
    graph.DrawImage(
    m_pImageBack,
    Rect(0, 0,  m_BakWidth,  m_BakHeight),  // destination rectangle 
    //destinationRect,
    0, 0,        // upper-left corner of source rectangle
    m_BakWidth,       // width of source rectangle
    m_BakHeight,      // height of source rectangle
    UnitPixel); //修改风格   
           graph.DrawImage(m_pImageTop,Pos_Top_x,Pos_Top_y);
       if (m_bOver)
       {
      graph.DrawImage(m_pImageTopc,Pos_Top_x-8,Pos_Top_y-9);
    }
       else if(m_bChe){
       graph.DrawImage(m_pImageTop,Pos_Top_x,Pos_Top_y);
       }
    SIZE sizeWindow={m_BakWidth,m_BakHeight};
    POINT ptSrc={0,0};
    DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
    if((dwExStyle&0x80000)!=0x80000)
    SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);
    UpdateLayeredWindow(m_hWnd, hdcScreen, &ptWinPos, &sizeWindow, m_hdcMemory, &ptSrc, 0, &m_Blend, 2);

    graph.ReleaseHDC(m_hdcMemory);
    ::ReleaseDC(m_hWnd,hdcScreen);
    hdcScreen=NULL;
    ::ReleaseDC(m_hWnd,hdcTemp);
    hdcTemp=NULL;
    DeleteObject(hBitMap);
    DeleteDC(m_hdcMemory);
               m_hdcMemory=NULL;

    }
    }
    int CGDIPNGDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CDialog::OnCreate(lpCreateStruct) == -1)
    return -1;

    // TODO: Add your specialized creation code here
    hFuncInst = LoadLibrary("User32.DLL"); 
    if(hFuncInst) 
    UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");
    else
    {
    AfxMessageBox("User32.dll ERROR!");
    exit(0);
    }
    //初始化gdiplus的环境
    // Initialize GDI+.
    m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
    m_Blend.BlendFlags=0; //nothingelseisspecial...
    m_Blend.AlphaFormat=1; //...
    m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA            // 透明度

    using namespace Gdiplus;            // 名称空间
     ImageFromIDResource(IDR_PNG2, "PNG", m_pImageBack);      // 读取资源中的PNG图片, 为自订义类形“PNG”
      ImageFromIDResource(IDR_PNG1, "PNG", m_pImageTop); 
      ImageFromIDResource(IDR_PNG3, "PNG", m_pImageTopc);
    m_TopWidth=m_pImageTop->GetWidth();
    m_TopHeight=m_pImageTop->GetHeight();
    Pos_Top_x=408;Pos_Top_y=11;  
    return 0;
    }
      

  9.   

    我有成功的exe   用的方法是  gdi+ 的  .drawimage()函数