MyMFC(2-6)菜单 CMyMFCView

// MyMFCView.cpp : CMyMFCView 类的实现
//

#include "stdafx.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MyMFC.h"
#endif

#include "MyMFCDoc.h"
#include "MyMFCView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMyMFCView

IMPLEMENT_DYNCREATE(CMyMFCView, CView)

BEGIN_MESSAGE_MAP(CMyMFCView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_PAINT()
	ON_WM_CHAR()
	ON_WM_TIMER()
	//	ON_COMMAND(IDM_TEST, &CMyMFCView::OnTest) //这是命令消息,它将菜单的ID号与命令响应函数关联起来。
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_32781, &CMyMFCView::OnYouJi)
	ON_UPDATE_COMMAND_UI(ID_HELLOW_32780, &CMyMFCView::OnUpdateHellow32780)
	ON_COMMAND(IDM_PHONE1, OnPhone1)
	ON_COMMAND(IDM_PHONE2, OnPhone2)
	ON_COMMAND(IDM_PHONE3, OnPhone3)
	ON_COMMAND(IDM_PHONE4, OnPhone4) 
END_MESSAGE_MAP()

// CMyMFCView 构造/析构

CMyMFCView::CMyMFCView()
: m_ptOrigin(0)
, m_bDraw(FALSE)
, m_ptOld(0)
, m_strLine(_T(""))
, m_ptOrigin1(0)
, m_nWidth(0)
, m_nIndex(-1)
, m_strPhoto(_T(""))
{
	// TODO:  在此处添加构造代码

}

CMyMFCView::~CMyMFCView()
{
}

BOOL CMyMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO:  在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return CView::PreCreateWindow(cs);
}

// CMyMFCView 绘制
//每次窗口重绘时都会发出WM_PAINT消息 
void CMyMFCView::OnDraw(CDC* pDC)  //由WM_PAINT消息产生的响应函数,可以实现:当窗口重绘时,字符和图像不会消失
{
	CMyMFCDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	// TODO:  在此处为本机数据添加绘制代码


/******************************************************************************************************************************************************/
    //显示输出的文字,并且窗口重绘时不会消失
	CString str("MFC Learning");
	pDC->TextOut(10, 50, str);	
	//还可以用LoadString来加载,在资源视图 - MyMFC.rc - String Table - 双击String Table,在最后写入(这是字符串资源),并会生成IDS_...号
	str.LoadString(IDS_STRING101);
	pDC->TextOut(50, 250, str);  



/******************************************************************************************************************************************************/
/*	//绘制路径层,用BeginPath和EndPath两个函数来实现。用处:如果希望整幅图形中某一部分与其他部分有所区别,就可以把其放置到一个路径层中
	//若果要用矩形框将输出的MFC Learning框起来,就得需要知道该字符串在窗口中的坐标值,已经知道了其左上角的坐标为(10,10),如何得知其右下角的坐标呢?
	//###CDC类为我们提供了一个GetTextExtent函数,可以获得一个字符创在屏幕上显示的宽度和高度,其返回值类型为CSize,所以右下角的坐标为(10+cx,10+cy)
	//注意之前的GetTextMetrics函数是获得设备描述表中当前字体的度量信息。而GetTextExtent是获得窗口中显示字符串的信息
	CString str("MFC Learning");
	pDC->TextOut(10, 100, str);
	CSize sz = pDC->GetTextExtent(str); //获得MFC Learning的cx,cy。注意该语句不能放到下面,因为下面的str值就变了
	str.LoadString(IDS_STRING101);
	pDC->TextOut(100, 250, str);
	pDC->BeginPath();
	pDC->Rectangle(10, 100, 10 + sz.cx, 100 + sz.cy); //一般绘制矩形框,用默认的白的画刷,会把内部填充覆盖掉。但是在路径层中绘制矩形,是没有影响的,不会覆盖。
	pDC->EndPath();  */

	//利用SelectClipPath函数,该函数的作用是把当前设置的路径层和设备描述表中已有的剪切区域按照一种指定的模式进行一个互操作
//pDC->SelectClipPath(RGN_DIFF); //###可以看到MFC Learning不会被下面所画的网格覆盖,这就是路径层的用处
	//把RGN_DIFF改为RGN_AND,则只有MFC Learning被网格覆盖。
		
	//绘制网格
/*	for (int i = 0; i < 300; i += 10)
	{
		pDC->MoveTo(0, i);
		pDC->LineTo(300, i);
		pDC->MoveTo(i, 0);
		pDC->LineTo(i, 300);

	} */
}


