#include "osr_window.h"
#include "resource.h"
#include "include/cef_app.h"
#include "include/cef_browser.h"
#include "include/cef_frame.h"
#include "include/cef_runnable.h"
#include <tchar.h>
#include <windows.h>
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
OSRWindow* gWindow = NULL;
static TCHAR szWindowName[] = L"OSRWindow";
std::map<HWND, OSRWindow*> OSRWindow::m_map_window;
OSRWindow::OSRWindow(HINSTANCE instance, bool use_transpate_rending)
{
DWORD dw_error;
gWindow = this;
this->m_hInstance = instance;
this->m_handle_filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4 * 1920 * 1080, NULL);
this->m_dc_buffer = NULL;
this->m_bitmap_buffer = NULL;
this->m_use_transparent_rending = use_transpate_rending;
dw_error = GetLastError();
this->RegisterClass();
this->CreateOSRWindow();
}
OSRWindow::~OSRWindow(void)
{
}
void OSRWindow::RegisterClass()
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = &OSRWindow::WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = this->m_hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowName;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassEx(&wcex);
}
LRESULT CALLBACK OSRWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
static POINT lastMousePos, curMousePos;
static bool mouseRotation = false;
static bool mouseTracking = false;
static int lastClickX = 0;
static int lastClickY = 0;
static CefBrowserHost::MouseButtonType lastClickButton = MBT_LEFT;
static int gLastClickCount = 0;
static double gLastClickTime = 0;
static bool gLastMouseDownOnView = false;
CefKeyEvent event;
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
OSRWindow* window;
CefRefPtr<CefBrowserHost> browser;
CefBrowserHost::MouseButtonType btnType;
if (m_map_window.find(hWnd) != m_map_window.end())
{
window = m_map_window[hWnd];
if (window->m_browser.get())
{
browser = window->m_browser->GetHost();
}
}
LONG currentTime = 0;
bool cancelPreviousClick = false;
if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN ||
message == WM_MBUTTONDOWN || message == WM_MOUSEMOVE ||
message == WM_MOUSELEAVE) {
currentTime = GetMessageTime();
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
cancelPreviousClick =
(abs(lastClickX - x) > (GetSystemMetrics(SM_CXDOUBLECLK) / 2))
|| (abs(lastClickY - y) > (GetSystemMetrics(SM_CYDOUBLECLK) / 2))
|| ((currentTime - gLastClickTime) > GetDoubleClickTime());
if (cancelPreviousClick &&
(message == WM_MOUSEMOVE || message == WM_MOUSELEAVE)) {
gLastClickCount = 0;
lastClickX = 0;
lastClickY = 0;
gLastClickTime = 0;
}
}
switch (message)
{
case WM_CREATE:
{
OSRWindow::m_map_window[hWnd] = gWindow;
gWindow->m_hwnd = hWnd;
if (gWindow->GetUseTransparentRending()) {
gWindow->SetLayerdAttribution();
}
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_MOVE:
break;
case WM_PAINT:
{
window->PaintWindow(hWnd);
return 0;
}
case WM_SIZE:
{
OSRWindow* window = m_map_window[hWnd];
if (window->m_browser.get())
{
window->m_browser->GetHost()->WasResized();
}
break;
}
case WM_NCHITTEST:{
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
POINT pt = { x, y };
ScreenToClient(hWnd, &pt);
if (pt.y < 18)
return HTCAPTION;
else
return 1;
break;
}
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN: {
SetCapture(hWnd);
SetFocus(hWnd);
btnType =
(message == WM_LBUTTONDOWN ? MBT_LEFT : (
message == WM_RBUTTONDOWN ? MBT_RIGHT : MBT_MIDDLE));
if (browser.get()) {
CefMouseEvent mouse_event;
mouse_event.x = GET_X_LPARAM(lParam);
mouse_event.y = GET_Y_LPARAM(lParam);
mouse_event.modifiers = GetCefMouseModifiers(wParam);
browser->SendMouseClickEvent(mouse_event, btnType, false, 1);
}
break;
}
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
{
btnType =
(message == WM_LBUTTONUP ? MBT_LEFT : (
message == WM_RBUTTONUP ? MBT_RIGHT : MBT_MIDDLE));
if (GetCapture() == hWnd)
ReleaseCapture();
if (browser.get()) {
CefMouseEvent mouse_event;
mouse_event.x = GET_X_LPARAM(lParam);
mouse_event.y = GET_Y_LPARAM(lParam);
browser->SendMouseClickEvent(mouse_event, btnType, true,
1);
}
break;
}
case WM_MOUSEMOVE: {
if (browser.get()) {
CefMouseEvent mouse_event;
mouse_event.x = GET_X_LPARAM(lParam);
mouse_event.y = GET_Y_LPARAM(lParam);
mouse_event.modifiers = GetCefMouseModifiers(wParam);
browser->SendMouseMoveEvent(mouse_event, false);
}
break;
}
case WM_MOUSELEAVE: {
if (browser.get()) {
CefMouseEvent mouse_event;
mouse_event.x = 0;
mouse_event.y = 0;
mouse_event.modifiers = GetCefMouseModifiers(wParam);
browser->SendMouseMoveEvent(mouse_event, true);
}
break;
}
case WM_MOUSEWHEEL: {
if (!browser.get()) {
break;
}
POINT screen_point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
HWND scrolled_wnd = ::WindowFromPoint(screen_point);
if (scrolled_wnd != hWnd) {
break;
}
ScreenToClient(hWnd, &screen_point);
int delta = GET_WHEEL_DELTA_WPARAM(wParam);
CefMouseEvent mouse_event;
mouse_event.x = screen_point.x;
mouse_event.y = screen_point.y;
mouse_event.modifiers = GetCefMouseModifiers(wParam);
browser->SendMouseWheelEvent(mouse_event,
isKeyDown(VK_SHIFT) ? delta : 0,
!isKeyDown(VK_SHIFT) ? delta : 0);
break;
}
case WM_SETFOCUS:
case WM_KILLFOCUS:
if (browser.get())
browser->SendFocusEvent(message == WM_SETFOCUS);
break;
case WM_CAPTURECHANGED:
case WM_CANCELMODE:
if (browser.get()) {
browser->SendCaptureLostEvent();
}
break;
case WM_SYSCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_CHAR:
{
event.windows_key_code = wParam;
event.native_key_code = lParam;
event.is_system_key = message == WM_SYSCHAR ||
message == WM_SYSKEYDOWN ||
message == WM_SYSKEYUP;
if (message == WM_KEYDOWN || message == WM_SYSKEYDOWN)
event.type = KEYEVENT_RAWKEYDOWN;
else if (message == WM_KEYUP || message == WM_SYSKEYUP)
event.type = KEYEVENT_KEYUP;
else
event.type = KEYEVENT_CHAR;
event.modifiers = GetCefKeyboardModifiers(wParam, lParam);
if (browser.get())
browser->SendKeyEvent(event);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_ERASEBKGND:
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
return 0;
}
void OSRWindow::CreateOSRWindow()
{
int scrWidth, scrHeight,initWidth = 800,initHeight = 600,initLeft,initTop;
scrWidth = GetSystemMetrics(SM_CXSCREEN);
scrHeight = GetSystemMetrics(SM_CYSCREEN);
initLeft = (scrWidth - initWidth) / 2;
initTop = (scrHeight - initHeight) / 2;
m_hwnd = ::CreateWindow(szWindowName, NULL,
WS_POPUP | WS_MAXIMIZEBOX | WS_MINIMIZEBOX,
initLeft, initTop, 800, 600, NULL, NULL, m_hInstance, NULL);
::ShowWindow(m_hwnd, SW_SHOW);
::UpdateWindow(m_hwnd);
::SetWindowPos(m_hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
bool OSRWindow::isKeyDown(WPARAM wparam) {
return (GetKeyState(wparam) & 0x8000) != 0;
}
int OSRWindow::GetCefMouseModifiers(WPARAM wparam) {
int modifi
没有合适的资源?快使用搜索试试~ 我知道了~
cef离屏渲染osr示例-lq20190604.zip
共597个文件
h:213个
pak:110个
obj:97个
5星 · 超过95%的资源 需积分: 50 51 下载量 23 浏览量
2019-06-04
06:01:23
上传
评论 1
收藏 78.11MB ZIP 举报
温馨提示
CEF透明背景,摘抄的某位大神的代码,然后修改了一下。
资源推荐
资源详情
资源评论
收起资源包目录
cef离屏渲染osr示例-lq20190604.zip (597个子文件)
osr_window.aps 50KB
v8value_ctocpp.cc 21KB
libcef_dll_wrapper.cc 21KB
menu_model_ctocpp.cc 20KB
xml_reader_ctocpp.cc 13KB
dictionary_value_ctocpp.cc 13KB
cef_xml_object.cc 12KB
browser_host_ctocpp.cc 11KB
domnode_ctocpp.cc 11KB
list_value_ctocpp.cc 11KB
request_handler_cpptoc.cc 10KB
command_line_ctocpp.cc 10KB
render_process_handler_cpptoc.cc 9KB
client_cpptoc.cc 9KB
browser_ctocpp.cc 9KB
render_handler_cpptoc.cc 8KB
frame_ctocpp.cc 8KB
request_ctocpp.cc 7KB
domdocument_ctocpp.cc 7KB
context_menu_params_ctocpp.cc 6KB
life_span_handler_cpptoc.cc 6KB
download_item_ctocpp.cc 6KB
v8context_ctocpp.cc 6KB
resource_handler_cpptoc.cc 6KB
response_ctocpp.cc 5KB
cookie_manager_ctocpp.cc 5KB
zip_reader_ctocpp.cc 5KB
display_handler_cpptoc.cc 5KB
drag_data_ctocpp.cc 5KB
jsdialog_handler_cpptoc.cc 5KB
load_handler_cpptoc.cc 4KB
cef_zip_archive.cc 4KB
post_data_ctocpp.cc 4KB
context_menu_handler_cpptoc.cc 4KB
app_cpptoc.cc 4KB
post_data_element_ctocpp.cc 4KB
task_runner_ctocpp.cc 3KB
urlrequest_ctocpp.cc 3KB
stream_reader_ctocpp.cc 3KB
v8accessor_cpptoc.cc 3KB
domevent_ctocpp.cc 3KB
urlrequest_client_cpptoc.cc 3KB
v8stack_frame_ctocpp.cc 3KB
v8exception_ctocpp.cc 3KB
keyboard_handler_cpptoc.cc 3KB
download_handler_cpptoc.cc 3KB
stream_writer_ctocpp.cc 3KB
v8handler_cpptoc.cc 3KB
process_message_ctocpp.cc 3KB
geolocation_handler_cpptoc.cc 3KB
binary_value_ctocpp.cc 3KB
resource_bundle_handler_cpptoc.cc 3KB
browser_process_handler_cpptoc.cc 3KB
write_handler_cpptoc.cc 3KB
focus_handler_cpptoc.cc 3KB
read_handler_cpptoc.cc 2KB
dialog_handler_cpptoc.cc 2KB
trace_client_cpptoc.cc 2KB
web_plugin_info_ctocpp.cc 2KB
scheme_handler_factory_cpptoc.cc 2KB
v8stack_trace_ctocpp.cc 2KB
cookie_visitor_cpptoc.cc 2KB
run_file_dialog_callback_cpptoc.cc 2KB
cef_stream_resource_handler.cc 2KB
drag_handler_cpptoc.cc 2KB
get_geolocation_callback_cpptoc.cc 2KB
web_plugin_info_visitor_cpptoc.cc 2KB
web_plugin_unstable_callback_cpptoc.cc 2KB
file_dialog_callback_ctocpp.cc 2KB
cef_byte_read_handler.cc 2KB
domevent_listener_cpptoc.cc 2KB
auth_callback_ctocpp.cc 1KB
domvisitor_cpptoc.cc 1KB
string_visitor_cpptoc.cc 1KB
scheme_registrar_ctocpp.cc 1KB
completion_handler_cpptoc.cc 1KB
quota_callback_ctocpp.cc 1KB
before_download_callback_ctocpp.cc 1KB
callback_ctocpp.cc 1KB
task_cpptoc.cc 1KB
jsdialog_callback_ctocpp.cc 1KB
allow_certificate_error_callback_ctocpp.cc 1KB
geolocation_callback_ctocpp.cc 1022B
download_item_callback_ctocpp.cc 1008B
libcef_dll_wrapper2.cc 189B
osr_window.cpp 15KB
client_app.cpp 13KB
osrenderer.cpp 11KB
transfer_util.cpp 2KB
main.cpp 2KB
client_renderer.cpp 2KB
client_app_delegates.cpp 784B
stdafx.cpp 202B
CommonHandler.cpp 110B
cefclient2010.VC.db 31.98MB
libcef.dll 34.93MB
icudt.dll 9.5MB
d3dcompiler_46.dll 3.08MB
d3dcompiler_43.dll 2.01MB
libGLESv2.dll 860KB
共 597 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
- xkin2020-03-30thank you!!!
- wxkey2020-12-10可以运行,都能编译通过,有个小问题,获取welcome.html的路径有问题,所以编译时候不显示,诸位下载时候注意一下就好
- hp_cpp2020-11-06不错,可以运行
啊全仔
- 粉丝: 2
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功