MFC(2)_突然醒悟的博客-程序员宅基地

技术标签: C++  MFC  

鼠标按下

void CMFC作业01View::OnLButtonDown(UINT nFlags, CPoint point)   
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CView::OnLButtonDown(nFlags, point);
	//CString 是编程中一种非常有用的数据类型,
	//它是MFC中的一个类,很大程度上简化了MFC中的许多字符串的操作。
	CString str;
	//Format是CString类的一个成员函数,它通过格式操作使任意类型的数据转换成一个字符串。
	str.Format(TEXT("x=%d,y=%d"), point.x, point.y);
	MessageBox(str);
}

键盘按下

  void CMFC作业01View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	TCHAR ch = (TCHAR)(nChar);
    	CString str;
    	str.Format(TEXT("%c"), ch);
    	MessageBox(str);
    	CView::OnChar(nChar, nRepCnt, nFlags);
    }

画直线:添加变量的时候尽量使用鼠标右键里面的添加变量,因为会在构造函数初始化(1.鼠标按下和抬起2.创建画家对象3.起点和终点)

void CMy02画图View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//保存点击的坐标
	m_Point = point;

	CView::OnLButtonDown(nFlags, point);
}

void CMy02画图View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//创建画家,指定绘图设备
	CClientDC dc(this);

	dc.MoveTo(m_Point);
	dc.LineTo(point);
	CView::OnLButtonUp(nFlags, point);
}

连续的线:bool 标准的 BOOL MFC里面的

void CMy02画图View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//保存点击的坐标
	m_Point = point;
	m_isPress = true;
	CView::OnLButtonDown(nFlags, point);
}


void CMy02画图View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
#if 0
	//创建画家,指定绘图设备
	CClientDC dc(this);

	dc.MoveTo(m_Point);
	dc.LineTo(point);
#endif
	m_isPress = false;

	CView::OnLButtonUp(nFlags, point);
}


void CMy02画图View::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_isPress == true) {
		CClientDC dc(this);

		dc.MoveTo(m_Point);
		dc.LineTo(point);
		//终点作为起点
		m_Point = point;
	}
	CView::OnMouseMove(nFlags, point);
}

画图

在这里插入图片描述
画笔,画刷的使用(1.定义画家2.定义画笔(画刷)3.把画笔交给画家4.画刷:单色,样式,位图,字体)

void CMy02画图View::OnDraw(CDC* pDC)
{
	CMy02画图Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	//PS_DASH:虚线  只有当画笔宽度小于1或者更小的时候才有效
	//10:线宽
	CPen pen(PS_DASH,1,RGB(255,0,0));
	//有返回值,回复原来的状态
	pDC->SelectObject(&pen);

	pDC->MoveTo(10, 10);
	pDC->LineTo(120, 20);

	//画圆形
	pDC->Ellipse(20, 20, 120, 120);
	//画刷 填充颜色
	CBrush brush(RGB(255, 0, 0));
	pDC->SelectObject(&brush);
	pDC->Ellipse(20, 20, 120, 120);
	
	//定义一个位图对象
	CBitmap bitmap;
	//加载位图
	bitmap.LoadBitmapW(IDB_BITMAP1);
	CBrush brush2(&bitmap);
	pDC->SelectObject(&brush);
	pDC->Ellipse(120, 20, 240, 240);
		//设置字体
	CFont font;
	font.CreatePointFont(1000, TEXT("楷体"));
	pDC->SelectObject(&font);
	pDC->TextOutW(100, 100, TEXT("HELLO,MIKE"));
	// TODO: 在此处为本机数据添加绘制代码
}

插入符的操作

//窗口创建后自动调用
int CMy03编辑View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	//获取字体信息

	CClientDC dc(this);

	//字体信息结构体
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);

	//继承于CWnd
	//创建插入符  要获取字体信息来进行插入符的操作
	//第一个参数平均字符的宽度 字符高度
	CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);

	//显示插入符
	ShowCaret();


	return 0;
}


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

	//设置鼠标点击的插入符位置
	SetCaretPos(point);
	//保存点击坐标
	m_point = point;
	//清空
	m_str.Empty();

	CView::OnLButtonDown(nFlags, point);
}


void CMy03编辑View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//点击键盘进行再插入符的地方进行输入字符串
	//创建一个成员变量
	CClientDC dc(this);

	

	//换行  字符串为空,没有高度
	if (nChar == VK_RETURN) {
		m_str.Empty();
		//获取字体信息
		TEXTMETRIC tm;
		dc.GetTextMetrics(&tm);
		m_point.y = m_point.y + tm.tmHeight;
	}
	else if (nChar == VK_BACK) {
		//获取背景色,用背景色来盖住
		COLORREF color = dc.GetBkColor();
		//设置写字颜色
		COLORREF oldColor = dc.SetTextColor(color);
		//白色重写一次
		dc.TextOutW(m_point.x, m_point.y, m_str);
		//去掉最后一个字符
		m_str = m_str.Left(m_str.GetLength() - 1);
		dc.SetTextColor(oldColor);

	}
	else {
		m_str += (TCHAR)nChar;
	}

	//获取字符串的长度,插入符也跟着移动,起点不能变,所以用局部变量
	CSize size = dc.GetTextExtent(m_str);
	int x = m_point.x + size.cx;
	int y = m_point.y;
	SetCaretPos(CPoint(x, y));
	dc.TextOutW(m_point.x, m_point.y, m_str);


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

字体渐变

// CMy04定时器View 消息处理程序


int CMy04定时器View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

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

	//设置定时器 第一个参数定时器ID 时间间隔以毫秒为单位
	//第三个回调函数一般不用  NULL代表系统默认的处理函数,每隔100毫米,触发WM_TIMER
	SetTimer(1,100,NULL);
	return 0;
}


void CMy04定时器View::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (nIDEvent = 1) {
#if 0
		static int i = 0;
		i++;
		CString str;
		str.Format(TEXT("%d"), i);
		if (i == 5) {
			KillTimer(1);
		}
		MessageBox(str);
#endif
		static int w = 0;
		w += 5;
		CString str = TEXT("塑造自己的过程很疼,但是你可以得到一个更好的自己");
		CClientDC dc(this);
		//获取字符串的长度(宽度)
		CSize size = dc.GetTextExtent(str);
		//如果宽度大于字符串的宽度,重新开始
		if (w > size.cx) {
			w = 0;
			//重新刷新窗口
			Invalidate();
		}
		//覆盖的矩形范围
		int x = 30;
		int y = 30;
		CRect rect(x, y, x + w, y+size.cy);
		//黑色写一次
		dc.TextOutW(x, y, str);
		//设置字体颜色
		dc.SetTextColor(RGB(255, 0, 0));
		dc.DrawText(str, &rect, DT_LEFT);
	}
	CView::OnTimer(nIDEvent);
}

菜单响应:弹式菜单ID不可以编辑,非弹式ID可编辑
菜单命令路由器
在这里插入图片描述
消息分为三类:1.命令消息:WM_COMMAND开头的,菜单处理函数选中。2.标准消息:属性->消息。3.通告消息:点击按钮最终处理函数
CWnd可以接受任何消息
CCmdTarget不能接受标准消息

菜单静态操作
在这里插入图片描述
在这里插入图片描述

//标志
	//获取菜单,先获取菜单栏,再获取子菜单,相当于数组下标
	CMenu *menu = GetMenu();
	CMenu*fileMenu = menu->GetSubMenu(0);
	//标志"新建"可以通过位置,也可以通过ID
	//第一个参数由位置来决定
	fileMenu->CheckMenuItem(0, MF_BYPOSITION|MF_CHECKED);
	//第一个参数由ID来决定后面是打钩
	fileMenu->CheckMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_CHECKED);
	//设置默认项 加粗 一个菜单上只有一个默认的
	//第二个参数是FALSE代表ID 否则代表位置
	fileMenu->SetDefaultItem(ID_FILE_SAVE_AS, FALSE);
	//变灰 需要把CFrameWnd::m_bAutoMenuEnable 设置为FALSE  因为系统默认为高亮
	//分隔符也算一个菜单的
	fileMenu->EnableMenuItem(ID_FILE_MRU_FILE1, MF_BYCOMMAND | MF_DISABLED);
	//移除菜单项
	SetMenu(NULL);
	//加载菜单
	CMenu menu2;
	menu2.LoadMenuW(IDR_MENU1);
	SetMenu(&menu2);
	//分离  保证不释放
	menu2.Detach();
	return 0;