// CMyMFCView 打印

BOOL CMyMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CMyMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO:  添加额外的打印前进行的初始化过程
}

void CMyMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO:  添加打印后进行的清理过程
}


// CMyMFCView 诊断

#ifdef _DEBUG
void CMyMFCView::AssertValid() const
{
	CView::AssertValid();
}

void CMyMFCView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyMFCDoc* CMyMFCView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyMFCDoc)));
	return (CMyMFCDoc*)m_pDocument;
}
#endif //_DEBUG


// CMyMFCView 消息处理程序

//由添加WM_CREATE消息得到的响应函数OnCreate
int CMyMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码

/****************************************************************************************************/
	//添加按钮
	//Create函数中参数:
	//1.按钮的名称
	//2.按钮的控件风格,BS_DEFPUSHBUTTON为按键式,BS_AUTORADIOBUTTON为按钮上有一个圆圈,BS_AUTOCHECKBOX为按钮上有一个方块是附选项
	//3.按钮控件的大小和位置。该参数是RECT结构体,通过定义左上角和右下角两个点的坐标来定义一个矩形。(左上x,左上y,右下x,右下y)
	//4.指定按钮控件的父窗口,这是一个CWnd类型的指针。MFC中不再通过窗口句柄,而是通过一个与窗口相关的C++窗口类对象指针来传递窗口对象
	//5.指定按钮控件的表示
    //若果在Create第二个参数中添加 | WS_VISIBILE,这是就不需要在调用ShowWindow函数,就可显示该按钮。
//	m_btn.Create((CString)("按钮"), WS_CHILD | /*BS_AUTOCHECKBOX*/BS_DEFPUSHBUTTON, CRect(0, 0, 100, 100), this, 123); //由于this指针指定的是 CMyMFCView类,父窗口是视类窗口,所以产生在(0, 0, 100, 100)处,不会覆盖工具栏
//	m_btn.ShowWindow(SW_SHOWNORMAL);                                                               //如果把this改为GetParent(),这与在CMainFrame中创建的按钮位置是一样的,覆盖工具栏。
	//可见按钮的位置与其父窗口有关,而不是与创建它的代码所在的类有关。


	
/******************************************************************************************/
	//创建文本插入符
	//CreateSolidCaret(0, 0); //第一个参数是插入符的宽度,第二个是插入符的高度
	//ShowCaret(); //由于CreateSolidCaret函数创建的插入符初始时是隐藏的,所以用ShowCaret显示



/******************************************************************************************/
/*	//让光标的大小根据当前所选的字体的大小来变化
	//用GetTextMetrics函数可以得到设备描述表中当前字体的信息。它的参数类型为LPTEXTMETRIC结构体指针用于存储信息
	CClientDC dc(this);
	TEXTMETRIC tm; //该变量会被设备描述表中当前字体的信息来填充这个结构体
	dc.GetTextMetrics(&tm);
	CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight); //创建插入符
	ShowCaret(); */



/******************************************************************************************/
	//创建图形插入符,即光标为所建图形的样式
	//首先定义了成员变量bitmap
	bitmap.LoadBitmap(IDB_BITMAP2); //加载你所创建的位图
	CreateCaret(&bitmap); //创建图形插入符
	ShowCaret();  
	


