VC中怎么让窗口上的关闭功能变成最小化 不想让窗口关闭,因此,想在点击叉叉的时候,实现的是最小化的功能,或者让叉叉变成灰色也行请大家帮帮忙是不是需要重载什么函数? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 捕足WM_CLOSE的消息case WM_CLOSE: ShowWindow(hWnd, SW_MINIMIZE); 应该是OnSysCommand吧当nID==SC_CLOSE为关闭按钮 重载OnClose OnClose{ min();//最小化} 将关闭按钮变灰:OnInitDialog函数中 CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } 再给个方法新建消息处理函数OnNcHitTest(CPoint point) {if(CWnd::OnNcHitTest(point) ==HTCLOSE )return HTMINBUTTON;} 可以重载OnClose,也可以吧叉叉直接去掉。。 void CMYModalView::OnSysCommand(UINT nID, LPARAM lParam){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CFormView::OnSysCommand(nID, lParam); if(nID == SC_CLOSE) this->ShowWindow(SW_MINIMIZE); }这么写,实现不了最小化 截获WM_CLOSE消息case WM_CLOSE: PostMessage(WM_SYSCOMMAND,SC_MINIMIZE,0); Win32程序:case WM_CLOSE:ShowWindow(hWnd, SW_MINIMIZE);MFC:OnSysCommand当nID==SC_CLOSE为关闭按钮 利用OnSysCommand,添加如下代码到 OnSysCommandelse if(nID==SC_CLOSE ) { SendMessage(WM_NULL,0,0); DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,lParam); }利用OnClose:void CXXXXXXXXXXXDlg::OnClose() { // TODO: Add your message handler code here and/or call default SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);/* CDialog::OnClose();*/} 在SDI 下的实现代码,VC++6.0 测试成功!void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam){ if(nID==SC_CLOSE ) { SendMessage(WM_NULL,0,0); DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,lParam); } else CFrameWnd::OnSysCommand(nID,lParam);}你需要手动添加消息处理:ON_WM_SYSCOMMAND()afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 拦截WM_CLOSE也成功,void CMainFrame::OnClose() { // TODO: Add your message handler code here and/or call default SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);/* CFrameWnd::OnClose();*/}或者:void CMainFrame::OnClose() { SendMessage(WM_NULL,0,0); DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,0);}但是,有一个缺点:就是连菜单的关闭也变成最小化了。以上几个帖子都要在CMainFrame中定义消息处理函数 OnClose() 这里设断点,程序都不会停,怎么回事? MDI,测试成功,在CChildFrame里添加消息处理函数 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); ON_WM_SYSCOMMAND()void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam){ if(nID==SC_CLOSE ) { SendMessage(WM_NULL,0,0); DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,lParam); } else CMDIChildWnd::OnSysCommand(nID,lParam);} 这个方法会影响效率。simoreg 的方法可以,最好改成下面void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam){if(nID==SC_CLOSE ){nID = SC_MINIMIZE;} CMDIChildWnd::OnSysCommand(nID,lParam);} 如何让窗口最大化后在任务栏的上沿 用摄像头拍摄档案照片区,然后取出需要的照片 mfc中链接odbc数据源的简单问题! P2P终结者为什么能得到其他机器的网络带宽啊? CheckBox 想把那个勾改成其它字符,怎么做? 如何旋转椭圆? 如何在程序中动态地改变按钮上的Caption 小车控制系统传数据的问题,求教!! win10上,安装vc6 sp6不成功。 QueryInterface的最后一个参数为什么要void** ppv?为何不用void *pv? 用 VC2008操作OFFICE2007的问题 UDP Recvfrom重复读取相同的数据。
case WM_CLOSE:
ShowWindow(hWnd, SW_MINIMIZE);
当nID==SC_CLOSE为关闭按钮
{
min();//最小化
}
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
pSysMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
新建消息处理函数
OnNcHitTest(CPoint point)
{
if(CWnd::OnNcHitTest(point) ==HTCLOSE )
return HTMINBUTTON;
}
也可以吧叉叉直接去掉。。
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 CFormView::OnSysCommand(nID, lParam); if(nID == SC_CLOSE)
this->ShowWindow(SW_MINIMIZE);
}这么写,实现不了最小化
case WM_CLOSE:
PostMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
case WM_CLOSE:
ShowWindow(hWnd, SW_MINIMIZE);MFC:
OnSysCommand
当nID==SC_CLOSE为关闭按钮
{
SendMessage(WM_NULL,0,0);
DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,lParam);
}利用OnClose:
void CXXXXXXXXXXXDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
/* CDialog::OnClose();*/
}
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID==SC_CLOSE )
{
SendMessage(WM_NULL,0,0);
DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,lParam);
}
else
CFrameWnd::OnSysCommand(nID,lParam);
}
你需要手动添加消息处理:
ON_WM_SYSCOMMAND()
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
/* CFrameWnd::OnClose();*/
}或者:
void CMainFrame::OnClose()
{
SendMessage(WM_NULL,0,0);
DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,0);
}
但是,有一个缺点:
就是连菜单的关闭也变成最小化了。以上几个帖子都要在CMainFrame中定义消息处理函数
这里设断点,程序都不会停,怎么回事?
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
ON_WM_SYSCOMMAND()
void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID==SC_CLOSE )
{
SendMessage(WM_NULL,0,0);
DefWindowProc(WM_SYSCOMMAND,SC_MINIMIZE,lParam);
}
else
CMDIChildWnd::OnSysCommand(nID,lParam);}
这个方法会影响效率。simoreg 的方法可以,最好改成下面void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID==SC_CLOSE )
{
nID = SC_MINIMIZE;
}
CMDIChildWnd::OnSysCommand(nID,lParam);}