mfc的学习

1.图形绘制-画线

创建一个单文档类型的应用程序

起点和终点,如何捕捉这2点? 鼠标左键按下:起点, 鼠标左键抬起:终点

步骤

1.选择类

 2.鼠标左键按下对应的消息,并添加处理程序

3.鼠标左键抬起对应的信息,并添加处理程序

 4.在OnlButtonDown这里把起点保存下来,类向导的view类里添加成员变量

点击添加自定义变量  

公共受保护私有三个任选一个

 可以在xxxView.h中看到

 

 在OnlButtonDown这里把起点保存下来,手动输入

在OnLButtonUp这里画线  

2.git(不熟练)

3.画出颜色 图形绘制-画笔-画刷

画笔(画轮廓)

画一条宽度为5像素,绿色的实线

虚线的设置,虚线的宽度不能超过1像素

 画刷(填充轮廓)

调用系统默认的画刷(白色,不透明)

CClientDC dc(this);//获得设备上下文的另一种方法,该方法不需要释放设备上下文
dc.Rectangle(CRect(起点,终点));//.Rectangle() 表示要画一个矩形,CRect()表示确定一个矩形的大小,CRect(起点,终点)表示把起点作为矩形的左上角,终点作为矩形的右下角来确定一个矩形

 透明画刷

  指定颜色填充的矩形


位图画刷  

点资源视图,右键xxx.rc,点击添加资源,选择Bitmap,点击新建,自己画一个图

图形绘制-画扇

连续画线

类向导-消息-选择WM_MOUSEMOVE-添加处理程序-确定

1、起始点固定是左上角

 

 2.需求:当点击某一个点的时候,才开始画线

类向导—添加成员变量

在构造函数中设置默认值

当鼠标按下时,再设置为真值 

 

 当鼠标按下(m_bDraw为TRUE)时才开始画线

 此时线会一直在画,不会停下来

3.需求更新为:点击鼠标开始画,再点击一次停止

修改这里的条件判断

也可以把代码优化为这样

4.需求:鼠标按下的时候一直画线,松开时候停止画线

鼠标按下的时候m_bDraw设为TRUE,鼠标抬起的时候设为FALSE

4.画扇形

 鼠标按下的点设为起始的原点,光标移动的每一个点都会和原点形成直线

改这两个地方

 完善需求;鼠标第二次按下就松开

 

需求:改变颜色

画椭圆形:建立一个矩形做椭圆的边框

 

 画圆

 

 

输出文本

法一

  法二

动态文字 

添加定时器:

类向导-消息-wm_create-添加处理程序-确定 

处理闹钟事件

类向导-消息-wm_timer-添加处理程序-确定

添加变量:存放矩形的宽度

类向导-成员变量

void Cdraw2View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_pOrigin = point;
	m_bDraw =!m_bDraw;

	CView::OnLButtonDown(nFlags, point);
}


void Cdraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
	
}


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


int Cdraw2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	//第一个参数:自己指定一个整型的id
	//第二个参数;以毫秒为单位的时间间隔
	//第三个参数:回调函数,可以默认设为NULL
	SetTimer(9526, 200, NULL);

	return 0;
}

//每200毫秒处理一次超时事件
void Cdraw2View::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	
	//得到一个设备上下文
	CClientDC dc(this);
	//设置字体和大小
	CFont font;
	font.CreatePointFont(200, _T("华文行楷"));//20号字体要输入200
	CFont* pOldFont = dc.SelectObject(&font);
	CString str(_T("你好我好大家好"));
	//文字颜色
	dc.SetTextColor(RGB(125, 0, 127));
	//获取文字在屏幕上的空间大小,长度和宽度
	CSize cz = dc.GetTextExtent(str);
	//手动指定一个矩形
	CRect rect;

	//根据不同的闹钟ID做相应的处理,即使此处只有一个闹钟
	switch (nIDEvent)
	{
		
	case 9526:
		m_nWidth += 10;
		
		rect.left = 200;
		rect.top = 100;
		rect.bottom = rect.top + cz.cy;
		rect.right = rect.left + m_nWidth;
		//在指定矩形区域内画文字
		//第三个参数是左对齐的意思
		dc.DrawText(str, rect, DT_LEFT);

		//字体滚动完之后重新滚动
		if (m_nWidth > cz.cx)
		{
			m_nWidth = 0;
			//使屏幕上的东西全都无效(擦除屏幕上的内容)
			Invalidate();
		}
		
	default:
		break;
	}

	CView::OnTimer(nIDEvent);
}

 菜单与工具栏

菜单项及菜单响应

 新建子菜单

资源视图-->Menu-->IDRMAINFRAME, 双击打开菜单编辑器

 新建菜单项

编辑菜单项ID

激活编辑ID模式

修改菜单项ID

 菜单项响应函数

 定义一个枚举

xxxView.h

 

 xxxView.cpp

 

 case DTPEN(鼠标保持按下状态时才可以画)如何处理

 

 菜单项助词键和快捷捷

在菜单项上添加助记词和快捷键

此时快捷键无法生效,需要添加快捷键绑定 

 添加快捷键绑定: 资源列表--> Accelerator-->IDR_MAINFRAME,双击打开