/******************************************************************************************************************************************************/
	SetTimer(1, 100, NULL); //设置定时器,用于产生字幕平滑变色
	//1.指定一个非零值的定时器标志。这个标识将作为返回值返回
	//2.指定定时器的时间间隔。指定多长时间发送一次WM_TIMER消息,以毫秒为单位,1000即为1秒
	//3.一个函数指针,并且要求是一个回调函数(CALLBACK类型的),若有则会调用其函数;若设为NULL
	//则定时消息WM_TIMER会被放到应用程序的消息队列中,由响应的窗口函数OnTimer来处理



	return 0;
}


void CMyMFCView::OnLButtonDown(UINT nFlags, CPoint point) //当鼠标点击时,其坐标会保存在point中
{

	// TODO:  在此添加消息处理程序代码和/或调用默认值

/******************************************************************************************************************************************************/
	//鼠标左击弹出窗口,与API中的MessageBox函数少了第一个参数窗口句柄hWnd。
	//这是因为在MFC中在CWnd类中定义了一个HWND类型的成员变量m_hWnd,用于保存当前窗口的句柄,并且该成员变量具有public类型的访问权限.
	//一次可以直接使用该成员变量,而不再传递窗口句柄。
  //MessageBox((CString)"Clicked!!!", (CString)"标题栏name", MB_YESNO); //后两个参数可以缺省
	

	m_ptOrigin = point;  //获得鼠标点击时的坐标

	m_bDraw = TRUE;  //如果鼠标左击后则为真,用于画曲线

	m_ptOld = point; //用于画带边的扇形,保存值


	SetCaretPos(point);  //把插入符移动到当前鼠标左击的位置
	m_strLine.Empty();  //当插入符移动到别的位置后,之前成员变量m_strLine中保存的字符串应该清空
	m_ptOrigin1 = point;  //用于保存当前鼠标左键的位置




	CView::OnLButtonDown(nFlags, point);
}


void CMyMFCView::OnLButtonUp(UINT nFlags, CPoint point) //鼠标左击后的点保存在point中
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

/****************************************************************************************/
/*画直线的功能的五种方法*/

/*	//方法一:利用全局SDK函数实现用鼠标画直线,首先获得窗口的设备描述表(DC)
	HDC hdc;    //绘图,输出字,都是在DC上面,
	hdc = ::GetDC(m_hWnd);  //m_hWnd是公有的一个数据成员,意味窗口的句柄。用GetDC获得当前窗口设备的描述表
	MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
	//MoveToEx的参数:
	//1.设备描述表的句柄
	//2,3.鼠标左击down时处的x,y坐标
	//4.用于保存移动操作前鼠标的位置坐标,若不需要可设为NULL
	LineTo(hdc, point.x, point.y);//设备描述表的句柄,终点的坐标,即鼠标左击up处的坐标
	::ReleaseDC(m_hWnd, hdc);   */


/*	//方法二:利用MFC的CDC类实现画直线的功能
	CDC* pDC = GetDC();   //定义了一个CDC类型的指针,用GetDC获得当前窗口的设备描述表,用的是CWnd类的成员函数GetDC,而不是全局::GetDC
	pDC->MoveTo(m_ptOrigin); //m_ptOrigin保存鼠标左击down的位置
	pDC->LineTo(point); //point保存鼠标左击up的位置
	ReleaseDC(pDC);  */


/*	//方法三:利用MFC的CClientDC类实现画直线的功能
	//CClientDC类是派生于CDC类(上述的),所以当一个CClientDC对象在构造时,会调用内部的GetDC函数,
	//当对象的生命周期结束时,会自动调用ReleaseDC函数,所以不用再显示的调用他们了。
	CClientDC dc(GetParent()); //this改为GetParent可以再工具栏上面画线
	dc.MoveTo(m_ptOrigin);
	dc.LineTo(point);    */


/*	//方法四:利用MFC的CWindowDC类实现画直线的功能
	//可以把直线划到非客户区域中
	CWindowDC dc(GetParent());
	dc.MoveTo(m_ptOrigin);
	dc.LineTo(point);    */


