touch screen calibration
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 24.04.08 09:28
Оценка:
стоит задача настраивать калибровку экрана для дэвайса под винСЕ...

на мсдне нашел, что существует такая функция, как

VOID TouchPanelSetCalibration(
  INT32 cCalibrationPoints,
  INT32* pScreenXBuffer,
  INT32* pScreenYBuffer,
  INT32* pUncalXBuffer,
  INT32* pUncalYBuffer 
);


вот, ну как я понял, до ее вызова нужно вызвать:
TouchPanelEnable
TouchPanelGetDeviceCaps...
но вот что как и в каком порядке я так и не разобрался, да и TouchPanelEnable нужно давать колбэк функцию в которую будут приходить сообщения о работе с точскрином, но мне бы просто калибровку настроить, а дальше пусть все работает как и работало...
как следствие вопрос:
может есть способ сделать настройку калибровки допустим через реестр?
Re: touch screen calibration
От: StDenis Россия  
Дата: 24.04.08 10:03
Оценка: 3 (1)
а зачем Enable, у Вас тачпад еще не включен?
вот кусок кода, может не поможет, но хоть как-то продвинет процесс размышлений.
    #define PT_COUNT    5
    INT32 uncalX[PT_COUNT] = // сырые данные по X
    INT32 uncalY[PT_COUNT] = // сырые данные по Y
    INT32 scrX[PT_COUNT], scrY[PT_COUNT]; // экранные координаты соответствующие сырым данным

    TPDC_CALIBRATION_POINT_COUNT ptcount = {0};
    TouchPanelGetDeviceCaps( TPDC_CALIBRATION_POINT_COUNT_ID, &ptcount );
    int count = min( PT_COUNT, ptcount.cCalibrationPoints );
    for( int i = 0; i < count; i++ ) {
        TPDC_CALIBRATION_POINT pt = {0};
        pt.PointNumber = i;
        pt.cDisplayWidth = // ширина экрана, пикс.
        pt.cDisplayHeight = // высота экрана, пикс.
        TouchPanelGetDeviceCaps( TPDC_CALIBRATION_POINT_ID, &pt );
        scrX[i] = pt.CalibrationX;
        scrY[i] = pt.CalibrationY;
    }
    TouchPanelSetCalibration( count, scrX, scrY, uncalX, uncalY );
не нужно было восстановить калибровку после TouchPanelEnable, сырые значения я брал из реестра
Re[2]: touch screen calibration
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 24.04.08 10:39
Оценка:
Здравствуйте, StDenis, Вы писали:

SD>а зачем Enable, у Вас тачпад еще не включен?

SD>вот кусок кода, может не поможет, но хоть как-то продвинет процесс размышлений.

огромное спасибо, думаю поможет и даже очень, только вот хотелось бы у вас в добавок спросить, чему равны константы
TPDC_CALIBRATION_POINT_COUNT_ID
TPDC_CALIBRATION_POINT_ID

и какой вид имеет DDI_TOUCH_PANEL_CALIBRATION_FLAGS из TPDC_CALIBRATION_POINT_COUNT

SD>не нужно было восстановить калибровку после TouchPanelEnable, сырые значения я брал из реестра


тоже очень интересно, а где именно в реестре их можно взять?

З.Ы. еще раз спасибо за помощ
Re[3]: touch screen calibration
От: StDenis Россия  
Дата: 24.04.08 11:31
Оценка:
_>огромное спасибо, думаю поможет и даже очень, только вот хотелось бы у вас в добавок спросить, чему равны константы
_>TPDC_CALIBRATION_POINT_COUNT_ID
_>TPDC_CALIBRATION_POINT_ID

_>и какой вид имеет DDI_TOUCH_PANEL_CALIBRATION_FLAGS из TPDC_CALIBRATION_POINT_COUNT

вот хидер http://pastebin.ru/293230
Re[4]: touch screen calibration
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 24.04.08 12:46
Оценка:
Здравствуйте, StDenis, Вы писали:

_>>огромное спасибо, думаю поможет и даже очень, только вот хотелось бы у вас в добавок спросить, чему равны константы

_>>TPDC_CALIBRATION_POINT_COUNT_ID
_>>TPDC_CALIBRATION_POINT_ID

