Mulai menggunakan Pesan Sentuh Windows

Bagian ini menjelaskan tugas yang terkait dengan mendapatkan input Windows Touch agar berfungsi di aplikasi Anda.

Langkah-langkah berikut biasanya dilakukan saat bekerja dengan pesan Windows Touch:

  1. Uji kemampuan digitizer input.
  2. Daftar untuk menerima pesan Windows Touch.
  3. Tangani pesan.

Pesan yang digunakan untuk Windows Touch WM_TOUCH. Pesan ini menunjukkan berbagai status kontak dengan digitizer.

Menguji Kemampuan Digitizer Input

Fungsi GetSystemMetrics dapat digunakan untuk mengkueri kemampuan digitizer input dengan meneruskan nilai nIndex SM_DIGITIZER. GetSystemMetrics mengembalikan bidang bit yang menunjukkan apakah perangkat siap, baik perangkat mendukung pena atau sentuhan, apakah perangkat input terintegrasi atau eksternal, dan apakah perangkat mendukung beberapa input (Windows Touch). Tabel berikut ini memperlihatkan bit untuk berbagai bidang.

Bit 8 7 6 5 4 3 2 1
Value Stack Siap Multi-input Dicadangkan Dicadangkan Pena Eksternal Pena Terintegrasi Sentuhan Eksternal Sentuhan Terintegrasi

 

Untuk menguji hasil dari perintah untuk fitur tertentu, Anda dapat menggunakan bitwise & operator dan bit tertentu yang Anda uji. Misalnya, untuk menguji Windows Touch, Anda akan menguji bahwa bit urutan ketujuh diatur (0x40 dalam heks). Contoh kode berikut menunjukkan bagaimana nilai-nilai ini dapat diuji.

#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value  & NID_MULTI_INPUT){
    /* digitizer is multitouch */ 
    MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}

Tabel berikut mencantumkan konstanta yang ditentukan di windows.h untuk menguji kemampuan sentuh digitizer input.

Nama Nilai Deskripsi
TABLET_CONFIG_NONE 0x00000000 Digitizer input tidak memiliki kemampuan sentuh.
NID_INTEGRATED_TOUCH 0x00000001 Digitizer sentuh terintegrasi digunakan untuk input.
NID_EXTERNAL_TOUCH 0x00000002 Digitizer sentuh eksternal digunakan untuk input.
NID_INTEGRATED_PEN 0x00000004 Digitizer pena terintegrasi digunakan untuk input.
NID_EXTERNAL_PEN 0x00000008 Digitizer pena eksternal digunakan untuk input.
NID_MULTI_INPUT 0x00000040 Digitizer input dengan dukungan untuk beberapa input digunakan untuk input.
NID_READY 0x00000080 Digitizer input siap untuk input. Jika nilai ini tidak diatur, itu mungkin berarti bahwa layanan tablet dihentikan, digitizer tidak didukung, atau driver digitizer belum diinstal.

 

Memeriksa nilai NID_* adalah cara yang berguna untuk memeriksa kemampuan komputer pengguna untuk mengonfigurasi aplikasi Anda untuk input sentuhan, pena, atau non-tablet. Misalnya, jika Anda memiliki antarmuka pengguna dinamis (UI) dan ingin mengonfigurasi beberapa di antaranya secara otomatis, Anda dapat memeriksa NID_INTEGRATED_TOUCH, NID_MULTITOUCH, dan bisa mendapatkan jumlah sentuhan maksimum saat pertama kali pengguna menjalankan aplikasi Anda.

Catatan

Ada beberapa batasan yang melekat untuk SM_GETSYSTEMMETRICS. Misalnya, tidak ada dukungan untuk plug and play. Untuk alasan ini, berhati-hatilah saat menggunakan fungsi ini sebagai sarana untuk konfigurasi permanen.

 

Mendaftar untuk Menerima Input Sentuhan Windows

