MFC界面编程2011年9月22日

本文介绍了一种通过编程方式实现窗口菜单栏、状态栏和标题栏的动态隐藏与显示的方法,并展示了如何给菜单项添加图标及修改多文档界面背景位图的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



隐藏菜单栏


//单击处理函数
void CHideMenuBarView::OnLButtonDown(UINT nFlags, CPoint point) 
{
//隐藏菜单栏
::SetMenu(AfxGetMainWnd()->m_hWnd, NULL);
CView::OnLButtonDown(nFlags, point);
}
//右击处理函数
void CHideMenuBarView::OnRButtonDown(UINT nFlags, CPoint point) 
{
//显示菜单栏
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME); //加载菜单
HMENU hMenu = (HMENU)menu; //类型转换
::SetMenu(AfxGetMainWnd()->m_hWnd, hMenu); //设置菜单
CView::OnRButtonDown(nFlags, point);
}






隐藏和显示状态栏


void CMainFrame::OnShow() 
{
//判断是否状态栏可见
if(!m_wndStatusBar.IsWindowVisible())
{
//如果是不可见的,设置为可见
m_wndStatusBar.ModifyStyle(0, WS_VISIBLE);
}
//使状态栏状态生效
    SendMessage(WM_SIZE);
}


void CMainFrame::OnHide() 
{
//判断是否状态栏可见
if(m_wndStatusBar.IsWindowVisible())
{
//如果是可见,设置为隐藏
m_wndStatusBar.ModifyStyle(WS_VISIBLE, 0);
}
//使状态栏状态生效
SendMessage(WM_SIZE);
}












隐藏和显示标题栏


void CMainFrame::OnMenuShowtitlebar() 
{
LONG style = GetWindowLong(m_hWnd, GWL_STYLE); //得到窗口类型
    style |= WS_CAPTION; //修改窗口类型,显示标题栏
    SetWindowLong(m_hWnd, GWL_STYLE, style); //设置窗口类型


//移动窗口使显示标题栏立即生效
    RECT winRect;
    GetWindowRect(&winRect);//得到窗口位置
    winRect.top--; //窗口下移
    MoveWindow(&winRect); //移动窗口
}


void CMainFrame::OnMenuHidetitlebar() 
{
LONG style = GetWindowLong(m_hWnd, GWL_STYLE); //得到窗口类型
    style &= ~(WS_CAPTION); //修改窗口类型,显示标题栏
    SetWindowLong(m_hWnd, GWL_STYLE, style); //设置窗口类型

//移动窗口使隐藏标题栏立即生效
    RECT winRect;
    GetWindowRect(&winRect);//得到窗口位置
    winRect.top++; //窗口上移
    MoveWindow(&winRect); //移动窗口
}








给菜多文档单选项前面添加位图




BOOL CIconMenuMDIDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;


// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_bitmap.LoadBitmap(IDB_BITMAP1);
    
    CMenu *pMenu;
    pMenu = CMenu::FromHandle(((CMultiDocTemplate *)m_pDocTemplate)->m_hMenuShared); // 获得文档菜单
//给菜单 文件->新建 添加图标
    pMenu->GetSubMenu(0)->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_bitmap, &m_bitmap);
    return TRUE;
}






给菜半单文档单选项前面添加位图


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;      // fail to create
}


if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
 sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;      // fail to create
}


// TODO: Delete these three lines if you don't want the toolbar to
//  be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);


bitmap.LoadBitmap(IDB_BITMAP1);//加载位图

//给菜单 文件->新建 添加图标
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0, MF_BYPOSITION, &bitmap, &bitmap);
return 0;
}








修改多文档界面的背景位图


#if !defined(AFX_BGWND_H__0776490A_FADF_442D_BBDD_EBAB2826EA1E__INCLUDED_)
#define AFX_BGWND_H__0776490A_FADF_442D_BBDD_EBAB2826EA1E__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BgWnd.h : header file
//


/////////////////////////////////////////////////////////////////////////////
// CBgWnd window


class CBgWnd : public CWnd
{
// Construction
public:
CBgWnd();


// Attributes
public:


// Operations
public:


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBgWnd)
//}}AFX_VIRTUAL


// Implementation
public:
virtual ~CBgWnd();


// Generated message map functions
protected:
//{{AFX_MSG(CBgWnd)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.


#endif // !defined(AFX_BGWND_H__0776490A_FADF_442D_BBDD_EBAB2826EA1E__INCLUDED_)








BOOL CBgWnd::OnEraseBkgnd(CDC* pDC) 
{
CRect rectClient; // 客户区
CDC dcMen; // 内存设备描述表 
CBitmap bmp; // 位图对象 
bmp.LoadBitmap(IDB_BITMAP1); // 从资源加载位图

BITMAP tmpBitmap; 
bmp.GetObject(sizeof(BITMAP), &tmpBitmap); 
CSize bmpSize(tmpBitmap.bmWidth, tmpBitmap.bmHeight); // 得到位图的大小 

dcMen.CreateCompatibleDC(pDC); // 创建兼容的设备描述表 
CBitmap *pOld=dcMen.SelectObject(&bmp); // 选入新的位图对象并保存旧的位图对象 
GetClientRect(&rectClient); // 取得客户区的大小 
// 从内存向屏幕复制位图对象 
pDC->StretchBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), 
&dcMen, 0, 0, bmpSize.cx, bmpSize.cy, SRCCOPY); 

dcMen.SelectObject(pOld); // 恢复旧的位图对象 
dcMen.DeleteDC(); // 删除内存设备描述表
return true;
}




void CBgWnd::OnSize(UINT nType, int cx, int cy) 
{
CWnd::OnSize(nType, cx, cy);
Invalidate();
}














int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;


// 把m_wndBg子类化为主窗口的客户窗口
if(!m_wndBg.SubclassWindow(m_hWndMDIClient))
{
TRACE("Fail to subclass MDI client window\n");
return -1;
}

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;      // fail to create
}


if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
 sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;      // fail to create
}


// TODO: Delete these three lines if you don't want the toolbar to
//  be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);


return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值