直接用vc++6.0打开安装目录下\PlugInDoc\VC++\DemoMfc\DemoMfc.dsp工程文件,将DemoMfc.cpp的代码全部删除,替换以下代码后直接编译dll文件即可。插件特色可以根据参数quotes决定单引号的数量,一般数字型的我们不需要单引号,直接传0即可,如果是要粘贴到过程里动态sql的需要两个单引号就需要传2,另还有一个复制到下一行功能,类似notepad++的ctrl+d功能,代码都已经写好了,直接编译即可,也可以下载我编译好的文件 https://download.csdn.net/download/kfzx3427/87810585
#include "stdafx.h"
#include "DemoMfc.h"
#include "PlSql_functions.h"
#include <ctype.h>
#include <string.h>
#include <fstream>
#include <iostream>
#include <ctime>
#include <windows.h>
// 将整数转换为字符串
const char* IntToStr(int n)
{
static CString s;
s.Format("%i", n);
return s;
}
// 追加日志到日志文件
void AppendToLog(const char* logMessage)
{
FILE* logFile = fopen("log.txt", "w");
if (logFile != NULL)
{
// 获取当前时间
time_t currentTime = time(NULL);
char* timestamp = ctime(¤tTime);
// 删除时间结尾的换行符
if (timestamp != NULL)
{
size_t length = strlen(timestamp);
if (length > 0 && timestamp[length - 1] == '\n')
{
timestamp[length - 1] = '\0';
}
}
// 写入日志信息
fprintf(logFile, "Timestamp: %s - %s\n", timestamp, logMessage);
// 关闭文件
fclose(logFile);
}
}
void SelectCurrentLine(HWND hEditWnd)
{
// 获取光标所在行数
int line = IDE_GetCursorY();
// 获取行的起始位置和结束位置
int lineStart = SendMessage(hEditWnd, EM_LINEINDEX, line - 1, 0);
int lineEnd = SendMessage(hEditWnd, EM_LINEINDEX, line, 0);
// 选中光标所在行的文本
//SendMessage(hEditWnd, EM_SETSEL, 0, 32767);
// 设置焦点到编辑器窗口,以确保选中文本可见
}
void PasteBelow()
{
int H = IDE_GetEditorHandle();
HWND hEditWnd = (HWND)H;
if (hEditWnd == NULL)
{
return;
}
SendMessage(hEditWnd, WM_KEYDOWN, VK_END, 0);
SendMessage(hEditWnd, WM_KEYUP, VK_END, 0);
int caretPos = SendMessage(hEditWnd, EM_GETSEL, 0, 0);
int lineNumber = IDE_GetCursorY(); // 获取当前行号
int lineStart = SendMessage(hEditWnd, EM_LINEINDEX, lineNumber - 1, 0); // 获取当前行的起始位置
int lineEnd = SendMessage(hEditWnd, EM_LINEINDEX, lineNumber, 0); // 获取当前行的结束位置
int textLength = SendMessage(hEditWnd, WM_GETTEXTLENGTH, 0, 0);
if (lineEnd == 0 && textLength > 0)
{
lineEnd = textLength; // 将行的结束位置设置为整个文本的长度减1
}
char* buffer = IDE_GetSelectedText();
if (strlen(buffer) == 0) // 判断字符串是否为空
{
// 选中当前行
SendMessage(hEditWnd, EM_SETSEL, lineStart, lineEnd);
Sleep(10);
buffer = IDE_GetSelectedText();
}
// 取消当前的文本选中状态
SendMessage(hEditWnd, EM_SETSEL, caretPos, caretPos);
SendMessage(hEditWnd, EM_REPLACESEL, TRUE, (LPARAM)"\r\n");
SendMessage(hEditWnd, EM_REPLACESEL, TRUE, (LPARAM)buffer);
}
char* convertCase(const char* str, int toLower) {
if (str == NULL) {
return NULL;
}
size_t length = strlen(str);
char* result = new char[length + 1];
strcpy(result, str);
for (size_t i = 0; i < length; i++) {
if (toLower) {
result[i] = tolower(result[i]);
} else {
result[i] = toupper(result[i]);
}
}
int H = IDE_GetEditorHandle();
if (H > 0)
{
SendMessage((HWND)H, EM_REPLACESEL, true, (LPARAM)result);
}
delete[] result;
return 0;
}
char* MenuItemInterface(int Index, bool CreateMenuItem_);
char* CreateMenuItem(int Index)
{
return MenuItemInterface(Index, true);
}
char* IdentifyPlugIn(int ID)
{
PlugInID = ID;
return Desc;
}
void OnMenuClick(int Index)
{
MenuItemInterface(Index, false);
}
char* GetClipboardText()
{
if (!OpenClipboard(NULL))
{
return NULL;
}
HANDLE hData = GetClipboardData(CF_TEXT);
if (hData == NULL)
{
CloseClipboard();
return NULL;
}
char* clipboardText = NULL;
char* buffer = (char*)GlobalLock(hData);
if (buffer != NULL)
{
int textLength = strlen(buffer) + 1;
clipboardText = new char[textLength];
strcpy(clipboardText, buffer);
GlobalUnlock(hData);
}
CloseClipboard();
return clipboardText;
}
char* ReplaceNewlines(const char* input, int quotes, bool autoLineBreak)
{
int inputLength = strlen(input);
char* result = new char[4 * inputLength + 3]; // 假设输入长度的四倍足够容纳替换后的文本
int count = 0;
int resultIndex = 0;
// 首先替换输入字符串的首尾换行回车为空
int startIndex = 0;
int endIndex = inputLength - 1;
while (input[startIndex] == '\r' || input[startIndex] == '\n')
{
startIndex++;
}
while (input[endIndex] == '\r' || input[endIndex] == '\n')
{
endIndex--;
}
// 添加开头的括号
result[resultIndex++] = '(';
// 添加开头的引号
bool insideQuotes = false;
bool isNewline = false; // 新增标记用于判断是否为连续的换行符
if (quotes > 0 && !isNewline)
{
for (int j = 0; j < quotes; j++)
{
result[resultIndex++] = '\'';
}
insideQuotes = true;
}
// 进行换行符替换
for (int i = startIndex; i <= endIndex; i++)
{
if (input[i] == '\r' && input[i + 1] == '\n')
{
if (insideQuotes)
{
for (int j = 0; j < quotes; j++)
{
result[resultIndex++] = '\'';
}
insideQuotes = false;
}
if (!isNewline) // 只处理第一个换行符
{
count++;
if (autoLineBreak && count % 10 == 0 && count > 0)
{
result[resultIndex++] = ',';
result[resultIndex++] = '\r';
result[resultIndex++] = '\n';
}
else
{
result[resultIndex++] = ',';
}
}
isNewline = true;
i++; // 跳过 '\n'
}
else
{
if (isNewline)
{
isNewline = false;
}
if (!insideQuotes && quotes > 0)
{
for (int j = 0; j < quotes; j++)
{
result[resultIndex++] = '\'';
}
insideQuotes = true;
}
result[resultIndex++] = input[i];
}
}
// 添加末尾的引号和括号
if (insideQuotes && quotes > 0)
{
for (int j = 0; j < quotes; j++)
{
result[resultIndex++] = '\'';
}
}
result[resultIndex++] = ')';
result[resultIndex] = '\0';
int H = IDE_GetEditorHandle();
if (H > 0)
{
SendMessage((HWND)H, EM_REPLACESEL, true, (LPARAM)result);
}
delete[] result;
return 0;
}
char* MenuItemInterface(int Index, bool CreateMenuItem_)
{
char* text1 = "0";
if (CreateMenuItem_)
{
switch (Index)
{
case 1:
return "Plugins / &无引号自动";
case 2:
return "Plugins / &单引号自动";
case 3:
return "Plugins / &双单引号自动";
case 4:
return "Plugins / &无引号";
case 5:
return "Plugins / &单引号";
case 6:
return "Plugins / &双单引号";
case 7:
return "Plugins / &转小写";
case 8:
return "Plugins / &转大写";
case 9:
return "Plugins / &复制到下一行";
}
}
else
{
char* selectedText = IDE_GetSelectedText();
// 判断 selectedText 是否为空
if (selectedText != NULL && strlen(selectedText) > 0) {
text1 = selectedText;
} else {
// 判断 clipboardText 是否为空
char* clipboardText = GetClipboardText();
if (clipboardText != NULL && strlen(clipboardText) > 0) {
text1 = clipboardText;
}else{
text1 = NULL;
}
}
if (text1 != NULL)
{
switch (Index)
{
case 1:
ReplaceNewlines(text1, 0, true);
break;
case 2:
ReplaceNewlines(text1, 1, true);
break;
case 3:
ReplaceNewlines(text1, 2, true);
break;
case 4:
ReplaceNewlines(text1, 0, false);
break;
case 5:
ReplaceNewlines(text1, 1, false);
break;
case 6:
ReplaceNewlines(text1, 2, false);
break;
case 7:
convertCase(selectedText, 1);
break;
case 8:
convertCase(selectedText, 0);
break;
case 9:
PasteBelow();
break;
}
}
}
return "";
}