VS Code菜单栏的增、删、改

本章任务

对菜单栏进行编辑,增加一个Exit菜单,Exit菜单中增加两个选项。这两个选项都是调用的已经定义过的命令。

修改过程

这里需要修改这几个部分:

增加菜单Exit

1、src/vs/workbench/browser/parts/titlebar/menubarControl.ts

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、src/vs/platform/actions/common/actions.ts在这里插入图片描述
3、src/vs/platform/menubar/electron-main/menubar.ts在这里插入图片描述
这里第357行&&后的Exit就是菜单的名称,&&是指定快捷键,具体参考https://www.v2ex.com/t/670590

增加选项

4、src/vs/workbench/electron-sandbox/desktop.contribution.ts

在这里插入图片描述
在这里插入图片描述

  • 这里的127和146行最后的参数是选项的名称

  • 这里的126行是借用117行的指令,作用是关闭窗口。跟进CloseCurrentWindowAction可以看到这个类在src/vs/workbench/electron-sandbox/actions/windowActions.ts中定义,代码如下:

export class CloseCurrentWindowAction extends Action {

	static readonly ID = 'workbench.action.closeWindow';
	static readonly LABEL = nls.localize('closeWindow', "Close Window");

	constructor(
		id: string,
		label: string,
		@IElectronService private readonly electronService: IElectronService
	) {
		super(id, label);
	}

	async run(): Promise<void> {
		this.electronService.closeWindow();
	}
}

所以说此处关闭窗口的指令就是workbench.action.closeWindow

  • 这里的145行则是直接调用了workbench.action.quit命令。其实也可以把命令封装一下,用类名.ID调用。

效果

在这里插入图片描述

