/***********************************************************************
*Copyright (c)2012 , 天际边工作室
*All rights reserved.
**
文件名称：	Menu.cpp
*摘要：		菜单类
**
*修改历史：
*	版本    日期     作者     改动内容和原因
*   ----------------------------------------------------
*	1.0    2012-10-5  wstjb     基本的功能完成
***********************************************************************/

#include "Menu.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>



extern  PAINTSTRUCT ps;
extern 	HDC hdc;
extern 	HBITMAP hbmp; 
extern 	HBITMAP hbmp2; 
extern 	BITMAP bmp;
extern 	HDC hdcMem;
extern 	HDC hdcTmp;
extern 	RECT rect;
extern 	HWND hwnd;
extern  char texta[TEXTAMAX][20];

extern int KeyReturn;
extern int KeyEsc;
extern int KeyHome;
extern int KeySpace;
extern int KeyLeft0;
extern int KeyUp0;
extern int KeyRight0;
extern int KeyDown0;
extern int color;
extern HPEN t_hpen;
extern HBRUSH t_hbrush;

/***********************************************************************
* 说明:    Menu类初始化函数
* 输入参数: int x——横向宽度,int y——纵向长度,int u——左上角x坐标,
int v——左上角y坐标,int num——菜单项数,
char *menufile——菜单内容所在文件,
int updown——到底后是否可以转到开始位置（或相反）
* 返回值  : 无
* 功能	   : 初始化
* 修改历史:
*               姓名            日期             说明
*             ------          ----------      -------------
*             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void Menu::InitMenu(int x,int y,int u,int v,int num,char *menufile,int updown,int showside)
{
	wlogfile(1,__FUNCTION__,"开始",0);
	statb=0;
	ux=x;
	uy=y;
	posx=u;
	posy=v;
	unum=num;
	flagu=0;
	flagd=0;
	tmpfx=0;
	statbtp=statb;
	uptodown=updown;
	showSideAll = showside;
	strcpy_s(this->menufile,menufile);
	for (int i=0;i<TEXTAMAX;i++)
		for(int j=0;j<20;j++)
			texta[i][j]=' ';
}

/***********************************************************************
* 说明:    Menu类按键函数
* 输入参数: WPARAM KeyCode——按键信息
* 返回值  : 0——正常返回；-1——esc退出；1——enter确定
* 功能	   : 处理按键信息
* 修改历史:
*               姓名            日期             说明
*             ------          ----------      -------------
*             wstjb          2012-10-5       完成基本功能
***********************************************************************/
int Menu::KeyDown(WPARAM KeyCode)
{
	wlogfile(1,__FUNCTION__,"开始",KeyCode);
	if(KeyCode==KeyDown0)
	{

		statb++;
		if(statb==(unum+1)&&uptodown==0)statb=unum;
		if(statb==(unum+1)&&uptodown!=0)statb=0;
		Show(KeyCode);
		return 0;
	}
	else if(KeyCode==KeyUp0)
	{
		statb--;
		if(statb==-1&&uptodown==0)statb=0;
		if(statb==-1&&uptodown!=0)statb=unum;
		Show(KeyCode);
		return 0;
	}
	else if(KeyCode==KeyReturn)
	{
		return 1;
	}
	else if(KeyCode==KeyEsc)
	{
		return -1;
	}
	else
	{
		return 0;
	}
	return 0;
}

/***********************************************************************
* 说明:    Menu类显示函数
* 输入参数: WPARAM KeyCode——按键信息
* 返回值  : 无
* 功能	   : 显示菜单，并根据按键调整反显及其他位置等等
* 修改历史:
*               姓名            日期             说明
*             ------          ----------      -------------
*             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void Menu::Show(WPARAM KeyCode)
{
	wlogfile(1,__FUNCTION__,"开始",0);
	if(uptodown!=3)
	{
		unum=GetFileText(menufile)-1;
		if(unum< 5) uy = unum + 1;
	}
	else
	{
		GetFileText(menufile);
	}
	MySetShowStyle();
	HPEN hpen=t_hpen;
	HPEN oldhpen=(HPEN)SelectObject(hdcTmp,hpen);

	HBRUSH hbrush = t_hbrush;
	HBRUSH hbrold = (HBRUSH)SelectObject(hdcTmp, hbrush); 


	Rectangle(hdcTmp,posx,posy,posx+ux*60,posy+uy*60); 
	if(showSideAll == 1 && unum > 6 )
	{
		Rectangle(hdcTmp,posx+ux*60,posy,posx+ux*60+10,posy+uy*60); 
		Rectangle(hdcTmp,posx+ux*60,posy,posx+ux*60+10,posy+10); 
		Rectangle(hdcTmp,posx+ux*60,posy+uy*60-10,posx+ux*60+10,posy+uy*60); 
	}
	SelectObject(hdcTmp, hbrold); 
	DeleteObject(hbrush);
	SelectObject(hdcTmp,oldhpen);
	DeleteObject(hpen);


	if(flagd==1&&KeyCode==KeyDown0)
	{
		statbtp++;
		tmpfx=uy-1;
		if(statbtp==(unum-uy+2)&&uptodown==0)statbtp=unum-uy+1;
		if(statbtp==(unum-uy+2)&&uptodown!=0)
		{
			statbtp=0;
			flagd=0;
			flagu=1;
			tmpfx=0;
		}
		//if(statbtp+uy>unum)statbtp=unum-uy;
	}
	else if(flagu==1&&KeyCode==KeyUp0)
	{
		statbtp--;
		tmpfx=0;
		if(statbtp==-1&&uptodown==0)statbtp=0;
		if(statbtp==-1&&uptodown!=0)
		{
			statbtp=unum-uy+1;
			flagd=1;
			flagu=0;
			tmpfx=uy-1;
		}
		//if(statbtp+uy>unum)statbtp=unum-uy;
	}
	else if(flagd==1&&KeyCode==KeyUp0)
	{
		flagd=0;
		tmpfx--;
	}
	else if(flagu==1&&KeyCode==KeyDown0)
	{
		flagu=0;
		tmpfx++;
	}
	else if(KeyCode==KeyUp0)
	{
		tmpfx--;
	}
	else if(KeyCode==KeyDown0)
	{
		tmpfx++;
	}
	if(tmpfx==(uy-1))flagd=1;
	if(tmpfx==0)flagu=1;

	for(int time=0;time<uy;time++)
	{
		if(uptodown!=3)
		{
			unum=GetFileText(menufile)-1;
		}
		else
		{
			GetFileText(menufile);
		}
		OverflowCheck(__FILE__,__LINE__,TEXTAMAX,time+statbtp);
		ShowText(texta[time+statbtp],posx+5,posy+time*60+5);
	}
	if(showSideAll == 1 && unum > 6 )//20170330
	{
		if(color==1)
		{
			HPEN hpen=CreatePen(PS_SOLID,5, RGB(180,106,41));
			HPEN oldhpen=(HPEN)SelectObject(hdcTmp,hpen);

			HBRUSH hbrush = CreateSolidBrush(RGB(198,151,81)); 
			HBRUSH hbrold = (HBRUSH)SelectObject(hdcTmp, hbrush); 

			Rectangle(hdcTmp,posx+ux*60,posy+10+350/unum*statb,posx+ux*60+5,posy+15+350/unum*statb); 
			SelectObject(hdcTmp, hbrold); 
			DeleteObject(hbrush);
			SelectObject(hdcTmp,oldhpen);
			DeleteObject(hpen);
		}
		else
		{
			HPEN hpen=CreatePen(PS_SOLID,5, RGB(0,0,0));
			HPEN oldhpen=(HPEN)SelectObject(hdcTmp,hpen);
			Rectangle(hdcTmp,posx+ux*60,posy+10+350/unum*statb,posx+ux*60+5,posy+15+350/unum*statb); 
			SelectObject(hdcTmp,oldhpen);
			DeleteObject(hpen);
		}
	}


	BitBlt(hdcTmp,posx+5,posy+5+tmpfx*60,60*ux-10,50,hdcTmp,posx+5,posy+5+tmpfx*60,DSTINVERT);

	InvalidateRect(hwnd,&rect,false);
	//Delay(100);

	/*if(statb<uy)
	{
	for(int time=0;time<uy;time++)
	{
	GetFileText(menufile);
	ShowText(texta[time],posx+5,posy+time*60+5);
	}
	BitBlt(hdc,posx+5,posy+5+statb*60,60*ux-10,50,hdc,posx+5,posy+5+statb*60,DSTINVERT);
	InvalidateRect(hwnd,&rect,false);
	}

	else if(statb>=uy)
	{

	for(int time=0;time<uy;time++)
	{
	GetFileText(menufile);
	ShowText(texta[time+statb-5],posx+5,posy+time*60+5);
	}
	BitBlt(hdc,posx+5,posy+305,60*ux-10,50,hdc,posx+5,posy+305,DSTINVERT);


	InvalidateRect(hwnd,&rect,false);
	}*/

}