| |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #include <Windows.h> |
| #include <tchar.h> |
| #define MAX_LOADSTRING 100 |
| |
| // Global Variables: |
| HINSTANCE hInst; // current instance |
| TCHAR szTitle[] = _T("SampleApp"); // The title bar text |
| TCHAR szWindowClass[] = _T("SAMPLEAPP"); // the main window class name |
| |
| // Forward declarations of functions included in this code module: |
| ATOM MyRegisterClass(HINSTANCE hInstance); |
| BOOL InitInstance(HINSTANCE, int, LPTSTR); |
| LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); |
| INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); |
| |
| int APIENTRY _tWinMain(HINSTANCE hInstance, |
| HINSTANCE hPrevInstance, |
| LPTSTR lpCmdLine, |
| int nCmdShow) |
| { |
| UNREFERENCED_PARAMETER(hPrevInstance); |
| |
| MSG msg; |
| |
| // Initialize global strings |
| MyRegisterClass(hInstance); |
| |
| // Perform application initialization: |
| if (!InitInstance (hInstance, nCmdShow, lpCmdLine)) |
| { |
| return FALSE; |
| } |
| |
| // Main message loop: |
| while (GetMessage(&msg, NULL, 0, 0)) |
| { |
| if (true) |
| { |
| TranslateMessage(&msg); |
| DispatchMessage(&msg); |
| } |
| } |
| |
| return (int) msg.wParam; |
| } |
| |
| |
| |
| // |
| // FUNCTION: MyRegisterClass() |
| // |
| // PURPOSE: Registers the window class. |
| // |
| // COMMENTS: |
| // |
| // This function and its usage are only necessary if you want this code |
| // to be compatible with Win32 systems prior to the 'RegisterClassEx' |
| // function that was added to Windows 95. It is important to call this function |
| // so that the application will get 'well formed' small icons associated |
| // with it. |
| // |
| 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 = NULL; |
| wcex.hCursor = NULL; |
| wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); |
| wcex.lpszMenuName = NULL; |
| wcex.lpszClassName = szWindowClass; |
| wcex.hIconSm = NULL; |
| |
| return RegisterClassEx(&wcex); |
| } |
| |
| #include "SkOSWindow_Win.h" |
| extern SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv); |
| |
| static SkOSWindow* gSkWind; |
| |
| char* tchar_to_utf8(const TCHAR* str) { |
| #ifdef _UNICODE |
| int size = WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), NULL, 0, NULL, NULL); |
| char* str8 = (char*) malloc(size+1); |
| WideCharToMultiByte(CP_UTF8, 0, str, wcslen(str), str8, size, NULL, NULL); |
| str8[size] = '\0'; |
| return str8; |
| #else |
| return _strdup(str); |
| #endif |
| } |
| |
| // |
| // FUNCTION: InitInstance(HINSTANCE, int, LPTSTR) |
| // |
| // 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, LPTSTR lpCmdLine) |
| { |
| HWND hWnd; |
| |
| hInst = hInstance; // Store instance handle in our global variable |
| |
| hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, |
| CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); |
| |
| if (!hWnd) |
| { |
| return FALSE; |
| } |
| |
| char* argv[4096]; |
| int argc = 0; |
| TCHAR exename[1024], *next; |
| int exenameLen = GetModuleFileName(NULL, exename, 1024); |
| argv[argc++] = tchar_to_utf8(exename); |
| TCHAR* arg = _tcstok_s(lpCmdLine, _T(" "), &next); |
| while (arg != NULL) { |
| argv[argc++] = tchar_to_utf8(arg); |
| arg = _tcstok_s(NULL, _T(" "), &next); |
| } |
| |
| gSkWind = create_sk_window(hWnd, argc, argv); |
| for (int i = 0; i < argc; ++i) { |
| free(argv[i]); |
| } |
| |
| 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) |
| { |
| switch (message) { |
| case WM_COMMAND: |
| return DefWindowProc(hWnd, message, wParam, lParam); |
| case WM_DESTROY: |
| PostQuitMessage(0); |
| break; |
| default: |
| if (gSkWind->wndProc(hWnd, message, wParam, lParam)) { |
| return 0; |
| } else { |
| 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; |
| } |