问题如题:

解决方案 »

  1.   

    网友们帮我看看啊,我实在找不出来了
    代码如下:void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    { CString sCaption;
    HDC h_clientDC;
    CRect rect;
    CDC *pDC; h_clientDC = lpDrawItemStruct->hDC;
    pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    GetWindowText(sCaption);
    rect = lpDrawItemStruct->rcItem;

    pDC->SetBkMode(TRANSPARENT); PaintButton(lpDrawItemStruct->hDC);

    }
    HBITMAP MyButton::LoadImagFile(CString strFileName)
    {
    IImagingFactory *pImgFactory =NULL;  
        IImage *pImage =NULL;  
        CoInitializeEx(NULL,COINIT_MULTITHREADED); 
    HBITMAP hResult =0;  
        if   (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,  
                                         NULL,  
                                         CLSCTX_INPROC_SERVER,  
                                         IID_IImagingFactory,  
                                         (void   **)&pImgFactory)))  
    {  
         ImageInfo imageInfo;  
            if(SUCCEEDED(pImgFactory->CreateImageFromFile(strFileName,&pImage))  
    && SUCCEEDED(pImage->GetImageInfo(&imageInfo)))  
            {  
    CWindowDC dc(0);  
    CDC dcBitmap;  
    dcBitmap.CreateCompatibleDC(&dc);  
    hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);  
    if(hResult){  
    HGDIOBJ   hOldBitmap   =   dcBitmap.SelectObject(hResult);  
                    pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL);  
    dcBitmap.SelectObject(hOldBitmap);     
    }  
    pImage->Release();  
            } 
            pImgFactory->Release();  
    }
      //释放资源
        if(pImage != NULL)
         {
             pImage->Release();
             pImage = NULL;
         }    if(pImgFactory != NULL)
         {
             pImgFactory->Release();
             pImgFactory = NULL;
         }
    CoUninitialize(); 
    return hResult;
    }
    void MyButton::PaintButton(HDC h_destDC)
    {
    CRect cltRect;
    BITMAP bmp;
    HDC hDC; HBITMAP  jpgbmp; if(BUTTON_STATE==BUTTON_DOWN)
    {
    jpgbmp = LoadImagFile(m_strdown);
    }
    else if(BUTTON_STATE==BUTTON_UP)
    {
    jpgbmp = LoadImagFile(m_strup);
    } ::GetObject(jpgbmp, sizeof(bmp), &bmp);
    hDC = ::CreateCompatibleDC(NULL);
    SelectObject(hDC, jpgbmp);
    ::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(), 
    hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));
    ::DeleteObject(jpgbmp);
    ::DeleteDC(hDC);}void MyButton::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    BUTTON_STATE=BUTTON_UP;
    CButton::OnLButtonUp(nFlags, point);
    }
    void MyButton::OnLButtonDown(UINT nFlags, CPoint point) 
    { BUTTON_STATE=BUTTON_DOWN; CButton::OnLButtonDown(nFlags, point);
    }
      

  2.   

    窗口切换多次后引发错误,很有可能是在切换一个窗口后,在另一个窗口状态下你还在调用先前窗口的指针;
    或者是你先NEW了一个窗口指针,但是当再次切换到该窗口时,又再次NEW了次,这样就会出问题了。
    所以建议你检查下窗口指针的处理情况
      

  3.   

    其实不长,重点的代码就只有这个,帮我看看
    void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
    {
    CString sCaption;
    HDC h_clientDC;
    CRect rect;
    CDC *pDC;
    h_clientDC = lpDrawItemStruct->hDC;
    pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    GetWindowText(sCaption);
    rect = lpDrawItemStruct->rcItem;
    pDC->SetBkMode(TRANSPARENT);
    PaintButton(lpDrawItemStruct->hDC);
    }void MyButton::PaintButton(HDC h_destDC)
    {
    CRect cltRect;
    BITMAP bmp;
    HDC hDC;
    HBITMAP jpgbmp;
    if(BUTTON_STATE==BUTTON_DOWN)
    {jpgbmp = LoadImagFile(m_strdown);}
    else if(BUTTON_STATE==BUTTON_UP)
    {jpgbmp = LoadImagFile(m_strup);}
    ::GetObject(jpgbmp, sizeof(bmp), &bmp);
    hDC = ::CreateCompatibleDC(NULL);
    SelectObject(hDC, jpgbmp);
    ::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(),  
    hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));
    ::DeleteObject(jpgbmp);
    ::DeleteDC(hDC);
    }
      

  4.   

    CWindowDC dc(0);   
    CDC dcBitmap;   
    dcBitmap.CreateCompatibleDC(&dc);   这个需要释放 dcBitmap.Delete(); hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);   
    if(hResult){   
    HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult);   
      pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL);   
    dcBitmap.SelectObject(hOldBitmap); 
      

  5.   

    HBITMAP oldBmp = SelectObject(hDC, jpgbmp);
    ::TransparentImage(h_destDC, 0, 0, cltRect.Width(), cltRect.Height(),  
    hDC, 0, 0, cltRect.Width(), cltRect.Height(), RGB(255,255,255));SelectObject(hDC, oldBmp);
    ::DeleteObject(jpgbmp);
    ::DeleteDC(hDC);
      

  6.   

      
    CDC dcBitmap;   
    dcBitmap.CreateCompatibleDC(&dc); 
    hResult =CreateCompatibleBitmap(dc.GetSafeHdc(),imageInfo.Width,imageInfo.Height);
    // hResult 需要释放 DeleteObject(hResult) ;  
    if(hResult){   
    HGDIOBJ hOldBitmap = dcBitmap.SelectObject(hResult);   
      pImage->Draw(dcBitmap.GetSafeHdc(),CRect(0,0,imageInfo.Width,imageInfo.Height),NULL);   
    dcBitmap.SelectObject(hOldBitmap);