/*	//方法五:可以把直线划到桌面窗口中
	CWindowDC dc(GetDesktopWindow());
	dc.MoveTo(m_ptOrigin);
	dc.LineTo(point);  */
	


/***************************************************************************************************/
/*	//画不同颜色,不同类型的直线
	CPen pen(PS_DOT, 1, RGB(255, 0, 0)); //用MFC提供的CPen类来创建画笔对象
	//CPen构造函数中的参数:
	//1.指定笔的线型,实线,点线,虚线等.点线和虚线只有在画笔的宽度小于1时才有效果。
	//2.指定笔的线宽
	//3.用RGB指定颜色
	//构造一个对象后,该对象并不会立刻生效,必须选入设备描述表中才会生效,利用SelectObject函数把对象选入设备描述表中
	CClientDC dc(this); //指定画板
	CPen* pOldpen = dc.SelectObject(&pen); //选入设备描述表
	dc.MoveTo(m_ptOrigin);
	dc.LineTo(point);
	dc.SelectObject(pOldpen);  //完成绘图后,把画笔设为原来的形式 */



/*********************************************************************************************************/
/*	//画刷CBrush画出来的是一个矩形区域,是填充的矩形,因为用的是FillRect函数
	CBrush brush(RGB(255, 0, 0));
	CClientDC dc(this);
	dc.FillRect(CRect(m_ptOrigin, point),&brush); //填充矩形区域,通过CRect类来构建矩形区域,CRect通过左上角和右下角两点来构造矩形区域
	//第二个参数&brush是指向用于填充矩形的画刷对象的指针,即上面定义的画刷  */

	
	
/*******************************************************************************************************/
/*  //利用画刷绘图,位图画刷。利用CBrush的一种构造函数CBrush aaa(CBitmap* pBitmap)
    //CBitmap类是位图类,所以要创建一个位图。在解决方案资源管理器—资源文件—双击*.rc文件—资源视图—右击*.rc文件夹—添加资源—Bitmap
	//绘制自己的位图,会生成默认的IDB_...号。
	//创建完CBitmap对象后,需要LoadBitmap或CreateBitmap或CreatrBitmapIndirect来初始化
	//可以用BOOL LoadBitmap(UINT nIDResource)来初始化,参数即使产生的IDB_...号

	CBitmap bitmap;
	bitmap.LoadBitmap(IDB_BITMAP1);
	CBrush brush(&bitmap);
	CClientDC dc(this);
	dc.FillRect(CRect(m_ptOrigin, point), &brush);  */


	
/****************************************************************************************/
/*	//画出来的是空矩形,只有矩形的边框,因为用的是Rectangle函数
	CClientDC dc(this);
	dc.Rectangle(CRect(m_ptOrigin, point)); //这时产生的矩形是用白画刷产生的,所以矩形重叠的时候会覆盖彼此,而不是透明的
	*/



/**********************************************************************************************/
/*	//透明画刷,画出的矩形不能够相互覆盖
	//由于CBbrush类并没有提供透明画刷,但是利用GetStockObject这个函数可以透明画刷句柄NULL_BRUSH
	//但GetStockObject函数获取的是一个画刷句柄,而我们绘画操作需要的是一个画刷对象
    //CBrush类提供了一个FromHandle函数,可以把画刷句柄转换为画刷对象

	CClientDC dc(this);
	CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //获得透明画刷
	//在使用FillRect函数绘制填充矩形的参数中提供了绘制使用的画刷dc.FillRect(CRect(m_ptOrigin, point), &brush),所以不再需要把画刷选入设备描述表中
	//然而Rectangle函数没有提供这个参数,所以必须用SelectObject把画刷选入设备描述表中
	CBrush *pOldBrush = dc.SelectObject(pBrush); //将空画刷选入设备描述表
	dc.Rectangle(CRect(m_ptOrigin, point));
	dc.SelectObject(pOldBrush);  */



    m_bDraw = FALSE;  //


	CView::OnLButtonUp(nFlags, point);
}


void CMyMFCView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

