Last active
August 29, 2015 13:57
-
-
Save CaptainJH/9758194 to your computer and use it in GitHub Desktop.
How to setup a bare bone chromium windows app
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef BAREBONESHANDLER_H_ | |
#define BAREBONESHANDLER_H_ | |
#include "include/cef_client.h" | |
class BareBonesHandler : public CefClient { | |
public: | |
BareBonesHandler() { } | |
~BareBonesHandler() { } | |
// Note that any of the IMPLEMENT_WHATEVER | |
// macros that come with CEF can (and do) set | |
// access modifiers, so you'll want them after | |
// everything else in your class or you may be | |
// in for a surprise when the access of a member | |
// isn't what you expect it to be! | |
IMPLEMENT_REFCOUNTING(BareBonesHandler); | |
}; | |
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ChromiumEmbedded_test.cpp : Defines the entry point for the application. | |
// | |
#include "stdafx.h" | |
#include <assert.h> | |
#include "ChromiumEmbedded_test.h" | |
#include "include\cef_app.h" | |
#include "bareboneshandler.h" | |
#pragma comment(lib, "libcef_dll_wrapper.lib") | |
#pragma comment(lib, "libcef.lib") | |
const char kCachePath[] = "cache-path"; | |
const char kMultiThreadedMessageLoop[] = "multi-threaded-message-loop"; | |
#define MAX_LOADSTRING 100 | |
// Global Variables: | |
HINSTANCE hInst; // current instance | |
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text | |
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name | |
// Forward declarations of functions included in this code module: | |
ATOM MyRegisterClass(HINSTANCE hInstance); | |
BOOL InitInstance(HINSTANCE, int); | |
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); | |
CefRefPtr<BareBonesHandler> g_handler; | |
CefRefPtr<CefCommandLine> g_command_line; | |
void destroy(void) | |
{ | |
// Tells CEF to quit its message loop so the application can exit. | |
CefQuitMessageLoop(); | |
} | |
void AppInitCommandLine() | |
{ | |
g_command_line = CefCommandLine::CreateCommandLine(); | |
g_command_line->InitFromString(::GetCommandLineW()); | |
} | |
void AppGetSettings(CefSettings& settings) | |
{ | |
assert(g_command_line.get()); | |
if (!g_command_line.get()) | |
return; | |
CefString str; | |
settings.multi_threaded_message_loop = | |
g_command_line->HasSwitch(kMultiThreadedMessageLoop); | |
CefString(&settings.cache_path) = | |
g_command_line->GetSwitchValue(kCachePath); | |
// Specify a port to enable DevTools if one isn't already specified. | |
if (!g_command_line->HasSwitch("remote-debugging-port")) | |
settings.remote_debugging_port = 8088; | |
} | |
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, | |
_In_opt_ HINSTANCE hPrevInstance, | |
_In_ LPTSTR lpCmdLine, | |
_In_ int nCmdShow) | |
{ | |
UNREFERENCED_PARAMETER(hPrevInstance); | |
UNREFERENCED_PARAMETER(lpCmdLine); | |
CefMainArgs main_args(hInstance); | |
int exitCode = CefExecuteProcess(main_args, NULL); | |
if (exitCode >= 0) | |
{ | |
return exitCode; | |
} | |
CefSettings settings; | |
AppInitCommandLine(); | |
AppGetSettings(settings); | |
CefInitialize(main_args, settings, NULL); | |
CefBrowserSettings browserSettings; | |
CefWindowInfo info; | |
g_handler = new BareBonesHandler(); | |
// TODO: Place code here. | |
MSG msg; | |
HACCEL hAccelTable; | |
// Initialize global strings | |
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | |
LoadString(hInstance, IDC_CHROMIUMEMBEDDED_TEST, szWindowClass, MAX_LOADSTRING); | |
MyRegisterClass(hInstance); | |
// Perform application initialization: | |
if (!InitInstance (hInstance, nCmdShow)) | |
{ | |
return FALSE; | |
} | |
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CHROMIUMEMBEDDED_TEST)); | |
// Main message loop: | |
//while (GetMessage(&msg, NULL, 0, 0)) | |
//{ | |
// if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) | |
// { | |
// TranslateMessage(&msg); | |
// DispatchMessage(&msg); | |
// } | |
//} | |
CefRunMessageLoop(); | |
CefShutdown(); | |
return 0; | |
} | |
// | |
// FUNCTION: MyRegisterClass() | |
// | |
// PURPOSE: Registers the window class. | |
// | |
ATOM MyRegisterClass(HINSTANCE hInstance) | |
{ | |
WNDCLASSEX wcex; | |
wcex.cbSize = sizeof(WNDCLASSEX); | |
wcex.style = CS_HREDRAW | CS_VREDRAW; | |
wcex.lpfnWndProc = WndProc; | |
wcex.cbClsExtra = 0; | |
wcex.cbWndExtra = 0; | |
wcex.hInstance = hInstance; | |
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CHROMIUMEMBEDDED_TEST)); | |
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); | |
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); | |
wcex.lpszMenuName = NULL; | |
wcex.lpszClassName = szWindowClass; | |
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); | |
return RegisterClassEx(&wcex); | |
} | |
// | |
// FUNCTION: InitInstance(HINSTANCE, int) | |
// | |
// PURPOSE: Saves instance handle and creates main window | |
// | |
// COMMENTS: | |
// | |
// In this function, we save the instance handle in a global variable and | |
// create and display the main program window. | |
// | |
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) | |
{ | |
HWND hWnd; | |
hInst = hInstance; // Store instance handle in our global variable | |
hWnd = CreateWindowEx(0, szWindowClass, 0, WS_POPUP | WS_VISIBLE | WS_SYSMENU, 100, 100, 800, 600, 0, 0, 0, 0); | |
if (!hWnd) | |
{ | |
return FALSE; | |
} | |
ShowWindow(hWnd, nCmdShow); | |
UpdateWindow(hWnd); | |
return TRUE; | |
} | |
// | |
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) | |
// | |
// PURPOSE: Processes messages for the main window. | |
// | |
// WM_COMMAND - process the application menu | |
// WM_PAINT - Paint the main window | |
// WM_DESTROY - post a quit message and return | |
// | |
// | |
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | |
{ | |
int wmId, wmEvent; | |
PAINTSTRUCT ps; | |
HDC hdc; | |
switch (message) | |
{ | |
case WM_COMMAND: | |
wmId = LOWORD(wParam); | |
wmEvent = HIWORD(wParam); | |
// Parse the menu selections: | |
switch (wmId) | |
{ | |
case IDM_ABOUT: | |
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); | |
break; | |
case IDM_EXIT: | |
DestroyWindow(hWnd); | |
break; | |
default: | |
return DefWindowProc(hWnd, message, wParam, lParam); | |
} | |
break; | |
case WM_PAINT: | |
hdc = BeginPaint(hWnd, &ps); | |
// TODO: Add any drawing code here... | |
EndPaint(hWnd, &ps); | |
break; | |
case WM_DESTROY: | |
PostQuitMessage(0); | |
break; | |
case WM_CREATE: | |
{ | |
CefWindowInfo info; | |
CefBrowserSettings settings; | |
RECT rect; | |
GetClientRect(hWnd, &rect); | |
info.SetAsChild(hWnd, rect); | |
CefBrowserHost::CreateBrowser(info, g_handler.get(), | |
"http://www.youtube.com/watch?v=d2ZNaLQD60Y", settings, NULL); | |
} | |
break; | |
default: | |
return DefWindowProc(hWnd, message, wParam, lParam); | |
} | |
return 0; | |
} | |
// Message handler for about box. | |
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) | |
{ | |
UNREFERENCED_PARAMETER(lParam); | |
switch (message) | |
{ | |
case WM_INITDIALOG: | |
return (INT_PTR)TRUE; | |
case WM_COMMAND: | |
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) | |
{ | |
EndDialog(hDlg, LOWORD(wParam)); | |
return (INT_PTR)TRUE; | |
} | |
break; | |
} | |
return (INT_PTR)FALSE; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment