亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tchstub.cpp

?? windows ce 下的觸控屏驅(qū)動程序源代碼
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
    if (ptq->iPut != iPut) OutputDebugString(L"iPut != ptq->iPut !!!\n");
   }
#endif

}


/* *********************************************************************************************** */
// This posts the point on the internal touch driver queue (Q2)
void SendPtToSelf(int iFlags, int iX, int iY)
{
 int iGet = 0;
 int iPut = 0;
 int i;

   if(_bIgnoreStroke2 &&
      (iFlags&TouchSamplePreviousDownFlag)!=0)
      {
        return; 
      }

   EnterCriticalSection(&Q2CritSect);

   iGet = tq2.iGet;
   iPut = tq2.iPut;
   
   if((iFlags&TouchSampleDownFlag)!=0)
      i = iGet - 3;
   else
      i = iGet - 2;

   // if there are at least 2 or 3 elements left for writing in the circular buffer (depn on iFlags)
   //  but why 2 or 3???  Does iGet not represent the real read pointer for the queue?
   //  perhaps we keep 2 or 3 old points available at all times in case we need them
   //  or maybe the code used to use them, but doesn't anymore
   if(iPut<i ||
      (iPut>=iGet && iPut<i+MAX_TOUCHQUEUE))
      {
         _bIgnoreStroke2 = FALSE;

         tq2.elems[iPut][0]=iFlags;
         tq2.elems[iPut][1]=((iX<<16)|iY);
//         if((iFlags&TouchSampleDownFlag)==0)
//            PostMessage(_hClientWnd, WM_PEGREC_TABLETEND, iPut, 0);
         iPut++;
         if(iPut>=MAX_TOUCHQUEUE)
           iPut = 0;
         tq2.iPut = iPut;

		 // if both this point and the last point were pen down
         if((iFlags&(TouchSampleDownFlag|TouchSamplePreviousDownFlag))==
             (TouchSampleDownFlag|TouchSamplePreviousDownFlag))
            {
             int iiX = (iX>>3);
             int iiY = (iY>>3);
               if(iiX != _iLastSelfX || 
                  iiY != _iLastSelfY || 
                  _iInRow >10)
                  {
                     SetEvent(g_hInnerEvent);
                     _iInRow = 0;
                  }
               else
                  _iInRow++;
            }
         else
            {
               SetEvent(g_hInnerEvent);
               _iInRow = 0;
            }
      }
   else
   {
      _bIgnoreStroke2 = TRUE;
#ifdef DEBUG
      OutputDebugString(TEXT("Inner Queue Overrun!\n")); 
#endif
   }

   LeaveCriticalSection(&Q2CritSect);

}


/* *********************************************************************************************** */

LPVOID TouchGetQueuePtr()
{
   return ptq; //_pTouchQueue; //&tq;
}

BOOL IsStubWndExist()
{
   if(*_phStubWnd!=NULL || (*_phStubWnd=FindWindow(TOUCHSTUB_WNDCLASSNAME, NULL))!=NULL)
      return TRUE;
   else
      return FALSE;
}

HWND TouchGetFocusWnd()
{
   if(IsStubWndExist())
      return (HWND)SendMessage(*_phStubWnd, WM_STUB_GETFOCUSWND, 0, 0);
   return NULL;
}

HWND TouchGetLastTouchFocusWnd()
{
   if(IsStubWndExist())
      return (HWND)SendMessage(*_phStubWnd, WM_STUB_GETLASTTOUCHFOCUSWND, 0, 0);
   return NULL;
}

void TouchReset(BOOL bSetAllValuesToDefault)
{
   if(IsStubWndExist())
      SendMessage(*_phStubWnd, WM_STUB_RESET, bSetAllValuesToDefault, 0);
}

void TouchCreateEvent(int iX, int iY)
{
   if(IsStubWndExist())
      SendMessage(*_phStubWnd, WM_STUB_EVENT, iX, iY);
}

void TouchCreateEventInternal(int begX, int begY)
{
   if(v_pfnCgrPointCallback==NULL)
      return;
   (*v_pfnCgrPointCallback)(0x07, begX+1, begY+1);
   (*v_pfnCgrPointCallback)(0x0f, begX, begY);
   (*v_pfnCgrPointCallback)(0x0f, begX, begY);
   (*v_pfnCgrPointCallback)(0x0f, begX, begY);
   (*v_pfnCgrPointCallback)(0x0D, begX, begY);
   (*v_pfnCgrPointCallback)(0x05, begX, begY);
}

HWND TouchGetRegisteredWindow()
{
   return _hClientWnd;
}

