调用CreateWindow或CreateWindowEx创建窗口返回空句柄时,我们总是会调用GetLastError看下错误码,就知道具体错误的原因(比如窗口类未注册),但如果GetLastError 阅读CreateWindow API说明文档,梳理下CreateWindow的主要内部实现过程: 第一,系统创建窗口资源,获得一个窗口句柄。 所以,CreateWindow返回空句柄而GetLastError返回0是因为未正确处理WM_CREATE消息,返回非0值。
既然控件实际上是窗口,当然也是用CreateWindow或者CreateWindowEx这个函数来完成的,第二个函数除了多一个扩展风格之外,其他完全一样,下面以主要以CreateWindow为例说明,该函数原型如下 (实际上在第一篇已经讲过了): HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, 创建标签/静态文本 CreateWindow(TEXT("STATIC"), TEXT("Test String"), WS_CHILD|WS_VISIBLE, 10, 10, 80, 20, hWnd , (HMENU)IDC_STATIC1, NULL, NULL); 创建button CreateWindow(TEXT("BUTTON"), TEXT("Click Me"), WS_CHILD|WS_VISIBLE WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 134, 30, 40, 20, hWnd, (HMENU)IDC_MALE, NULL, NULL); 创建复选框 CreateWindow
通过MSDN可以知道,不管是创建窗口还是控件,都是通过CreateWindow或者CreateWindowEx这个函数来完成的,这两个函数除了多一个扩展风格之外,其他完全一样,下面以CreateWindow 为例说明,该函数原型如下: HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int 创建标签/静态文本: CreateWindow("STATIC", TEXT("Test Text"), WS_CHILD|WS_VISIBLE|SS_LEFT, 10, 10, 250, 30, hwnd )IDC_BUTTON1, NULL, NULL); 创建编辑框: CreateWindow( "Edit", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 10, 50, 250, 30, hwnd, (HMENU)IDC_EDIT1, NULL, NULL); 创建控件容器Frame CreateWindow("BUTTON", TEXT("颜色"), WS_CHILD
()函数,用于将index.html加载到新BrowserWindow实例中 const createWindow = () => { const win = new BrowserWindow ()函数来打开你的窗口 app.whenReady().then(() => { createWindow() }) 运行npm start 就可以启动程序了。 要实现此功能,请侦听app模块的activate事件,如果没有打开浏览器窗口,则调用您现有的createWindow()方法。因为不能在事件之前创建窗口,所以你应该只在你的应用程序ready之后。 // 调用这个createWindow()函数来打开你的窗口 app.whenReady().then(() => { createWindow() // 监听窗口激活的事件 app.on const createWindow = () => { const win = new BrowserWindow({ width: 800, height:
, FF_DONTCARE, TEXT("微软雅黑") ); //选择性别 labSex = CreateWindow 10, 10, 80, 26, hWnd, (HMENU)1, hInst, NULL ); radioMale = CreateWindow , 10, 50, 26, hWnd, (HMENU)2, hInst, NULL ); radioFemale = CreateWindow 40, 80, 26, hWnd, (HMENU)4, hInst, NULL ); radioMarried = CreateWindow , 40, 65, 26, hWnd, (HMENU)5, hInst, NULL ); radioSingle = CreateWindow
一般情况下这个区域是用户与应用程序交互的枢纽;上一小节使用 MessageBox 创建的简单窗口也是与用户交互的一个窗口,该窗口的功能有限,只能够简单的展示一些想要表达的信息,想创建一个能表达更多信息的窗口,可以使用 CreateWindow HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {} 写好入口函数后,必须要使用 RegisterClassEx 注册一个新的窗口类型,再使用 CreateWindow WM_DESTROY 在 WndProc 函数中使用 —————————————————————————————————— 补充 WM_CREATE 当应用程序通过调用CreateWindowEx或CreateWindow ————————————————————————— RegisterClassEx 之后注册该窗口,使用 RegisterClassEx: RegisterClassEx(&wcex); 注册后使用 CreateWindow 进行注册的窗口创建语法如下: HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,
main.jsconst { app, BrowserWindow } = require('electron')const createWindow = () => { const win = new BrowserWindow({ width: 800, height: 600, }) win.loadFile('index.html')}app.whenReady().then(createWindow 4.2 将可复用的函数写入实例化窗口createWindow() 函数将我们的页面加载到新的 BrowserWindow 实例中:main.js (Lines 3-10)const createWindow 我们可以借助 app.whenReady() API 来等待此事件,并在该 API 的 promise 被 resolve 时调用 createWindow() 方法。 + app.on('ready').then(() => { - app.whenReady().then(() => { createWindow() })但是 Electron 暴露了 app.whenReady
public: virtual std::unique_ptr<Button> createButton() = 0; virtual std::unique_ptr<Window> createWindow make_unique<WindowsFactory>(); auto button = factory->createButton(); auto window = factory->createWindow factory = std::make_unique<MacFactory>(); button = factory->createButton(); window = factory->createWindow override Button CreateButton() { return new MacButton(); } public override Window CreateWindow new WindowsFactory(); Button button = factory.CreateButton(); Window window = factory.CreateWindow
const createWindow = exports.createWindow = () => { let newWindow = new BrowserWindow({ show 我们现在在主进程中实现并导入createWindow()函数,我们也可以很快地把那个按钮连接起来。 列表5.8 向newFileButton添加监听器: . /app/main.js const createWindow = exports.createWindow = () => { let x,y; const currentWindow 当应用程序第一次准备好并调用createWindow()时,没有一个焦点窗口,`BrowserWindow.getFocusedWindow()返回undefined。 hasVisibleWindows) { createWindow(); } }); const createWindow = exports.createWindow = () => { let
$main.createWindow(windowConfig,url,divConfig) 打开一个新的窗口 windowConfig为窗口配置 参考 electron 文档的 https://www.electronjs.org $main.createWindow(windowConfig, url, divConfig); 效果如下 this. $main.createWindow(windowConfig,url,divConfig)时的name为’hsq’ 则可以通过this.$main.getWindow(‘hsq’)来获取 this. $main.createWindow(windowConfig,url,divConfig)时的name为’hsq’ 则可以通过this. $main.createWindow创建的窗体相关 在 config目录下vueWindow.config.js 配置 主进程相关 在 config目录下electron.config.js 拓展 网络请求推荐使用
win.loadFile('index.html') } 接着,调用createWindow()函数来打开您的窗口。 在whenReady()成功后调用createWindow()。 app.whenReady().then(() => { createWindow() }) 注意:此时,您的电子应用程序应当成功 打开显示您页面的窗口! ().length === 0) createWindow() }) }) 注意:此时,您的窗口控件应功能齐全! // 在文件头部引入 Node.js 中的 path 模块 const path = require('path') // 修改现有的 createWindow() 函数 function createWindow
. // 释放系统资源 SDL_Quit(); return 0; } 3、SDL_CreateWindow 函数 SDL_CreateWindow 函数 用于 创建 SDL_Window 窗口 , 该函数的函数原型如下 : SDL_Window* SDL_CreateWindow(const char* title, int x, int y, int w, int h, Uint32 // 初始化 SDL 环境 , 用于播放视频 SDL_Init(SDL_INIT_VIDEO); // 创建 SDL Window 窗口对象 window = SDL_CreateWindow SDL_Renderer* SDL_CreateRenderer(SDL_Window* window, int index, Uint32 flags); window 参数 : 调用 SDL_CreateWindow // 初始化 SDL 环境 , 用于播放视频 SDL_Init(SDL_INIT_VIDEO); // 创建 SDL_Window 窗口对象 window = SDL_CreateWindow
win.loadFile('index.html') } 接着,调用createWindow()函数来打开您的窗口。 在whenReady()成功后调用createWindow()。 如果没有任何浏览器窗口是打开的,则调用 createWindow() 方法。 因为窗口无法在 ready 事件前创建,你应当在你的应用初始化后仅监听 activate 事件。 ().length === 0) createWindow() }) }) 注意:此时,您的窗口控件应功能齐全! // 在文件头部引入 Node.js 中的 path 模块 const path = require('path') // 修改现有的 createWindow() 函数 function createWindow
win.setTitle(title) }) mainWindow.loadFile('index.html') } app.whenReady().then(() => { createWindow () app.on('activate', function () { if (BrowserWindow.getAllWindows().length === 0) createWindow ('index.html') } app.whenReady().then(() => { ipcMain.handle('openFileDialog', handleFileOpen) createWindow () app.on('activate', function () { if (BrowserWindow.getAllWindows().length === 0) createWindow () app.on('activate', function () { if (BrowserWindow.getAllWindows().length === 0) createWindow
)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } 这段代码中使用了 CreateWindow / ShowWindow / GetMessage 等 Windows API,这里仅分析 CreateWindow 的处理流程。 Win32 API 层 实际上,CreateWindow 不是一个真正的函数,而是一个宏,它最终会展开成 CreateWindowEx。 CreateWindowW #else #define CreateWindow CreateWindowA #endif 由于历史原因,一些 Windows API 有两个版本:一个是 ANSI 这里先小结一下到目前为止的调用流程: 应用程序调用 ↓ CreateWindow(...) // 宏 (include/winuser.h) ↓ CreateWindowEx(0, .
browser window const { app, BrowserWindow } = require('electron') const path = require('path') function createWindow dirname, 'preload.js') } }) mainWindow.loadFile('index.html') } app.whenReady().then(() => { createWindow () app.on('activate', function () { if (BrowserWindow.getAllWindows().length === 0) createWindow mainWindow.webContents.openDevTools() } app.whenReady().then(() => { createWindow() app.on('activate if (BrowserWindow.getAllWindows().length === 0) createWindow() }) }) app.on('window-all-closed', function
); const app = electron.app; const BrowserWindow = electron.BrowserWindow; let mainWindow; function createWindow mainWindow.webContents.openDevTools(); mainWindow.on('closed', function () { mainWindow = null; }); } app.on('ready', createWindow ') { app.quit(); } }); app.on('activate', ()=> { if (mainWindow === null) { createWindow
BrowserWindow} = require('electron'); let win; let windowConfig = { width: 800, height: 600 }; function createWindow BrowserWindow对象 win = null; }); win.on('resize', () => { win.reload(); }) } app.on('ready', createWindow ('window-all-closed', () => { app.quit(); }); app.on('activate', () => { if (win == null) { createWindow
只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口 // 类似vue 的生命周期 将会在 Electron 结束后初始化 app.whenReady().then(() => { createWindow command + Q 才完全退出 app.on('activate', function () { if (BrowserWindow.getAllWindows().length === 0) createWindow 用上面手动或者脚手架的方式创建初始化文件 修改 main.js const { app, BrowserWindow, Menu } = require('electron') function createWindow const menu = Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu) } app.on('ready', createWindow }) app.on('activate', () => { // Mac 逻辑 if (BrowserWindow.getAllWindows().length === 0) { createWindow
require('electron'); const path = require('path'); const url = require('url'); let win; function createWindow file:', slashes: true })); win.on('closed', () => { win = null; }); } app.on('ready', createWindow == 'darwin') { app.quit(); } }); app.on('activate', () => { if (win === null) { createWindow