⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledemuwnd.cpp

📁 魅族M8 LED源码 wince的。。。需要的下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "LedEmuWnd.h"
#include "resource.h"
#include "UserIni.h"
#include "SelectList.h"
#include <pm.h>
#include "BackLightApi.h"
#include "ShellNotifyMsg.h"
#include <readwriteini.h>
#include <acc_api.h>

extern COLORREF AllColors[];

//三个LED点图的高度
const int AllDotPicHeight[3]=
{
	LED_HEIGHT1*8,LED_HEIGHT2*8,LED_HEIGHT3*8
};

//三个LED点图的宽度
const int AllDotPicWidth[3]=
{
	LED_HEIGHT1*7,LED_HEIGHT2*7,LED_HEIGHT3*7
};

//构造函数
CLedEmuWnd::CLedEmuWnd(void)
{
	GetBackLightLevel(&BackLightSave);
	cVirtualLedDotBuf = NULL;
	cLedDotBuf = NULL;

	SaveBitMapBmp[0] = 0;
	SaveBitMapBmp[1] = 0;
	SaveBitMapBmp[2] = 0;
	AccOK = MzAccOpen();
//	AccOK = 0;
}

//析构函数
CLedEmuWnd::~CLedEmuWnd(void)
{
	delete [] cLedDotBuf;
	if(SaveBitMapBmp[0] != 0)
	{
		DeleteObject((HGDIOBJ)(SaveBitMapBmp[0]));
	}
	if(SaveBitMapBmp[1] != 0)
	{
		DeleteObject((HGDIOBJ)(SaveBitMapBmp[1]));
	}
	if(SaveBitMapBmp[2] != 0)
	{
		DeleteObject((HGDIOBJ)(SaveBitMapBmp[2]));
	}
	if(cLedDotBuf != NULL)
		delete [] cLedDotBuf;
	if(cVirtualLedDotBuf != NULL)
		delete [] cVirtualLedDotBuf;
	SetBackLightLevel(BackLightSave);

	if(AccOK)
	{
		MzAccClose();
	}
}

BOOL CLedEmuWnd::OnInitDialog()
{
	if (!CMzWndEx::OnInitDialog())
	{
		return FALSE;
	}

	ScrollSize = 0;

	BaseX = GetHeight();
	BaseY = 0;

	int i;

	GetModuleFileName(NULL,WorkPath,255);
	i = wcslen(WorkPath)-1;
	for(;WorkPath[i]!='\\';i--);
	WorkPath[i+1]='\0';
	swprintf_s(IniName,256,L"%sSetting.ini",WorkPath);//Ini文件路径

	IniCreateFile(IniName);

	wchar_t cDotPngPath[256];
	//正常大小的图片
	BOOL Error = FALSE;

	//载入三张LED点图
	for(i = 0;i < 3;i++)
	{
		swprintf_s(cDotPngPath,256,L"%sAllDot%02d.png",WorkPath,i);

		ImagingHelper pDotImg;
		if(pDotImg.LoadImage(cDotPngPath,false,true,false))
		{
			SaveBitMapDC[i] = CreateCompatibleDC(GetDC(m_hWnd));
			SaveBitMapBmp[i] = CreateCompatibleBitmap(GetDC(m_hWnd),pDotImg.GetImageWidth(),pDotImg.GetImageHeight());
			SelectObject(SaveBitMapDC[i], (HGDIOBJ)(SaveBitMapBmp[i]));
			RECT rcImg;
			rcImg.left = 0;
			rcImg.top = 0;
			rcImg.right = pDotImg.GetImageWidth();
			rcImg.bottom = pDotImg.GetImageHeight();

			if((rcImg.bottom != AllDotPicHeight[i]) || (rcImg.right != AllDotPicWidth[i]))
			{
				Error = TRUE;
				MzMessageBoxEx(m_hWnd,L"LED点图片大小错误", L"错误", MB_OK);
				break;
			}

			pDotImg.Draw(SaveBitMapDC[i],&rcImg);//将图片绘制到保存点图片的内部DC上
			SaveLedSize[i]=pDotImg.GetImageHeight()/8;
		}
		else
		{
			Error = TRUE;
			MzMessageBoxEx(m_hWnd,L"打开LED点图片错误", L"错误", MB_OK);
			break;
		}
	}

	if(!AccOK)
	{
		MzMessageBoxEx(m_hWnd,L"打开重力感应失败", L"错误", MB_OK);
	}

	TimeSave = 0;
	if(!Error)
	{
		LoadNewString();//载入ini中选择的项目
		ScreenSta = 0;
		return TRUE;
	}
	else
	{
		PostQuitMessage(0);
		return FALSE;
	}
}
//从INI取出字串和其它设置
//刚运行和设置后调用此函数即可.
void CLedEmuWnd::LoadNewString()
{
	MzBeginWaitDlg(m_hWnd);
	int i;

	wchar_t WorkString[256];
	wcscpy(WorkString,L"");//空串

	int Select;
	int BackLight;
	UserReadIniData(&Select,L"LastSelect",L"Select",0,IniName);//选择第一个
	
	wchar_t AppString[20];
	swprintf_s(AppString,20,L"Setting%02d",Select);

	UserReadIniData(&Type,AppString,L"Type",0,IniName);//默认为字串
	if(Type == 0)
	{
		UserReadIniString(WorkString,128,AppString,L"String",L"示例字串",IniName);//显示示例字串
	}
	else
	{
		UserReadIniString(WorkString,128,AppString,L"Picture",L"",IniName);//显示示例字串
	}

	UserReadIniData(&Color,AppString,L"Color",0,IniName);//默认为红色
	UserReadIniData(&Delay,AppString,L"Delay",40,IniName);
	UserReadIniData(&BackLight,AppString,L"BackLight",100,IniName);
	UserReadIniData(&DotSizeSelect,AppString,L"DotSizeSelect",1,IniName);

	SetTimer(m_hWnd,ID_TIMER_TEST,Delay,NULL);//设定时钟
	SetBackLightLevel(255*BackLight/100);

	if(Type == 0)
	{
		LedSizeX = (GetHeight())/(SaveLedSize[DotSizeSelect]);
		LedSizeY = (GetWidth())/(SaveLedSize[DotSizeSelect]);

		if(cLedDotBuf != NULL)
			delete [] cLedDotBuf;

		cLedDotBuf = new UCHAR[LedSizeX*LedSizeY];
		for(i = 0;i < LedSizeX*LedSizeY;i++)
		{
			cLedDotBuf[i]=0x80;//清除所有显示
		}

		if(Color > 7)
			Color = 6;
		LoadVirtualLedFromText(WorkString);
	}
	else
	{
		{
			LoadVirtualLedFromBmp(WorkString);
		}
	}

	MzEndWaitDlg();
}

//重载绘图,自己控制哪儿需要刷新
//因为M8刷新太慢了
//这个想法是源于单片机上刷新屏幕.

void CLedEmuWnd::OnPaint(HDC hdc,LPPAINTSTRUCT ps)
{
//	CMzWndEx::OnPaint(hdc,ps);
//	BitBlt(hdc,0,0,100,100,SaveBitMapDC,0,0,SRCCOPY);

	//cLedDotBuf
	//.7表示是否需要刷新,
	//.2.1.0表示当前颜色的色深
	//.6.5.4.3表示当前使用的颜色,当.2.1.0为零时,无效(黑点)

	int x,y;
	UCHAR data;

	if(cLedDotBuf != NULL)
	{
		for(x = 0;x < LedSizeX;x++)
		{
			for(y = 0;y < LedSizeY;y++)
			{
				data = cLedDotBuf[y*LedSizeX+x];
				if(data & 0x80)//需要刷新才绘制,如果去掉这句话,就会极不流畅.
				{
					cLedDotBuf[y*LedSizeX+x] &= 0x7f;
					//这儿转了90度,所以有点难想象
					BitBlt(hdc,BaseY+SaveLedSize[DotSizeSelect]*y,BaseX-SaveLedSize[DotSizeSelect]*(x+1),
						SaveLedSize[DotSizeSelect],SaveLedSize[DotSizeSelect],
						SaveBitMapDC[DotSizeSelect],SaveLedSize[DotSizeSelect]*((data>>3)&0xf),SaveLedSize[DotSizeSelect]*(data&0x7),SRCCOPY);
					//BitBlt(hdc,BaseY+LED_SIZE*y,BaseX-LED_SIZE*(x+1),LED_SIZE,LED_SIZE,
					//	SaveBitMapDC,0,LED_SIZE*7,SRCCOPY);
				}
			}
		}
	}
	//SaveBitMapDC
}