BOOL TouchRegisterWindow(HWND hClientWnd)
{
	// set up permissions so we can access the buffer in the touch driver
	//  (which might be in slot 4, for example, while Tscriber is in slot 8)

	ptq->iPut = ptq->iGet =0;
	tq2.iPut = tq2.iGet =0;

	// zero out the shared memory queue
	memset((void*) ptq, 0, sizeof(TOUCH_QUEUE));

	if(IsStubWndExist() && SendMessage(*_phStubWnd, WM_STUB_REGISTWND, (WPARAM)hClientWnd, 0))
		return TRUE;
	else
		return FALSE;
}

void TouchUnregisterWindow(HWND hClientWnd)
{
	if(IsStubWndExist())
        SendMessage(*_phStubWnd, WM_STUB_UNREGISTWND, (WPARAM)hClientWnd, 0);
}

void TouchSetValue(DWORD dwName, DWORD dwValue)
{
   if(IsStubWndExist())
      SendMessage(*_phStubWnd, WM_STUB_SETVALUE, dwName, dwValue);
}

LRESULT TouchGetValue(DWORD dwName, DWORD dwValue)
{
   if(IsStubWndExist())
      return SendMessage(*_phStubWnd, WM_STUB_GETVALUE, dwName, dwValue);
   return 0;
}


