40上位机VC MFC最大最小化及关闭按钮使用与禁用
40上位机VC MFC最大最小化及关闭按钮使用与禁用
功能展示
窗口默认创建都会有最大最小化及关闭按钮,如果想让程序在处理某一功能时,禁止使用这三种按钮时,我们就得实现对三个按钮的屏蔽及恢复,我们当前例程就实现了这一功能,效果如图
要点提示 我们例程是通过 API函数GETWINDOWLONG和SETWINDOWLONG来改变窗口风格,设置最大化和最小化按钮的禁用及恢复的;至于关闭按钮我们通过系统菜单对菜单项的操作来实现;GetSystemMenu(); EnableMenuItem()函数的语法我们查阅MSDN获得 LONG GetWindowLong( HWND hWnd, // handle of window int nIndex // offset of value to retrieve ); hWnd窗口句柄 ; nIndex 大于0的偏移量; LONG SetWindowLong( HWND hWnd, // handle of window int nIndex, // offset of value to set LONG dwNewLong // new value ); dwNewLong 指定的新的值 实现功能 1.新建基于单文档的应用程序,建立六个菜单项关联六个函数用来设置三个按钮的六种状态;六个函数的函数体为 - void CMainFrame::OnMenuablemin() //使用最小化按钮
- {
- LONG Style;
- //获得窗口风格
- Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
- //设置新的风格
- Style |= WS_MINIMIZEBOX;
- ::SetWindowLong(m_hWnd,GWL_STYLE,Style);
- /* //重画窗口边框
- CRect Rect;
- GetWindowRect(&Rect);
- ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME);
- */
- }
- void CMainFrame::OnMenuablemax() //使用最大化按钮
- {
- LONG Style;
- //获得窗口风格
- Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
- //设置新的风格
- Style |= WS_MAXIMIZEBOX;
- ::SetWindowLong(m_hWnd,GWL_STYLE,Style);
- /* //重画窗口边框
- CRect Rect;
- GetWindowRect(&Rect);
- ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME);
- */
- }
复制代码- void CMainFrame::OnMenuableclose() //使用关闭按钮
- {
- //获得系统菜单
- CMenu *pMenu = GetSystemMenu(false);
- //获得关闭按钮ID
- UINT ID = pMenu->GetMenuItemID(pMenu->GetMenuItemCount()-1);
- //使关闭按钮可用
- pMenu->EnableMenuItem(ID,MF_ENABLED);
- }
- void CMainFrame::OnMenudisclose() //禁用关闭按钮
- {
- //获得系统菜单
- CMenu *pMenu = GetSystemMenu(false);
- //获得关闭按钮ID
- UINT ID = pMenu->GetMenuItemID(pMenu->GetMenuItemCount()-1);
- //使关闭按钮无效
- pMenu->EnableMenuItem(ID,MF_GRAYED);
-
- }
- void CMainFrame::OnMenudismin() //禁用最小化按钮
- {
- LONG Style;
- //获得窗口风格
- Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
- //设置新的风格
- Style &= ~(WS_MINIMIZEBOX);
- ::SetWindowLong(m_hWnd,GWL_STYLE,Style);
- /* //重画窗口边框
- CRect Rect;
- GetWindowRect(&Rect);
- ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME);
- */
- }
复制代码
- void CMainFrame::OnMenudismax() //禁用最大化按钮
- {
- LONG Style;
- //获得窗口风格
- Style = ::GetWindowLong(m_hWnd,GWL_STYLE);
- //设置新的风格
- Style &= ~(WS_MAXIMIZEBOX);
- ::SetWindowLong(m_hWnd,GWL_STYLE,Style);
-
- /* //重画窗口边框
- CRect Rect;
- GetWindowRect(&Rect);
- ::SetWindowPos(m_hWnd,HWND_TOP,Rect.left,Rect.top,Rect.Width(),Rect.Height(),SWP_DRAWFRAME);
- */
- }
复制代码我们来演示下功能实现的整个过程 源码及视频下载 (仅在电脑可见)
|