C++实例 菜单操作


#include  
#include "menu.h"	//载入资源文件所使用之标头文件

class MyFrame : public CFrameWnd
{
private:
	CMenu MainMenu, *SysMenu, *PopMenu, * SubMenu;
	COLORREF color;
public:
	MyFrame()	//建构符
	{
		Create(NULL,	//产生标准视窗
					"Menu",	//视窗标题
					WS_OVERLAPPEDWINDOW|WS_VISIBLE,	//视窗样式
					rectDefault,	//视窗大小
					NULL,	//指向父视窗的指针
					MAKEINTRESOURCE(IDR_SMENU));	//使用选单的识别符

		SysMenu = GetSystemMenu(FALSE);	//取得系统选单
		SysMenu->AppendMenu(IDM_INSERT, MF_SEPARATOR);	//插入分隔线
		SysMenu->AppendMenu(MF_STRING, IDM_INSERT, "Insert by me!");
				//插入选项
		color = RGB(255,0,0);	//将点的颜色预设为红色
	}

	afx_msg void OnSwitchMenu()//当Switch Menu选项被选取时的回应函数
	{
		CMenu InsMenu;	//建立选单控件
	
		InsMenu.LoadMenu(IDR_INSMENU);	//载入选单资源
		MainMenu.LoadMenu(IDR_MAINMENU);	//载入选单资源

		MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu,
						"Color Menu");//增加一个选单

		SubMenu = MainMenu.GetSubMenu(1);	//取得第2个子选单的指针

		SubMenu->AppendMenu(MF_SEPARATOR);	//插入分隔线
		SubMenu->InsertMenu(IDM_CreateItem, MF_BYCOMMAND | MF_STRING,
						IDM_InsertItem, "Insert a Item");	//插入选项
		SubMenu->InsertMenu(IDM_CreateItem, MF_BYCOMMAND | MF_POPUP,
						(UINT) InsMenu.m_hMenu, "Insert a Submenu");	//插入子选单
		SetCheck();	//设定应被选取的选项

		SubMenu->InsertMenu(IDM_CreateItem, MF_BYCOMMAND | MF_SEPARATOR);
					//插入分隔线
		InsMenu.Detach();	//将选单资源与选单控件分离

		SetMenu(&MainMenu);	//设定应用程序所使用之选单
	}

	afx_msg void OnCreateItem()
	{		//当Dynamic Menu选单的Create Item选项被选取时的回应函数
		MainMenu.ModifyMenu(IDM_CreateItem,MF_BYCOMMAND,
							IDM_DeleteItem,"Delete Item");
		SubMenu = MainMenu.GetSubMenu(1);	//取得第2个子选单的指针
		SubMenu->AppendMenu(MF_STRING, IDM_NewItem, "New Item");
				//增加Create item选项
	}

	afx_msg void OnDeleteItem()	
	{		//当Dynamic Menu选单的Delete Item选项被选取时的回应函数
		MainMenu.ModifyMenu(IDM_DeleteItem,MF_BYCOMMAND,
							IDM_CreateItem,"Create Item");		
		SubMenu = MainMenu.GetSubMenu(1);	//取得第2个子选单的指针
		SubMenu->DeleteMenu(IDM_NewItem, MF_BYCOMMAND);	//删除选项
	}

	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point) 
	{		//按下鼠标右键时,将执行此成员函数产生弹出选单
		CMenu menu;

		menu.LoadMenu(IDR_POPMENU);	//载入选单资源

		PopMenu = menu.GetSubMenu(0);	//取得第1个选单的指针

		PopMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,
			point.x,point.y,
			this);	//建立弹出选单
		menu.Detach();
	}

	afx_msg void OnRed()	//当Color Menu中Red选项被选取时
	{
		SetUnCheck();	//取消原被打勾的选项
		color = RGB(255,0,0);	//设定画在画布上的颜色
		SetCheck();	//设定应被打勾的选项
	}

	afx_msg void OnGreen()	//当Color Menu中Green选项被选取时
	{
		SetUnCheck();
		color = RGB(0,255,0);
		SetCheck();
	}

	afx_msg void OnBlue()	//当Color Menu中Blue选项被选取时
	{
		SetUnCheck();
		color = RGB(0,0,255);
		SetCheck();
	}

	void SetCheck()	//判别color属性,将Color Menu中对应的选项打勾
	{
		switch(color)
		{
		case RGB(255,0,0) :
			MainMenu.CheckMenuItem(IDM_Red,MF_BYCOMMAND | 
								MF_CHECKED);	//将该选项打勾
			break;
		case RGB(0,255,0) :
			MainMenu.CheckMenuItem(IDM_Green,MF_BYCOMMAND | MF_CHECKED);
			break;
		case RGB(0,0,255) :
			MainMenu.CheckMenuItem(IDM_Blue,MF_BYCOMMAND | MF_CHECKED);
			break;
		}
	}

	void SetUnCheck()	//取消Color Menu中被打勾的选项
	{
		switch(color)
		{
		case RGB(255,0,0) :
			MainMenu.CheckMenuItem(IDM_Red,MF_BYCOMMAND | 
						MF_UNCHECKED);	//取消该选项打勾
			break;	
		case RGB(0,255,0) :
			MainMenu.CheckMenuItem(IDM_Green,MF_BYCOMMAND | MF_UNCHECKED);
			break;
		case RGB(0,0,255) :
			MainMenu.CheckMenuItem(IDM_Blue,MF_BYCOMMAND | MF_UNCHECKED);
			break;
		}
	}

	afx_msg void OnLButtonUp(UINT nFlags, CPoint point)
	{ ReleaseCapture(); }	//当鼠标左键放开后的回应函数,释放鼠标讯息接收权

	afx_msg void OnLButtonDown(UINT nFlags, CPoint point)
	{ SetCapture(); }	//当鼠标左键按下后的回应函数,取得鼠标讯息接收权

	afx_msg void OnMouseMove(UINT nFlags, CPoint point)
	{				//当鼠标移动时的回应函数
		if (this == GetCapture())	//判断鼠标光标是否在视窗之上
		{
			CClientDC aDC(this);	//建立一个画布
			aDC.SetPixel(point, color);	//在画布上画出颜色为color的点
		}
	}

	DECLARE_MESSAGE_MAP()	//声明讯息映射表
};

//建立MyFrame类别的讯息映射表
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
	ON_COMMAND(IDR_SwitchMenu, OnSwitchMenu)
	ON_COMMAND(IDM_CreateItem, OnCreateItem)
	ON_COMMAND(IDM_DeleteItem, OnDeleteItem)
	ON_COMMAND(IDM_Red, OnRed)
	ON_COMMAND(IDM_Green, OnGreen)
	ON_COMMAND(IDM_Blue, OnBlue)
	ON_WM_CONTEXTMENU()	//按下鼠标右键时,将呼叫OnContextMenu
			//回应鼠标讯息
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

class MyApp : public CWinApp	//应用程序类别
{
public:
	BOOL InitInstance()	//程序进入点
	{
		CFrameWnd *Frame = new MyFrame;
		m_pMainWnd = Frame;
		Frame->ShowWindow(SW_SHOW);	//显示视窗
		
		return true;
	}
} a_app;	//声明应用程序控件

你可能感兴趣的:(C/C++)