C++音乐播放按钮的封装过程详解

简介: 1、准备工作:音乐、开发工具VS stdio及图形库工具 2、设计思路:先加载音乐,再通过点击不同的按钮执行不同的操作(播放音乐,暂停音乐、继续播放、结束播放) 绘制按钮我们通过一个按钮button类来操作,这样数据会存在一些必要的访问数据权限,并可以将多个函数声明写在同一个类中,调用只需使用 " 类名.函数名 “即可调用里面的函数

1、准备工作:音乐、开发工具VS stdio及图形库工具

2、设计思路:先加载音乐,再通过点击不同的按钮执行不同的操作(播放音乐,暂停音乐、继续播放、结束播放)

绘制按钮我们通过一个按钮button类来操作,这样数据会存在一些必要的访问数据权限,并可以将多个函数声明写在同一个类中,调用只需使用 " 类名.函数名 “即可调用里面的函数

按钮类头文件:-----button.h

#include "graphics.h"
#include <iostream>
#include <string>
using namespace std;
class Button
{
public:
  void Show();
  void InitButton(int xx, int yy, int ww, int hh, COLORREF color, string text);
  bool InButton(ExMessage message);
  bool OnClickButton(ExMessage message);
private:
  int x;
  int y;
  int w;
  int h;
  COLORREF curColor;
  COLORREF oldColor;
  string str;
};

写类中函数的定义(即写函数的函数体) ----button.cpp

注意:在类外写类内部函数的定义时,需要加类名限定

1、初始化按钮的一些参数:如按钮的长宽高、颜色和按钮上的文字内容:

void Button::InitButton(int xx, int yy, int ww, int hh, COLORREF color, string text)
{
    x = xx;
    y = yy;
    w = ww;
    h = hh;
    curColor = color;
    oldColor = color;
    str = text;
}

2、绘制矩形按钮:

void Button::Show()
{
    //矩形框
    setfillcolor(curColor);
    solidrectangle(x, y, x + w, y + h);
    //文字
    settextstyle(15, 0, "FZZJ-XHFTJW.TTF");
    //1、求文字所在矩形的宽高
    int textw = textwidth(str.c_str());
    int texth = textheight(str.c_str());
    //2、求h1 w1
    //(w - textw) / 2   <=> w1
    //(h - texth) / 2   <=> h1
    //3、求出文字所在矩形左上角的坐标
    int xx = x+(w - textw) / 2;
    int yy = y+(h - texth) / 2;
    setbkmode(TRANSPARENT);
    settextcolor(BLACK);
    outtextxy(xx, yy, str.c_str());
}

注意:这里有一个文字在矩形框中居中显示的:

如何将文字在矩形框中居中显示?

如图:要使文字在矩形中居中显示: h1=h2 ; w1=w2

步骤:

1、求出文字的 高(textwidth(文字)) 与 宽(text(文字)) 返回的是一个整数

2、求出h1、w1的值

3、外矩形的宽高分别加上w1,h1就是需要绘制里面文字所在的矩形框的左上角的坐标。绘制一个矩形只需直到矩形左上角的坐标和矩形的宽高即可绘制绘制一个矩形。

4、判断鼠标是否在按钮中---在矩形中矩形显示一种颜色,不在显示另外一种颜色

bool Button::InButton(ExMessage message)
{
    if (message.x >= x && message.x <= x + w && message.y >= y && message.y <= y + h) 
    {
        curColor = RGB(236, 244, 255);
        return true;
    }
    curColor = oldColor;
    return false;
}

5、判断鼠标是否点击矩形框

bool Button::OnClickButton(ExMessage m)
{
    if (InButton(m) && m.message == WM_LBUTTONDOWN) 
    {
        return true;
    }
    return false;
}

主函数---main

加载音乐,绘制按钮,按钮消息的制作,显示界面等

#include "button.h"
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
int main() 
{
  initgraph(800, 600);
  IMAGE mm;
  loadimage(&mm, "mm.jpg",800,600);
  Button* play = new Button;
  play->InitButton(5, 5, 100, 25, RGB(204, 213, 240), "播放(play)");
  Button* pause = new Button;
  pause->InitButton(110, 5, 100, 25, RGB(204, 213, 240), "暂停(pause)");
  Button* resume = new Button;
  resume->InitButton(215, 5, 100, 25, RGB(204, 213, 240), "继续(resume)");
  Button* stop = new Button;
  stop->InitButton(320, 5, 100, 25, RGB(204, 213, 240), "停止(stop)");
  ExMessage m;
  BeginBatchDraw();
  while (1) 
  {
    putimage(0, 0, &mm);
    peekmessage(&m);
    play->Show();
    if (play->OnClickButton(m)) 
    {
      mciSendString("open 1.mp3", 0, 0, 0);
      mciSendString("play 1.mp3", 0, 0, 0);
    }
    pause->Show();
    if (pause->OnClickButton(m)) 
    {
      mciSendString("pause 1.mp3", 0, 0, 0);
    }
    resume->Show();
    if (resume->OnClickButton(m))
    {
      mciSendString("resume 1.mp3", 0, 0, 0);
    }
    stop->Show();
    if (stop->OnClickButton(m))
    {
      mciSendString("close 1.mp3", 0, 0, 0);
    }
    FlushBatchDraw();
  }
  EndBatchDraw();
  closegraph();
  return 0;
}

到此这篇关于C++音乐播放按钮的封装过程详解的文章就介绍到这了,更多相关C++封装内容请搜索或继续浏览下面的相关文章希望大家以后多多支持米米素材网!                  原文链接:https://www.mimisucai.com/teach/c/37099.html

相关文章
|
7月前
|
C++
C++中的封装、继承与多态:深入理解与应用
C++中的封装、继承与多态:深入理解与应用
175 1
|
6月前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
157 0
|
3月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
3月前
|
数据安全/隐私保护 C语言 C++
C++(七)封装
本文档详细介绍了C++封装的概念及其应用。封装通过权限控制对外提供接口并隐藏内部数据,增强代码的安全性和可维护性。文档首先解释了`class`中的权限修饰符(`public`、`private`、`protected`)的作用,并通过示例展示了如何使用封装实现栈结构。接着介绍了构造器和析构器的使用方法,包括初始化列表的引入以及它们在内存管理和对象生命周期中的重要性。最后,通过分文件编程的方式展示了如何将类定义和实现分离,提高代码的模块化和复用性。
|
5月前
|
C++ 容器
【C++】map和set封装
【C++】map和set封装
44 2
|
5月前
|
存储 开发框架 Java
|
6月前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
6月前
|
数据安全/隐私保护 C++
C++语言深入理解类的封装与数据隐藏
深入理解类的封装与数据隐藏
|
5月前
|
存储 C++ 容器
【C++】开散列实现unordered_map与unordered_set的封装
【C++】开散列实现unordered_map与unordered_set的封装
61 0
|
7月前
|
存储 C语言 C++
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)(上)
从C语言到C++_31(unordered_set和unordered_map介绍+哈希桶封装)
66 3