MFC之自定义控件(逃跑的按钮)和在按钮加载位图18

1 自定义控件(逃跑的按钮)

1)首先创建基于对话框的项目。
2)创建自定义按钮类。注意一下,此时的自定义类与对话框还没关系,区别前几篇自定义对话框的做法(自定义对话框有关联)。
在这里插入图片描述
在这里插入图片描述

3)然后在对话框中添加一个按钮,右击添加变量。
在这里插入图片描述
在这里插入图片描述

此时在对话框类会有一个成员变量类型MyButton。现在我们对话框和自定义的按钮类就关联上了。

4)由于我们要实现的是自定义按钮的逃跑事件,即把按钮当做窗口,所以我们需要在自定义按钮类中实现按钮的鼠标移动事件。
添加鼠标移动事件就是右击MyButton类点击属性,然后选择右方的小白色消息,选择MouseMove事件。
在这里插入图片描述

5)在自定义按钮类编写代码。

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

	int x = rand() % 400;
	int y = rand() % 400;

	//按钮移到
	this->MoveWindow(x, y, 50, 50);

	CButton::OnMouseMove(nFlags, point);
}

结果,只要在自定义按钮的范围内就会移动。
在这里插入图片描述
注意:逃跑的按钮的名字我是在对话框类的OnInitDialog函数中使用函数设置的,你也可以直接在对话框ui’界面修改。

m_button.SetWindowTextW(TEXT("逃跑的按钮"));

2 在自定义按钮添加位图

上面我们讲了如何自定义控件,下面我们将加载位图到该自定义按钮中。
1)按下面添加位图。位图需要提前准备好放在项目的res目录。
在这里插入图片描述
在这里插入图片描述

2)编写代码。因为按钮是在对话框中显示,所以在初始化对话框的函数中处理。

// CjiyuduihuakDlg 消息处理程序
BOOL CjiyuduihuakDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_button.SetWindowTextW(TEXT("逃跑的按钮"));

	CBitmap bitmap;
	bitmap.LoadBitmapW(IDB_BITMAP1);
	//获取位图大小
	BITMAP bmp;
	bitmap.GetBitmap(&bmp);
	//给按钮设置位图
	m_button.SetBitmap(bitmap);
	//设置按钮大小,图片有多大就设置多大
	m_button.MoveWindow(0, 0, bmp.bmHeight, bmp.bmWidth);//0,0表示按钮的起始显示位置

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

为了显示的图片在按钮合适显示,所以修改一下自定义按钮类的构造。注意,图片的大小与this->MoveWindow的参3,参4相同但是不一样合适的显示,需要自己调整一下。例如我图片为100x100,然后参3,参3写成100,100,但是按钮显示完图片还存在按钮的部分区域。所以我改小点宽度,即下面的90。

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

	int x = rand() % 200;//200是我随便写的,防止越界,导致按钮从窗口消失
	int y = rand() % 200;

	//按钮移到
	this->MoveWindow(x, y, 90, 100);//参3,参4表示按钮要显示的大小,即窗口(按钮)要显示的大小

	CButton::OnMouseMove(nFlags, point);
}

结果:
在这里插入图片描述

3 通过路径加载位图

上面是通过导入的方式加载位图,但是如果图片多起来,导入多的话程序变得庞大,所以我们多的时候可以使用路径加载。我们主要使用HBMP这个自定义宏来加载,另一再区分使用路径加载icon的宏。

	// TODO: 在此添加额外的初始化代码
	m_button.SetWindowTextW(TEXT("逃跑的按钮"));

#define HBMP(filepath, width, heigth) (HBITMAP)LoadImage(AfxGetInstanceHandle(), filepath,IMAGE_BITMAP,width,heigth,LR_LOADFROMFILE|LR_CREATEDIBSECTION) 
#define HICO(filepath) (HICO)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_ICON,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE)

	//通过路径给按钮设置位图
	m_button.SetBitmap(HBMP(TEXT("./11.bmp"), 100, 50));

	//设置按钮大小,图片有多大就设置多大
	m_button.MoveWindow(0, 0 ,90, 100);//0,0表示按钮的起始显示位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值