/* generic.c */
#include "windows.h"
#include "resource.h"

HINSTANCE hinstance;
TCHAR aMenuname[]= TEXT("GenericMenu");
TCHAR aClassname[]= TEXT("GenericWClass");
TCHAR aCaption[]= TEXT("Multiple Language Sample Application");

HDC hdcmy;
HWND hwndmy;
int ulanguage= 0;

static LOGFONT logfont= { 64, 0,0,0, 400, 0,0,0, 0, 
	OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, FF_SWISS, TEXT("Arial")};

void set_language(){
	WORD fr;
	LCID locale;

	switch(ulanguage-IDM_FRENCH){
	default:
	case 0: fr =MAKELANGID(LANG_FRENCH,SUBLANG_FRENCH_CANADIAN); break;
	case 1: fr =MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US); break;
	case 2: fr =MAKELANGID(LANG_GREEK,SUBLANG_DEFAULT); break;
	}
	locale= MAKELCID(fr, SORT_DEFAULT);
	SetThreadLocale(locale);
}
BOOL CALLBACK SetLanguage(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam){
	static int klang;
	switch (message){
	case WM_INITDIALOG:
		klang= ulanguage;
		CheckRadioButton(hdlg, IDM_FRENCH, IDM_GREEK, ulanguage);
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wParam)){
		case IDM_FRENCH: case IDM_ENGLISH: case IDM_GREEK:
			klang= LOWORD(wParam);
			break;
		case IDOK:
			ulanguage= klang;
		case IDCANCEL:
			EndDialog(hdlg, LOWORD(wParam));
			return TRUE;
		} break;
	}
	return FALSE;
}
BOOL CALLBACK About(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam){
	switch (message){
	case WM_INITDIALOG:
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wParam)){
		case IDOK:
		case IDCANCEL:
			EndDialog(hdlg, LOWORD(wParam));
			return TRUE;
		} break;
	}
	return FALSE;
}
long CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
	PAINTSTRUCT ps;
	HDC hdc;
	HFONT hfont;
	int id;
	TCHAR legend[64];

	switch (message){
	case WM_CREATE:
		hwndmy= hwnd;
		hdcmy= GetDC(hwnd);
		LoadString(hinstance, IDS_CAPTION, legend, sizeof(legend));
		SetWindowText(hwnd, legend);
		return 0;
	case WM_PAINT:
		hdc= BeginPaint(hwnd, &ps);
		FillRect(hdc, &ps.rcPaint, GetStockObject(WHITE_BRUSH));
		hfont= CreateFontIndirect(&logfont);
		hfont= (HFONT)SelectObject(hdc, hfont);
		SetTextColor(hdc, RGB(128,0,0));
		SetBkColor(hdc, RGB(192,255,192));
		SetBkMode(hdc, OPAQUE);
		LoadString(hinstance, IDS_LEGEND, legend, sizeof(legend));
		TextOut(hdc, 40, 200, legend, lstrlen(legend));
		DeleteObject(SelectObject(hdc, hfont));
		EndPaint(hwnd, &ps);
		return 0;
	case WM_COMMAND:
		switch(id= LOWORD(wParam)){
		case IDM_LANGUAGE:
			id= ulanguage;
			DialogBox(hinstance, TEXT("Languagedlg"), hwnd, SetLanguage);
			if(id!=ulanguage){
				HMENU hmenu= GetMenu(hwnd), hnewmenu;
				set_language();
				hnewmenu= LoadMenu(hinstance, aMenuname);
				DestroyMenu(hmenu);
				SetMenu(hwnd, hnewmenu);
				LoadString(hinstance, IDS_CAPTION, legend, sizeof(legend));
				SetWindowText(hwnd, legend);
				InvalidateRect(hwnd, 0, 0);
			} break;
		case IDM_ABOUT:
			DialogBox(hinstance, TEXT("AboutBox"), hwnd, About);
			return 0;
		case IDM_EXIT:
			ShowWindow(hwnd, SW_HIDE);
			SendMessage(hwnd, WM_CLOSE, 0, 0);
			return 0;
		} break;
	case WM_DESTROY:
		if(hdcmy)
			ReleaseDC(hwnd, hdcmy);
		hdcmy= 0;
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
BOOL InitApplication(HANDLE hInstance){
	WNDCLASS wc;

	wc.style= CS_OWNDC;
	wc.lpfnWndProc= MainWndProc;

	wc.cbClsExtra= 0;
	wc.cbWndExtra= 0;
	wc.hInstance= hInstance;
	wc.hIcon= LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground= GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName=  aMenuname;
	wc.lpszClassName= aClassname;
	return RegisterClass(&wc);
}
BOOL InitInstance(HANDLE hInstance, int nCmdShow){
	HWND hwnd;

	hinstance= hInstance;
	hwnd= CreateWindow(
		aClassname,
		aCaption,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL);
	if(!hwnd)
		return FALSE;
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	return TRUE;
}
int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	MSG msg;

	ulanguage= *lpCmdLine - '0' + IDM_FRENCH;
	set_language();
	if(!hPrevInstance){
		if(!InitApplication(hInstance))
			return FALSE;
	}
	if(!InitInstance(hInstance, nCmdShow))
		return FALSE;
	do{
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}else
			WaitMessage();
	}while(msg.message!=WM_QUIT);
	return msg.wParam;
}