_>>и какой вид имеет DDI_TOUCH_PANEL_CALIBRATION_FLAGS из TPDC_CALIBRATION_POINT_COUNT

SD>вот хидер http://pastebin.ru/293230

спасибо, кстати на одном китайском форуме нашел что в coredll.dll есть void TouchCalibrate(); по этому для тех для кого не критичен собственный менеджер калибровки, думаю вполне сойдет просто вызов TouchCalibrate()
Re[4]: touch screen calibration
От: DarkSmoke  
Дата: 04.06.08 05:07
Оценка:
>вот хидер http://pastebin.ru/293230

можно еща раз хидер куда-нить выложить?
Re[5]: touch screen calibration
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 04.06.08 07:41
Оценка:
Здравствуйте, DarkSmoke, Вы писали:

DS>можно еща раз хидер куда-нить выложить?


catch up

http://slil.ru/25862287
Re[6]: touch screen calibration
От: Socrat Россия  
Дата: 14.12.08 19:54
Оценка:
Здравствуйте, dabeat_bf, Вы писали:

DS>>можно еща раз хидер куда-нить выложить?


_>catch up


_>http://slil.ru/25862287


Нету
Re[7]: touch screen calibration
От: dabeat_bf Украина http://alexmogurenko.com
Дата: 17.12.08 15:53
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Нету


6 месяцев прошло
в инете оказалось найти проще чем на винте )))
http://topic.csdn.net/u/20081209/08/b5909a86-0273-48aa-8b20-c6c96361c69a.html
Re[8]: touch screen calibration
От: Socrat Россия  
Дата: 17.12.08 20:40
Оценка:
Здравствуйте, dabeat_bf, Вы писали:

S>>Нету


_>6 месяцев прошло

_>в инете оказалось найти проще чем на винте )))
_>http://topic.csdn.net/u/20081209/08/b5909a86-0273-48aa-8b20-c6c96361c69a.html

Спасибо, я уже сам нашел

У меня проблема в следующем. Нужно, чтобы калибровка тачскрина сохранялась между выключениями. Для этого собираюсь сделать дополнительную программу, которая считывает параметры калибровки и сохраняет в файл. Функция выглядит так:


static CString CalibrateTouch ()
{
  HINSTANCE hinstance = LoadLibrary (L"touch.dll");
  if (hinstance == NULL)
    return "";

  PFN_TOUCH_PANEL_GET_DEVICE_CAPS   pTouchPanelGetDeviceCaps   =
    (PFN_TOUCH_PANEL_GET_DEVICE_CAPS  ) GetProcAddress (hinstance, L"TouchPanelGetDeviceCaps");
  PFN_TOUCH_PANEL_CALIBRATE_A_POINT pTouchPanelCalibrateAPoint =
    (PFN_TOUCH_PANEL_CALIBRATE_A_POINT) GetProcAddress (hinstance, L"TouchPanelCalibrateAPoint");

  TPDC_CALIBRATION_POINT_COUNT point_count; 
  if (pTouchPanelGetDeviceCaps == NULL || pTouchPanelGetDeviceCaps == NULL || pTouchPanelCalibrateAPoint == NULL)
    return "";

  pTouchPanelGetDeviceCaps (TPDC_CALIBRATION_POINT_COUNT_ID, &point_count); 

  RECT rt;
  HWND w = ::GetDesktopWindow();
  GetWindowRect (w, &rt);

  CString str, tmp;
  for (int i = 0; i < point_count.cCalibrationPoints; i++) 
  { 
    TPDC_CALIBRATION_POINT point;
    point.PointNumber    = i;
    point.cDisplayWidth  = rt.right;
    point.cDisplayHeight = rt.bottom;
    pTouchPanelGetDeviceCaps (TPDC_CALIBRATION_POINT_ID, &point);

    INT32 x, y; 
    pTouchPanelCalibrateAPoint (point.CalibrationX, point.CalibrationY, &x, &y); 
    tmp.Format (L"%d:%d,%d:%d", point.CalibrationX, x, point.CalibrationY, y);
    if (i != 0)
      str += ';';
    str += tmp;
  }
  FreeLibrary (hinstance);
  return str;
}


Проблема в том, что функция pTouchPanelCalibrateAPoint возвращает те же координаты, что на входе. В чем может быть проблема? Некалиброванные точки отличаются от калиброванных.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.