手动配置ID,修饰符,键,再点保存文件

 配置菜单项的状态

类似于这里的'√' ,这就是菜单栏的状态

给每一个菜单项配置这个消息

 

 

如何禁用掉某个功能

6.2 工具栏

在工具栏中添加画图相关按钮
资源视图-->ToolBar-->IDR_MAINFRAME

工具栏按钮如何与菜单项对应?

设置工具栏ID与菜单项ID一致即可。配置完点保存

更改快捷键后不生效的问题

  • 问题原因: 创建项目时选择 "使用菜单栏和工具栏"
  • 应该是要选择经典菜单


使用这种方式创建的应用程序,会将其应用信息,如菜单等资源记录在注册表中,每次启动时从注册表加载,会忽略代码中的修改,导致出现在程序中修改了菜单却无效的问题。

  • 如何区分项目是使用哪种菜单? "经典菜单"还是"菜单和工具栏"?
    看APP继承类,“经典菜单”继承CWinApp

“菜单和工具栏”继承“”

  • 解决办法:
    在xxxApp类中添加: ExitInstance 实现,如1
  • 类向导-虚函数-ExitInstance-选择类名xxxApp类-添加函数-确定

📋int CMFCApplication1App::ExitInstance() {
    AfxOleTerm(FALSE);
    this->CleanState();       //清空注册表信息 
    return CWinAppEx::ExitInstance();
}

要运行两次,因为此方法要在第一次运行后退出的时候才会清掉注册表,所以第二次运行的时候才会生效

上下文菜单-Part1(经典菜单)

上下文菜单,或者称之为"右键菜单",这种菜单一般是在单击鼠标右键时弹出。制作弹出菜单步骤:

  • 新建菜单资源
  • 资源视图-xxx.rc-Menu右键添加资源-添加Menu
     
  • 保持这些菜单的ID与主菜单的ID是一致的,右键可以编辑ID,编辑完保存
  • 在应用初始化时加载菜单资源
  • xxxView.cpp文件里
  • 给类名xxxView里加一个成员变量,变量类型CMenu,变量名m_Menu

📋

BOOL Cdraw3View::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: 在此处通过修改
    //  CREATESTRUCT cs 来修改窗口类或样式
    m_Menu.LoadMenu(IDR_MENU1);
    return CView::PreCreateWindow(cs);
}

类向导-消息WM_RBUTTONUP 添加处理程序

  • 在点击右键时显示菜单

📋

void Cdraw3View::OnRButtonUp(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CMenu* pPopup = m_Menu.GetSubMenu(0);

    //把应用的坐标系转换成窗口的坐标系
    ClientToScreen(&point);

    //右键弹起的地方显示菜单
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTALIGN, point.x, point.y, this);

    CView::OnRButtonUp(nFlags, point);
}

对话框

 什么是对话框?

与用户进行交互的控件,如文件对话框,字体对话框,颜色对话框等,一般用于告示,提醒等。

模式对话框

在其显示时,整个程序会暂停,直到关闭该对话框。

示例

在项目的前面代码中,通过菜单和工具栏,已经可以支持用户绘制多种形状,如线,矩形,椭圆等,但用户还无法控制线条粗细,线型,颜色等参数,本节课通过对话框形式来提供参数定制功能

1.创建一个菜单

修改Id

 2.要求点击选项后弹出一个对话框

添加事件

 

创建一个dialog(对话框)资源 

  设置对话框的主题名

一个标签

 

 

法一

 

改id

 右键对话框,点添加类

在view.cpp里添加头文件

 

 给下面这个文本编辑框绑定一个变量

右键这个编辑框点击类向导(或者直接点击添加变量)

 点添加变量

 

设置允许的线宽的范围

drawview.cpp 新增一个变量

  draw.cpp

把对话框输入的值赋值给自定义的变量

修改之前的代码

 

滑块控件

拖一个滑块控件过来

 改变一些设置

 

 

 

 设置一个虚函数

与对话框有关的先注释掉

 给滑块绑定一个变量

点添加变量

 

删掉和对话框有关的

要确保存在下面这行代码

 需求:实现一下这个

添加该控件

 单选按钮(要三个)

 

 

 

  第一个单选控件把group标选为TRUE,这三个控件就合成一组

 

给该控件设置一个变量

 

xxxview.cpp -类向导-添加成员变量(自定义变量)

 

 修改代码

 

 注意:非实心线的线的宽度不能大于1

 改变颜色

 添加一个按钮,控制颜色

 需求:点击这个按钮就会弹出颜色对话框

双击这个按钮,就会绑定按钮的点击事件,并且生成该事件的响应函数

setup.cpp

 类向导-给Setup类添加一个自定义变量

 

view.cpp 

类向导-添加一个自定义的变量

修改代码

 需求:每一次点进去颜色不会被重置为黑色,而是上一次的颜色

setup.cpp

加上这行代码

展示画线效果实例

增加一个控件

右键, 添加事件处理程序,另一种快捷的方法是直接双击控件

这三个控件都要去分别添加事件处理程序

 需求:重新绘制,原先的去掉(让他无效)

类向导-添加一个消息,该消息的作用是重新绘制

 旧的让它无效

  捕捉颜色的更改

捕捉滑块

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值