📄 bcmeter.c
字号:
#include "bcmeter.h"BC_Meter::BC_Meter(int x, int y, int w, int h, float min, int mode) : BC_Tool(x, y, w, h){ this->min = min; this->mode = mode; init_graphics();}BC_Meter::~BC_Meter(){ for(int i = 0; i < 6; i++) delete db_titles[i];}BC_Meter::init_graphics(){ vertical = h > w; total_width = vertical ? h : w; for(int i = 0; i < 6; i++) db_titles[i] = new char[6]; // calibrate the db titles get_divisions(&low_division, &medium_division, total_width, db_titles, title_x, vertical);}BC_Meter::get_divisions(int *low_division, int *medium_division, int total_width, char **titles, int *title_x, int vertical){ int i; float j, j_step; int division, division_step; division = 0; division_step = total_width / 4; j = min; // number for title j_step = min / 4; for(i = 0; i < 4;) { sprintf(titles[i], "%.0f", j); if(i == 0) title_x[i] = division; else title_x[i] = division - 10; division += division_step; j -= j_step; i++; } sprintf(titles[4], "%.0f", j_step / 2); title_x[4] = (division + title_x[3]) / 2; sprintf(titles[5], "0"); title_x[5] = division - 10; *low_division = (int)title_x[2] + 10; *medium_division = title_x[4] + 10;}BC_Meter::create_tool_objects(){ create_window(x, y, w, h, BLACK); peak_timer = 0; level_x = peak_x = 0; over_timer = 0; over_count = 0; draw();}BC_Meter::resize_tool(int x, int y, int w, int h){ resize_window(x, y, w, h); for(int i = 0; i < 6; i++) delete db_titles[i]; init_graphics(); draw();}BC_Meter::reset(){ level_x = peak_x = 0; peak_timer = 0; over_timer = 0; over_count = 0; draw();}BC_Meter::reset_over(){ over_timer = 0;}BC_Meter::change_format(int mode){ this->mode = mode;}BC_Meter::draw(){ int low_size = low_division; int medium_size = medium_division - low_division; int high_size = total_width - medium_division; draw_3d_big(0, 0, w, h, DKGREY, BLACK, LTGREY);// draw bars if(level_x > 0) { if(level_x < total_width) high_size = level_x - medium_division; if(level_x < medium_division) medium_size = level_x - low_division; if(level_x < low_division) low_size = level_x; if(low_size > 0) { set_color(low_color); if(vertical) draw_box(2, h - low_size - 2, w - 4, low_size); else draw_box(2, 2, low_size, h - 4); } if(medium_size > 0) { set_color(medium_color); if(vertical) draw_box(2, h - low_division - medium_size - 2, w - 4, medium_size); else draw_box(low_division, 2, medium_size, h - 4); } if(high_size > 0) { set_color(high_color); if(vertical) draw_box(2, h - medium_division - high_size - 2, w - 4, high_size); else draw_box(medium_division, 2, high_size, h - 4); } }// draw peak peak_x1 = peak_x - 2; peak_x2 = peak_x; if(peak_x1 < 0) peak_x1 = 0; if(peak_x > 0) { if(peak_x2 > medium_division) set_color(high_color); else if(peak_x2 > low_division) set_color(medium_color); else set_color(low_color); if(vertical) draw_box(2, h - peak_x1 - 4, w - 4, peak_x2 - peak_x1); else draw_box(peak_x1 + 2, 2, peak_x2 - peak_x1, h-4); }// draw over if(over_timer) { set_color(RED); if(vertical) draw_text(10, h - 25, "O"); else draw_text(25, h / 2 + get_text_height(LARGEFONT) / 2 - 2, "OVER");// force user to reset over_timer--; } flash();}BC_Meter::update(float new_value, int over){ peak_timer++; if(mode == METER_DB) { if(new_value == 0) new_value = min; else new_value = db.todb(new_value); // db value level_x = total_width - 4 - (int)((new_value / min) * total_width); } if(mode == METER_INT) { level_x = (int)(new_value * total_width - 4); } if(level_x > total_width - 4) level_x = total_width - 4; if(level_x > peak_x) { peak_x = level_x; peak_timer = 0; } else if(peak_timer > 10) { peak_x = level_x; peak_timer = 0; } if(over) over_timer = 100; // only draw if window is visible if(!top_level->hidden) { draw(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -