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个图片,其他两个是鼠标划过的图片,在切换这两个图片时,界面会出现闪烁,怎么去掉呢?也不知道我描述的清晰不,哪位大仙给我解决一下?万分感谢,没分了。 展开
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个图片,其他两个是鼠标划过的图片,在切换这两个图片时,界面会出现闪烁,怎么去掉呢?也不知道我描述的清晰不,哪位大仙给我解决一下?万分感谢,没分了。 展开
2个回答
展开全部
第一种方法:
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);
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,我不会,你会?
展开全部
方案1:重写m_btn1成员变量的类。
重写该类的onErasebackground()方法,直接return true.就可以了。
方案2:
如果觉得重写麻烦,
那就把响应方法,放到OnPaint()函数中去,避免刷新。
重写该类的onErasebackground()方法,直接return true.就可以了。
方案2:
如果觉得重写麻烦,
那就把响应方法,放到OnPaint()函数中去,避免刷新。
追问
我在网上找了方法,我那个m_btn1,是用那个cbuttonst定义的,然后我把cbuttonst中的onErasebackground,直接return true了,还是不好使
你说的第二个方案,我没看明白,什么意思,什么响应方法,放到谁的onpait中,是cbuttonst的,还是放到我切换图片的这个类的onpaint中
追答
最好用消息通知吧,后台画好图片再刷新。
主要是更换图片和系统窗口绘制不同步引起的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询