新建一个位图按钮类,添加一个这样的函数。
void DrawImage()
{
CPaintDC dc(this); 
         CBitmap myBitmap;
myBitmap.LoadBitmap(IDB_BITMAP1); 
CDC MemDC; 
         MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=MemDC.SelectObject (&myBitmap); 
         dc.StretchBlt(0,0,20,20,&MemDC,0,0,16,16,SRCCOPY;   MemDC.SelectObject ( pOldBitmap );
  
} Create一个对象,并显示出按钮,在另外一个按钮的单击事件中 调用DrawImage();这个按钮是不会显示图片的,怎么回事?代码有错?在代码里面加入
Invalidate(TRUE);InvalidateRect..ReDrawWindow都是无效的,在OnDrawItem里面加入上面代码也是无效的,我应该怎么解决?

解决方案 »

  1.   

    我上面的copy错了,代码里面本来都是dc的,现在改回&dc,也还是不行
      

  2.   

    CPaintDC一般用于OnPaint()消息处理,你改用CClientDc.
    建议换
    pDC->DrawState
    试一下。
      

  3.   

    把CClientDC也一样,我式过很多方法了。
    现在更怪了。我重载DrawItem,把上面代码加进去。重载PreSubClassWindow,把 ModifyStyle(0,BS_OWNERDRAW); 加进去。
    现在CImageButton *pBt;
    pBt=new CImageButton();
    pBt->Create("O",WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,rect,this,IDC_IMAGEBUTTON);
    pBt->ShowWindow(TRUE);
    结果产生的按钮看不见了。但这个按钮还可以响应信息。
      

  4.   

    HDC hBMDC;
    HBITMAP hBitmap,hBitmapOld;hBitmap=NULL;
    SetBkMode(hdc, TRANSPARENT);hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_PREPARE_2));//-1hBMDC = CreateCompatibleDC(hdc); 
    hBitmapOld=(HBITMAP)SelectObject(hBMDC,hBitmap); 
                
    StretchBlt(hdc,0,0,PIC_PREPARE_WIDTH,PIC_PREPARE_HEIGHT,hBMDC,0,0,
          PIC_PREPARE_WIDTH,PIC_PREPARE_HEIGHT,SRCCOPY);

    SelectObject(hBMDC,hBitmapOld);
    DeleteDC(hBMDC);
    DeleteObject(hBitmap);
      

  5.   

    设置按钮的属性,选择自己拥有(own)。
      

  6.   

    : canoe_eyes(阿里) ( ):我这个不是对话框的按钮
    lygfqy(风清扬) ( 发送消息会出现xxx错误。所以我放弃那种方式。
      

  7.   

    要在按钮上显示位图,要把按钮的风格设为 BS_OWNERDRAW。
    一般要显示三个位图,即缺省时,鼠标选中时和鼠标按下时。
    需要用到的消息有主窗体的 WM_DRAWITEM 消息,按钮的 WM_MOUSEMOVE、WM_MOUSELEAVE。如果用 MFC, 只是简单的显示位图,在按钮的属性中选择 Owner draw,在自定义按钮类的 OnPaint 中进行绘制,并且重载 DrawItem 方法即可。
      

  8.   

    bluebood7大哥,你是说必须重载WM_DRawItem.MouseMove,WM_MousLeave???