ハードボタンを使う
Top > Tips > Button

Palmマシンには、4つのボタン(ハードボタン)が付いていて、 ボタン1つでPalmwareの起動ができるようになっています。
その他に上下ボタンがあり、カーソルの移動などができ、 ジョグダイヤルの付いているCLIEでは、 ジョグダイヤルを押し込むことで決定することができます。
しかし、他のマシンにはこれに対応するボタンがありません。

そこでハードボタンを決定ボタンにしてみましょう。

ハードボタン押下に対するイベントは、 SysHandleEvent関数が処理していますが、 これをアプリのイベントハンドラにて行うようにします。

ここでは処理を省いていますが、イベントループはアプリで1つしかないので、 アクティブフォームがハードボタンを使うフォームかどうかを判断する必要があります。 アプリ起動中はハードボタンからのアプリ起動ができなくても良いというなら話は別ですが…。

イベントループの処理を変更してしまえば、 あとは普通にキーダウンイベントで、 対応するキーコード(vchrHard1〜vchrHard4)の場合に処理を行えば、 ハードボタン対応が出来ます。

イベントハンドラ&イベントループ
static Boolean MainFormHandleEvent(EventPtr pEvent)
{
    Boolean     handled = false;
    FormPtr     pForm;
    ListPtr     pList;

    switch (pEvent->eType)
    {
    case frmOpenEvent:      /* フォームオープンイベント */
        pForm = FrmGetActiveForm();
        FrmDrawForm(pForm);
        handled = true;
        break;

    case keyDownEvent:      /* キーダウンイベント */
        /* ハードボタンが押された? */
        if (TxtCharIsHardKey(pEvent->data.keyDown.modifiers, pEvent->data.keyDown.chr))
        {
            switch (pEvent->data.keyDown.chr)
            {
            case vchrHard1:         /* ハードボタン1 */
                /* ここにハードボタン1が押されたときの処理を記述 */
                handled = true;
                break;

            case vchrHard2:         /* ハードボタン2 */
                /* ここにハードボタン2が押されたときの処理を記述 */
                handled = true;
                break;

            case vchrHard3:         /* ハードボタン3 */
                /* ここにハードボタン3が押されたときの処理を記述 */
                handled = true;
                break;

            case vchrHard4:         /* ハードボタン4 */
                /* ここにハードボタン4が押されたときの処理を記述 */
                handled = true;
                break;

            }
        }
        break;

    default:
        break;
    }

    return handled;
}

static void EventLoop(void)
{
    Word        err;
    EventType   event;
    Boolean     ret;

    /* イベントループ */
    do
    {
        EvtGetEvent(&event, evtWaitForever);

        if (keyDownEvent == event.eType
         && TxtCharIsHardKey(event.data.keyDown.modifiers, event.data.keyDown.chr)
         && vchrHard1 <= event.data.keyDown.chr
         && vchrHard4 >= event.data.keyDown.chr)
        {
            /* ハードボタンのイベントはSysHandleEvent関数に処理させない */
            ret = false;
        }
        else
        {
            ret = SysHandleEvent(&event);
        }

        if (!ret)
        {
            if (!MenuHandleEvent(NULL, &event, &err))
            {
                if (!ApplicationHandleEvent(&event))
                {
                    FrmDispatchEvent(&event);
                }
            }
        }
    } while (appStopEvent != event.eType);
}

'04/12/16 新規作成