/**************************************************************************/
/*	//画连续的线,即曲线
	//再次之前要现在WM_LBUTTONDOWN和WM_LBOTTONUP消息中进行TRUE或FALSE设置
	CClientDC dc(this);
	CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
	CPen *pOldpen = dc.SelectObject(&pen);
	if (m_bDraw == TRUE)
	{ 
		dc.MoveTo(m_ptOrigin);
		dc.LineTo(point);
		m_ptOrigin = point;  //鼠标移动的”积分性“,下一个位置的起点应是上一个位置终点,
	}
	dc.SelectObject(pOldpen); */



/**********************************************************************************/
/*	//绘制扇形
	CClientDC dc(this);
	CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
	CPen *pOldpen = dc.SelectObject(&pen);
	if (m_bDraw == TRUE)
	{
		dc.MoveTo(m_ptOrigin);
		dc.LineTo(point);		
	}
	dc.SelectObject(pOldpen);  */


	
/***********************************************************************************/
/*	//绘制带边的扇形
	CClientDC dc(this);
	CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
	CPen *pOldpen = dc.SelectObject(&pen);
	if (m_bDraw == TRUE)
	{
		dc.MoveTo(m_ptOrigin);
		dc.LineTo(point);	
		dc.LineTo(m_ptOld); //后两条程序的作用是把鼠标移动过的点连接起来
		m_ptOld = point;
	}
	dc.SelectObject(pOldpen);    */







	CView::OnMouseMove(nFlags, point);
}


//void CMyMFCView::OnPaint()
//{
//	CPaintDC dc(this); // device context for painting
//	// TODO:  在此处添加消息处理程序代码
//	// 不为绘图消息调用 CView::OnPaint()
//}


void CMyMFCView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

/**************************************************************************************************************************/
/*	//实现TXT的功能
	CClientDC dc(this); //指定画板
	CFont font; //MFC提供CFont类专门用来设置字体
	font.CreatePointFont(300, _T("楷体"),NULL); //第一个参数设置字体的高度,第二个是字体的名称,第三个参数是一个CDC对象指针,用来把第一个参数的高度转换为逻辑单位
	CFont *pOldFont = dc.SelectObject(&font); //选入设备描述表,返回值为先前的字体。
	TEXTMETRIC tm; //保存信息
	dc.GetTextMetrics(&tm); //把当前设备描述表中字体的信息保存到tm中
	if (0x0d == nChar)  //当输入回车后
	{
		m_strLine.Empty();  //清空保留的之前所输入的字符串
		m_ptOrigin1.y += tm.tmHeight;  //所标当前的位置移到下一行	 
	}
	else if(0x08 == nChar) //当输入退格键。原理是:先把字符串设置为背景色输出,则覆盖屏幕之前的,即现在屏幕上什么都没有,
		                   //再把字符串删除一个字符,背景色设置为原来的,再输出
	{
		COLORREF clr = dc.SetTextColor(dc.GetBkColor()); //GetBkColor获得背景色;SetTextColor设置文本颜色,这个函数的返回值是###先前的文本颜色###
		dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine); //输出文本,输出之后屏幕上没有任何东西
		m_strLine = m_strLine.Left(m_strLine.GetLength() - 1); //删除一个字符,Left(n)即只输出前n个字符
		dc.SetTextColor(clr); //把文本颜色设为原来的
	}
	else
	{
		m_strLine += (char)nChar; //累加保存输出的字符
	}
	//下面是设置光标跟着移动
	CSize sz = dc.GetTextExtent(m_strLine); //sz保存上面所输出字符串的高度和宽度信息
	CPoint pt;
	pt.x = m_ptOrigin1.x + sz.cx;
	pt.y = m_ptOrigin1.y;
	SetCaretPos(pt); //设置光标的位置,由上面所输出的字符的长度决定。
	dc.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine); //输出字符
	dc.SelectObject(pOldFont); //恢复为原来的字体
	*/



