diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts index 68e5557..c40ad65 100644 --- a/frontend/electron/main.ts +++ b/frontend/electron/main.ts @@ -69,6 +69,8 @@ function createWindow() { minWidth: 800, minHeight: 600, icon: path.join(__dirname, '../src/assets/AUTO_MAA.ico'), + frame: false, // 去掉系统标题栏 + titleBarStyle: 'hidden', // 隐藏标题栏 webPreferences: { preload: path.join(__dirname, 'preload.js'), nodeIntegration: false, @@ -109,6 +111,33 @@ ipcMain.handle('open-dev-tools', () => { } }) +// 窗口控制 +ipcMain.handle('window-minimize', () => { + if (mainWindow) { + mainWindow.minimize() + } +}) + +ipcMain.handle('window-maximize', () => { + if (mainWindow) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize() + } else { + mainWindow.maximize() + } + } +}) + +ipcMain.handle('window-close', () => { + if (mainWindow) { + mainWindow.close() + } +}) + +ipcMain.handle('window-is-maximized', () => { + return mainWindow ? mainWindow.isMaximized() : false +}) + ipcMain.handle('select-folder', async () => { if (!mainWindow) return null const result = await dialog.showOpenDialog(mainWindow, { diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts index 7e136fd..6aae513 100644 --- a/frontend/electron/preload.ts +++ b/frontend/electron/preload.ts @@ -11,6 +11,12 @@ contextBridge.exposeInMainWorld('electronAPI', { selectFile: (filters?: any[]) => ipcRenderer.invoke('select-file', filters), openUrl: (url: string) => ipcRenderer.invoke('open-url', url), + // 窗口控制 + windowMinimize: () => ipcRenderer.invoke('window-minimize'), + windowMaximize: () => ipcRenderer.invoke('window-maximize'), + windowClose: () => ipcRenderer.invoke('window-close'), + windowIsMaximized: () => ipcRenderer.invoke('window-is-maximized'), + // 初始化相关API checkEnvironment: () => ipcRenderer.invoke('check-environment'), downloadPython: (mirror?: string) => ipcRenderer.invoke('download-python', mirror), diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 36e57aa..4b0bcc2 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -4,6 +4,7 @@ import { useRoute } from 'vue-router' import { ConfigProvider } from 'ant-design-vue' import { useTheme } from './composables/useTheme.ts' import AppLayout from './components/AppLayout.vue' +import TitleBar from './components/TitleBar.vue' import zhCN from 'ant-design-vue/es/locale/zh_CN' import { logger } from '@/utils/logger' @@ -24,8 +25,11 @@ onMounted(() => { - - + +
+ + +
@@ -33,4 +37,9 @@ onMounted(() => { * { box-sizing: border-box; } + +.app-container { + height: 100vh; + overflow: hidden; +} diff --git a/frontend/src/components/AppLayout.vue b/frontend/src/components/AppLayout.vue index 76b28c0..f605f22 100644 --- a/frontend/src/components/AppLayout.vue +++ b/frontend/src/components/AppLayout.vue @@ -7,14 +7,14 @@ :width="180" :collapsed-width="60" :theme="isDark ? 'dark' : 'light'" - style="height: 100vh; position: fixed; left: 0; top: 0; z-index: 100" + style="height: calc(100vh - 32px); position: fixed; left: 0; top: 32px; z-index: 100" >
- - + + + + +