AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows

在 Windows 平台上的实现,相对比较顺利,将一个窗口嵌入到另外一个窗口是比较容易的事情。

1. 创建窗口

这里有点需要注意:

  • 父窗口的大小变化时,子窗口也要跟着变化,否则 webview 显示不出来。
  • 创建时窗口的大小先设置为 0,后面再调整,否则 webview 也显示不出来。
c 复制代码
#include <windows.h>
#include <SDL_syswm.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
    case WM_SIZE: {
      HWND hwndSub = FindWindowEx(hwnd, NULL, NULL, NULL);
      if (hwndSub) {
        RECT rcClient;
        int width = 0;
        int height = 0;

        GetClientRect(hwnd, &rcClient);
        width = rcClient.right - rcClient.left;
        height = rcClient.bottom - rcClient.top;
        MoveWindow(hwndSub, 0, 0, width, height, TRUE);
      }
      break;
    }
    case WM_PAINT: {
      PAINTSTRUCT ps;
      HDC hdc = BeginPaint(hwnd, &ps);
      FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
      EndPaint(hwnd, &ps);
      break;
    }
    default:
      return DefWindowProc(hwnd, uMsg, wParam, lParam);
  }
  return 0;
}

static const char CLASS_NAME[] = "WebViewContainer";

static ret_t webview_os_window_init(HINSTANCE hInstance) {
  WNDCLASSEX wc;

  ZeroMemory(&wc, sizeof(WNDCLASSEX));
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.hInstance = hInstance;
  wc.lpszClassName = CLASS_NAME;
  wc.lpfnWndProc = WindowProc;

  RegisterClassEx(&wc);

  return RET_OK;
}

webview_os_window_t webview_os_window_create(SDL_Window* parent, int x, int y, int w, int h) {
  SDL_SysWMinfo wmInfo;
  SDL_VERSION(&wmInfo.version);
  SDL_GetWindowWMInfo(parent, &wmInfo);

  HWND hwndParent = wmInfo.info.win.window;
  HINSTANCE hInstance = wmInfo.info.win.hinstance;

  webview_os_window_init(hInstance);

  HWND hwndSub = CreateWindowEx(0, CLASS_NAME, "Container Window", WS_CHILD | WS_VISIBLE, x, y, 0,
                                0, hwndParent, NULL, hInstance, NULL);

  if (hwndSub == NULL) {
    return 0;
  }

  ShowWindow(hwndSub, SW_SHOW);
  UpdateWindow(hwndSub);

  if (!hwndSub) {
    printf("Failed to create subwindow: %lu\n", GetLastError());
    return NULL;
  }

  return (webview_os_window_t)hwndSub;
}

2. 调整窗口大小

resize 窗口时,需要调整子窗口的大小。要注意的是,窗口的大小是以像素为单位的,所以需要考虑缩放因子。

c 复制代码
void webview_os_window_move_resize(SDL_Window* parent, webview_os_window_t subwindow, int x, int y,
                                   int w, int h) {
  HWND hwndSub = (HWND)subwindow;
  float scale = system_info()->device_pixel_ratio;

  MoveWindow(hwndSub, x, y, w * scale, h * scale, TRUE);
}

3. 销毁窗口

销毁窗口时,需要销毁子窗口。

c 复制代码
void webview_os_window_destroy(webview_os_window_t subwindow) {
  HWND hwndSub = (HWND)subwindow;
  DestroyWindow(hwndSub);
}
相关推荐
2501_916008893 小时前
iOS 抓包工具有哪些?全面盘点主流工具与功能对比分析
android·ios·小程序·https·uni-app·iphone·webview
2501_915921433 小时前
iOS混淆工具实战 视频流媒体类 App 的版权与播放安全保护
android·ios·小程序·https·uni-app·iphone·webview
2501_916008897 小时前
uni-app iOS 日志与崩溃分析全流程 多工具协作的实战指南
android·ios·小程序·https·uni-app·iphone·webview
2501_915921438 小时前
iOS混淆工具实战 在线教育直播类 App 的课程与互动安全防护
android·安全·ios·小程序·uni-app·iphone·webview
2501_9151063211 小时前
Charles抓包工具在接口性能优化与压力测试中的实用方法
ios·性能优化·小程序·https·uni-app·压力测试·webview
2501_915909061 天前
uni-app iOS 上架常见问题与解决方案,实战经验全解析
android·ios·小程序·https·uni-app·iphone·webview
2501_916008893 天前
uni-app iOS 应用版本迭代与上架实践 持续更新的高效流程
android·ios·小程序·https·uni-app·iphone·webview
2501_915909063 天前
uni-app iOS 性能监控与调试全流程:多工具协作的实战案例
android·ios·小程序·https·uni-app·iphone·webview
2501_915918416 天前
uni-app 跨平台项目的 iOS 上架流程:多工具组合的高效协作方案
android·ios·小程序·https·uni-app·iphone·webview
2501_916013747 天前
iOS 文件管理与 uni-app 性能优化实战 多工具协作的完整指南
android·ios·性能优化·小程序·uni-app·iphone·webview