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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tchstub.cpp

?? The touch screen driver reads input from touch screen hardware and converts it to touch events that
?? 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一区二区三区免费野_久草精品视频
欧美一区二区三级| 午夜精品久久久久影视| 亚洲精品国产精品乱码不99| 偷偷要91色婷婷| 菠萝蜜视频在线观看一区| 欧美另类z0zxhd电影| 亚洲欧美在线视频| 国产一区二区三区免费在线观看| 91福利视频久久久久| 国产日韩欧美激情| 蜜桃视频一区二区三区在线观看| 91在线观看美女| 中文av字幕一区| 国产在线精品一区二区夜色| 欧美精品一卡二卡| 亚洲精品成人精品456| 丰满亚洲少妇av| 精品精品欲导航| 日本午夜一区二区| 欧美亚洲综合网| 亚洲免费观看高清| 99精品欧美一区二区蜜桃免费| 日韩丝袜情趣美女图片| 日韩精品福利网| 678五月天丁香亚洲综合网| 樱花草国产18久久久久| 成人高清视频免费观看| 久久久久国产精品麻豆ai换脸| 日产欧产美韩系列久久99| 欧美视频一区二区在线观看| 一区二区三区四区不卡视频| 9l国产精品久久久久麻豆| 中文字幕av免费专区久久| 国产成人精品午夜视频免费| 国产亚洲精品7777| 夫妻av一区二区| 综合久久给合久久狠狠狠97色| 成人视屏免费看| 日韩理论片网站| 在线视频观看一区| 亚洲1区2区3区4区| 日韩欧美在线影院| 国产一区二区免费视频| 国产丝袜在线精品| 99re热这里只有精品视频| 亚洲视频在线一区观看| 欧美综合在线视频| 三级欧美在线一区| 欧美草草影院在线视频| 精品一区二区在线看| 国产日韩成人精品| 一本色道久久综合亚洲91| 亚洲成a人v欧美综合天堂| 555www色欧美视频| 国产一区二区三区综合| 国产精品夫妻自拍| 欧美精品自拍偷拍| 国产精品一区二区在线播放 | 成人h动漫精品一区二| 亚洲国产人成综合网站| 欧美日韩亚洲综合在线| 久久国产剧场电影| 亚洲欧洲日产国码二区| 4hu四虎永久在线影院成人| 狠狠狠色丁香婷婷综合激情| 国产精品视频一二三区| 欧美日韩在线播放三区| 国内精品伊人久久久久影院对白| 中文字幕亚洲在| 欧美一区国产二区| 成人av网站在线观看| 午夜国产不卡在线观看视频| 久久久精品国产免大香伊| 91同城在线观看| 九九九久久久精品| 一区二区三区在线免费| 久久亚洲欧美国产精品乐播| 日本精品免费观看高清观看| 久久99久久久欧美国产| 一区二区三区小说| 91久久精品网| 精品99久久久久久| 色系网站成人免费| 国产精品资源在线观看| 香蕉久久夜色精品国产使用方法 | 中文字幕亚洲一区二区va在线| 7777精品久久久大香线蕉| av中文字幕一区| 精品中文字幕一区二区小辣椒| 亚洲视频在线一区二区| 国产午夜三级一区二区三| 欧美日本在线视频| 色婷婷久久久亚洲一区二区三区| 久久99国产精品久久99| 亚洲va国产va欧美va观看| 自拍偷拍欧美精品| 日本一区二区三区四区| 欧美videos中文字幕| 在线综合视频播放| 欧美性猛交xxxxxxxx| 91亚洲永久精品| jiyouzz国产精品久久| 国产成人av一区| 国产一区二区三区美女| 久久精品久久久精品美女| 亚洲3atv精品一区二区三区| 一区二区三区在线视频免费| 国产欧美一区二区精品秋霞影院| 欧美mv日韩mv| 精品久久久三级丝袜| 91精品国产全国免费观看| 精品视频999| 91成人网在线| 欧美丝袜丝交足nylons图片| 色婷婷综合在线| 日本丶国产丶欧美色综合| 色综合一区二区| 欧美三电影在线| 欧美电影在线免费观看| 欧美日韩一区三区四区| 欧美久久婷婷综合色| 欧美精品日韩一区| 日韩欧美国产综合在线一区二区三区| 欧美剧情片在线观看| 91精品国产综合久久婷婷香蕉| 欧美人动与zoxxxx乱| 日韩精品资源二区在线| 精品电影一区二区三区| 国产亚洲欧美日韩日本| 综合自拍亚洲综合图不卡区| 亚洲色图制服诱惑| 亚洲成人一区在线| 美女视频第一区二区三区免费观看网站| 日韩av一级电影| 国产剧情一区二区| 99久久国产综合精品麻豆| 日本精品一级二级| 日韩一区二区三区在线视频| 久久一区二区视频| 欧美国产欧美综合| 亚洲小说欧美激情另类| 蜜臀av国产精品久久久久| 国产精品18久久久久久久久| 91亚洲精品久久久蜜桃| 91精品婷婷国产综合久久性色| 91精品国产全国免费观看| 国产亚洲精品福利| 亚洲一区二区视频在线观看| 日日摸夜夜添夜夜添精品视频| 九九视频精品免费| 色视频成人在线观看免| 日韩欧美高清一区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲黄色性网站| 韩国三级中文字幕hd久久精品| 99久久综合国产精品| 91精品久久久久久久99蜜桃| 欧美激情中文字幕| 亚洲v中文字幕| 成人国产精品免费观看视频| 欧美日韩在线三级| 欧美国产日韩精品免费观看| 亚洲成人av福利| 成人精品免费网站| 日韩欧美成人一区| 亚洲国产日韩一级| 成人性视频免费网站| 51精品国自产在线| 亚洲精品欧美专区| 国产成人av自拍| 日韩一区二区高清| 亚洲亚洲精品在线观看| 成人国产精品免费网站| 日韩欧美一二三| 午夜视黄欧洲亚洲| 91视频一区二区三区| 国产午夜精品理论片a级大结局| 亚洲18女电影在线观看| 91浏览器打开| 国产精品日产欧美久久久久| 狠狠色狠狠色综合| 91麻豆精品国产综合久久久久久| 亚洲日本青草视频在线怡红院 | 国产大片一区二区| 91麻豆精品国产自产在线观看一区| 亚洲欧洲日韩一区二区三区| 国产精品 日产精品 欧美精品| 欧美日韩精品一区二区天天拍小说| 国产精品国产三级国产aⅴ原创| 蜜臀精品一区二区三区在线观看| 欧美三级中文字幕| 亚洲欧美日韩国产手机在线| 高清在线不卡av| 国产日韩欧美a| 国产精品一区二区久久不卡| www久久精品| 国产一区日韩二区欧美三区| 精品毛片乱码1区2区3区| 日本aⅴ免费视频一区二区三区| 欧美日韩另类一区|