/*****************************************************************************************************************************/
	//最简单的实现TXT功能的方法是根据,MFC提供了CEditView和CRichEditView两个类,他们可以实现
	//功能强大的字处理程序,后者提供的功能比前者更为强大
	//让程序中的CMyMFCView视类直接派生于这两个类中的一个就可以实现TXT的功能
	//具体做法:因为默认的视类是派生于CView,所以只要把CMyMFCView.h和CMyMFCView.cpp中所有的CView替换为CEditView或CRichEditView,即可。
	


/****************************************************************************************************************************/
	//电话本实例程序
	//在CMainFrame类中可以直接调用GetMenu来获得菜单栏指针,但是视类窗口是没有菜单的,因此在视类中不能直接调用GetMenu。应该先用GetParent
	//来获得视类的父窗口,即框架类窗口对象,然后再用GetMenu
	CClientDC dc(this);
	if (0x0d == nChar)
	{
		if (0 == ++m_nIndex)
		{
			m_menu.CreatePopupMenu();
			GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu, CString("PhoneBook"));
			GetParent()->DrawMenuBar();  //前面学的,在CMainFrame类的OnCreate函数中用AppendMenu来创建子菜单,会立即显示出来。这是因为
			//在调用这个函数时,程序的窗口还没有创建和显示。但是在View中,窗口已经创建了,所以在View类中创建子菜单后,要重绘菜单栏,才能够显示出来
			//并且要用框架类来调用DrawMenuBar重绘菜单栏函数
		}
		m_menu.AppendMenu(MF_STRING, IDM_PHONE1 + m_nIndex, m_strPhoto.Left(m_strPhoto.Find(' ')));  //只提取出字符串中的空格之前的部分,作为菜单项的名称
		//Find函数是返回匹配结果的第一个字符在该字符串中的位置索引,索引号从零开始。如在“Hello”中查找字符‘l',返回的结果为2
		//Left(n)函数是,返回字符串中的前n个字符。可以把人名字符串截取出来
		m_strArray.Add(m_strPhoto);  //CstringArray是一个集合类,类似于动态的数组,可以存储不定个数的字符串,用Add函数来存入,参数为字符串类型;用GetAt函数来提取元素,参数为索引号
		m_strPhoto.Empty();
		Invalidate(TRUE);  //当再次输入文字是在上次输入的文字之上显示的,我们希望将上次显示的内容清楚掉。可以利用重绘来实现
		//Invalidate成员函数的作用是让窗口的整个客户区无效,这样,当下一条WM_PAINT消息发生时,窗口就会被更新
		//参数默认为TRUE,表示窗口重绘时把窗口的背景擦出掉;为FALSE,则保留窗口的背景
	}
	else
	{
		m_strPhoto +=(char)nChar;
		dc.TextOut(0, 0, m_strPhoto);
	}

	



	CView::OnChar(nChar, nRepCnt, nFlags);
}


void CMyMFCView::OnPhone1()
{
	CClientDC dc(this);
	dc.TextOut(0, 0, m_strArray.GetAt(0));  //GetAt(0)得到数组中的第一个元素
}
void CMyMFCView::OnPhone2()
{
	CClientDC dc(this);
	dc.TextOut(0, 0, m_strArray.GetAt(1));
}
void CMyMFCView::OnPhone3()
{
	CClientDC dc(this);
	dc.TextOut(0, 0, m_strArray.GetAt(2));
}
void CMyMFCView::OnPhone4()
{
	CClientDC dc(this);
	dc.TextOut(0, 0, m_strArray.GetAt(3));
}

void CMyMFCView::OnTimer(UINT_PTR nIDEvent) //参数是定时器的标识,当有多个定时器是,可以通过判断nIDEvent参数来做出不同的处理。
                                            //该参数与设置定时器SetTimer()函数中的第一个参数相同
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

