WM_SYSCOMMAND消息(点击窗口的系统菜单发送的消息)
2013-07-12 09:32
537 查看
从窗口系统菜单上发送该消息,实现窗口的最大化,最小化,移动,还原,移动等操作
假设在CWnd派生类中
如,关闭窗口SC_CLOSE
SendMessage(WM_SYSCOMMAND, SC_CLOSE, NULL);
最小化窗口SC_MINIMIZE
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);
窗口移动状态SC_MOVE
SendMessage(WM_SYSCOMMAND, SC_MOVE, NULL);
改变窗口状态还有其他的方法
如,更改窗口布局
WINDOWPLACEMENT lwndpl;
WINDOWPLACEMENT * lpwndpl;
lpwndpl=&lwndpl;
GetWindowPlacement(lpwndpl);
lpwndpl->showCmd=SW_SHOW;
SetWindowPlacement(lpwndpl);
客户区移动
在OnLButtonDown中添加如下代码:
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
FromHandle(pMsg->hwnd)->SendMessage(WM_SYSCOMMAND,SC_MOVE+1,0);
WM_SYSCOMMAND 消息使用技巧
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
TRACE(" nID = %x", nID);
if ( nID == SC_RESTORE && ::IsZoomed(m_hWnd) ) // 最大化时屏蔽"还原"
return;
if ( nID == 0x0f032 || nID == SC_MAXIMIZE) // 屏蔽双击标题栏
{
RECT rtScreen ={0};
if ( !SystemParametersInfo(SPI_GETWORKAREA, 0, &rtScreen, 0) )
return;
else
SetWindowPos(NULL, rtScreen.left, rtScreen.top,
rtScreen.right, rtScreen.bottom, 0);
return;
}
if ( nID == 0x0f012 || nID == SC_MOVE) // 屏蔽拖动标题栏 CFileException
return;
if ( nID == 0x0f032 ) // 屏蔽双击标题栏
return;
if ( nID == 0x0f006 || nID == 0x0f001 & nID == 0x0f003 & nID == 0x0f008) // 屏蔽改变大小
return;
if ( nID == ID_SYSTEM_MENU_DEFINE) // 系统关于菜单
PostMessage(WM_COMMAND, ID_APP_ABOUT, 0);
CFrameWnd::OnSysCommand(nID, lParam);
假设在CWnd派生类中
如,关闭窗口SC_CLOSE
SendMessage(WM_SYSCOMMAND, SC_CLOSE, NULL);
最小化窗口SC_MINIMIZE
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);
窗口移动状态SC_MOVE
SendMessage(WM_SYSCOMMAND, SC_MOVE, NULL);
改变窗口状态还有其他的方法
如,更改窗口布局
WINDOWPLACEMENT lwndpl;
WINDOWPLACEMENT * lpwndpl;
lpwndpl=&lwndpl;
GetWindowPlacement(lpwndpl);
lpwndpl->showCmd=SW_SHOW;
SetWindowPlacement(lpwndpl);
客户区移动
在OnLButtonDown中添加如下代码:
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
FromHandle(pMsg->hwnd)->SendMessage(WM_SYSCOMMAND,SC_MOVE+1,0);
WM_SYSCOMMAND 消息使用技巧
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
TRACE(" nID = %x", nID);
if ( nID == SC_RESTORE && ::IsZoomed(m_hWnd) ) // 最大化时屏蔽"还原"
return;
if ( nID == 0x0f032 || nID == SC_MAXIMIZE) // 屏蔽双击标题栏
{
RECT rtScreen ={0};
if ( !SystemParametersInfo(SPI_GETWORKAREA, 0, &rtScreen, 0) )
return;
else
SetWindowPos(NULL, rtScreen.left, rtScreen.top,
rtScreen.right, rtScreen.bottom, 0);
return;
}
if ( nID == 0x0f012 || nID == SC_MOVE) // 屏蔽拖动标题栏 CFileException
return;
if ( nID == 0x0f032 ) // 屏蔽双击标题栏
return;
if ( nID == 0x0f006 || nID == 0x0f001 & nID == 0x0f003 & nID == 0x0f008) // 屏蔽改变大小
return;
if ( nID == ID_SYSTEM_MENU_DEFINE) // 系统关于菜单
PostMessage(WM_COMMAND, ID_APP_ABOUT, 0);
CFrameWnd::OnSysCommand(nID, lParam);
相关文章推荐
- 学习 Message(22): WM_SYSCOMMAND 消息[六] : 系统菜单综合操作示例
- VC里OnPaint几点要注意的地方(没有invalidate,系统认为窗口没有更新的必要,于是就对发来的WM_PAINT消息不理不睬)
- 移动无边框窗体(设置标志位更流畅,或者发送WM_SYSCOMMAND和SC_MOVE + HTCAPTION消息)
- win32常用的消息WM_SYSCOMMAND - 系统命令消息
- 系统何时发送WM_PAINT消息
- WM_SYSCOMMAND Notification(WM_SYSCOMMAND 系统命令消息)应用
- Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)
- 用代码关闭程序的正确做法!---向窗口发送WM_CLOSE消息
- 模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转)
- 发送消息执行记事本的“另存为”菜单功能(通过WM_COMMAND控制使用别的程序的菜单命令)
- 学习 Message(21): WM_SYSCOMMAND 消息[五] : 点击关闭按钮让窗体最小化
- Delphi 实现无窗口移动(发WM_NCHITTEST消息计算,然后再发WM_SYSCOMMAND消息,带参数SC_DRAGMOVE)
- 用代码关闭程序的正确做法!---向窗口发送WM_CLOSE消息
- 发送给MDI客户窗口的消息MDI消息WM_MDICASCADE
- TForm.ShowModal只是接管消息循环,禁止外部键盘和鼠标输入到别的窗口,但并不封锁其它窗口继续获取消息(比如WM_TIMER消息仍可被发送到别的窗口上)
- Delphi主窗口任务栏菜单的问题(转发WM_SYSCOMMAND到Application)
- win32汇编:原来点击顶层菜单属于发送SYSCOMMAND消息啊!!!终于解决了!!!
- 系统何时发送WM_PAINT消息?
- delphi 发送鼠标点击消息到指定窗口
- WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效