1. WinAPI

Das Windows Application Programming Interface ist eine Programmierschnittstelle und Laufzeitumgebung, welche Windows-Programmierern bereitsteht, um Anwendungsprogramme für Windows Betriebssysteme zu erstellen. Die WinAPI für SmartDevices ähnelt sehr der Win32 API, sie ist lediglich ein wenig abgespeckt und einige Funktionen heißen anders.



Im Resource Editor lassen sich bequem alle Dialog Boxen, Menüstrukturen und andere Resourcen erstellen. Im Dialog Editor können leicht neue Elemente hinzugefügt werden. Hier als Beispiel die Eingabemaske für die Stützstellen der Newton Interpolationsfunktion.






Den von dem Editor erstellten Code kann man sich unter View/Code ansehen.






Hier der Code für eine Dialog Box mit einem Text und Button aus der Resource Datei. Alle Elemente haben jeweils zwei Positions- (Links, Oben) und zwei Größenvariablen (Breite, Höhe).

IDD_NOTICE DIALOG 0, 0, 186, 94
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
   CTEXT "Sie müssen alle 20 Felder ausfüllen!",IDC_STATIC,20,10,120,8
   DEFPUSHBUTTON "OK",IDOK,65,25,30,14,BS_CENTER
END





Die folgende Funktion bindet den Input Dialog in den Programmablauf mit ein. Die Variable Message wird vom System übergeben. Mit einem Switch kann abgefangen werden, ob ein Button gedrückt wurde.

// Message handler for input box.
INT_PTR CALLBACK Input(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
   int wmId, wmEvent;

   switch (message)
   {
      case WM_INITDIALOG:
      {
          // Create a Done button and size it.
          SHINITDLGINFO shidi;
          shidi.dwMask = SHIDIM_FLAGS;
          shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
          shidi.hDlg = hDlg;
          SHInitDialog(&shidi);
          initInput(hDlg);
       }
       return (INT_PTR)TRUE;

       case WM_COMMAND:
          wmId = LOWORD(wParam);
          wmEvent = HIWORD(wParam);
          switch (wmId)
          {
             case IDOK:
                EndDialog(hDlg, LOWORD(wParam));
                return TRUE;
            // Die drei Funktionen werden aufgerufen sobald der Button IDC_BUTTON_START gedrückt wurde
            case IDC_BUTTON_START:
                getInput(hDlg, g_hInst);
                interpolate();
                writeOutput();
                break;
          }
          break;
       case WM_CLOSE:
          EndDialog(hDlg, message);
          return TRUE;
    }
    return (INT_PTR)FALSE;
}





Die Eingabe erwartet 10 Stützstellen. Klickt man auf Start, so wird die Interpolation ausgeführt. Ein Klick auf den OK Button beendet das Programm.






Die Funktion getInput liest alle Textfelder über die Funktion GetDlgItemText() ein, und füllt ein Array mit den Werten. Ist ein Feld nicht ausgefüllt sieht man hier schön, dass eine weitere Dialog Box mit einem Hinweis geöffnet wird.

bool getInput(HWND hDlg, HINSTANCE g_hInst)
{
   int i = 0, row = 0, col = 0;
    float digit;
    wchar_t fieldValue[20];
    extern bool status;
    extern float input[MAX_INPUT_VARS][2];
    status = true;

    for (i = 0; i < MAX_INPUT_VARS * 2; i++)
    {
       GetDlgItemText(hDlg, inputIDs[i], fieldValue, sizeof(fieldValue));
       swscanf(fieldValue, L"%f", &digit);

       //wcscmp returns 0 if the two strings are equal
       if (!wcscmp(fieldValue, L"#"))
       {
          //open notice dialog
          DialogBox(g_hInst, (LPCTSTR)IDD_NOTICE, hDlg, Notice);
          //break process
          status = false;
          break;
       }

       input[row][col] = digit;
       if (col == 1)
       {
          col = 0;
          row++;
       }
       else
          col = 1;
    }

    return status;
}





Das Programm interpoliert, zu gegebenen Stützstellen, eine bestimmte Anzahl weiterer Kooridnaten auf dem Intervall der Stützstellen. Wurde die Interpolation erfolgreich durchgeführt, speichert das Programm alle Kooridinaten ein einer Textdatei.