1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8#include <windows.h> 9#include <tchar.h> 10 11#include "SkApplication.h" 12 13#define MAX_LOADSTRING 100 14 15// Global Variables: 16HINSTANCE hInst; // current instance 17TCHAR szTitle[] = _T("SampleApp"); // The title bar text 18TCHAR szWindowClass[] = _T("SAMPLEAPP"); // the main window class name 19 20// Forward declarations of functions included in this code module: 21ATOM MyRegisterClass(HINSTANCE hInstance); 22BOOL InitInstance(HINSTANCE, int, LPTSTR); 23LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 24INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 25 26int APIENTRY _tWinMain(HINSTANCE hInstance, 27 HINSTANCE hPrevInstance, 28 LPTSTR lpCmdLine, 29 int nCmdShow) 30{ 31 UNREFERENCED_PARAMETER(hPrevInstance); 32 33 MSG msg; 34 35 // Initialize global strings 36 MyRegisterClass(hInstance); 37 38 // Perform application initialization: 39 if (!InitInstance (hInstance, nCmdShow, lpCmdLine)) 40 { 41 return FALSE; 42 } 43 44 // Main message loop: 45 while (GetMessage(&msg, NULL, 0, 0)) 46 { 47 if (true) 48 { 49 TranslateMessage(&msg); 50 DispatchMessage(&msg); 51 } 52 } 53 54 application_term(); 55 56 return (int) msg.wParam; 57} 58 59 60 61// 62// FUNCTION: MyRegisterClass() 63// 64// PURPOSE: Registers the window class. 65// 66// COMMENTS: 67// 68// This function and its usage are only necessary if you want this code 69// to be compatible with Win32 systems prior to the 'RegisterClassEx' 70// function that was added to Windows 95. It is important to call this function 71// so that the application will get 'well formed' small icons associated 72// with it. 73// 74ATOM MyRegisterClass(HINSTANCE hInstance) 75{ 76 WNDCLASSEX wcex; 77 78 wcex.cbSize = sizeof(WNDCLASSEX); 79 80 wcex.style = CS_HREDRAW | CS_VREDRAW; 81 wcex.lpfnWndProc = WndProc; 82 wcex.cbClsExtra = 0; 83 wcex.cbWndExtra = 0; 84 wcex.hInstance = hInstance; 85 wcex.hIcon = NULL; 86 wcex.hCursor = NULL; 87 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 88 wcex.lpszMenuName = NULL; 89 wcex.lpszClassName = szWindowClass; 90 wcex.hIconSm = NULL; 91 92 return RegisterClassEx(&wcex); 93} 94 95#include "SkOSWindow_Win.h" 96extern SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv); 97 98static SkOSWindow* gSkWind; 99 100char* tchar_to_utf8(const TCHAR* str) { 101#ifdef _UNICODE 102 int size = WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), NULL, 0, NULL, NULL); 103 char* str8 = (char*) malloc(size+1); 104 WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), str8, size, NULL, NULL); 105 str8[size] = '\0'; 106 return str8; 107#else 108 return _strdup(str); 109#endif 110} 111 112// 113// FUNCTION: InitInstance(HINSTANCE, int, LPTSTR) 114// 115// PURPOSE: Saves instance handle and creates main window 116// 117// COMMENTS: 118// 119// In this function, we save the instance handle in a global variable and 120// create and display the main program window. 121// 122 123 124BOOL InitInstance(HINSTANCE hInstance, int nCmdShow, LPTSTR lpCmdLine) 125{ 126 application_init(); 127 128 hInst = hInstance; // Store instance handle in our global variable 129 130 HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 131 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 132 133 if (!hWnd) 134 { 135 return FALSE; 136 } 137 138 char* argv[4096]; 139 int argc = 0; 140 TCHAR exename[1024], *next; 141 int exenameLen = GetModuleFileName(NULL, exename, SK_ARRAY_COUNT(exename)); 142 // we're ignoring the possibility that the exe name exceeds the exename buffer 143 (void) exenameLen; 144 argv[argc++] = tchar_to_utf8(exename); 145 TCHAR* arg = _tcstok_s(lpCmdLine, _T(" "), &next); 146 while (arg != NULL) { 147 argv[argc++] = tchar_to_utf8(arg); 148 arg = _tcstok_s(NULL, _T(" "), &next); 149 } 150 151 gSkWind = create_sk_window(hWnd, argc, argv); 152 for (int i = 0; i < argc; ++i) { 153 free(argv[i]); 154 } 155 ShowWindow(hWnd, nCmdShow); 156 UpdateWindow(hWnd); 157 158 return TRUE; 159} 160 161// 162// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) 163// 164// PURPOSE: Processes messages for the main window. 165// 166// WM_COMMAND - process the application menu 167// WM_PAINT - Paint the main window 168// WM_DESTROY - post a quit message and return 169// 170// 171LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 172{ 173 switch (message) { 174 case WM_COMMAND: 175 return DefWindowProc(hWnd, message, wParam, lParam); 176 case WM_DESTROY: 177 PostQuitMessage(0); 178 break; 179 default: 180 if (gSkWind->wndProc(hWnd, message, wParam, lParam)) { 181 return 0; 182 } else { 183 return DefWindowProc(hWnd, message, wParam, lParam); 184 } 185 } 186 return 0; 187} 188 189// Message handler for about box. 190INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 191{ 192 UNREFERENCED_PARAMETER(lParam); 193 switch (message) 194 { 195 case WM_INITDIALOG: 196 return (INT_PTR)TRUE; 197 198 case WM_COMMAND: 199 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 200 { 201 EndDialog(hDlg, LOWORD(wParam)); 202 return (INT_PTR)TRUE; 203 } 204 break; 205 } 206 return (INT_PTR)FALSE; 207} 208