#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; | |
} |