//a的更新,菜单更新内部自动更新
void CMainFrame::OnUpdateTestA(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	if (true == m_isUpdate) {
		pCmdUI->Enable(TRUE);
	}
	else {
		pCmdUI->Enable(FALSE);
	}
}

//b的处理函数
void CMainFrame::OnTestB()
{
	// TODO: 在此添加命令处理程序代码
	//bool类型
	m_isUpdate = !m_isUpdate;
}

//视图鼠标左键按下
void CMy05菜单View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//在视图当中进行得创建菜单1.获取主菜单2.获取子菜单
	CMenu menu;
	menu.LoadMenuW(IDR_MENU1);
	CMenu*subMenu=menu.GetSubMenu(0);
	//子菜单作为快捷菜单,右击菜单,坐标应该相对于屏幕
	//坐标转换
	ClientToScreen(&point);
	subMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this);

	CView::OnLButtonDown(nFlags, point);
}

修改标题图标

CMainFrame::CMainFrame()
{
	//获取应用程序加载图标,AfxGetApp()获取应用程序
	icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
	icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
	icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
	icon[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
	// TODO: 在此添加成员初始化代码
}

	//在框架类里面的ONCREATE()里面设置定时器,然后在消息中添加回调函数OnTimer()
	SetTimer(1, 500, NULL);

void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	static int i = 0;
	//改变标题图标
	SetClassLong(m_hWnd, GCL_HICON, (LONG)icon[i]);
	i++;
	if (i == 4) {
		i = 0;
	}
	CFrameWnd::OnTimer(nIDEvent);
}

图标移动
在这里插入图片描述

	//OnCreate()函数里面
	SetTimer(1, 500, NULL);


	//加载图标  不知道绘图和这个函数谁先调用,所以放在构造函数里面
	icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
	icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
	icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
	icon[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
	x1 = x2 = x3 = x4 = 30;
	y1 = 30;

void CMy07作业View::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (1 == nIDEvent) {
		x1 += 20;
		x2 += 40;
		x3 += 60;
		x4 += 80;
		//越界判断,获取客户区范围
		CRect rect;
		GetClientRect(&rect);
		if (x1 > rect.Width()) {
			x1 = 30;
		}
		if (x2 > rect.Width()) {
			x2 = 30;
		}
		if (x3 > rect.Width()) {
			x3 = 30;
		}
		if (x4 > rect.Width()) {
			x4 = 30;
		}
		//刷新
		Invalidate();
	}
	CView::OnTimer(nIDEvent);
}


void CMy07作业View::On32771()
{
	// TODO: 在此添加命令处理程序代码
	x1 = 30;
	x2 = 30;
	x3 = 30;
	x4 = 30;
	//刷新窗口
	Invalidate();
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41403610/article/details/83419886

智能推荐

工具IDEA 配置springboot+maven项目_Carr_Memory的博客-程序员宅基地

工具IDEA 配置springboot+maven项目   首先安装IDEA,至于怎么安装就不介绍了。。 第一步 配置maven环境   首先安装maven,先在网上下载一个maven包。在IDEA的settings中Maven设置              点击USer settings file 文件夹正常的是空白 如图找到你下载的maven文件夹,引入settings.xml 

Tomcat指定JDK版本_小志的博客的博客-程序员宅基地_tomcat设置jdk版本

windows1、找到bin下的setclasspath.bat文件;在文件的开始出添加如下代码:set JAVA_HOME=D:\Java\jdk7\jdk1.7.0_51set JRE_HOME=D:\Java\jdk7\jre7 linux2、在bin下找到setclasspath.sh,在文件的最开始加入如下代码:set JAVA_HOME=/opt/jdk/Ja...

简单易懂的事务四大特性ACID_Step_Top的博客-程序员宅基地

MySQL 事务事务简介 事务Transaction,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。这两个操作必须保证全部成功或者什么都不做,不允许出现成功1个失败一个的情况。事务四大特性ACID原子性(Atomicity)一致性(Consistenc...

jQuery EasyUi实现tab页_闻雨轩少爷的博客-程序员宅基地

在项目中往往会遇到这种情况,点击菜单,上面出现tab页,下次如果再要访问这个菜单下面的数据就不用重新加载,以下代码是我这次在项目中用jQuery EasyUI实现的tab页:在jsp中需要引入的重要js:/common/jquery-easyui/themes/default/easyui.css" rel="stylesheet" type="text/css" /> /comm

Bugku-WEB篇(50')_东方与君语的博客-程序员宅基地

Bugku-WEB篇50分域名解析分析步骤域名解析分析计算机首先拿到域名后是先去本机的hosts文件(不知道的自行百度)找有没有对应的ip,没有再去访问DNShosts文件是一个没有扩展名的系统文件,它的主要作用是能加快域名解析,还可以屏蔽网站等。步骤在hosts添加上 123.206.87.240 flag.baidu.com(位置:c:\windows\system32\dri...

京东2017实习生招聘在线笔试编程题_渣狗哪有未来的博客-程序员宅基地

站队异或分堆A拍卖终结者C通过考试站队来源:站队(京东2017实习生真题)  有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的人的距离为i与j之差的绝对值。   每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,一共

随便推点

Oracle的trunc函数与MySQL(Maria)的truncate函数_北冥牧之的博客-程序员宅基地_oracle truncate函数

首先,Oracle的trunc函数与MySQL(Maria)的truncate函数都可以对数值进行截取操作,但是Oracle的trunc函数还可以对日期进行截取操作。其次,个人测试下来认为,对数值进行截取操作两者功能是一样的。第三,我们针对两者做对比,先说MySQL。可以参考这篇文章:MySQL truncate()函数的使用说明个人测试的数据结果如下:-- 等同于Oracle的trunc函数。作用是对日期或数值进行截取操作-- 首先看对数值进行截取操作SELECT TRUNCAT

Linux面试专题*48_程序员小羊的博客-程序员宅基地

文章目录1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当4、Ls 命令执行什么功能? 可以带哪些参数,有什么区别?5、查看文件有哪些命令6、列举几个常用的Linux命令7、你平时是怎么查看日志的?8、建立软链接(快捷方式),以及硬链接的命令9、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?10、查看文件内容有哪些命令可以使用?11、随意

java 中值滤_2D中值滤波器,忽略nan值_瞬儿哥的博客-程序员宅基地

您可以首先使用padarray填充图像,在每侧填充 floor(r/2) 像素,然后使用im2col重新构建填充图像,以便像素的每个邻域放置在单独的列中 . 接下来,您需要首先将所有 nan 值设置为虚拟值,这样您就不会干扰中值计算...也许就像零一样 . 之后,找到每列的中位数,然后重新塑造成适当大小的图像 .这样的事情应该有效:r = 3;nanMask = isnan(I); % Defin...

axis1 c# 接口 调用_基于JAVA中使用Axis发布/调用Webservice的方法详解_Noahha的博客-程序员宅基地

本示例和参考文章的差别在于:1)deploy.wsdd定义的更详细(对于server端定义了接口:ICalculate):xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">xmlns:operNS="http://web.webservice.CalculateService.org"returnQName="addRet...

基于 SquashFS 构建 Linux 可读写文件系统_啊困兽犹斗的博客-程序员宅基地_squashfs 可写

转载:http://www.ibm.com/developerworks/cn/linux/1306_qinzl_squashfs/    在当前的嵌入式操作系统开发中,Linux 操作系统通常被压缩成 Image 后存放在 Flash 设备中。在系统启动过程中,这些 Image 被直接挂载到根文件系统, 然而这时的根文件系统是只读的, 用户不能在这个文件系统中进行任何写的操作。 如果把

The difference between d8&d9's constants def in asm shaders_一麒麟子一的博客-程序员宅基地

The difference between d8&d9's constants def in asm shaders :::::Pick from dx9 sdkThe behavior of shader constants has changed between Direct3D 8 and Direct3D 9.F...

推荐文章

热门文章

相关标签