You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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();
}
};