// 提升Windows API版本到Vista
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
// 强制使用ANSI字符集
#define _MBCS
#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <set>
#include <cstring>
#include <cctype>
// 链接必要库
#pragma comment(lib, "comctl32.lib")
// 窗口类名
#define MAIN_WINDOW_CLASS "TextEditorMainClass"
#define EDITOR_WINDOW_CLASS "TextEditorEditClass"
// 控件ID
#define ID_BTN_ENTER_EDITOR 1001 // 主页跳转按钮
#define ID_STATIC_STATUS 1003 // 状态栏
// 颜色定义
#define COLOR_BG RGB(244, 164, 96) // 土黄色背景
#define COLOR_OPERATOR RGB(255, 0, 0) // 运算符:红色
#define COLOR_PREPROCESS RGB(128, 0, 128) // 预处理指令:紫色
#define COLOR_HEADER RGB(0, 102, 204) // 头文件:深蓝色
#define COLOR_COMMENT RGB(0, 128, 0) // 注释:绿色
#define COLOR_FUNC RGB(153, 0, 153) // 常用函数:深紫色
#define COLOR_CONSTANT RGB(139, 69, 19) // 常量:棕色
#define COLOR_KEYWORD RGB(255, 165, 0) // 核心关键字:橙色
#define COLOR_LINE_NUM RGB(0, 0, 0) // 行号:黑色
#define COLOR_TEXT RGB(0, 0, 0) // 普通文本:黑色
#define COLOR_CARET_LINE RGB(255, 248, 220) // 光标行高亮(浅黄)
#define COLOR_MATCH_BRACKET RGB(255, 215, 0) // 匹配括号(金色)
#define COLOR_EDIT_BG RGB(255, 255, 255) // 编辑区背景(白色)
#define COLOR_SELECTION RGB(173, 216, 230) // 选中区域高亮(浅蓝)
// 全局变量
HWND g_hwndEditor = NULL; // 编辑器窗口句柄
int g_fontSize = 12; // 默认字体大小
LOGFONT g_logFont = {0}; // 字体结构
HFONT g_hFont = NULL; // 字体句柄
stdsetstd::string g_operators; // 运算符集合
stdsetstd::string g_preprocess; // 预处理指令集合
stdsetstd::string g_headers; // 头文件集合
stdsetstd::string g_keywords; // 核心关键字集合
stdsetstd::string g_core_funcs; // 常用函数集合
stdsetstd::string g_constants; // 常量集合
// 文本缓冲区和光标信息
std::vectorstd::string g_textLines; // 存储每行文本
int g_caretLine = 0; // 当前光标行(从0开始)
int g_caretCol = 0; // 当前光标列(从0开始)
int g_viewportTop = 0; // 视图顶部可见行
int g_matchBracketLine = -1; // 匹配括号所在行
int g_matchBracketCol = -1; // 匹配括号所在列
// 新增:选中区域相关(全选/复制需要)
int g_selectStartLine = -1; // 选中起始行
int g_selectStartCol = -1; // 选中起始列
int g_selectEndLine = -1; // 选中结束行
int g_selectEndCol = -1; // 选中结束列
bool g_isSelected = false; // 是否有选中内容
// ===================== 核心修复:添加函数原型声明 =====================
// 确保所有被调用的函数在调用前有声明
void UpdateStatusBar();
void FindMatchingBracket();
void HandleDelete();
void InsertChar(char ch);
void HandleNewLine();
void HandleBackspace();
void ClearScreen();
void UpdateFont();
void ScreenToTextPos(int x, int y, int& line, int& col);
void DrawTextContent(HDC hdc);
COLORREF GetCharColor(int lineIdx, int colIdx);
void InitKeywordSets();
void InitSampleCode();
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EditorWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL RegisterWindowClasses(HINSTANCE hInstance);
// 示例代码
const char* g_sampleCode =
"// 简易C示例代码(可自由修改)\n"
"#include <iostream>\n"
"#include <string>\n"
"#include <vector>\n"
"\n"
"// 计算两数之和的函数\n"
"int add(int a, int b) {\n"
" return a + b;\n"
"}\n"
"\n"
"int main() {\n"
" // 定义变量\n"
" int num1 = 10;\n"
" int num2 = 20;\n"
" std::string hello = "Hello, C!";\n"
" const bool flag = true;\n"
" \n"
" // 输出信息\n"
" stdcout << hello << stdendl;\n"
" stdcout << "10 + 20 = " << add(num1, num2) << stdendl;\n"
" \n"
" // 循环示例\n"
" for (int i = 0; i < 5; i++) {\n"
" stdcout << "循环次数:" << i << stdendl;\n"
" }\n"
" \n"
" // 条件判断\n"
" if (num1 > num2) {\n"
" stdcout << num1 << " 大于 " << num2 << stdendl;\n"
" } else {\n"
" stdcout << num1 << " 小于等于 " << num2 << stdendl;\n"
" }\n"
" \n"
" // 数组/容器示例\n"
" stdvector<int> nums = {1, 2, 3, 4, 5};\n"
" for (auto num : nums) {\n"
" stdcout << "数组元素:" << num << std::endl;\n"
" }\n"
" \n"
" return 0;\n"
"}\n";
// 初始化关键字集合
void InitKeywordSets() {
// 运算符集合
const char* ops[] = {"+", "-", "", "/", "%", "=", "+=", "-=", "=", "/=", "%=",
"==", "!=", "<", ">", "<=", ">=", "&&", "||", "!", "&", "|",
"^", "~", "<<", ">>", "", "--", "?", ":", ",", ";", "(", ")",
"{", "}", "[", "]", ".", "->", "<<=", ">>=", "&=", "^=", "|="};
for (size_t i = 0; i < sizeof(ops)/sizeof(ops[0]); i) {
g_operators.insert(ops[i]);
}
}
// 初始化示例代码到文本缓冲区
void InitSampleCode() {
g_textLines.clear();
std::string code(g_sampleCode);
size_t pos = 0;
size_t prev = 0;
}
// 更新状态栏
void UpdateStatusBar() {
if (!g_hwndEditor) return;
}
// 创建/更新字体
void UpdateFont() {
// 销毁旧字体
if (g_hFont) {
DeleteObject(g_hFont);
g_hFont = NULL;
}
}
// 查找匹配的括号
void FindMatchingBracket() {
g_matchBracketLine = -1;
g_matchBracketCol = -1;
}
// 获取字符的着色颜色
COLORREF GetCharColor(int lineIdx, int colIdx) {
const std::string& line = g_textLines[lineIdx];
if (colIdx >= (int)line.length()) return COLOR_TEXT;
}
// 新增:将屏幕坐标转换为文本行/列(鼠标点击跳转核心)
void ScreenToTextPos(int x, int y, int& line, int& col) {
RECT rcClient;
GetClientRect(g_hwndEditor, &rcClient);
}
// 绘制文本(核心绘制逻辑,新增选中区域高亮)
void DrawTextContent(HDC hdc) {
if (g_textLines.empty()) return;
}
// 插入字符到当前光标位置
void InsertChar(char ch) {
// 插入前先清除选中内容
if (g_isSelected) {
HandleDelete(); // 复用删除逻辑清除选中内容
g_isSelected = false;
g_selectStartLine = g_selectEndLine = -1;
g_selectStartCol = g_selectEndCol = -1;
}
}
// 处理换行
void HandleNewLine() {
// 换行前清除选中
if (g_isSelected) {
HandleDelete();
g_isSelected = false;
g_selectStartLine = g_selectEndLine = -1;
g_selectStartCol = g_selectEndCol = -1;
}
}
// 处理退格
void HandleBackspace() {
// 退格前清除选中
if (g_isSelected) {
HandleDelete();
g_isSelected = false;
g_selectStartLine = g_selectEndLine = -1;
g_selectStartCol = g_selectEndCol = -1;
return;
}
}
// 处理删除键(新增:支持删除选中区域)
void HandleDelete() {
if (g_isSelected) {
// 删除选中区域
if (g_selectStartLine == g_selectEndLine) {
// 单行选中
g_textLines[g_selectStartLine].erase(g_selectStartCol, g_selectEndCol - g_selectStartCol);
g_caretLine = g_selectStartLine;
g_caretCol = g_selectStartCol;
} else {
// 多行选中
// 1. 处理起始行剩余内容
std::string& startLine = g_textLines[g_selectStartLine];
startLine.erase(g_selectStartCol);
}
// 清屏功能(无system调用)
void ClearScreen() {
g_textLines.clear();
g_textLines.push_back("");
g_caretLine = 0;
g_caretCol = 0;
g_viewportTop = 0;
g_matchBracketLine = -1;
g_matchBracketCol = -1;
}
// 主页窗口过程
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE: {
CreateWindowA("BUTTON", "进入文本编辑器",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
200, 150, 180, 40,
hwnd, (HMENU)ID_BTN_ENTER_EDITOR,
(HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
break;
}
case WM_COMMAND: {
if (LOWORD(wParam) == ID_BTN_ENTER_EDITOR) {
ShowWindow(hwnd, SW_HIDE);
g_hwndEditor = CreateWindowA(EDITOR_WINDOW_CLASS, "简易C++文本编辑器(纯绘制版)",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 900, 700,
NULL, NULL, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
}
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
default:
return DefWindowProcA(hwnd, msg, wParam, lParam);
}
return 0;
}
// 编辑器窗口过程(纯绘制实现,新增快捷键和鼠标处理)
LRESULT CALLBACK EditorWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE: {
// 创建状态栏
CreateWindowA("STATIC", "字符数:0 | 行:1 列:1",
WS_VISIBLE | WS_CHILD | SS_LEFT,
10, 10, 250, 20,
hwnd, (HMENU)ID_STATIC_STATUS,
(HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
}
// 注册窗口类
BOOL RegisterWindowClasses(HINSTANCE hInstance) {
// 注册主页窗口类
WNDCLASSEXA wcMain = {0};
wcMain.cbSize = sizeof(WNDCLASSEXA);
wcMain.lpfnWndProc = MainWndProc;
wcMain.hInstance = hInstance;
wcMain.lpszClassName = MAIN_WINDOW_CLASS;
wcMain.hbrBackground = CreateSolidBrush(COLOR_BG);
wcMain.hCursor = LoadCursor(NULL, IDC_ARROW);
if (!RegisterClassExA(&wcMain)) return FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 初始化关键字集合
InitKeywordSets();
}