MFC切换图片会有闪烁

哪位大神给我解决一下,用的cbuttonst加载两个图片,实现鼠标划过的功能。switch(m_nFlag){casesanwei:{m_btn1.EnableWindo... 哪位大神给我解决一下,用的cbuttonst加载两个图片,实现鼠标划过的功能。
switch (m_nFlag)
{
case sanwei:
{
m_btn1.EnableWindow();
m_btn1.SetIcon(IDI_ICON1,IDI_ICON2);
break;
}
case lianxi:
{
m_btn1.EnableWindow();
m_btn1.SetIcon(IDI_ICON3,IDI_ICON4);
break;
}
}
相当于在同一个位置加载了2个图片,其他两个是鼠标划过的图片,在切换这两个图片时,界面会出现闪烁,怎么去掉呢?也不知道我描述的清晰不,哪位大仙给我解决一下?万分感谢,没分了。
展开
 我来答
liuhuajun07
2014-03-04
知道答主
回答量:65
采纳率:0%
帮助的人:25.4万
展开全部
第一种方法:
MFC中,应用CBitmapButton就可以实现图形按钮。CBitmapButton类继承自CButton类。你可以为图形按钮指定四张图片,分别对应按钮的四种不同状态:
正常显示(Up),鼠标按下(Down),获得焦点(Focused),不可用(Disabled)。
正常显示(Up)状态的图片是必须的,其他三张图片是可选的。
还有,按钮的Style必须指定为BS_OWNERDRAW.。
第二种方法:GDI+中贴图的技术
stdafx.h:

#include <gdiplus.h>
using namespace
Gdiplus;
#pragma comment( lib, "gdiplus.lib"
)

TestButtonPng.h:

protected:
GdiplusStartupInput
m_gdiplusStartupInput;
ULONG_PTR gdiplusToken;

public:
virtual int
ExitInstance();

TestButtonPng.cpp:
BOOL
CTestButtonPngApp::InitInstance()
{
GdiplusStartupInput
gdiplusStartupInput;
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);

INITCOMMONCONTROLSEX
InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
//
将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC =
ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();
}

int
CTestButtonPngApp::ExitInstance()
{
// TODO:
在此添加专用代码和/或调用基类
GdiplusShutdown(gdiplusToken);

return
CWinApp::ExitInstance();
}
BOOL CMyButton::LoadStpImage(LPCWSTR normal, LPCTSTR mask, LPCTSTR
pType)
{
m_pStdImage = new CGdiPlusBitmapResource;

bool ret =
m_pStdImage->LoadFromFile(normal);//,
pType);

m_bMask.DeleteObject();

if(mask != "")
{
HBITMAP
hBitmap=
(HBITMAP)::LoadImage(NULL,mask,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
if
(hBitmap == NULL)
{
return
FALSE;
}

m_bMask.Attach(hBitmap);
if (hClipRgn)
DeleteObject(hClipRgn);
hClipRgn = CreateRgnFromBitmap(m_bMask,
RGB(255,255,255));
if (hClipRgn)
{
SetWindowRgn(hClipRgn,
TRUE);
SelectClipRgn((HDC)GetDC(),hClipRgn);
SetWindowPos(NULL,0,0,GetBitmapWidth(m_bMask),GetBitmapHeight(m_bMask),SWP_NOZORDER|SWP_NOMOVE);//设置按钮大小
}

}
return
ret;
}

调用的时候这样写
CString nomp;//png图片路径
CString
headp;//bmp图片路径
...
LPCWSTR pChar = 0;
USES_CONVERSION;
pChar =
A2CW((LPCSTR)nomp);
m_MyButton->LoadStpImage(pChar, headp,
_T("PNG"));
m_MyButton->ShowWindow(SW_SHOW);
追问
我知道你说的第一种,我想要实现鼠标划过图标时,图片有变化,cbitmapbutton根本实现不了这种功能,我上网查了一下,说除非重写cmousemove,我不会,你会?
酸落啊4
2014-03-03 · TA获得超过138个赞
知道答主
回答量:212
采纳率:0%
帮助的人:68.2万
展开全部
方案1:重写m_btn1成员变量的类。
重写该类的onErasebackground()方法,直接return true.就可以了。
方案2:
如果觉得重写麻烦,
那就把响应方法,放到OnPaint()函数中去,避免刷新。
追问
我在网上找了方法,我那个m_btn1,是用那个cbuttonst定义的,然后我把cbuttonst中的onErasebackground,直接return true了,还是不好使
你说的第二个方案,我没看明白,什么意思,什么响应方法,放到谁的onpait中,是cbuttonst的,还是放到我切换图片的这个类的onpaint中
追答
最好用消息通知吧,后台画好图片再刷新。

主要是更换图片和系统窗口绘制不同步引起的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式