Sebelum menerima input Windows Touch, aplikasi harus terlebih dahulu mendaftar untuk menerima input Windows Touch. Dengan mendaftarkan jendela aplikasi, aplikasi menunjukkan bahwa aplikasi tersebut kompatibel dengan sentuhan. Setelah aplikasi mendaftarkan jendelanya, pemberitahuan dari driver Windows Touch diteruskan ke aplikasi saat input dibuat di jendela. Saat aplikasi dimatikan, aplikasi membatalkan pendaftaran jendelanya untuk menonaktifkan pemberitahuan.

Catatan

WM_TOUCH pesan saat ini "serakah." Setelah pesan sentuhan pertama diterima di jendela, semua pesan sentuhan dikirim ke jendela tersebut hingga jendela lain menerima fokus.

 

Catatan

Secara default, Anda menerima pesan WM_GESTURE alih-alih WM_TOUCH pesan. Jika Anda memanggil RegisterTouchWindow, Anda akan berhenti menerima pesan WM_GESTURE .

 

Kode berikut menunjukkan bagaimana aplikasi dapat mendaftar untuk menerima pesan Windows Touch dalam aplikasi Win32.

RegisterTouchWindow(hWnd, 0);

Menangani Pesan Sentuh Windows

Anda dapat menangani pesan Windows Touch dari aplikasi di sistem operasi Windows dengan berbagai cara. Jika Anda memprogram aplikasi GUI, Anda menambahkan kode dalam WndProc fungsi untuk menangani pesan yang menarik. Jika Anda memprogram Microsoft Foundation Class (MFC) atau aplikasi terkelola, Anda menambahkan handler untuk pesan yang menarik. Contoh kode berikut menunjukkan bagaimana pesan sentuh dapat ditangani dari WndProc dalam aplikasi berbasis Windows.

  LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
    BOOL bHandled = FALSE;
    UINT cInputs = LOWORD(wParam);
    PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
    if (pInputs){
        if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
            for (UINT i=0; i < cInputs; i++){
                TOUCHINPUT ti = pInputs[i];
                //do something with each touch input entry
            }            
            bHandled = TRUE;
        }else{
             /* handle the error here */
        }
        delete [] pInputs;
    }else{
        /* handle the error here, probably out of memory */
    }
    if (bHandled){
        // if you handled the message, close the touch input handle and return
        CloseTouchInputHandle((HTOUCHINPUT)lParam);
        return 0;
    }else{
        // if you didn't handle the message, let DefWindowProc handle it
        return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
    }
  }


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
      // pass touch messages to the touch handler 
      case WM_TOUCH:
        OnTouch(hWnd, wParam, lParam);
        break;

Kode berikut menunjukkan bagaimana Anda dapat mengimplementasikan peta pesan dan penanganan pesan. Perhatikan bahwa pesan harus dideklarasikan dalam peta pesan dan kemudian handler untuk pesan harus diimplementasikan. Misalnya, dalam aplikasi MFC, ini dapat dideklarasikan dalam kode dialog. Perhatikan juga, bahwa OnInitDialog fungsi untuk jendela dialog Anda harus menyertakan panggilan ke RegisterTouchWindow seperti RegisterTouchWindow(m_hWnd, 0).

  // Class implementations within a dialog
  LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
    //Insert handler code here to do something with the message or uncomment the following line to test
    //MessageBox(L"touch!", L"touch!", MB_OK);
    return 0;
  }
  // The message map
  BEGIN_MESSAGE_MAP()
    ON_WM_CREATE()
    ... ... ...
    ON_MESSAGE(WM_TOUCH, OnTouch)
  END_MESSAGE_MAP()  
 
  BOOL TestDlg::OnInitDialog()
  {
    CDialog::OnInitDialog();    

    RegisterTouchWindow(m_hWnd, 0);
     ... ... ...
  }  
  

Menyentuh jendela akan menunjukkan sentuhan dari jendela pop-up.

Input Sentuh Windows