// 初めてのスクリーンセーバーProject.cpp : アプリケーションのエントリ ポイントを定義します。
//

#pragma once

// Windows ヘッダーから使用されていない部分を除外します。
// Windows ヘッダー ファイル:
#include <windows.h>
#include<WindowsX.h>
// C ランタイム ヘッダー ファイル
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource1.h"
#include<scrnsave.h>
#define ID_MYTIMER 100
// グローバル変数:
// 現在のインターフェイス
static HKEY hMyKey;
static UINT nSpeed,nNo;//表示間隔と表示回数
static char szText[64];//表示文字列

// このコード モジュールに含まれる関数の宣言を転送します:




//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
//  コメント:
//
//    この関数および使い方は、'RegisterClassEx' 関数が追加された
//    Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
//    アプリケーションが、関連付けられた
//    正しい形式の小さいアイコンを取得できるようにするには、
//    この関数を呼び出してください。
//


//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND	- アプリケーション メニューの処理
//  WM_PAINT	- メイン ウィンドウの描画
//  WM_DESTROY	- 中止メッセージを表示して戻る
//
//
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int x,y,xw,yh;
	HDC hdc;
	BITMAP bmp_info;
	static RECT rc;
	static char *lpszTitle="猫でも分かるwindowsプログラミング";
	static HBITMAP hMyBmp;
	static HDC hdc_mem;
	static int n;
	DWORD dwResult,dwSize,dwType;

	switch (message)
	{
	case WM_CREATE:
		RegCreateKeyEx(HKEY_CURRENT_USER,
			"Control panel\\Screen Saver.screensv02",
			0,NULL,REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,NULL,
			&hMyKey,&dwResult);
		if(dwResult==REG_CREATED_NEW_KEY){//新規にレジストリ書き込み
			nSpeed=300;
			RegSetValueEx(hMyKey,
				"Speed",0,REG_DWORD,
				(LPBYTE)&nSpeed,sizeof(DWORD));
			strcpy(szText,"猫でもわかるwindowsプログラミング");
			RegSetValueEx(hMyKey,
				"Text",0,REG_SZ,
				(LPBYTE)szText,strlen(szText)+1);
			nNo=20;
			RegSetValueEx(hMyKey,
				"No",0,REG_DWORD,
				(LPBYTE)&nNo,sizeof(DWORD));
		}else{//レジストリ開いた場合
			dwSize=(DWORD)sizeof(DWORD);
			RegQueryValueEx(hMyKey,
				"Speed",0,&dwType,(LPBYTE)&nSpeed,&dwSize);
			dwSize=(DWORD)sizeof(szText);
			RegQueryValueEx(hMyKey,
				"Text",0,&dwType,(LPBYTE)szText,&dwSize);
			dwSize=(DWORD)sizeof(DWORD);
			RegQueryValueEx(hMyKey,
				"No",0,&dwType,(LPBYTE)&nNo,&dwSize);
		}
		if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
			MessageBox(hWnd,"RegCloseKeyに失敗しました",
				"Error",
				MB_OK);
		}
		SetTimer(hWnd,ID_MYTIMER,nSpeed,NULL);
		GetClientRect(hWnd,&rc);
		break;
	case WM_TIMER:
		if(wParam!=ID_MYTIMER)break;

		hdc=GetDC(hWnd);
		hMyBmp=LoadBitmap(hMainInstance,"MYBMP");
		hdc_mem=CreateCompatibleDC(hdc);
		SelectObject(hdc_mem,hMyBmp);
		GetObject(hMyBmp,sizeof(BITMAP),&bmp_info);
		DeleteObject(hMyBmp);//残っているのはhdc_memだけ
		BitBlt(hdc,x=rand()%rc.right-36,y=rand()%rc.bottom,xw=bmp_info.bmWidth,yh=bmp_info.bmHeight
			,hdc_mem,0,0,SRCCOPY);
		SetBkMode(hdc,TRANSPARENT);
		SetTextColor(hdc,RGB(rand()%256,rand()%256,rand()%256));
		TextOut(hdc,x+xw,y+yh-12,lpszTitle,strlen(lpszTitle));
		n++;
		if(n>(int)nNo){
			n=0;
			PatBlt(hdc,0,0,rc.right,rc.bottom,BLACKNESS);
		}
		DeleteDC(hdc_mem);
		ReleaseDC(hWnd,hdc);
		break;
	case WM_DESTROY:
		KillTimer(hWnd,ID_MYTIMER);
		PostQuitMessage(0);
		break;
	default:
		break;
	}
	return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
BOOL WINAPI	ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wp, LPARAM lp)
{
	static HWND hSpeed,hText,hNo;
	char szBuf[256];
	DWORD dwResult,dwType,dwSize;
	switch(message){
	case WM_INITDIALOG:
		return TRUE;
		hSpeed=GetDlgItem(hDlg,IDC_EDIT1);
		hText=GetDlgItem(hDlg,IDC_EDIT2);
		hNo=GetDlgItem(hDlg,IDC_EDIT3);
		RegCreateKeyEx(HKEY_CURRENT_USER,
			"Control panel\\Screen Saver.screensv02",
			0,NULL,REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,NULL,
			&hMyKey,&dwResult);

		dwSize=(DWORD)sizeof(DWORD);
		RegQueryValueEx(hMyKey,
			"Speed",0,&dwType,(LPBYTE)&nSpeed,&dwSize);
		dwSize=(DWORD)sizeof(szText);
		RegQueryValueEx(hMyKey,
			"Text",0,&dwType,(LPBYTE)szText,&dwSize);
		dwSize=(DWORD)sizeof(DWORD);
		RegQueryValueEx(hMyKey,
			"No",0,&dwType,(LPBYTE)&nNo,&dwSize);

		Edit_SetText(hText,szText);
		//表示間隔
		_itoa(nSpeed,szBuf,10);
		Edit_SetText(hSpeed,szBuf);
		//表示回数
		_itoa(nNo,szBuf,10);
		Edit_SetText(hNo,szBuf);

		if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
			MessageBox(hDlg,"RegCloseKeyに失敗しました",
				"Error",
				MB_OK);
		}
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wp)){
		case IDOK:
			Edit_GetText(hSpeed,szBuf,sizeof(szBuf)-1);
			nSpeed=atoi(szBuf);
			Edit_GetText(hText,szText,sizeof(szText)-1);
			Edit_GetText(hNo,szBuf,sizeof(szBuf)-1);
			nNo=atoi(szBuf);

			RegCreateKeyEx(HKEY_CURRENT_USER,
				"Control panel\\Screen Saver.screensv02",
				0,NULL,REG_OPTION_NON_VOLATILE,
				KEY_ALL_ACCESS,NULL,
				&hMyKey,&dwResult);

			
			RegSetValueEx(hMyKey,
				"Speed",0,REG_DWORD,
				(LPBYTE)&nSpeed,sizeof(DWORD));
			
			RegSetValueEx(hMyKey,
				"Text",0,REG_SZ,
				(LPBYTE)szText,strlen(szText)+1);
			
			RegSetValueEx(hMyKey,
				"No",0,REG_DWORD,
				(LPBYTE)&nNo,sizeof(DWORD));

			if(RegCloseKey(hMyKey)!=ERROR_SUCCESS){
				MessageBox(hDlg,"RegCloseKeyに失敗しました",
					"Error",MB_OK);
			}
			EndDialog(hDlg,IDOK);
			return TRUE;
		case IDCANCEL:
			EndDialog(hDlg,IDCANCEL);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}
BOOL WINAPI	RegisterDialogClasses(HANDLE hInst)
{
	return TRUE;
}