如何实现弹出菜单的淡入淡出的效果

sghcpt 2013-08-26 02:01:07
各位,我要实现弹出菜单的淡入淡出效果。查看相关资料,好像可以使用函数SystemParametersInfo是实现,代码如下:
BOOL bRetCode = SystemParametersInfo(SPI_GETMENUFADE, 0, (LPVOID)&bSystemMenuFade, 0);
bRetCode = SystemParametersInfo(SPI_GETMENUANIMATION, 0, (LPVOID)&bSystemMenuAnimation, 0);

BOOL bSetFade = TRUE, bSetAnimation = TRUE;
bRetCode = SystemParametersInfo(SPI_SETMENUFADE, 0, (LPVOID)bSetFade, SPIF_UPDATEINIFILE);
bRetCode = SystemParametersInfo(SPI_SETMENUANIMATION, 0, (LPVOID)bSetAnimation, SPIF_UPDATEINIFILE);

int id = ::TrackPopupMenu(hPopMenu,TPM_VERNEGANIMATION|TPM_LEFTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,rc.left,rc.top,0,m_hWnd,NULL);
m_tMenu.RemoveMenu(hPopMenu);

bRetCode = SystemParametersInfo(SPI_SETMENUFADE, 0, (LPVOID)bSystemMenuFade, SPIF_UPDATEINIFILE);
bRetCode = SystemParametersInfo(SPI_SETMENUANIMATION, 0, (LPVOID)bSystemMenuAnimation, SPIF_UPDATEINIFILE);

但测试过,上面的代码不行,请问各位有什么办法实现弹出菜单淡入淡出效果了?
...全文
326 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-09-27
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
sghcpt 2013-08-27
  • 打赏
  • 举报
回复
to cjfdqchwh: 你好,谢谢你的回答。能否给出一个例子来看看,是如何实现的了?谢谢了。
cjfdqchwhj 2013-08-27
  • 打赏
  • 举报
回复
楼主,2楼的方法是可以实现菜单淡入淡出效果的,本人在以前有几个项目都是使用SetLayeredWindowAttributes 来实现这一功能的
sghcpt 2013-08-26
  • 打赏
  • 举报
回复
TO lzj891013: 谢谢的回帖,我要实现的是弹出菜单的淡入淡出效果,而不是对话框的淡入淡出效果显示呀。
NPCHard 2013-08-26
  • 打赏
  • 举报
回复
对话框淡入的效果  这里使用了Windows2000的API函数SetLayeredWindowAttributes()实现淡入淡出效果, 该函数定义如下:  BOOL SetLayeredWindowAttributes(   HWND hwnd, // handle to the layered window 透明窗体的句柄  COLORREF crKey, // specifies the color key 颜色值   BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]  DWORD dwFlags // action 透明方式 );   dwFlags可以取两个值:            当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;            当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。           LWA_ALPHA = 0x2          LWA_COLORKEY=0x1       其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。   在使用时我们在OnInitalDialog()中添加
  m_hUser32= GetModuleHandle(_T("USER32.DLL"));    g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(m_hUser32, "SetLayeredWindowAttributes");   if (g_pSetLayeredWindowAttributes == NULL)     ::PostQuitMessage(0);   HWND hWnd = GetSafeHwnd();   LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;   ::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);  //关键是下面这两句  g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_tm, 2);   ::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); 在OnTimer()中添加:  g_pSetLayeredWindowAttributes(this->m_hWnd, 0, (BYTE)m_tm, 2);     ::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);//参考上面的程序  注:m_hUser32、g_pSetLayeredWindowAttributes定义为类的成员变量 使用结束后记得调用FreeLibrary()释放对DLL的使用 本程序在DestroyWindow()中释放 if(m_hUser32!=NULL)   ::FreeLibrary(m_hUser32);
  你可以参考一下 ,本人以前实现过。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