1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 80d9e3da8bb853c5ed96d13646a4264eb57b13a2abungeman@google.com#include <windows.h> 99d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com#include <tchar.h> 102882c57910e0e91fa0be070871a9258548364825bsalomon@google.com 112882c57910e0e91fa0be070871a9258548364825bsalomon@google.com#include "SkApplication.h" 122882c57910e0e91fa0be070871a9258548364825bsalomon@google.com 139d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com#define MAX_LOADSTRING 100 149d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 159d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// Global Variables: 169d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comHINSTANCE hInst; // current instance 179d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comTCHAR szTitle[] = _T("SampleApp"); // The title bar text 189d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comTCHAR szWindowClass[] = _T("SAMPLEAPP"); // the main window class name 199d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 209d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// Forward declarations of functions included in this code module: 219d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comATOM MyRegisterClass(HINSTANCE hInstance); 229d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comBOOL InitInstance(HINSTANCE, int, LPTSTR); 239d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 249d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comINT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 259d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 269d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comint APIENTRY _tWinMain(HINSTANCE hInstance, 279d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com HINSTANCE hPrevInstance, 289d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com LPTSTR lpCmdLine, 299d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com int nCmdShow) 309d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com{ 319d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com UNREFERENCED_PARAMETER(hPrevInstance); 329d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 339d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com MSG msg; 349d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 359d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com // Initialize global strings 369d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com MyRegisterClass(hInstance); 379d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 389d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com // Perform application initialization: 399d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com if (!InitInstance (hInstance, nCmdShow, lpCmdLine)) 409d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com { 419d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return FALSE; 429d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 439d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 449d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com // Main message loop: 459d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com while (GetMessage(&msg, NULL, 0, 0)) 469d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com { 479d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com if (true) 489d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com { 499d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com TranslateMessage(&msg); 509d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com DispatchMessage(&msg); 519d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 529d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 539d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 542882c57910e0e91fa0be070871a9258548364825bsalomon@google.com application_term(); 552882c57910e0e91fa0be070871a9258548364825bsalomon@google.com 569d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return (int) msg.wParam; 579d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com} 589d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 599d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 609d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 619d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 629d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// FUNCTION: MyRegisterClass() 639d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 649d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// PURPOSE: Registers the window class. 659d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 669d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// COMMENTS: 679d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 689d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// This function and its usage are only necessary if you want this code 699d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// to be compatible with Win32 systems prior to the 'RegisterClassEx' 709d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// function that was added to Windows 95. It is important to call this function 719d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// so that the application will get 'well formed' small icons associated 729d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// with it. 739d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 749d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comATOM MyRegisterClass(HINSTANCE hInstance) 759d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com{ 769d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com WNDCLASSEX wcex; 779d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 789d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.cbSize = sizeof(WNDCLASSEX); 799d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 809d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.style = CS_HREDRAW | CS_VREDRAW; 819d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.lpfnWndProc = WndProc; 829d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.cbClsExtra = 0; 839d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.cbWndExtra = 0; 849d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.hInstance = hInstance; 859d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.hIcon = NULL; 869d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.hCursor = NULL; 879d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 889d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.lpszMenuName = NULL; 899d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.lpszClassName = szWindowClass; 909d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com wcex.hIconSm = NULL; 919d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 929d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return RegisterClassEx(&wcex); 939d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com} 949d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 959d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com#include "SkOSWindow_Win.h" 969d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comextern SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv); 979d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 989d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comstatic SkOSWindow* gSkWind; 999d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1009d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comchar* tchar_to_utf8(const TCHAR* str) { 1019d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com#ifdef _UNICODE 1029d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com int size = WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), NULL, 0, NULL, NULL); 1034459a0448d84d4adb53984227fbee4c581f13a98senorblanco char* str8 = (char*) sk_malloc_throw(size+1); 1049d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), str8, size, NULL, NULL); 1059d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com str8[size] = '\0'; 1069d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return str8; 1079d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com#else 1089d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return _strdup(str); 1099d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com#endif 1109d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com} 1119d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1129d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1139d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// FUNCTION: InitInstance(HINSTANCE, int, LPTSTR) 1149d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1159d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// PURPOSE: Saves instance handle and creates main window 1169d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1179d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// COMMENTS: 1189d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1199d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// In this function, we save the instance handle in a global variable and 1209d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// create and display the main program window. 1219d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1229d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1239d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1249d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comBOOL InitInstance(HINSTANCE hInstance, int nCmdShow, LPTSTR lpCmdLine) 1259d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com{ 1262882c57910e0e91fa0be070871a9258548364825bsalomon@google.com application_init(); 1279d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1289d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com hInst = hInstance; // Store instance handle in our global variable 1299d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1302882c57910e0e91fa0be070871a9258548364825bsalomon@google.com HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 1312882c57910e0e91fa0be070871a9258548364825bsalomon@google.com CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 1329d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1339d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com if (!hWnd) 1349d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com { 1359d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return FALSE; 1369d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 1379d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1389d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com char* argv[4096]; 1399d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com int argc = 0; 1409d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com TCHAR exename[1024], *next; 141b58a639b2fbe919489654bb506efdb024a308a8ebsalomon@google.com int exenameLen = GetModuleFileName(NULL, exename, SK_ARRAY_COUNT(exename)); 142b58a639b2fbe919489654bb506efdb024a308a8ebsalomon@google.com // we're ignoring the possibility that the exe name exceeds the exename buffer 143b58a639b2fbe919489654bb506efdb024a308a8ebsalomon@google.com (void) exenameLen; 1449d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com argv[argc++] = tchar_to_utf8(exename); 1459d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com TCHAR* arg = _tcstok_s(lpCmdLine, _T(" "), &next); 1469d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com while (arg != NULL) { 1479d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com argv[argc++] = tchar_to_utf8(arg); 1489d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com arg = _tcstok_s(NULL, _T(" "), &next); 1499d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 1509d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1519d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com gSkWind = create_sk_window(hWnd, argc, argv); 1529d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com for (int i = 0; i < argc; ++i) { 1534459a0448d84d4adb53984227fbee4c581f13a98senorblanco sk_free(argv[i]); 1549d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 1559d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com ShowWindow(hWnd, nCmdShow); 1569d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com UpdateWindow(hWnd); 1579d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1589d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return TRUE; 1599d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com} 1609d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1619d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1629d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) 1639d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1649d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// PURPOSE: Processes messages for the main window. 1659d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1669d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// WM_COMMAND - process the application menu 1679d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// WM_PAINT - Paint the main window 1689d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// WM_DESTROY - post a quit message and return 1699d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1709d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// 1719d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 1729d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com{ 1739d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com switch (message) { 1749d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com case WM_COMMAND: 1759d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return DefWindowProc(hWnd, message, wParam, lParam); 1769d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com case WM_DESTROY: 1779d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com PostQuitMessage(0); 1789d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com break; 1799d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com default: 1809d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com if (gSkWind->wndProc(hWnd, message, wParam, lParam)) { 1819d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return 0; 1829d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } else { 1839d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return DefWindowProc(hWnd, message, wParam, lParam); 1849d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 1859d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 1869d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return 0; 1879d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com} 1889d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1899d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com// Message handler for about box. 1909d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.comINT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 1919d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com{ 1929d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com UNREFERENCED_PARAMETER(lParam); 1939d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com switch (message) 1949d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com { 1959d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com case WM_INITDIALOG: 1969d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return (INT_PTR)TRUE; 1979d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com 1989d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com case WM_COMMAND: 1999d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 2009d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com { 2019d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com EndDialog(hDlg, LOWORD(wParam)); 2029d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return (INT_PTR)TRUE; 2039d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 2049d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com break; 2059d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com } 2069d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com return (INT_PTR)FALSE; 2079d12f5c11b56ef51ba2c95db721ae7e5bab27023bsalomon@google.com} 208