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

📄 synplot.h

📁 Synaptics触摸板应用开发包(SDK)
💻 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 + -