LRESULT  CLedEmuWnd::MzDefWndProc(UINT message,WPARAM wParam,LPARAM lParam)
{
	signed char AccX,AccY,AccZ;
	switch(message)
	{
	case WM_ACTIVATE://窗口激活状态变化
		int i;
		if(wParam == WA_INACTIVE)
		{
			Pause = TRUE;
		}
		else
		{
			HideMzTopBar();//隐藏标题栏
			for(i = 0;i < LedSizeX*LedSizeY;i++)
			{
				cLedDotBuf[i] |=0x80;//强行刷新所有显示
			}
			//要调试一下看看这儿有没有必须加这句话.
			//Pause = FALSE;
		}

		break;
	case WM_LBUTTONDOWN://点击屏幕
	case WM_LBUTTONDBLCLK:
		//保存按下时的点
		int x,y;
		{
			StartX = LOWORD(lParam);
			StartY = HIWORD(lParam);

			StartPos = ScrollPos;

			SwitchPauseSta = TRUE;
			//Pause = TRUE;
		}
		break;
	case WM_LBUTTONUP://离开屏幕
		
		{
			x = LOWORD(lParam);
			y = HIWORD(lParam);

			//Pause = FALSE;

			//判断中间划动的方向和距离
			if((x-StartX)*(x-StartX) > 4*(y-StartY)*(y-StartY))
			{
				//横向划动
				switch(ScreenSta)
				{
				case 1:
				case 3:
					if((x > StartX)&&((x-StartX)> 200))
					{
						//设置
						KillTimer(m_hWnd,ID_TIMER_TEST);
						CSelectList dlg;
						RECT rcWork;
						rcWork = MzGetWorkArea();
						rcWork.top = 0;
						dlg.SetIniFileName(IniName);
						dlg.Create(rcWork.left,rcWork.top,RECT_WIDTH(rcWork),RECT_HEIGHT(rcWork), m_hWnd, 0, WS_POPUP);
						dlg.DoModal();
						LoadNewString();
					}
					else if((StartX > x)&&((StartX-x)> 200))
					{
						PostQuitMessage(0);
					}
					break;
				case 0:
				case 2:
					if((x > StartX)&&((x-StartX)> 200))
					{
						PostQuitMessage(0);
					}
					else if((StartX > x)&&((StartX-x)> 200))
					{
						//设置
						KillTimer(m_hWnd,ID_TIMER_TEST);
						CSelectList dlg;
						RECT rcWork;
						rcWork = MzGetWorkArea();
						rcWork.top = 0;
						dlg.SetIniFileName(IniName);
						dlg.Create(rcWork.left,rcWork.top,RECT_WIDTH(rcWork),RECT_HEIGHT(rcWork), m_hWnd, 0, WS_POPUP);
						dlg.DoModal();
						LoadNewString();
					}
					break;
				}
			}
			else if(((y-StartY)*(y-StartY) > 4*(x-StartX)*(x-StartX)) && !Pause)
			{
				int Select;
				int SelectSave;
				UserReadIniData(&Select,L"LastSelect",L"Select",0,IniName);//选择第一个
				SelectSave = Select;
				switch(ScreenSta)
				{
				case 1:
				case 3:
					if((y > StartY)&&((y-StartY)> 100))
					{
						//设置
						Select++;
					}
					else if((StartY > y)&&((StartY-y)> 100))
					{
						Select--;
					}
					break;
				case 0:
				case 2:
					if((y > StartY)&&((y-StartY)> 100))
					{
						Select--;
					}
					else if((StartY > y)&&((StartY-y)> 100))
					{
						//设置
						Select++;
					}
					break;
				}

				if(SelectSave != Select)
				{
					if(Select < 0)
					{
						Select = MAX_PRESENT_ITEM-1;
					}
					else if(Select >= MAX_PRESENT_ITEM)
					{
						Select = 0;
					}
					IniWriteInt(L"LastSelect",L"Select",Select,IniName);
					SelectSave = ScreenSta;//保存屏幕状态
					LoadNewString();
					Pause = FALSE;
					AutoPause = FALSE;
					ScreenSta = SelectSave;
				}
			}

			if(SwitchPauseSta)
			{
				Pause = !Pause;
				AutoPause = FALSE;
			}
		}
		//return TRUE;
		break;
	case WM_MOUSEMOVE:
		x = LOWORD(lParam);
		y = HIWORD(lParam);

		if(Pause)
		{
			switch(ScreenSta)
			{
			case 1:
			case 3:
				ScrollPos = StartPos+(y-StartY)/SaveLedSize[DotSizeSelect];
				while(ScrollPos < 0)
				{
					ScrollPos+=(ScrollSize-LedSizeX);
				}
				ScrollPos %= (ScrollSize-LedSizeX);
				CopyVirtruaLed2DisBuf();
				break;
			case 2:
			case 0:
				ScrollPos = StartPos+(StartY-y)/SaveLedSize[DotSizeSelect];
				while(ScrollPos < 0)
				{
					ScrollPos+=(ScrollSize-LedSizeX);
				}
				ScrollPos %= (ScrollSize-LedSizeX);
				CopyVirtruaLed2DisBuf();
				break;
			}
			Invalidate();
		}

		if(((x-StartX)*(x-StartX)+(y-StartY)*(x-StartY)) > 100)
		{
			SwitchPauseSta = FALSE;
		}
		break;
	case WM_TIMER:
		switch(wParam)
		{
		case ID_TIMER_TEST:
			//没找到怎么得到转屏信息,用三向XYZ加速度死判的.
			if(AccOK)
			{
				MzAccGetXYZ(&AccX,&AccY,&AccZ);
			}
			else
			{
				AccY = -58;//认为是左横屏

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -