📄 ledemuwnd.cpp
字号:
#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 + -