请教一下位图按钮为什么显示不了图片?
新建一个位图按钮类,添加一个这样的函数。
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里面加入上面代码也是无效的,我应该怎么解决?
问题点数:0、回复次数:13Top
1 楼lblyy76(yibo)回复于 2003-08-04 08:23:12 得分 0
pDC改成&dc试一试Top
2 楼afxboy(afxboy)回复于 2003-08-04 08:26:29 得分 0
我上面的copy错了,代码里面本来都是dc的,现在改回&dc,也还是不行Top
3 楼laodie(张三)回复于 2003-08-04 08:45:18 得分 0
CPaintDC一般用于OnPaint()消息处理,你改用CClientDc.
建议换
pDC->DrawState
试一下。Top
4 楼afxboy(afxboy)回复于 2003-08-04 08:53:44 得分 0
把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);
结果产生的按钮看不见了。但这个按钮还可以响应信息。Top
5 楼DeautyFan(可可魔仙)回复于 2003-08-04 08:54:13 得分 0
HDC hBMDC;
HBITMAP hBitmap,hBitmapOld;
hBitmap=NULL;
SetBkMode(hdc, TRANSPARENT);
hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_PREPARE_2));//-1
hBMDC = 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);Top
6 楼afxboy(afxboy)回复于 2003-08-04 09:40:58 得分 0
大虾你上面的代码也不起作用啊。
Top
7 楼canoe_eyes(阿里)回复于 2003-08-04 09:44:52 得分 0
设置按钮的属性,选择自己拥有(own)。Top
8 楼lygfqy(风清扬)回复于 2003-08-04 09:47:53 得分 0
我想是不是应该发送消息,来实现位图的显示!
按钮控件有自己的绘制处理函数,所以自己些写的并不一定相应呢Top
9 楼afxboy(afxboy)回复于 2003-08-04 09:57:28 得分 0
: canoe_eyes(阿里) ( ):我这个不是对话框的按钮
lygfqy(风清扬) ( 发送消息会出现xxx错误。所以我放弃那种方式。Top
10 楼blueblood7()回复于 2003-08-04 10:02:05 得分 0
要在按钮上显示位图,要把按钮的风格设为 BS_OWNERDRAW。
一般要显示三个位图,即缺省时,鼠标选中时和鼠标按下时。
需要用到的消息有主窗体的 WM_DRAWITEM 消息,按钮的 WM_MOUSEMOVE、WM_MOUSELEAVE。
如果用 MFC, 只是简单的显示位图,在按钮的属性中选择 Owner draw,在自定义按钮类的 OnPaint 中进行绘制,并且重载 DrawItem 方法即可。Top
11 楼afxboy(afxboy)回复于 2003-08-04 10:30:51 得分 0
bluebood7大哥,你是说必须重载WM_DRawItem.MouseMove,WM_MousLeave???Top
12 楼afxboy(afxboy)回复于 2003-08-04 17:37:21 得分 0
55555555555555555,怎么这么简单的问题姐姐不了呢Top
13 楼afxboy(afxboy)回复于 2003-08-04 18:55:24 得分 0
这个问题朝难阿Top