好的,教师信息管理系统的C++可视化程序大致上需要以下步骤: 1. 界面设计:使用Visual Studio的窗体设计器,设计教师信息管理系统的主界面,包括菜单栏、工具栏、状态栏、数据表格等控件。 2. 数据库设计:在Visual Studio中创建一个数据库,包括教室信息表,其中包含教室容纳人数、教室空闲时间、教室设备等字段。 3. 数据库连接:在程序中添加数据库连接代码,使用ODBC或者ADO.NET连接数据库。 4. 数据显示:将数据库中的教室信息显示在数据表格中,方便用户查看。 5. 数据操作:通过菜单栏提供的操作,用户可以方便地对教室信息进行维护。 下面是一个简单的示例程序,仅供参考: ```cpp #include <Windows.h> #include <sqlext.h> #include <iostream> #include <string> // 定义数据库连接字符串 #define DB_CONN_STR "DRIVER={SQL Server};SERVER=localhost;DATABASE=TeacherInfo;UID=sa;PWD=123456" // 定义窗口句柄和控件ID HWND hwnd; const int ID_MENU_FILE = 1; const int ID_MENU_ADD = 2; const int ID_MENU_DELETE = 3; const int ID_MENU_EDIT = 4; const int ID_TABLE = 5; // 定义ODBC连接参数 SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retcode; // 连接数据库 void connect() { // 分配环境句柄 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); // 分配连接句柄 SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); // 连接数据库 SQLCHAR* connStr = (SQLCHAR*)DB_CONN_STR; retcode = SQLDriverConnect(dbc, hwnd, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); // 分配语句句柄 SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); } // 断开数据库连接 void disconnect() { SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); } // 显示教室信息 void showData() { // 清空数据表格 HWND hTable = GetDlgItem(hwnd, ID_TABLE); SendMessage(hTable, LVM_DELETEALLITEMS, 0, 0); // 查询教室信息 retcode = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM Classroom", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { // 获取结果集列数 SQLSMALLINT numCols; SQLNumResultCols(stmt, &numCols); // 获取结果集列信息 SQLCHAR colName[256]; SQLSMALLINT colNameLen; SQLSMALLINT colType; SQLULEN colSize; LVCOLUMN lvCol = { 0 }; lvCol.mask = LVCF_TEXT | LVCF_WIDTH; lvCol.cx = 100; for (int i = 1; i <= numCols; i++) { SQLDescribeCol(stmt, i, colName, sizeof(colName), &colNameLen, &colType, &colSize, NULL, NULL); lvCol.pszText = (LPSTR)colName; SendMessage(hTable, LVM_INSERTCOLUMN, i - 1, (LPARAM)&lvCol); } // 获取结果集行信息 SQLCHAR colValue[256]; SQLLEN cbValue; int row = 0; LVITEM lvItem = { 0 }; lvItem.mask = LVIF_TEXT; while (SQLFetch(stmt) == SQL_SUCCESS) { lvItem.iItem = row; lvItem.iSubItem = 0; for (int i = 1; i <= numCols; i++) { SQLGetData(stmt, i, SQL_C_CHAR, colValue, sizeof(colValue), &cbValue); lvItem.pszText = (LPSTR)colValue; SendMessage(hTable, LVM_SETITEM, 0, (LPARAM)&lvItem); lvItem.iSubItem++; } row++; } } } // 加教室信息 void addData() { // 弹出对话框,输入教室信息 std::string capacity, freeTime, equipment; std::cout << "请输入教室信息:" << std::endl; std::cout << "容纳人数:"; std::getline(std::cin, capacity); std::cout << "空闲时间:"; std::getline(std::cin, freeTime); std::cout << "设备:"; std::getline(std::cin, equipment); // 插入教室信息 std::string sql = "INSERT INTO Classroom (Capacity, FreeTime, Equipment) VALUES ('" + capacity + "', '" + freeTime + "', '" + equipment + "')"; retcode = SQLExecDirect(stmt, (SQLCHAR*)sql.c_str(), SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { std::cout << "教室信息添加成功!" << std::endl; showData(); } else { std::cout << "教室信息添加失败!" << std::endl; } } // 删除教室信息 void deleteData() { // 弹出对话框,选择要删除的教室信息 HWND hTable = GetDlgItem(hwnd, ID_TABLE); int selectedRow = SendMessage(hTable, LVM_GETNEXTITEM, -1, LVNI_SELECTED); if (selectedRow >= 0) { LVITEM lvItem = { 0 }; lvItem.mask = LVIF_TEXT; lvItem.iItem = selectedRow; lvItem.iSubItem = 0; SendMessage(hTable, LVM_GETITEM, 0, (LPARAM)&lvItem); std::string id = lvItem.pszText; // 删除教室信息 std::string sql = "DELETE FROM Classroom WHERE ID=" + id; retcode = SQLExecDirect(stmt, (SQLCHAR*)sql.c_str(), SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { std::cout << "教室信息删除成功!" << std::endl; showData(); } else { std::cout << "教室信息删除失败!" << std::endl; } } else { std::cout << "请先选择要删除的教室信息!" << std::endl; } } // 修教室信息 void editData() { // 弹出对话框,选择要修的教室信息 HWND hTable = GetDlgItem(hwnd, ID_TABLE); int selectedRow = SendMessage(hTable, LVM_GETNEXTITEM, -1, LVNI_SELECTED); if (selectedRow >= 0) { LVITEM lvItem = { 0 }; lvItem.mask = LVIF_TEXT; lvItem.iItem = selectedRow; lvItem.iSubItem = 0; SendMessage(hTable, LVM_GETITEM, 0, (LPARAM)&lvItem); std::string id = lvItem.pszText; // 弹出对话框,输入新的教室信息 std::string capacity, freeTime, equipment; std::cout << "请输入新的教室信息:" << std::endl; std::cout << "容纳人数:"; std::getline(std::cin, capacity); std::cout << "空闲时间:"; std::getline(std::cin, freeTime); std::cout << "设备:"; std::getline(std::cin, equipment); // 修教室信息 std::string sql = "UPDATE Classroom SET Capacity='" + capacity + "', FreeTime='" + freeTime + "', Equipment='" + equipment + "' WHERE ID=" + id; retcode = SQLExecDirect(stmt, (SQLCHAR*)sql.c_str(), SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { std::cout << "教室信息修成功!" << std::endl; showData(); } else { std::cout << "教室信息修失败!" << std::endl; } } else { std::cout << "请先选择要修的教室信息!" << std::endl; } } // 处理菜单命令 void handleCommand(int command) { switch (command) { case ID_MENU_ADD: addData(); break; case ID_MENU_DELETE: deleteData(); break; case ID_MENU_EDIT: editData(); break; default: break; } } // 窗口过程 LRESULT CALLBACK wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: // 创建数据表格 { HWND hTable = CreateWindow(WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD | LVS_REPORT, 10, 50, 500, 400, hwnd, (HMENU)ID_TABLE, NULL, NULL); LVCOLUMN lvCol = { 0 }; lvCol.mask = LVCF_TEXT | LVCF_WIDTH; lvCol.cx = 100; lvCol.pszText = "ID"; SendMessage(hTable, LVM_INSERTCOLUMN, 0, (LPARAM)&lvCol); lvCol.pszText = "容纳人数"; SendMessage(hTable, LVM_INSERTCOLUMN, 1, (LPARAM)&lvCol); lvCol.pszText = "空闲时间"; SendMessage(hTable, LVM_INSERTCOLUMN, 2, (LPARAM)&lvCol); lvCol.pszText = "设备"; SendMessage(hTable, LVM_INSERTCOLUMN, 3, (LPARAM)&lvCol); } // 创建菜单栏 { HMENU hMenu = CreateMenu(); HMENU hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, ID_MENU_ADD, "加"); AppendMenu(hSubMenu, MF_STRING, ID_MENU_DELETE, "删除"); AppendMenu(hSubMenu, MF_STRING, ID_MENU_EDIT, "修"); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, "操作"); SetMenu(hwnd, hMenu); } // 连接数据库并显示教室信息 connect(); showData(); break; case WM_COMMAND: handleCommand(LOWORD(wParam)); break; case WM_CLOSE: disconnect(); DestroyWindow(hwnd); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } // 主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASS wc = { 0 }; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = wndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = "TeacherInfo"; RegisterClass(&wc); // 创建窗口 hwnd = CreateWindow("TeacherInfo", "教师信息管理系统", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 600, 500, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` 这个程序使用ODBC连接SQL Server数据库,实现了教室信息的和查询操作。在菜单栏中选择“加”、“删除”、“修”等操作,可以弹出对话框输入或选择教室信息。在数据表格中显示教室信息,并支持排序和筛选功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值