ADD file via upload

main
mi84kabv9 6 months ago
parent a94b0dd167
commit f36a5d2630

@ -0,0 +1,164 @@
#include<graphics.h>
#include <tchar.h>
class EasyTextBox {
private:
int left = 0, top = 0, right = 0, bottom = 0;
wchar_t* text = NULL;
size_t maxlen = 0;
public:
void create(int x1, int y1, int x2, int y2, int max) {
maxlen = max;
text = new wchar_t[maxlen];
text[0] = 0;
left = x1, top = y1, right = x2, bottom = y2;
// 绘制用户界面
show();
}
~EasyTextBox() {
if (text != NULL) delete[] text;
}
wchar_t* get_text() {
return text;
}
bool check(int x, int y) {
return left <= x && x <= right && top <= y && y <= bottom;
}
void show() {
// 备份环境值
int old_line_color = getlinecolor();
int old_bk_color = getbkcolor();
int old_fill_color = getfillcolor();
setlinecolor(LIGHTGRAY);
setbkcolor(0xeeeeee);
setfillcolor(0xeeeeee);
fillrectangle(left, top, right, bottom);
outtextxy(left + 10, top + 5, (LPCTSTR)(&text[0]));
// 恢复环境值
setlinecolor(old_line_color);
setbkcolor(old_line_color);
setfillcolor(old_fill_color);
}
void on_message() {
// 备份环境值
int old_line_color = getlinecolor();
int old_bk_color = getbkcolor();
int old_fill_color = getfillcolor();
setlinecolor(BLACK);
setbkcolor(WHITE);
setfillcolor(WHITE);
fillrectangle(left, top, right, bottom);
int width = textwidth((LPCTSTR)text);
int counter = 0;
bool binput = true;
ExMessage msg;
while (binput) {
// 获取消息,但不从消息队列中拿出
while (binput && peekmessage(&msg, EX_MOUSE | EX_CHAR, false)) {
if (msg.message == WM_LBUTTONDOWN) {
// 如果鼠标点击文本框外面,结束文本输入
if (msg.x < left || msg.x > right || msg.y < top || msg.y > bottom) {
binput = false;
break;
}
}
else if (msg.message == WM_CHAR) {
size_t len = wcslen(text);
switch (msg.ch) {
case '\b': {
if (len > 0) {
text[len - 1] = 0;
width = textwidth((LPCTSTR)text);
counter = 0;
clearrectangle(left + 10 + width, top + 1, right - 1, bottom - 1);
}
break;
}
case '\r':
case '\n':
binput = false;
break;
default:
if (len < maxlen - 1) {
text[len++] = msg.ch;
text[len] = 0;
clearrectangle(left + 10 + width + 1, top + 3, left + 10 + width + 1, bottom - 3); // 清除画的光标
// 重新计算文本框宽度
width = textwidth((LPCTSTR)text);
counter = 0;
outtextxy(left + 10, top + 5, (LPCTSTR)text);
}
}
}
peekmessage(NULL, EX_MOUSE | EX_CHAR);
}
// 绘制光标(光标闪烁周期为 20ms * 32
counter = (counter + 1) % 32;
if (counter < 16)
line(left + 10 + width + 1, top + 3, left + 10 + width + 1, bottom - 3);
else
clearrectangle(left + 10 + width + 1, top + 3, left + 10 + width + 1, bottom - 3); // 擦光标
// 延时 20ms
Sleep(20);
}
clearrectangle(left + 10 + width + 1, top + 3, left + 10 + width + 1, bottom - 3); // 擦光标
// 恢复环境值
setlinecolor(old_line_color);
setbkcolor(old_bk_color);
setfillcolor(old_fill_color);
show();
}
};
// 实现按钮控件
class EasyButton {
private:
int left = 0, top = 0, right = 0, bottom = 0;
wchar_t* text = NULL; // 控件内容
void (*userfunc)() = NULL; // 控件消息
public:
void create(int x1, int y1, int x2, int y2, const wchar_t* title, void(*func)()) {
text = new wchar_t[wcslen(title) + 1];
wcscpy_s(text, wcslen(title) + 1, title);
left = x1, top = y1, right = x2, bottom = y2;
userfunc = func;
// 绘制
show();
}
~EasyButton() {
if (text != NULL) delete[] text;
}
bool check(int x, int y) {
return left <= x && x <= right && top <= y && y <= bottom;
}
void show() {
int old_line_color = getlinecolor();
int old_bk_color = getbkcolor();
int old_fill_color = getfillcolor();
setlinecolor(BLACK); // 设置划线颜色
setbkcolor(WHITE); // 设置背景颜色
setfillcolor(WHITE); // 设置填充颜色
outtextxy(left + (right - left - textwidth((LPCTSTR)text) + 1) / 2, top + (bottom - top - textheight((LPCTSTR)text) + 1) / 2, (LPCTSTR)text);
setlinecolor(old_line_color);
setbkcolor(old_bk_color);
setfillcolor(old_fill_color);
}
void on_message() {
if (userfunc != NULL) userfunc();
}
};
Loading…
Cancel
Save