Visual Studio小技巧:复制代码时,保留原ID

本文介绍如何在Visual Studio中禁用自动为粘贴的HTML元素重新生成ID的功能,避免在开发过程中不必要的ID修改。

在我们开发过程中,经常会复制一些代码,而Visual Studio会自动把这些代码的ID重新生成,常常导致我们还必须去修改回原ID

其实,Visual Studio是可以保留原始ID的。我们可以通过在Tools->Options->Text Editor->HTML->Miscellaneous中,把Auto ID elements on paste in Source View前面的勾去掉就可以。

如图所示


 

 

转载于:https://www.cnblogs.com/binny1983/archive/2009/05/11/1454097.html

<think>我们使用Win32 API和标准C++来创建一个简单的记事本应用程序。这个应用程序将具有以下功能: 1. 创建、打开、保存文件 2. 基本的文本编辑功能(复制、粘贴、剪切等) 3. 简单的菜单栏(文件、编辑) 注意:由于不使用MFC,我们将直接使用Win32 API创建窗口和控件。 步骤: 1. 创建主窗口,并在其中创建一个多行编辑控件(EDIT)。 2. 添加菜单栏,包含文件(新建、打开、保存、退出)和编辑(撤销、剪切、复制、粘贴、删除)。 3. 实现菜单命令的消息处理。 4. 实现文件对话框(打开和保存)使用commdlg.h中的函数。 我们将使用Unicode字符集。 由于代码较长,我们将分步骤编写。 注意:为了支持文件对话框,我们需要链接comdlg32.lib。 在Visual Studio中,可以在项目属性->链接器->输入->附加依赖项中添加:comdlg32.lib 代码结构: 1. 全局变量:编辑控件句柄,当前文件名等。 2. 窗口过程函数(WndProc)处理消息。 3. 创建菜单的函数(可以在WinMain中创建)。 4. 文件操作函数:打开、保存。 我们开始编写完整代码:</think>下面是一个完整的C++ Notebook应用程序实现,使用Win32 API而不依赖MFC。该程序包含文件操作、文本编辑和基本UI功能: ```cpp #include <Windows.h> #include <commctrl.h> #include <commdlg.h> #include <string> #include <fstream> #include <sstream> // 资源ID定义 #define IDM_OPEN 1001 #define IDM_SAVE 1002 #define IDM_SAVEAS 1003 #define IDM_EXIT 1004 #define IDM_COPY 2001 #define IDM_CUT 2002 #define IDM_PASTE 2003 #define IDM_ABOUT 3001 // 全局变量 HWND g_hEdit; // 编辑控件句柄 std::wstring g_currentFile; // 当前文件路径 HFONT g_hFont; // 字体句柄 // 创建主窗口 HWND CreateMainWindow(HINSTANCE hInstance) { WNDCLASSEX wc = { sizeof(WNDCLASSEX) }; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = [](HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -> LRESULT { switch (msg) { case WM_CREATE: { // 创建编辑控件 g_hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 0, 0, 0, hWnd, (HMENU)1, hInstance, NULL); // 创建字体 g_hFont = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Consolas"); SendMessage(g_hEdit, WM_SETFONT, (WPARAM)g_hFont, TRUE); break; } case WM_SIZE: // 调整编辑控件大小 MoveWindow(g_hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_COMMAND: { WORD cmd = LOWORD(wParam); switch (cmd) { case IDM_OPEN: OpenFile(hWnd); break; case IDM_SAVE: SaveFile(hWnd, false); break; case IDM_SAVEAS: SaveFile(hWnd, true); break; case IDM_EXIT: PostMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_COPY: SendMessage(g_hEdit, WM_COPY, 0, 0); break; case IDM_CUT: SendMessage(g_hEdit, WM_CUT, 0, 0); break; case IDM_PASTE: SendMessage(g_hEdit, WM_PASTE, 0, 0); break; case IDM_ABOUT: { MessageBox(hWnd, L"C++ Notebook Application\nVersion 1.0\nWin32 API Implementation", L"About", MB_OK | MB_ICONINFORMATION); break; } } break; } case WM_CLOSE: if (MessageBox(hWnd, L"确定要退出吗?", L"退出", MB_YESNO | MB_ICONQUESTION) == IDYES) { DestroyWindow(hWnd); } break; case WM_DESTROY: DeleteObject(g_hFont); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = L"NotebookApp"; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&wc)) { MessageBox(NULL, L"窗口注册失败!", L"错误", MB_ICONERROR); return NULL; } // 创建主窗口 HWND hWnd = CreateWindowEx(0, L"NotebookApp", L"Notebook", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL); if (!hWnd) { MessageBox(NULL, L"窗口创建失败!", L"错误", MB_ICONERROR); } return hWnd; } // 创建菜单 HMENU CreateAppMenu() { HMENU hMenu = CreateMenu(); HMENU hFileMenu = CreatePopupMenu(); HMENU hEditMenu = CreatePopupMenu(); HMENU hHelpMenu = CreatePopupMenu(); // 文件菜单 AppendMenu(hFileMenu, MF_STRING, IDM_OPEN, L"打开(&O)"); AppendMenu(hFileMenu, MF_STRING, IDM_SAVE, L"保存(&S)"); AppendMenu(hFileMenu, MF_STRING, IDM_SAVEAS, L"另存为(&A)"); AppendMenu(hFileMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hFileMenu, MF_STRING, IDM_EXIT, L"退出(&X)"); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, L"文件(&F)"); // 编辑菜单 AppendMenu(hEditMenu, MF_STRING, IDM_COPY, L"复制(&C)"); AppendMenu(hEditMenu, MF_STRING, IDM_CUT, L"剪切(&T)"); AppendMenu(hEditMenu, MF_STRING, IDM_PASTE, L"粘贴(&P)"); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hEditMenu, L"编辑(&E)"); // 帮助菜单 AppendMenu(hHelpMenu, MF_STRING, IDM_ABOUT, L"关于(&A)"); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hHelpMenu, L"帮助(&H)"); return hMenu; } // 打开文件 void OpenFile(HWND hWnd) { OPENFILENAME ofn; wchar_t szFile[260] = { 0 }; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = L"文本文件\0*.TXT\0所有文件\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn)) { std::wifstream file(ofn.lpstrFile); if (file.is_open()) { std::wstringstream buffer; buffer << file.rdbuf(); SetWindowText(g_hEdit, buffer.str().c_str()); g_currentFile = ofn.lpstrFile; // 更新窗口标题 std::wstring title = L"Notebook - " + g_currentFile; SetWindowText(hWnd, title.c_str()); } else { MessageBox(hWnd, L"无法打开文件!", L"错误", MB_ICONERROR); } } } // 保存文件 void SaveFile(HWND hWnd, bool saveAs) { OPENFILENAME ofn; wchar_t szFile[260] = { 0 }; if (!saveAs && !g_currentFile.empty()) { wcscpy_s(szFile, g_currentFile.c_str()); } else { ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = L"文本文件\0*.TXT\0所有文件\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrDefExt = L"txt"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; if (!GetSaveFileName(&ofn)) { return; // 用户取消 } } int len = GetWindowTextLength(g_hEdit) + 1; wchar_t* buffer = new wchar_t[len]; GetWindowText(g_hEdit, buffer, len); std::wofstream file(szFile); if (file.is_open()) { file << buffer; g_currentFile = szFile; // 更新窗口标题 std::wstring title = L"Notebook - " + g_currentFile; SetWindowText(hWnd, title.c_str()); } else { MessageBox(hWnd, L"无法保存文件!", L"错误", MB_ICONERROR); } delete[] buffer; } // 应用程序入口 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 初始化通用控件 INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_STANDARD_CLASSES; InitCommonControlsEx(&icc); // 创建主窗口 HWND hMainWnd = CreateMainWindow(hInstance); if (!hMainWnd) { return 1; } // 创建菜单 HMENU hMenu = CreateAppMenu(); SetMenu(hMainWnd, hMenu); // 显示窗口 ShowWindow(hMainWnd, nCmdShow); UpdateWindow(hMainWnd); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` ### 项目配置步骤 1. 在Visual Studio中创建**Windows桌面应用程序**项目 2. 将上述代码复制到主源文件(如`main.cpp`) 3. 配置项目属性: - 字符集:**使用Unicode字符集** - 子系统:**Windows (/SUBSYSTEM:WINDOWS)** - 附加依赖项:`comctl32.lib; comdlg32.lib` ### 功能说明 1. **文件操作**: - 打开/保存文本文件(支持.txt格式) - 另存为功能 - 自动更新窗口标题显示当前文件名 2. **编辑功能**: - 复制/剪切/粘贴文本 - 多行编辑支持滚动条 - 使用等宽字体(Consolas) 3. **用户界面**: - 标准Windows菜单(文件、编辑、帮助) - 关于对话框 - 退出确认提示 ### 高级功能扩展建议 1. **添加富文本支持**(使用RichEdit控件): ```cpp // 初始化RichEdit控件(在WinMain中) LoadLibrary(L"Msftedit.dll"); g_hEdit = CreateWindowEx(0, MSFTEDIT_CLASS, L"", ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | WS_HSCROLL, 0, 0, 0, 0, hWnd, NULL, hInstance, NULL); ``` 2. **实现查找/替换功能**: ```cpp // 查找对话框实现 void FindText(HWND hWnd) { static FINDREPLACE fr; fr.lStructSize = sizeof(fr); fr.hwndOwner = hWnd; fr.lpstrFindWhat = new TCHAR[256]; fr.wFindWhatLen = 256; fr.Flags = FR_DOWN; FindText(&fr); } ``` 3. **添加最近文件列表**: ```cpp // 在注册表中存储最近文件 void SaveRecentFiles(const std::vector<std::wstring>& files) { HKEY hKey; RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\NotebookApp", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); for (int i = 0; i < files.size(); ++i) { std::wstring valueName = L"RecentFile" + std::to_wstring(i); RegSetValueEx(hKey, valueName.c_str(), 0, REG_SZ, (const BYTE*)files[i].c_str(), (files[i].size() + 1) * sizeof(wchar_t)); } RegCloseKey(hKey); } ``` ### 性能优化技巧 1. **大文件处理**: ```cpp // 使用内存映射文件处理大文件 HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); LPCWSTR pData = (LPCWSTR)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0); SetWindowText(g_hEdit, pData); UnmapViewOfFile(pData); CloseHandle(hMapping); CloseHandle(hFile); ``` 2. **异步保存**: ```cpp // 使用多线程防止UI冻结 void AsyncSave(const std::wstring& path, const std::wstring& content) { std::thread([path, content]() { std::wofstream file(path); file << content; }).detach(); } ``` ### 相关问题 1. 如何在Win32应用程序中实现多文档界面(MDI)?[^1] 2. 如何为Notebook添加语法高亮功能? 3. 如何将SQLite数据库集成到C++ Notepad中存储笔记? 4. Win32 API中如何处理高DPI缩放问题? 5. 如何为Notebook应用程序添加插件系统? ### 部署注意事项 1. 静态链接运行库(/MT编译选项) 2. 包含必要的manifest文件支持Windows主题 3. 为RichEdit控件分发`Msftedit.dll`(如果需要) 此实现提供了一个完整的、可扩展的Notebook应用程序基础,可根据需要添加更多高级功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值