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表示按钮的起始显示位置