/* ************************************************************************** */
// this is where we get points from the hardware
BOOL
CgrCallback(
	TOUCH_PANEL_SAMPLE_FLAGS	Flags,
	INT	X,
	INT	Y
    )
{
 DWORD dwTick;
 TOUCH_PANEL_SAMPLE_FLAGS FlagsToDll = Flags, FlagsToWnd = Flags;
#ifdef DEBUG1
 TCHAR str[100];
#endif

#if WRITE_STATISTICSLOG // define to log all points we get from hardware into a txt file
{
  static int _iStatWrites = 0;
  static int _iStatCurrent = 0;
  static short _iStatBuf[MAX_STATS][3] = {0};

if(_iStatWrites<=MAX_WRITES)
   {
    static int count = 0;

      _iStatBuf[_iStatCurrent][0] = (short)Flags;
      _iStatBuf[_iStatCurrent][1] = (short)X;
      _iStatBuf[_iStatCurrent][2] = (short)Y;
      _iStatCurrent++;
      
	  if(_iStatCurrent==MAX_STATS)
         {
          HANDLE hFile = INVALID_HANDLE_VALUE;
          int i;

 
		  
		  _iStatCurrent = 0;

             hFile = CreateFile(L"\\tchlog.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
             if(hFile!=INVALID_HANDLE_VALUE)
                {
                 DWORD dw = 0;
				 int   len;
				 int   j;
      
				 SetFilePointer(hFile, 0, NULL, FILE_END);

				   for (i = 0; i < MAX_STATS; i++)
				   {
				    TCHAR str[64];
					unsigned char str2[64];

                    wsprintf(str, L"%d %d %d %d %c%c", count++, (int)_iStatBuf[i][1], (int)(3000 - _iStatBuf[i][2]), (int)_iStatBuf[i][0], (TCHAR)13, (TCHAR)10); 
  		            
					len = _tcslen(str); 
					if(len > 62) 
						len = 62;

					for (j = 0; j < len; j ++) 
						str2[j] = (unsigned char)str[j]; 
					str2[len] = 0;
					
					WriteFile(hFile, str2, len, &dw, NULL);

				   }

                   CloseHandle(hFile);
                }

             _iStatWrites++;
         }
   }
}
#endif

#ifdef DEBUG1
	wsprintf(str, TEXT(" *** StubCallback (%d,%d) *** \n"), X, Y);
	OutputDebugString( str);
#endif


#ifdef DEBUGTOUCH

    static int		nPointSkips;    				// incr if point more than 10 pixels away in x or y
    static int      nLongIntervalCount;				// incr if time between points is greater than some threshold
    static int      nLongIntervalSum;  				// total length of all the long intervals we see
    static long     nStrokeStartTick;               // when did this stroke start
    static long		nLastTimerTick;                 // time the last point was seen at
    static int		sampleCount;                    // number of points seen since the pen went down
    static long     nPointSkipSum;                  // how many total point skip distances
    long            nTicksNow;
    long            samplesPerSecond;
    long            nLongIntervalAvg;               // how long was the average long interval
    long            nPointSkipAvg;                  // how many total point skip distances
    long            deltaX;
    long            deltaY;
    long            ptIndex;
    static POINT	ptBuf[2];                       // point buffer for testing latentcy and throughput

    // test for first point, middle point, or end point
    // (ex - pen up points: wacom pens send points when above the tablet for cursor hovering)

    // if first point
    //  Set sample count to 1
    //  get strokeStartTick and lastTimerTick time
    //  store first sample
    //  initialize accumulator variables
    if ((0 == (Flags&TouchSamplePreviousDownFlag)) &&       // if previous sample is pen up
        (0 != (Flags&TouchSampleDownFlag))            )     //  and this sample is pen down
    {
        nStrokeStartTick = GetTickCount();
        nLastTimerTick = nStrokeStartTick;
        ptBuf[0].x = X;
        ptBuf[0].y = Y;
        sampleCount = 1;
        nLongIntervalSum = 0;
        nLongIntervalCount = 0;
        nPointSkips = 0;
        nPointSkipSum = 0;
    }

    // if middle point or end point
    //  get time
    //  store sample
    //  samplecount++
    //  check for time lag between samples
    //  check for point jumps
    if (0 != (Flags&TouchSamplePreviousDownFlag))     // if the previous sample was pen down
                                                    //  and this sample is either pen down or pen up
    {
        nTicksNow = GetTickCount();
        ptIndex = sampleCount % 2;
        ptBuf[ptIndex].x = X;
        ptBuf[ptIndex].y = Y;
        sampleCount++;

        // check to see if too much time elapsed since the last point.
        //  this ignores the fact that the windows timer wraps around every 49 days
        //  I ignored it for the purpose of being fast and minimally intrusive.
        if (nTicksNow - nLastTimerTick > LATENCY_THRESHOLD)
        {
            nLongIntervalCount++;
            nLongIntervalSum += nTicksNow - nLastTimerTick;
        }

        // dist is greater than threshold if delta x squared + delta y squared > threshold squared
        //  we compute it this way because it is fastest - avoids the sqrt call
        //  we might be faster still if we used abs(deltaX) + abs(deltaY) > SKIP_THRESHOLD, 
        //  but that is a non-euclidean distance metric.
        deltaX = ptBuf[0].x - ptBuf[1].x;
        deltaY = ptBuf[0].y - ptBuf[1].y;
        if ( (deltaX * deltaX + deltaY * deltaY) > SKIP_THRESHOLD * SKIP_THRESHOLD)
        {
            nPointSkips++;
            nPointSkipSum += deltaX*deltaX + deltaY*deltaY;
        }

        nLastTimerTick = nTicksNow;
    }


    // if end point, check for errors, and display error message if any happened.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
婷婷一区二区三区| 日本大胆欧美人术艺术动态| 欧美日韩中文字幕精品| 国产在线看一区| 亚洲夂夂婷婷色拍ww47 | 91精品国产色综合久久不卡电影| 激情欧美日韩一区二区| 一片黄亚洲嫩模| 国产农村妇女毛片精品久久麻豆| 欧美日韩亚洲综合在线| 国产盗摄一区二区三区| 婷婷开心激情综合| 亚洲美女偷拍久久| 国产亚洲精品免费| 日韩午夜中文字幕| 欧美日韩一区二区在线视频| 成人黄色国产精品网站大全在线免费观看 | 色哟哟欧美精品| 成人综合在线视频| 韩国欧美一区二区| 视频在线在亚洲| 亚洲自拍都市欧美小说| 国产精品女人毛片| 久久久噜噜噜久久人人看| 日韩一区二区影院| 欧美日韩国产天堂| 91极品视觉盛宴| 色狠狠桃花综合| 91色porny蝌蚪| 成人免费毛片高清视频| 国产一区二区三区观看| 久久99精品国产麻豆婷婷| 婷婷综合五月天| 天堂成人国产精品一区| 亚洲国产精品久久人人爱| 亚洲影院久久精品| 一区二区国产视频| 一区二区三区四区在线免费观看| 中文字幕在线一区二区三区| 国产婷婷色一区二区三区| 亚洲精品一线二线三线| 久久婷婷综合激情| 久久亚洲精华国产精华液| 精品国产一区二区亚洲人成毛片| 欧美一级二级在线观看| 欧美一级欧美三级在线观看| 欧美一区二区三区在线观看| 欧美一级高清片在线观看| 日韩亚洲欧美中文三级| 日韩欧美一区中文| 精品久久国产字幕高潮| 26uuu国产电影一区二区| 337p粉嫩大胆色噜噜噜噜亚洲| 精品国产伦一区二区三区观看体验 | 免费不卡在线视频| 久久国产乱子精品免费女| 国产一区二区电影| 福利视频网站一区二区三区| av成人老司机| 欧美日韩黄色影视| 欧美一区二区视频网站| 精品国产3级a| 国产精品区一区二区三区| 亚洲人一二三区| 亚洲成人在线免费| 麻豆精品在线看| 国产黄色成人av| 91免费视频观看| 欧美三级在线看| 精品三级在线看| 国产精品免费视频观看| 亚洲国产一区视频| 久久成人精品无人区| 丁香激情综合国产| 在线观看亚洲专区| 欧美精品一区二区三区蜜臀| 国产精品国产自产拍高清av王其| 一区二区三区免费| 美女视频黄久久| 99久久综合国产精品| 欧美日韩1区2区| 国产午夜精品一区二区三区视频 | 久久成人av少妇免费| 白白色亚洲国产精品| 91麻豆精品国产无毒不卡在线观看| 精品区一区二区| 亚洲老妇xxxxxx| 久久99精品国产.久久久久久 | 午夜精品aaa| 丁香天五香天堂综合| 欧美少妇bbb| 国产午夜精品久久久久久久 | 欧美乱妇15p| 欧美精彩视频一区二区三区| 亚洲mv在线观看| 高清国产午夜精品久久久久久| 欧美日韩在线三区| 国产女同互慰高潮91漫画| 香蕉影视欧美成人| 成人av影视在线观看| 精品少妇一区二区三区免费观看 | 国产麻豆精品在线观看| 色婷婷久久99综合精品jk白丝| 精品理论电影在线| 亚洲成a天堂v人片| 91色porny| 国产欧美一区二区三区网站| 三级一区在线视频先锋| 色狠狠桃花综合| 中文字幕欧美激情一区| 麻豆专区一区二区三区四区五区| 91官网在线观看| 国产精品网站在线| 黑人巨大精品欧美一区| 欧美精品日韩一本| 一区二区日韩av| 91小视频在线免费看| 中文字幕精品—区二区四季| 精品一区二区精品| 国产成人精品午夜视频免费| 欧美性xxxxx极品少妇| 国产精品欧美久久久久无广告| 久久爱www久久做| 欧美精品777| 亚洲国产欧美另类丝袜| 色琪琪一区二区三区亚洲区| 中文字幕一区二区三区在线播放 | 无码av免费一区二区三区试看| av亚洲精华国产精华精| 中文字幕 久热精品 视频在线| 国产一区二区成人久久免费影院 | 亚洲激情自拍视频| av高清久久久| 亚洲婷婷综合色高清在线| 成人精品视频一区| 中文字幕日韩一区| 不卡一区二区在线| 国产精品你懂的在线| 成人免费高清视频在线观看| 日本一区二区高清| gogogo免费视频观看亚洲一| 中文字幕av不卡| 97se亚洲国产综合在线| 自拍偷拍国产精品| 色婷婷亚洲一区二区三区| 一区二区视频在线看| 在线观看欧美日本| 天天色天天操综合| 精品少妇一区二区三区免费观看 | 亚洲精品视频一区| 在线观看一区日韩| 人人超碰91尤物精品国产| 欧美一区二区三区视频免费| 蜜桃av噜噜一区| 久久久国际精品| 91香蕉视频黄| 亚洲一区二区欧美日韩| 91精品国产欧美一区二区成人| 奇米色一区二区| www成人在线观看| 成人丝袜高跟foot| 亚洲精品国产a久久久久久| 精品视频一区二区三区免费| 久久国产精品第一页| 国产精品人妖ts系列视频| 日本高清成人免费播放| 日韩av网站在线观看| 精品99999| 99久久精品费精品国产一区二区| 亚洲综合色噜噜狠狠| 欧美sm美女调教| 99精品国产热久久91蜜凸| 亚洲第一综合色| 26uuu亚洲综合色欧美| 91免费视频大全| 久久不见久久见免费视频1| 国产精品入口麻豆九色| 欧美日韩成人在线| 国产成人a级片| 亚洲国产精品一区二区www| 久久综合久久鬼色| 在线观看日韩一区| 国产精品正在播放| 亚洲午夜在线电影| 国产日韩欧美不卡在线| 欧美三级视频在线播放| 国产一区二三区| 亚洲一二三四在线| 国产日产欧美精品一区二区三区| 欧美性色黄大片| 国产黄色成人av| 日韩中文字幕一区二区三区| 亚洲国产精品高清| 日韩一区二区中文字幕| 91丨porny丨国产入口| 狠狠色丁香婷婷综合久久片| 亚洲午夜电影网| 中文字幕一区二区三区av| 精品久久久久久无| 欧美日本韩国一区|