欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

continue (15千字)

continue (15千字)

BOOL OnPenDown(EventPtr eventP, HW_PREF* pPrefs, HW_PENS* pHWPens, HW_TRACE* pHWTrace)
{
    Coord x, y;
    FormPtr frm;
    Int8 MenuMode;
    UInt16 screenX, screenY;
    // d3 = eventP(a6)
    // a2 = pPrefs
    // a3 = pHWPens
    // a4 = pHWTrace
    x = eventP->screenX;
    y = eventP->screenY;
    WinWindowToDisplayPt(&x, &y);
    if (x > 160 || y > 160)
        return 0;
    MenuMode = pPrefs->MenuMode;
    switch (MenuMode)
    {
    case FOLDED:
        if (screenX > 141 && screenX < 151 && screenY > 141 && screenY < 151)
            break;
    case LOWER:
        if (screenY > 120 && screenY < 145)
            break;
    case UPPER:
        if (screenY > 80 && screenY < 105)
            break;
    default:
        if (pPrefs->bMouse)
            return false;
        pHWTrace->b2006 = 0;
        pHWTrace->points[pHWTrace->PtCount].x = screenX;
        pHWTrace->points[pHWTrace->PtCount].y = screenY;
        if (pHWTrace->PtCount == 0)
            pHWTrace->b2007 = 1;
        pHWTrace->PtCount++;
        pHWTrace->dw2002 = 0;
        return true;
    }
    // 如果已有笔迹采样点, 将新点加入笔迹数组.
    if (pHWTrace->PtCount) {
        pHWTrace->points[pHWTrace->PtCount].x = screenX;
        pHWTrace->points[pHWTrace->PtCount].y = screenY;
        pHWTrace->PtCount++;
        return true;
    }
    
    pHWTrace->b2006 = true;
    if (MenuMode == LOWER && x > 3 && x < 63 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 3 && x < 63 && y > 94 && y < 106)
    {
        UInt16 ofs = (pHWPens->CandiDispOfs + (x - 1)) / 12;
        char* p = (char*)&pHWPens->Cands[pHWPens->index - 1][ofs];
        
        if (*p == 0) {
            if (*(p + 1) == 0)
                return true;
            EvtEnqueueKey(backspaceChr, 0, 0);
            EvtEnqueueKey(*(p + 1), 0, 0);
        }
        else {
            EnqueueChChar(GetCurField(FrmGetActiveForm()), p, true);
            GetAssoc(pHWPens, *(UInt16*)p);
        }
        pPrefs->bRedrawMenu = true;
        return true;
    }

    if (MenuMode == LOWER && x > 3 && x < 133 && y > 121 && y < 133 ||
        MenuMode == UPPER && x > 3 && x < 133 && y > 81 && y < 93) // else goto 6b4a
    {
        UInt16 pos = (x - 1) / 13 * 2;
        if (pHWPens->AssocOfs + pos < pHWPens->AssocNum) {
            EnqueueChChar(GetCurField(FrmGetActiveForm()), pHWPens->AssocBuffer[pos], false);
            pHWPens->AssocNum = 0;
            pHWPens->AssocOfs = 0;
        }
        return true;
    }
    if (MenuMode == LOWER && x > 63 && x < 75 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 63 && x < 75 && y > 94 && y < 106) // else goto 6be0
    {
        UInt16 ofs = pHWPens->CandiDispOfs + 5;
        if (ofs == 10) {
            pHWPens->CandiDispOfs = 0;
            pPrefs->bRedrawMenu = true;
        }
        else if (pHWPens->Cands[pHWPens->index - 1][ofs] != 0) {
            pHWPens->CandiDispOfs + 5;
            pPrefs->bRedrawMenu = true;
        }
        return true;
    }
    if (MenuMode == LOWER && x > 132 && x < 144 && y > 121 && y < 133 ||
        MenuMode == UPPER && x > 132 && x < 144 && y > 81 && y < 93) // else goto 6c4a
    {
        if (pHWPens->AssocOfs) {
            pHWPens->AssocOfs -= 20;
            pPrefs->bRedrawMenu = true;
        }
        return true;
    }
    if (MenuMode == LOWER && x > 145 && x < 157 && y > 121 && y < 133 ||
        MenuMode == UPPER && x > 145 && x < 157 && y > 81 && y < 93) // else goto 6cba
    {
        if (pHWPens->AssocOfs + 20 < pHWPens->AssocNum) {
            pHWPens->AssocOfs += 20;
            pPrefs->bRedrawMenu = true;
        }
        return true;
    }

    if (MenuMode == LOWER && x > 148 && x < 158 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 148 && x < 158 && y > 94 && y < 106) // else goto 6d46
    {
        frm = FrmGetActiveForm();
        if (FrmValidatePtr(frm))
            FrmUpdateForm(FrmGetFormId(frm), frmRedrawUpdateCode);
        ClearMenu(MenuMode);
        MenuMode = FOLDED;
        pPrefs->bMenuFolded = true;
        return true;
    }

    if (x > 141 && x < 151 && y > 141 && y < 151 && MenuMode == LOWER)
    {
        ClearMenu(MenuMode);
        pPrefs->MenuMode = GetMenuMode();
        pPrefs->bMenuFolded = false;
        pPrefs->bRedrawMenu = true;
        return true;
    }
    if (MenuMode == LOWER && x > 76 && x < 88 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 76 && x < 88 && y > 94 && y < 106) // else goto 6dfa
    {
        if (pPrefs->RecogRange == HW_ENGLISH)
            pPrefs->RecogRange = 0;
        else
            pPrefs->RecogRange = HW_ENGLISH;
        RedrawMenu(pPrefs, pHWPens);
        return true;
    }
    if (MenuMode == LOWER && x > 88 && x < 100 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 88 && x < 100 && y > 94 && y < 106) // else goto 6e6a
    {
        if (pPrefs->RecogRange == HW_NUMERIC)
            pPrefs->RecogRange = 0;
        else
            pPrefs->RecogRange = HW_NUMERIC;
    
        RedrawMenu(pPrefs, pHWPens);
        return true;
    }
    if (MenuMode == LOWER && x > 100 && x < 112 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 100 && x < 112 && y > 94 && y < 106) // else goto 6e6a
    {
        if (pPrefs->RecogRange == HW_SYMBOL)
            pPrefs->RecogRange = 0;
        else
            pPrefs->RecogRange = HW_SYMBOL;
    
        RedrawMenu(pPrefs, pHWPens);
        return true;
    }
    if (MenuMode == LOWER && x > 112 && x < 124 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 112 && x < 124 && y > 94 && y < 106) // else goto 6f42
    {
        pPrefs->bHalfToFull = !pPrefs->bHalfToFull;
        RedrawMenu(pPrefs, pHWPens);
        return true;
    }
    if (MenuMode == LOWER && x > 136 && x < 148 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 136 && x < 148 && y > 94 && y < 106) // else goto 6fa8
    {
        pPrefs->bMouse = !pPrefs->bMouse;
        RedrawMenu(pPrefs, pHWPens);
        return true;
    }
    if (MenuMode == LOWER && x > 124 && x < 136 && y > 134 && y < 146 ||
        MenuMode == UPPER && x > 124 && x < 136 && y > 94 && y < 106) // else goto 7022
    {
        LocalID dbID = DmFindDatabase(0, "HWPenS-1");
        UInt32 Results;
        if (dbID)
            SysAppLaunch(0, dbID, 0, HWDefinedCmd, NULL, &Results);
        return true;
    }
    return false;
}
BOOL OnPenUp(EventPtr eventP, HW_PREF* pPrefs, HW_PENS* pHWPens, HW_TRACE* pHWTrace)
{
    Boolean handled;
    EventType evt1, evt2;
    UInt16 PtCount = pHWTrace->PtCount;
    if (PtCount == 0)
        handled = false;
    else if (pHWTrace->b2006)
        handled = true;
    else if (pHWTrace->b2007) {
        pHWTrace->b2007 = 0;
        pHWTrace->b2008 = 1;
        evt1 = *eventP;
        evt1.eType = penDownEvent;
        EvtAddEventToQueue(&evt1);
        EvtAddEventToQueue(eventP);
        pHWTrace->PtCount = 0;
        handled = true;
    }
    else {
        pHWTrace->points[PtCount].x = 0xff; //(FF,00)表示笔划结束
        pHWTrace->points[PtCount].y = 0;
        pHWTrace->PtCount++;
        evt2.eType = firstUserEvent + 1;
        EvtAddEventToQueue(&evt2);
        pHWTrace->dw2002 = TimGetTicks();
        handled = true;
    }
    return handled;
}
BOOL OnPenMove(EventPtr eventP, HW_PREF* pPrefs, HW_PENS* pHWPens, HW_TRACE* pHWTrace)
{
    Coord x, y;
    UInt16 var_e, err, i;
    RectangleType rc;
    WindowType* winHandle, *winHandleSaved;
    x = eventP->screenX;
    y = eventP->screenY;
    WinWindowToDisplayPt(&x, &y);
    if (x > 160 || y > 160)
        return false;
    if ((var_e = pHWTrace->PtCount) == 0)
        return false;
    if (pHWTrace->b2006 != 0)
        return true;
    pHWTrace->points[var_e].x = x;
    pHWTrace->points[var_e].y = y;
    pHWTrace->PtCount++;
    if (pHWTrace->b2007) { // or jump to 719e
        Int16 deltaX, deltaY, d;
        deltaX = x - pHWTrace->points[0].x;
        if (deltaX >= 0)
            d = deltaX;
        else
            d = -deltaX;
        if (d <= 8) { // or 70f0
            deltaY = y - pHWTrace->points[0].y;
            if (deltaY >= 0)
                d = deltaY;
            else
                d = -deltaY;
            if (d <= 8)
                return true;
        }
        RctSetRectangle(&rc, 0, 0, 160, 160);
        winHandle = WinSetDrawWindow(WinGetDisplayWindow()); // d4
        InsPtEnable(false);
        winHandleSaved = WinSaveBits(&rc, &err); // d3
        MemPtrSetOwner(winHandleSaved, 0);
        InsPtEnable(true);
        WinSetDrawWindow(winHandle);
        FtrSet('HW99', 14, winHandleSaved);
        pHWTrace->b2007 = false;
        for (i = 0; i < pHWTrace->PtCount - 1; i++) // d3 = i
            DrawStroke(pPrefs, pHWTrace->points[i], pHWTrace->points[i + 1]);
        return true;
    }
    // only draw last stroke
    i = pHWTrace->PtCount - 2;
    DrawStroke(pPrefs, pHWTrace->points[i], pHWTrace->points[i + 1]);
    return true;
}
BOOL HW_SysHandleEvent(EventPtr eventP)
{
    MemHandle    memPref, mem414, mem8202;
    HW_PREF*    pPrefs;
    HW_PENS* pHWPens;
    char* pHWTrace;
    BOOL (*OrgSysHandleEvent)(EventPtr eventP);
    FormPtr frm;
    WinHandle winHandle;
    EventType event;
    UInt32 var_2e, i, j;
    Int8 WaitTime;
    UInt16 DeltaX, DeltaY;
    
    if (!FtrGet('HW99', 10, (UInt32 *)&memPref))
        pPrefs = (HW_PREF*)memPrefLock(memPref); // a2 = pPrefs
    if (!FtrGet('HW99', 12, (UInt32 *)&mem414))
        pHWPens = (HW_PENS*)memPrefLock(mem414); // a3
    if (!FtrGet('HW99', 11, (UInt32 *)&mem8202))
        pHWTrace = (char*)memPrefLock(mem8202); // d3
    // 如果是半屏模式, 则退出.
    if (!pPrefs->bHalfScrnInput) {// d4 = eventP
        if (pHWTrace[8194] && eventP->eType == firstUserEvent + 1) {
            WaitTime = pPrefs->RecogWaitTime * 10;
            // 如果识别等待时间已过, 就开始识别
            if (TimGetTicks() - pHWTrace[8194] > WaitTime) {
                UInt16 range = GetRecogRange(pPrefs);
                frm = FrmGetActiveForm(); // a4
                pHWTrace[pHWTrace[8192] << 2] = 0xff; // (FF,FF)表示字的结束
                pHWTrace[pHWTrace[8192] << 2 + 2] = 0xff;
                pHWTrace[8192]++;
                FtrGet('HW99', 14, &var_2e);
                winHandle = WinSetDrawWindow(WinGetDisplayWindow()); // a5
                WinRestoreBits(var_2e, 0, 0);
                WinSetDrawWindow(winHandle);
                if (pPrefs->bSplitScreen) {
                    pHWPens->index = 0;
                    if ((i = HWHalfScreenRecognize(pHWTrace, &pHWPens->Cands[pHWPens->index], 10, range)) > 0) { // d5
                        pHWPens->AssocNum = 0;
                        pHWPens->AssocOfs = 0;
                        j = 0; // d4
                    
                        do EnqueueInputKeys(frm, pHWPens, j++, 0);
                        while (j < i - 1);
                        EnqueueInputKeys(frm, pHWPens, i - 1, 1);
                    }
                }
                else if (HWFullScreenRecognize(pHWTrace, pHWPens->Cands[pHWPens->index], 10, range) > 0) {
                    pHWPens->AssocNum = 0;
                    pHWPens->AssocOfs = 0;
                    EnqueueInputKeys(frm, pHWPens, pHWPens->index, 1);
                    pPrefs->bRedrawMenu = true;
                }
                MemSet(pHWTrace, 0, 8202, 0);
                goto _exit;
            }
            else {
                if (eventP->eType == firstUserEvent + 1) {
                    EvtGetEvent (&event, evtWaitForever);
                    if (event.eType == nilEvent) {
                        event.eType = firstUserEvent + 1;
                        EvtAddEventToQueue(&event);
                    }
                    goto _exit;
                }
            }
        }
        
        if (eventP->eType == penDownEvent) {
            if (pPrefs->bSetting) {
                pPrefs->ShotcutPenDownX = eventP->screenX;
                pPrefs->ShotcutPenDownY = eventP->screenY;
            }
            else {
                if (eventP->screenX - pPrefs->ShotcutPenDownX >= 0)
                    DeltaX = eventP->screenX - pPrefs->ShotcutPenDownX;
                else
                    DeltaX = -(eventP->screenX - pPrefs->ShotcutPenDownX);
                if (DeltaX <= 15) {
                    if (eventP->screenY - pPrefs->ShotcutPenDownY >= 0)
                        DeltaY = eventP->screenY - pPrefs->ShotcutPenDownY;
                    else
                        DeltaY = -(eventP->screenY - pPrefs->ShotcutPenDownY);
                    if (DeltaY <= 15) {
                        pPrefs->bUsingShortcut = 1;
                        goto _exit;
                    }
                }
            }
        }
        else if (eventP->eType == penUpEvent) {
            if (pPrefs->bSetting) {
                if (pPrefs->ShotcutPenDownX != -1) {
                    ControlType *controlP;
                    frm = GetActiveForm();
                    controlP = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1058));
                    pPrefs->ShotcutPenUpX = eventP->screenX;
                    pPrefs->ShotcutPenUpY = eventP->screenY;
                    pPrefs->bSetting = false;
                    CtlSetLabel(controlP, "设置完成!");
                }
                goto _exit;
            }
            else if (pPrefs->bUsingShortcut) {
                frm = GetActiveForm();
                if (eventP->screenX - pPrefs->ShotcutPenUpX > 0)
                    DeltaX = eventP->screenX - pPrefs->ShotcutPenUpX;
                else
                    DeltaX = -(eventP->screenX - pPrefs->ShotcutPenUpX);
                if (DeltaX <= 15) {
                    if (eventP->screenY - pPrefs->ShotcutPenUpY > 0)
                        DeltaY = eventP->screenY - pPrefs->ShotcutPenUpY;
                    else
                        DeltaY = -(eventP->screenY - pPrefs->ShotcutPenUpY);
                    if (DeltaY <= 15) {
                        UInt16 focus;
                        if ((focus = FrmGetFocus(frm)) != -1) {
                            pPrefs->bOpenHW = !pPrefs->bOpenHW;
                            if (pPrefs->bOpenHW)
                                pPrefs->bRedrawMenu = true;
                            else {
                                ClearMenu(pPrefs->MenuMode);
                                RedrawCurForm();
                            }
                            pPrefs->bUsingShortcut = 0;
                            goto _exit;
                        }
                    }
                }
            }
        }
        if (pPrefs->bOpenHW) {
            if (pPrefs->bRedrawMenu) {
                RedrawMenu(pPrefs, pHWPens);
                pPrefs->bRedrawMenu = false;
            }
            if (pPrefs->Phase == ENTER) {
                MemSet(pHWPens, 414, 0);
                frm = FrmGetActiveForm();
                if (frm && GetCurField(frm)) {
                    pHWPens->InsPtPos = FldGetInsPtPosition(GetCurField(frm));
                    if (pPrefs->bMenuFolded)
                        pPrefs->MenuMode = FOLDED;
                    else
                        pPrefs->MenuMode = GetMenuMode();
                    pPrefs->bRedrawMenu = true;
                }
                else
                    pPrefs->MenuMode = HIDDEN;
                pPrefs->Phase = READY;
            }
            else if (pPrefs->Phase == LEAVE) {
                if (pPrefs->MenuMode != HIDDEN) {
                    frm = FrmGetActiveForm(); // a4
                    if (frm) {
                        winHandle = WinGetActiveWindow();
                        if (winHandle == FrmGetWindowHandle(frm) && frm->focus != -1)
                            FrmDrawForm(frm);
                    }
                }
                pPrefs->Phase = READY;
            }
            else if (pPrefs->Phase == CHGFLD) {
                frm = FrmGetActiveForm();
                if (InsPtEnabled()) {
                    AdjustCandIndex(frm, pHWPens);
                    if (pPrefs->bMenuFolded) {
                        pPrefs->MenuMode = FOLDED;
                        pPrefs->bRedrawMenu = false; // then goto 6684
                    }
                    else {
                        Int8 MenuMode = GetMenuMode();
                        if (pPrefs->MenuMode == HIDDEN) {
                            pPrefs->MenuMode = MenuMode;
                            pPrefs->bRedrawMenu = true;
                            // goto 6684
                        }
                        else if (pPrefs->MenuMode != MenuMode) {
                            ClearMenu(pPrefs->MenuMode);
                            frm = FrmGetActiveForm();
                            if (FrmGetFocus(frm) != -1) {
                                RedrawCurForm();
                                pPrefs->MenuMode = MenuMode;
                            }
                        } // goto 6684
                    }
                }
                else if (pPrefs->MenuMode != HIDDEN) {
                    frm = GetActiveForm();
                    ClearMenu(pPrefs->MenuMode);
                    if (FrmGetFocus(frm) != -1) {
                        RedrawCurForm();
                        pPrefs->MenuMode = HIDDEN;
                    }
                }
                pPrefs->Phase = READY; // 6684 here
            }
            switch (eventP->eType)
            {
            case winEnterEvent:
            case frmOpenEvent:
                pPrefs->Phase = ENTER;
                break;
            case winExitEvent:
                ClearMenu(pPrefs->MenuMode);
                pPrefs->Phase = LEAVE;
                break;
            case fldEnterEvent:
            case tblSelectEvent:
                pPrefs->Phase = CHGFLD;
                break;
            case fldChangedEvent:
            case frmUpdateEvent:
                pPrefs->bRedrawMenu = true;
                break;
            default:
                if (pPrefs->MenuMode != HIDDEN) {
                    switch (eventP->eType)
                    {
                    case penDownEvent:
                        if (pHWTrace[8200] == 0)
                            if (OnPenDown(eventP, pPrefs, pHWPens, pHWTrace))
                                goto _exit;
                        break;
                    case penUpEvent:
                        if (pHWTrace[8200] != 0)
                            pHWTrace[8200] = 0;
                        else if (pPrefs->bMouse == 0 && OnPenUp(eventP, pPrefs, pHWPens, pHWTrace))
                            goto _exit;
                        break;
                    case penMoveEvent:
                        if (pPrefs->bMouse == 0 && OnPenMove(eventP, pPrefs, pHWPens, pHWTrace))
                            goto _exit;
                    }
                }
            }
        }
    }
    MemHandleUnlock(memPref);
    MemHandleUnlock(mem414);
    MemHandleUnlock(mem8202);
    FtrGet('HW99', 13, (UInt32)&OrgSysHandleEvent);
    return OrgSysHandleEvent(eventP);
_exit:
    MemHandleUnlock(memPref);
    MemHandleUnlock(mem414);
    MemHandleUnlock(mem8202);
    return 1;
}
static Err RomVersionCompatible (UInt32 requiredVersion, UInt16 launchFlags)
{
    UInt32 romVersion;
    DmSearchStateType stateInfoP;
    UInt16 cardNo;
    LocalID dbID; 

    // See if we have at least the minimum required version of the ROM or later.
    FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion);
    if (romVersion < requiredVersion)
        {
        if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==
            (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))
            {
            FrmAlert (RomIncompatibleAlert);
        
            // Pilot 1.0 will continuously relaunch this app unless we switch to
            // another safe one.
            if (romVersion < version350)
                {
                DmGetNextDatabaseByTypeCreator(true, &stateInfoP, 'appl', 'pref', true, &cardNo, &dbID);
                if (!dbID)
                    ErrDisplayFileLineMsg("HWGBIMEMain.c", 551, "Could not find app");
                if (dbID && SysUIAppSwitch(cardNo, dbID, 0, 0))
                    ErrDisplayFileLineMsg("HWGBIMEMain.c", 551, "Could not launch app");
                //AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);
                }
            }
        
        return (sysErrRomIncompatib

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功