关于基于CWnd或者Win32的CreateWindow实现CMenu

bsplover 2011-08-25 06:20:09
各位好因为最近项目上需求加上微软的CMenu太过复杂、拓展性差,需要自己实现一个继承CWND或者WIN32窗口实现的Menu菜单控件(类似于QQ的右键弹出菜单),但一直都没有头绪,网上查找不到都是对CMenu使用Hook重画的例子(CodeProject基本都是继承CMenu或者Hook来实现)。请问各位有没有或者接触到菜单类控件实现的源代码。谢谢!
...全文
223 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ndy_w 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xianglitian 的回复:]
显示的时候用SetWindowPos设置SWP_NOACTIVATE属性
[/Quote]
那样焦点不对吧?键盘不能操作了
什么时候删除自己呢?
向立天 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ndy_w 的回复:]

对话框+自绘按钮
我做的时候有个问题,父窗口的active状态。因为我做的是弹出菜单,在对话框失活的时候删除自己,所以不能让父窗口保持激活状态。
应该是窗口属性没设好,dlg好像PreCreateWindow不会进去。后来一直没继续搞。
期待下。
[/Quote]
显示的时候用SetWindowPos设置SWP_NOACTIVATE属性
ndy_w 2011-08-26
  • 打赏
  • 举报
回复
对话框+自绘按钮
我做的时候有个问题,父窗口的active状态。因为我做的是弹出菜单,在对话框失活的时候删除自己,所以不能让父窗口保持激活状态。
应该是窗口属性没设好,dlg好像PreCreateWindow不会进去。后来一直没继续搞。
期待下。
alexmayer 2011-08-26
  • 打赏
  • 举报
回复
关注一下,等好的解决方案。
向立天 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]

用对话框+自绘按钮当菜单行不?
[/Quote]
此法可行
我做过
而且还是透明的
jacky_qiu 2011-08-26
  • 打赏
  • 举报
回复
希望对你有所帮助。 阿弥陀佛!



/****************************************************************************
几大主要问题:
1.通过处理WM_MOUSEACTIVATE,并返回MA_NOACTIVATE可以实现点窗口时不激活窗口(父窗口不会失去焦点)
2.CreateWindowEx时窗口的样式一定要有 WS_EX_TOPMOST 和 WS_POPUP ,并且设置窗口的父句柄。
3.用 ::ShowWindow(hWnd,SW_SHOWNOACTIVATE); 让窗口显示时无焦点
4.消息阻塞:用 GetMessage 来阻塞父窗口,不让代码继续往下执行直到菜单窗口消失为止。

未解决的问题:
1.菜单窗口不处于激活状态,所以未能收到键盘消息
2.窗口点击其他程序时,菜单不会自动消失
****************************************************************************/


/****************************************************************************
创建窗口 (不需要注册窗口类,只能创建一个)
****************************************************************************/
class CMyMenu
{
private:
static WNDPROC OldWndProc;
static LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
public:
static void CreateWnd(int x,int y,HWND PareWnd=NULL) //创建窗口函数
{
HWND hWnd = CreateWindowEx(WS_EX_TOPMOST,
_T("#32770"),
_T("Demo"),
WS_POPUP| WS_BORDER,
x,y,100,100,PareWnd,NULL,NULL,NULL) ;

::ShowWindow(hWnd,SW_SHOWNOACTIVATE);

//把hWnd的默认窗口过程替换为WindowProc,返回默认函数过程的函数指针
OldWndProc=(WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC, (LONG) (WindowProc));


MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
//点击的不是菜单窗口就返回
if ( msg.message==WM_LBUTTONDOWN || msg.message==WM_RBUTTONDOWN )
{
if ( msg.hwnd != hWnd )
::PostMessage(hWnd,WM_CLOSE,NULL,NULL);
}

TranslateMessage(&msg);
DispatchMessage(&msg);
}

}
};

WNDPROC CMyMenu::OldWndProc=NULL;
LRESULT CALLBACK CMyMenu::WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_LBUTTONDOWN:
{
::PostMessage(hWnd,WM_CLOSE,NULL,NULL);
}
break;

case WM_MOUSEACTIVATE:
return MA_NOACTIVATE ;

case WM_CLOSE:
DestroyWindow(hWnd);
break;

case WM_DESTROY:
PostQuitMessage(0); //会退出消息循环 GetMessage
break;

default:
return ::CallWindowProc(OldWndProc, hWnd, message, wParam, lParam); //如果我们没有处理的再交给原窗口默认处理
}
return 0;
}



void CDemoDlg::OnRButtonUp(UINT nFlags, CPoint point)
{

POINT pt;
::GetCursorPos(&pt);
CMyMenu::CreateWnd(pt.x,pt.y,m_hWnd) ;



CDialog::OnRButtonUp(nFlags, point);



bsplover 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]

用对话框+自绘按钮当菜单行不?
[/Quote]

是popup的吗?哪里有呢,谢谢
Eleven 2011-08-25
  • 打赏
  • 举报
回复
用对话框+自绘按钮当菜单行不?
bsplover 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgl7903 的回复:]

下载电驴的源代码参考下,里面的菜单就是对话框和静态框来实现的
[/Quote]
你好,那个代码我看了,电驴的其实就是一个模态对话框,不符合我的要求
我是需要像QQ那种POPUP的Menu菜单,谢谢你
bsplover 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgl7903 的回复:]

下载电驴的源代码参考下,里面的菜单就是对话框和静态框来实现的
[/Quote]
你好,是哪个CPP呢,里面文件太多了,找不到
bsplover 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgl7903 的回复:]

下载电驴的源代码参考下,里面的菜单就是对话框和静态框来实现的
[/Quote]
啊,是吗,谢谢了
zgl7903 2011-08-25
  • 打赏
  • 举报
回复
下载电驴的源代码参考下,里面的菜单就是对话框和静态框来实现的
bsplover 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangyt 的回复:]

自己实现菜单时,用CDialog的派生类来实现你说的菜单
[/Quote]

有没有这样的参考例子,找了一天没找到
一名程序员 2011-08-25
  • 打赏
  • 举报
回复
自己实现菜单时,用CDialog的派生类来实现你说的菜单
jjajun 2011-08-25
  • 打赏
  • 举报
回复
先用MFC新建一个过程,里面有你说的源代码。

15,979

社区成员

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

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