做了个无边框的对话框,最小化时,右击任务栏的任务按钮(不是托盘区域)无法弹出菜单,现在我想通过获得右击任务按钮的事件,来添加菜单。
请问右击任务栏的事件是什么呢?还有无边框对话框的最大化问题,我最大化时候是通过SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y))的,但是对话框不是最大化,而是全屏了,将任务栏都覆盖了~!
请问右击任务栏的事件是什么呢?还有无边框对话框的最大化问题,我最大化时候是通过SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y))的,但是对话框不是最大化,而是全屏了,将任务栏都覆盖了~!
解决方案 »
- 求思路与方向,反应时间检测评测
- 如何将Edit Control输入的内容转换成usinged char*
- Dll 无法调试 VS2005 ,急!!!!!!!!!!
- 如何HOOK DirectDraw中的Blt等绘图函数[分不够可加,顶者有分]
- 导入导出通讯录(addressbook) 200分立马送上
- 请问怎样给钩子处理函数传入一些额外的参数?
- 菜鸟问题啊,一台机子,一张网卡,怎么调网络程序啊?UP也有分哦!
- HMM-隐马尔可夫模型
- 打开文件有问题吗?
- dycdyc123兄请进!!!!!!!!!!!!!
- 在.cpp中我是这样使用CList列表变量的:CList<struct node ,struct node&> L; struct node *Nn=new (struct node);我想让这两个变量作为类的成员变量,我该怎么做啊?
- 上传问题 multipart/form-data
图标属性 m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;//图标属性
m_tnid.uCallbackMessage=MYWM_NOTIFYICON;//应用程序定义的回调消息ID
然后调用系统托盘的消息映射:
LRESULT CXXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case MYWM_NOTIFYICON:
//如果是用户定义的消息
if(lParam==WM_LBUTTONDBLCLK)
{
//鼠标双击时主窗口出现
// AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
this->ShowWindow(SW_SHOW);
}
else if(lParam==WM_RBUTTONDOWN) //鼠标右键单击弹出选单
{
CMenu menu;
menu.LoadMenu(IDR_MENU1); //载入事先定义的选单
CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
}
break;
case WM_SYSCOMMAND:
//如果是系统消息
if(wParam==SC_MINIMIZE)
{
//接收到最小化消息时主窗口隐藏
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
return 0;
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
///////////////////处理系统托盘的消息///////////////////////最重要的是添加一个头文件: #define MYWM_NOTIFYICON WM_USER+1
将Minimize Box和Maximize Box勾上就有最大化和最小化的按钮了
另外,SC_MAXIMIZE才是最大化窗口,SC_RESTORE是还原到正常状态,也就是你在资源编辑器里调整的对话框大小。
将System Menu勾上就有任务栏按钮的菜单了 ?
将Minimize Box和Maximize Box勾上就有最大化和最小化的按钮了 ?
怎么钩啊?我都将边框设置为无了,System Menu,Minimize Box和Maximize Box 都变灰了?怎么钩?
也可以有的,在你的对话框OnInitDialog中加入一句ModifyStyle(0, WS_SYSMENU)就可以了如果你的系统菜单中有“关于”菜单项,要加在在CMenu* pSysMenu = GetSystemMenu(FALSE)前 ModifyStyle(0, WS_SYSMENU);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
因为没有边框,所以最大化时会盖住整个屏幕如果不想盖住任务栏,在OnGetMinMaxInfo中设置最大尺寸,应该可以(这个没有测试过)
ModifyStyle(0,WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);最大化问题,你响应OnSize,加如下代码即可:
if (nType == 2)
{
CRect rect;
SystemParametersInfo(SPI_GETWORKAREA,0,(RECT*)rect,NULL);
rect.bottom -= 1;
MoveWindow(rect);
}
我的程序是无边框、无标题栏、的对话框。此时对话框已经是不能进行拖动大小的,
为了实现拖动改变大小,是我通过判断鼠标的位置,等让它实现了此功能。
代码是这样的:
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS));
PostMessage(WM_NCLBUTTONDOWN,HTTOP,MAKELPARAM(point.x, point.y));由于点击任务栏按钮没系统菜单,我在OnInitDialog()加入了ModifyStyle(0, WS_SYSMENU);系统菜单有了,OK了。
可是我现在进行拖动对话框改变大小的时候,大小改变不了了。
呵呵。这个怎么办??- -!
因需求我不能使用MoveWindow
恩,我也是通过判断鼠标是否落在窗口上,然后模拟消息WM_NCLBUTTONDOWN进行移动的。
但是我的对话框Border一定需要None,无边框的,选择了Resizingde不就右边框了?
afx_msg UINT OnNcHitTest( CPoint point );
if(point 在左边)
return HTLEFT;
else if(point.x 在右边)
return HTRIGHT;
else if(point 在下边)
return HTBOTTOM;
else
return CWnd::OnNcHitTest(point);
我的对话框Border一定需要None,无边框的。
我改变大小的方法是,通过判断,模拟发送PostMessage(WM_NCLBUTTONDOWN,HTTOP,MAKELPARAM(point.x, point.y))消息,不用movewindow()。不能ModifyStyle(0, WS_SYSMENU),因为ModifyStyle(0, WS_SYSMENU)之后我的WM_NCLBUTTONDOWN消息就没用了,就不能改变对话框的大小了如何右键任务栏任务按钮弹出菜单?左键任务栏任务按钮最小化与最大化的切换?
-----------------------------------------------------------------------------------------
ModifyStyle(0,WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);这句话人家都说了N遍了,你用没有试过啊?
这里又有个最大化的问题,最大化时会遮盖任务栏
最大化问题,你响应OnSize,加如下代码即可:
if (nType == 2)
{
CRect rect;
SystemParametersInfo(SPI_GETWORKAREA,0,(RECT*)rect,NULL);
rect.bottom -= 1;
MoveWindow(rect);
}
我的程序是无边框、无标题栏、的对话框。此时对话框已经是不能进行拖动大小的,
为了实现拖动改变大小,是我通过判断鼠标的位置,等让它实现了此功能。
代码是这样的:
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS));
PostMessage(WM_NCLBUTTONDOWN,HTTOP,MAKELPARAM(point.x, point.y));
---------------------------------------------------------------------------------
无边框,设置对话框Border->None。实现拖动的建议如下:
响应OnMouseMove,当鼠标移到边框上时,显示可以拖动,m_bCanMove = TRUE
响应OnLButtonDown,当m_bCanMove为TRUE是记录下鼠标按下的位置
响应OnLButtonUp,当是拖动窗口的时候,MoveWindow到新的位置
如果要有拖动的效果,在OnMouseMove中可以画拖动过程另:系统可以重载的消息最好别用PostMessage之类的来发送消息吧