#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"winmm")
#define BMPFILE TEXT("Misaka_bigblue.bmp")
#define APP_NAME TEXT("御坂妹")
#define BUFFER_SIZE 256
#include <time.h>
#define IDM_WIND 40001
#define IDM_SET 40002
#define IDM_HOGE 40003
#define IDM_END 40004

VOID watch();

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){

	//Paint
	HDC hdc;
	PAINTSTRUCT ps;
	static HDC hMemDC;
	static HBITMAP hBitmap;
	static BITMAP bitmap;

	//Sound
	static MCI_OPEN_PARMS mop,endmop;
	int iErr,iErr2;
	TCHAR strErr[BUFFER_SIZE],strErr2[BUFFER_SIZE];
	
	//Text
	TEXTMETRIC tm;
	TCHAR str[64];

	//Menu
	MENUITEMINFO mii;
	POINT pt;
	static HMENU hMenu, hSubMenu;
	static int windTop=1;

	switch(msg){
		case WM_DESTROY:
			DeleteDC(hMemDC);
			DeleteObject(hBitmap);
			mciSendCommand(mop.wDeviceID,MCI_CLOSE,0,0);
			mciSendCommand(endmop.wDeviceID,MCI_CLOSE,0,0);
			PostQuitMessage(0);
			break;
		case WM_CREATE:
			//画面表示
			MoveWindow(hWnd, 0, 0, 100, 270, TRUE);
			SetLayeredWindowAttributes(hWnd, RGB(0, 0, 255), 0, LWA_COLORKEY);
			
			//タイマー
			SetTimer(hWnd,1,100,NULL);

			//メニュー
			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_TYPE|MIIM_ID;
			mii.fType = MFT_STRING;

			hMenu = CreateMenu();
			hSubMenu = CreatePopupMenu();

			
			mii.dwTypeData = TEXT("最前表示切換え");
			mii.wID = IDM_WIND;
			InsertMenuItem(hSubMenu , 0 , TRUE , &mii);
			mii.dwTypeData = TEXT("Windows起動時に起動");
			mii.wID = IDM_SET;
			InsertMenuItem(hSubMenu , 1 , TRUE , &mii);
			mii.dwTypeData = TEXT("空き枠");
			mii.wID = IDM_HOGE;
			InsertMenuItem(hSubMenu , 2 , TRUE , &mii);
			mii.dwTypeData = TEXT("終了");
			mii.wID = IDM_END;
			InsertMenuItem(hSubMenu , 3 , TRUE , &mii);

			mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
			mii.hSubMenu = hSubMenu;
			mii.dwTypeData = TEXT("ファイル");
			InsertMenuItem(hMenu , 0 , TRUE , &mii);

			//SetMenu(hWnd , hMenu);

			//音声
			mop.dwCallback = (DWORD)hWnd;
			mop.lpstrDeviceType = (LPTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			mop.lpstrElementName = TEXT("voice01.wav");

			endmop.dwCallback = (DWORD)hWnd;
			endmop.lpstrDeviceType = (LPTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			endmop.lpstrElementName = TEXT("end.wav");

			iErr = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)&mop);
			iErr2 = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)&endmop);

			if(iErr){
				mciGetErrorString(iErr,strErr,BUFFER_SIZE);
				MessageBox(hWnd,strErr,NULL,MB_OK);
				return -1;
			}
			if(iErr2){
				mciGetErrorString(iErr2,strErr2,BUFFER_SIZE);
				MessageBox(hWnd,strErr2,NULL,MB_OK);
				return -1;
			}
			//画像
			hMemDC = CreateCompatibleDC(NULL);
			hBitmap = LoadImage(NULL , BMPFILE , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE);

			SelectObject(hMemDC , hBitmap);
			GetObject(hBitmap , sizeof(BITMAP) , &bitmap);

			return 0;
		case WM_PAINT:
			hdc = BeginPaint(hWnd , &ps);
			BitBlt(hdc , 0 , 0 , bitmap.bmWidth , bitmap.bmHeight ,	hMemDC , 0 , 0 , SRCCOPY);

			//解像度
			GetTextMetrics(hdc , &tm);
			//wsprintf(str , "横幅 %d px" , GetDeviceCaps(hdc , HORZRES));
			//TextOut(hdc , 10 , 10 , str , lstrlen(str));
			//wsprintf(str , "高さ %d px" , GetDeviceCaps(hdc , VERTRES));
			//TextOut(hdc , 10 , 10 + tm.tmHeight , str , lstrlen(str));
			
			Rectangle(hdc,0,200,100,260);

			watch(hdc,hWnd);
			EndPaint(hWnd , &ps);
			return 0;
		case WM_RBUTTONDOWN:
			mciSendCommand(endmop.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,0);
			mciSendCommand(endmop.wDeviceID,MCI_PLAY,0,0);
			//PostQuitMessage(0);
			return 0;
		case WM_RBUTTONUP:
			pt.x = LOWORD(lp);
			pt.y = HIWORD(lp);
			ClientToScreen(hWnd , &pt);
			TrackPopupMenu(
				hSubMenu , TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
				pt.x , pt.y , 0 , hWnd , NULL
			);
			return 0;
		case WM_MBUTTONDOWN:
			mciSendCommand(mop.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,0);
			mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
			return 0;
		case WM_LBUTTONDOWN:
			PostMessage(hWnd,WM_NCLBUTTONDOWN,(WPARAM)HTCAPTION,lp);
			return 0;
		case WM_COMMAND:
			switch(LOWORD(wp)){
			case IDM_WIND:
				if(windTop==1){
					//最前面表示の設定
					SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
					windTop=0;
				}else if(windTop==0){
					//最前面表示の解除
					SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
					windTop=1;
				}
				return 0;
			case IDM_SET:
				return 0;
			case IDM_HOGE:
				return 0;
			case IDM_END:
				PostQuitMessage(0);
				return 0;
			}
		case WM_TIMER:
			watch();
			InvalidateRect(hWnd,NULL,TRUE);
			return 0;
		default:
			return DefWindowProc(hWnd,msg,wp,lp);
	}
	return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp);

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR pCmdLine,int showCmd){
	WNDCLASSEX wc;
	HWND hWnd;
	MSG msg;


	wc.cbSize = sizeof(wc);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wc.hIconSm = wc.hIcon;
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = APP_NAME;

	if(RegisterClassEx(&wc) == 0){return 1;}

	//WS_OVERLAPPEDWINDOW
	hWnd = CreateWindowEx(WS_EX_LAYERED,wc.lpszClassName,APP_NAME,WS_POPUP|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);

	// 最前面表示の設定
	//SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));

	// 最前面表示の解除
	//SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));

	if(hWnd == NULL){return 1;}

	while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg);DispatchMessage(&msg);}
	return msg.wParam;
}
VOID watch(HDC hdc){
	TCHAR watchStr[64];
	struct tm *date;
	time_t now;
	int year, month, day;
	int hour, minute, second;
	
	/* 現在の日時を取得 */
	time(&now);
	date = localtime(&now);

	year = date->tm_year + 1900;
	month = date->tm_mon + 1;
	day = date->tm_mday;

	hour = date->tm_hour;
	minute = date->tm_min;
	second = date->tm_sec;

	//strftime(s_date,MAX_LEN,"%S", second);

	SetBkMode(hdc,TRANSPARENT);
	wsprintf(watchStr , "%d年" , year);
	TextOut(hdc,0,200,watchStr,lstrlen(watchStr));
	wsprintf(watchStr , "%d月%d日" , month,day);
	TextOut(hdc,0,218,watchStr,lstrlen(watchStr));

	if(second<10){
		wsprintf(watchStr , "%d:%d%:0%d" , hour,minute,second);
		TextOut(hdc,0,236,watchStr,lstrlen(watchStr));
	}else{
		wsprintf(watchStr , "%d:%d%:%d" , hour,minute,second);
		TextOut(hdc,0,236,watchStr,lstrlen(watchStr));
	}
}