/*************************************************************************************/
	//实现字幕变色功能,例如:卡拉OK
	//可以先把字符串输出到屏幕上,接着把文本的颜色改变后,然一个字符一个字符的输出,也可以达到变色的效果,单数不能达到平滑变色
	//为了能够平滑变色,可用CDC类提供的DrawText函数来实现,DrawText函数的作用是在指定的矩形范围内输出文字,
	//当输出的文字太多超过设定的矩形范围时,DrawText函数就会截断输出文字,只显示在设定矩形内能够显示的那部分文字
	//利用DrawText函数的这个特点,可以控制矩形的宽度,让它不断地加大,来实现文字平滑变色。
	//###因为字体变色是一个不断变化、自动进行的过程,需要不断地调用DrawText函数和增加文本的矩形宽度,要实现这个功能,必须用到”定时器“
	//通过定时器来自定控制文字变色过程

	m_nWidth += 5;  //按5个像素点增加
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm); //获得设备描述表中当前字体的高度和宽度信息
	CRect rect;        //下面是设置DrawText函数中用到的矩形坐标
	rect.left = 50;
	rect.top = 250;
	rect.right = rect.left + m_nWidth;   //宽度是逐渐增加的
	rect. bottom = rect.top + tm.tmHeight;
	dc.SetTextColor(RGB(255, 0, 0));  //设置设置文本颜色,为红色、
	CString str;
	str. LoadString(IDS_STRING101);  //设置要显示的字符串
	dc.DrawText(str, rect, DT_LEFT);  //1.所显示的字符 2.再次用红色字体输出前面的字符的位置 3.再次输出字符的形式,是从左边开始输出,还是右边,还是中间

	rect.top = 100;
	rect.bottom = rect.top + tm.tmHeight;
	dc.DrawText(str, rect, DT_RIGHT);  //先输出右边的


	CSize sz = dc.GetTextExtent(str); //获得的只是字符串的宽度,若前面有空白,则不会算入其中
	if (m_nWidth > sz.cx)
	{
		m_nWidth = 0;
		dc.SetTextColor(RGB(0, 255, 0));
		dc.TextOut(50, 250, str);
	}
	CView::OnTimer(nIDEvent);
}




/*********************************************************************************************************/
//要删除该成员函数需要删除的三个地方:1.该函数的定义2.该函数在类中的生命3.上面的ON_COMMAND(IDM_TEST, &CMyMFCView::OnTest)
//void CMyMFCView::OnTest()
//{
//	// TODO:  在此添加命令处理程序代码
//	MessageBox((CString)"View Click!");
//
//}


void CMyMFCView::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值

/***************************************************************************************************************/
	//添加右击菜单
	CMenu menu;
	menu.LoadMenu(IDR_MENU1);  //加载菜单
	CMenu* pPopup = menu.GetSubMenu(0);  //获得该菜单的第一个子菜单,对于快捷菜单来说,实际上只有一个子菜单(位置索引为0)
	//该函数参数传递的point的坐标是相对于屏幕而言的,所以下面若直截用point.x和point.y来指定快捷菜单的位置时,那么右击后弹出的菜单的位置会有偏差
	//###可以用ClientToScreen函数来把客户坐标转换为屏幕坐标###
	ClientToScreen(&point);  // 把客户坐标转换为屏幕坐标
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
	//调用TrackPopupMenu函数来显示快捷菜单,参数:
	//1.指定菜单在屏幕上显示的位置
	//2,3.分别指定快捷菜单的x,y坐标
	//4.指定快捷菜单的拥有者,也就是标识拥有快捷菜单的窗口对象
	//5.指定一块矩形区域类型为lpRect,在这个区域内单击鼠标,快捷菜单仍保持显示。该参数默认为NULL,即在快捷菜单范围之外单击鼠标,这个菜单就将消失




	CView::OnRButtonDown(nFlags, point);
}


void CMyMFCView::OnYouJi()
{
	// TODO:  在此添加命令处理程序代码
	MessageBox(CString("YouJi-command"));
}


void CMyMFCView::OnUpdateHellow32780(CCmdUI *pCmdUI)
{
	// TODO:  在此添加命令更新用户界面处理程序代码
	MessageBox(CString("YouJi-update-ui"));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值