RT,首先我在OnPaint()函数中改变背景颜色,然后再贴图上去,可是没有成功,开始怀疑是改变背景颜色覆盖了贴上的图片,后来去掉了改变背景颜色的代码,还是不成功。
另外,如果在VC中设置按钮按下,正常,鼠标移上去的图片啊?我试过用捕获鼠标移动消息来贴图的方法,太麻烦了,有没有简便一些的方法啊,另外按钮按下去时,会在按钮的四周产生一个虚线框,大大地影响了美观,有没有办法解决啊

解决方案 »

  1.   

    OnPaint没有问题啊,估计是你载入图片有问题
    至于按钮,可以下载一个CButtonST吧,能满足你的需求
      

  2.   

    to flyelf:
    我现在用那个CBitmapButton来做,但出现了一个新的问题
    CBitmapButton是动态创建的,我需要得到窗口大小,所以必须在窗口创建后才能创建CBitmapButton
    你知道在CFormView中哪 个虚函数是在窗口创建后调用的吗?
      

  3.   

    在OnEraseBkgnd()中设置背景也可以贴图,实现是可以的
    BOOL CControlView::OnEraseBkgnd(CDC *pDC)
    {
    if( m_bitmap.m_hObject != NULL )
    {
    CDC tempDC;
    tempDC.CreateCompatibleDC(pDC);
    tempDC.SelectObject( &m_bitmap ); RECT rcClient;
    GetClientRect(&rcClient); CRgn rgnBitmap;
    CRect rcTmpBmp;//( rcItem );

    rcTmpBmp.right = rcClient.right; // We also need to check whether it is the last item
    // The update region has to be extended to the bottom if it is
    //if( nItem == rCtrlList.GetItemCount() - 1 )
    rcTmpBmp.bottom = rcClient.bottom; rgnBitmap.CreateRectRgnIndirect(&rcTmpBmp);
    pDC->SelectClipRgn(&rgnBitmap);
    rgnBitmap.DeleteObject();

    if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
    {
    pDC->SelectPalette( &m_pal, FALSE );
    pDC->RealizePalette();
    } //CRect rcFirstItem;
    //rCtrlList.GetItemRect(0, rcFirstItem, LVIR_BOUNDS);
    for( int i = 0; i < rcClient.right; i += m_cxBitmap )
    for( int j = 0; j < rcClient.bottom; j += m_cyBitmap )
    pDC->BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC, 
    0, 0,SRCCOPY );
    /*
    // Create a pruple brush. 
    CBrush Brush (RGB (128 , 128 , 128) ); 
     
    // Select the brush into the device context . 
    CBrush* pOldBrush = pDC->SelectObject(&Brush); 
     
    // Get the area that needs to be erased . 
    CRect rcClip ; 
    pDC->GetClipBox(&rcClip); 
    //Paint the area. 
    pDC-> PatBlt (rcClip.left , rcClip.top , 
    rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY ); 
     
    //Unselect brush out of device context . 
    pDC->SelectObject(pOldBrush ); */
    }
    // Return nonzero to half fruther processing . 
    return TRUE; }void CControlView::SetBKImage(UINT nIDResource)
    {
    SetBKImage( (LPCTSTR)nIDResource );
    }void CControlView::SetBKImage(LPCTSTR lpszResourceName)
    {
    if( m_bitmap.m_hObject != NULL )
    m_bitmap.DeleteObject();
    if( m_pal.m_hObject != NULL )
    m_pal.DeleteObject();


    HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
    lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION ); if( hBmp == NULL ) 
    return ; m_bitmap.Attach( hBmp );
    BITMAP bm;
    m_bitmap.GetBitmap( &bm );
    m_cxBitmap = bm.bmWidth;
    m_cyBitmap = bm.bmHeight;
    // Create a logical palette for the bitmap
    DIBSECTION ds;
    BITMAPINFOHEADER &bmInfo = ds.dsBmih;
    m_bitmap.GetObject( sizeof(ds), &ds ); int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount; // Create a halftone palette if colors > 256. 
    CClientDC dc(NULL); // Desktop DC
    if( nColors > 256 )
    m_pal.CreateHalftonePalette( &dc );
    else
    {
    // Create the palette RGBQUAD *pRGB = new RGBQUAD[nColors];
    CDC memDC;
    memDC.CreateCompatibleDC(&dc); memDC.SelectObject( &m_bitmap );
    ::GetDIBColorTable( memDC, 0, nColors, pRGB ); UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
    LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300;
    pLP->palNumEntries = nColors; for( int i=0; i < nColors; i++)
    {
    pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
    pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
    pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
    pLP->palPalEntry[i].peFlags = 0;
    } m_pal.CreatePalette( pLP ); delete[] pLP;
    delete[] pRGB;
    }
    Invalidate(); return;
    }
      

  4.   

    在OnInitialUpdate中设置背景图ID
    void CControlView::OnInitialUpdate()
    {
    CFormView::OnInitialUpdate();
    SetBKImage(IDB_BG26);
             //略
    }在FormView类中加入变量
    CPalette m_pal;
    CBitmap m_bitmap;
    int m_cxBitmap, m_cyBitmap;我已经应用到实际工程中,祝好运。
      

  5.   

    我现在用CBitmapButton,但执行到SubClassDlgItem()时老是出错,就是那个CWnd的指针不对
      

  6.   

    可以不用SubClassDlgItem(),给按钮设定一个CButton变量m_Button,然后修改其类型为CBitmapButton。
      

  7.   

    http://dev.csdn.net/article/9/9603.shtm