📄 synplot.h
字号:
#if !defined(AFX_SYNPLOT_H__7A3B5155_A7DE_4D15_BA42_63AA278D349D__INCLUDED_)
#define AFX_SYNPLOT_H__7A3B5155_A7DE_4D15_BA42_63AA278D349D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "resource.h"
class PacketData
{
public:
PacketData()
{
memset(this, 0, sizeof(*this));
}
PacketData(SynPacket *pPacket)
{
dwSequenceNumber = pPacket->SequenceNumber();
dwTimestamp = pPacket->TimeStamp();
lW = pPacket->W();
lX = pPacket->X();
lY = pPacket->Y();
lZ = pPacket->Z();
lXDelta = pPacket->XDelta();
lYDelta = pPacket->YDelta();
lZDelta = pPacket->ZDelta();
lXMickeys = pPacket->XMickeys();
lYMickeys = pPacket->YMickeys();
lXRaw = pPacket->XRaw();
lYRaw = pPacket->YRaw();
lZRaw = pPacket->ZRaw();
lZYRaw = pPacket->ZYRaw();
dwFingerState = pPacket->FingerState();
dwExtendedState = pPacket->ExtendedState();
}
DWORD dwSequenceNumber;
DWORD dwTimestamp;
LONG lW;
LONG lX;
LONG lY;
LONG lZ;
LONG lXDelta;
LONG lYDelta;
LONG lZDelta;
LONG lXMickeys;
LONG lYMickeys;
LONG lXRaw;
LONG lYRaw;
LONG lZRaw;
LONG lZYRaw;
DWORD dwState;
DWORD dwFingerState;
DWORD dwExtendedState;
};
class PacketBuffer
{
public:
enum numbers { eSize = 128 };
PacketBuffer(void)
{
m_uiCurrent = 0;
m_iUnread = 0;
}
int NextLocation(void)
{
m_iUnread += m_iUnread == eSize ? 0 : 1;
return m_uiCurrent++ % eSize;
}
void Add(PacketData &Packet)
{
m_Packets[NextLocation()] = Packet;
}
PacketData *Read(void)
{
if (m_iUnread)
return m_Packets + ((m_uiCurrent - m_iUnread--) % eSize);
else
return 0;
}
int Unread(void) { return m_iUnread; }
PacketData m_Packets[eSize];
int m_iUnread;
unsigned int m_uiCurrent;
};
class CPlot :
// Derive from Synaptics device events.
public _ISynDeviceEvents
{
public:
CPlot(HINSTANCE hInstance)
{
m_hInstance = hInstance;
}
bool OnCreate(HWND hWnd)
{
m_hWnd = hWnd;
long lHandle = -1;
// Set the taskbar icon
HICON hSmallIcon = (HICON) LoadImage (m_hInstance,
MAKEINTRESOURCE (IDI_SMALL), IMAGE_ICON,
GetSystemMetrics (SM_CXSMICON), GetSystemMetrics (SM_CYSMICON),
LR_DEFAULTCOLOR);
SendMessage (hWnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM) hSmallIcon);
DeleteObject(hSmallIcon);
HRESULT hRes = CoInitialize(0);
if (hRes && hRes != S_FALSE)
return false; // Error other than already initialized on thread.
if (CoCreateInstance(_uuidof(SynAPI), 0,
CLSCTX_INPROC_SERVER, _uuidof(ISynAPI), (void **) &m_pAPI) ||
m_pAPI->Initialize() ||
m_pAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &lHandle) ||
m_pAPI->CreateDevice(lHandle, &m_pDevice))
{
return false; // Couldn't initialize properly.
}
// Setup to receive device packets.
m_pDevice->SetSynchronousNotification(this);
m_pDevice->GetProperty(SP_XLoSensor, &m_XMin);
m_pDevice->GetProperty(SP_XHiSensor, &m_XMax);
m_pDevice->GetProperty(SP_YLoSensor, &m_YMin);
m_pDevice->GetProperty(SP_YHiSensor, &m_YMax);
return true;
}
// Examine device packets and if a tap occurs in the exit icon in the
// upper right hand corner, exit.
long STDMETHODCALLTYPE OnSynDevicePacket(long lSeq)
{
m_pDevice->LoadPacket(m_Packet);
PacketData sPacket(&m_Packet);
m_Undrawn.Add(sPacket);
InvalidateGraphArea();
return 0;
}
void InvalidateGraphArea()
{
RECT Rect;
GetClientRect(m_hWnd, &Rect);
InvalidateRect(m_hWnd, &Rect, FALSE);
}
void PaintPoint(HDC hdc, int x, int y)
{
RECT Rect;
GetClientRect(m_hWnd, &Rect);
x = (x - m_XMin)*(Rect.right - Rect.left)/(m_XMax - m_XMin);
y = -(y - m_YMax)*(Rect.bottom - Rect.top)/(m_YMax - m_YMin);
SetPixel(hdc, x, y, RGB(0,0,0));
}
int OnPaint(HDC hdc)
{
for (PacketData *pPacket = m_Undrawn.Read(); pPacket;
pPacket = m_Undrawn.Read())
{
PaintPoint(hdc, pPacket->lXRaw, pPacket->lYRaw);
}
return 0;
}
HINSTANCE m_hInstance;
HWND m_hWnd;
ISynAPI *m_pAPI;
ISynDevice *m_pDevice;
SynPacket m_Packet; // Instantiation will result in CoInitialize();
PacketBuffer m_Undrawn;
long m_XMin;
long m_XMax;
long m_YMin;
long m_YMax;
};
#endif // !defined(AFX_SYNPLOT_H__7A3B5155_A7DE_4D15_BA42_63AA278D349D__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -