欢迎来到 嗅灵易学

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

continue (15千字)

continue (15千字)

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 (sysErrRomIncompatible);
        }
    return (0);
}
static void SetDefaultValues(void)
{
    MemHandle    memHandle;
    HW_PREF*    pPrefs;
    FormPtr frm;
    
    frm = FrmGetActiveForm(); // a2 = frm
    if (FtrGet('HW99', 10, (UInt32 *)&memHandle)) {
        FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1001), 0);
        return;
    }
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1001), 1);
    pPrefs = (HW_PREF*)MemHandleLock(memHandle); // a3 = ptr
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1008), (Int16)(pPrefs->flags & HW_NUMERIC));    //数字
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1010), (Int16)(pPrefs->flags & HW_ENGLISH));    //英文
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1012), (Int16)(pPrefs->flags & HW_SYMBOL));    //符号
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1011), (Int16)(pPrefs->flags & HW_SUBCOMMONCCHAR));    //次常用汉字
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1009), (Int16)(pPrefs->flags & HW_COMMONCCHAR));        //常用汉字
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1013), (Int16)(pPrefs->flags & HW_TRA2SIMPLIFIED));    //写繁得简
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1003), pPrefs->bSplitScreen);            //启动全屏分割
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1060), (Int16)(pPrefs->flags & HW_HALF2FULL));    //半角字符转成全角字符
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1061), (Int16)(pPrefs->flags & HW_UPPER2LOWER));    //大写字母转成小写字母
    FrmSetControlValue(frm, FrmGetObjectIndex(frm, 1062), (Int16)(pPrefs->flags & HW_LOWER2UPPER));    //小写字母转成大写字母
    FrmSetControlGroupSelection(frm, 3, (Int16)(pPrefs->PenColor + 1017));        //笔迹颜色选择
    FrmSetControlGroupSelection(frm, 4, (Int16)(pPrefs->RecogWaitTime + 1043));    //识别等待时间
    FrmSetControlGroupSelection(frm, 2, (Int16)(pPrefs->PenThickness + 1052));    //笔迹粗细
    CtlSetLabel(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1058)), "设置快捷方式");
    MemHandleUnlock(memHandle);
}
void DrawTabLines(void)
{
    int i;
    
    Coord x1 = 3;
    Coord y1 = 22;
    Coord x2, y2;
    WinHandle winHandle = WinGetDisplayWindow(); // a2 = winHandle
    WinSetDrawWindow(winHandle);
    for (i = 0; i < 4; i++) {
        x2 = x1;
        y2 = y1 - 15;
        WinDrawLine(x1, y1, x2, y2);
        y1 = y2;
        x2 += 4;
        y2 -= 4;
        WinDrawLine(x1, y1, x2, y2);
        x1 = x2;
        y1 = y2;
        x2 = x1 + 30;
        WinDrawLine(x1, y1, x2, y2);
        x1 = x2;
        x2 += 4;
        y2 += 4;
        WinDrawLine(x1, y1, x2, y2);
        x1 = x2;
        y1 = y2;
        y2 += 15;
        WinDrawLine(x1, y1, x2, y2);
    }
    y2 += 135;
    WinDrawLine(x1, y1, x1, y2);
    WinDrawLine(x1, y2, 3, y2);
    WinDrawLine(3, y2, 3, (Coord)(y2 - 135));
    WinDrawLine(41, y2, 3 + 4 * 38, y2);
}
void DrawActiveTab(int);
void DrawGroupFrame(Int16 left, Int16 top, Int16 right, Int16 bottom, char* title, Int16 i, Boolean b);
// 显示"设置"选项卡中的控件
void ShowSettingControls(void)
{
    FormPtr frm;
    MemHandle memHandle;
    
    frm = FrmGetActiveForm(); // a2 = frm
    DrawActiveTab(0);
    CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1001)));
    if (!FtrGet('HW99', 10, (UInt32 *)&memHandle)) {
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1004)), true); //"设置"选项卡
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1005)), true); //"笔迹"选项卡
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1006)), true); //"辅助"选项卡
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1007)), true); //"关于"选项卡
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1008))); //数字
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1009))); //常用汉字
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1010))); //英文
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1011))); //次常用汉字
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1012))); //符号
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1013))); //写繁得简
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1044))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1045))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1046))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1047))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1048))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1049))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1050))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1051))); //识别等待
        CtlShowControl(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1052))); //识别等待
        FrmShowObject(frm, FrmGetObjectIndex(frm, 1015)); //长
        FrmShowObject(frm, FrmGetObjectIndex(frm, 1016)); //短
        DrawGroupFrame(50, 8, 65, 140, "识别范围", 10, true); //"识别范围"框
        DrawGroupFrame(125, 8, 25, 140, "识别等待时间", 10, true); //"识别等待时间"框
    }
    else {
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1004)), false); //"设置"选项卡
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1005)), false); //"笔迹"选项卡
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1006)), false); //"辅助"选项卡
        CtlSetEnabled(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, 1007)), false); //"关于"选项卡
    }
}
static Boolean HW_HandleEvent(EventPtr event)
{
    FormPtr frm;
    Boolean handled = false;
    MemHandle    memHandle;
    HW_PREF* pPrefs;
    MemHandle    BitmapHandle;
    BitmapPtr    BitmapPtr;
    frm = FrmGetActiveForm (); // a3 = frm
    
    if (event->eType == frmOpenEvent) {
        BitmapHandle = DmGet1Resource(bitmapRsc, 0x44c); // a2 = MemHandle
        BitmapPtr = MemHandleLock(BitmapHandle); // a4
        WinPaintBitmap(BitmapPtr, 40, 10);
        MemHandleUnlock(BitmapHandle);
        DmReleaseResource(BitmapHandle);
        WinScreenLock(winLockCopy);
        SetDefaultValues();
        FrmDrawForm(frm);
        DrawTabLines();
        ShowSettingControls();
        WinScreenUnlock();
        handled =  true;
    }
    else if (event->eType == ctlSelectEvent) {
        switch (event->data.ctlSelect.controlID)
        {
        case 1001: //启动汉王手写输入法
            if (event->data.ctlSelect.on) {
                if (HW_Install()) return true;
                SetDefaultValues();
                ShowSettingControls();
                
                if (FtrGet('HW99', 10, (UInt32 *)&memHandle))
                    return true;
                pPrefs = (HW_PREF*)MemHandleLock(memHandle); // a3 = ptr
                pPrefs->bOpenHW = true;
                pPrefs->MenuMode = HIDDEN;
                MemHandleUnlock(memHandle);
            }
            else {
                HideSettingControls();
                HW_Uninstall();
            }
            handled = true;
            break;
        case 1004: //"设置"选项卡
            HidePenControls();
            HideAccessorialControls();
            HideAboutControls();
            ShowSettingControls();
            handled = true;
            break;
        case 1005: //"笔迹"选项卡
            HideSettingControls();
            HideAccessorialControls();
            HideAboutControls();
            ShowPenControls();
            handled = true;
            break;
        case 1006: //"辅助"选项卡
            HideSettingControls();
            HidePenControls();
            HideAboutControls();
            ShowAccessorialControls();
            handled = true;
            break;
        case 1007: //"关于"选项卡
            HideSettingControls();
            HidePenControls();
            HideAccessorialControls();
            ShowAboutControls();
            handled = true;
            break;
        case 1017: //笔迹颜色: 彩色
        case 1018: //笔迹颜色: 红色
        case 1019: //笔迹颜色: 绿色
        case 1020: //笔迹颜色: 棕色
        case 1021: //笔迹颜色: 黑色
        case 1022: //笔迹颜色: 蓝色
        case 1023: //笔迹颜色: 黄色
        case 1024: //笔迹颜色: 紫色
            handled = true;
            break;
        case 1058: //启动/关闭快捷方式设置
            handled = true;
            break;
        case 1061: //大写字母转成小写字母
            handled = true;
            break;
        case 1062: //小写字母转成大写字母
            handled = true;
            break;
        }
    }
    return (handled);
}
static Boolean ApplicationHandleEvent (EventPtr event)
{
    UInt16 formId;
    FormPtr frm;
    if (event->eType == frmLoadEvent)
        {
        // Load the form resource.
        formId = event->data.frmLoad.formID;
        frm = FrmInitForm (formId);
        FrmSetActiveForm (frm);        
        
        // Set the event handler for the form.  The handler of the currently
        // active form is called by FrmHandleEvent each time is receives an
        // event.
        if (formId == HW_MainForm)
            FrmSetEventHandler (frm, HW_HandleEvent);
        
        return (true);
        }
    return (false);
}
static void EventLoop (void)
{
    EventType event;
    do {
        EvtGetEvent (&event, evtWaitForever);
        if (! SysHandleEvent (&event))
        
                if (! ApplicationHandleEvent (&event))
    
                    FrmDispatchEvent (&event);
        
    } while (event.eType != appStopEvent);
}
// 加载汉字识别编码库
int LoadRecognitionDB()
{
    DmOpenRef dor;
    MemPtr* mp;
    MemPtr* ptr;
    UInt16 i;
    dor = DmOpenDatabaseByTypeCreator('GB68', 'HW99', dmModeReadOnly); // a3
    if (!dor) return -1;
    mp = (MemPtr*)MemPtrNew(86 * sizeof(void*)); // a4
    if (!mp) {
        DmCloseDatabase(dor);
        return -2;
    }
    ////////////////////////////////////////////////////////////////////////////////
    // Specify 0 to set the owner to the operating system.
    // When you allocate a parameter block to pass to SysUIAppSwitch or
    // SysAppLaunch, you must call MemPtrSetOwner or MemHandleSetOwner to grant
    // ownership of the parameter block chunk, and any other chunks referenced
    // in it, to the OS (your application is originally set as the owner).
    // If you don't change the ownership of the parameter block, it will get freed
    // before the application you're launching has a chance to use it.
    ////////////////////////////////////////////////////////////////////////////////
    MemPtrSetOwner(mp, 0);
    for (i = 0; i < 22; i++) // d3 = i, a6 = mp
        mp[i] = MemHandleLock(DmQueryRecord(dor, i));
    DmCloseDatabase(dor);
    for (i = 6, ptr = &mp[22]; i < 22; i++) {
        *ptr++ = mp[i];
        *ptr++ = (Int8*)mp[i] + 9757;
        *ptr++ = (Int8*)mp[i] + 19514;
        *ptr++ = (Int8*)mp[i] + 29271;
    }
    if (FtrSet('HW99', 1, (UInt32)mp)) {
        for (i = 0; i < 22; i++)
            MemPtrUnlock(mp[i]);
        MemChunkFree(mp);
        return -3;
    }
    return 0;
}
// 加载多元词组联想库
int LoadPhraseDB()
{
    DmOpenRef dor;
    MemHandle** mp;
    UInt16 i;
    // In Resource Database Header, there are type and creator fields holding
    // 4-byte signatures of the database type and creator as defined by the
    // application that created the database.
    dor = DmOpenDatabaseByTypeCreator('HMPR', 'HW99', dmModeReadOnly); // a3
    if (!dor) return -1;
    mp = (MemHandle**)MemPtrNew(4 * sizeof(void*)); // a4
    if (!mp) {
        DmCloseDatabase(dor);
        return -2;
    }
    MemPtrSetOwner(mp, 0);
    for (i = 0; i < 4; i++) // d3 = i, a6 = mp
        mp[i] = MemHandleLock(DmQueryRecord(dor, i));
    DmCloseDatabase(dor);
    if (FtrSet('HW99', 2, (UInt32)mp)) {
        for (i = 0; i < 4; i++)
            MemPtrUnlock(mp[i]);
        MemChunkFree(mp);
        return -3;
    }
    return 0;
}
// 安装汉王手写系统
int HW_Install(void)
{
    MemHandle memHandlePref, memHandle2, memHandle3;
    HW_PREF* pPref;
    void* mp2, *mp3;
    UInt16 sz = sizeof(HW_PREF);
    LocalID dbID;
    LoadRecognitionDB();    // 加载汉字识别编码库
    LoadPhraseDB();            // 加载多元词组联想库
    memHandlePref = MemHandleNew(sz);
    if (!memHandlePref) return 1;
    MemHandleSetOwner(memHandlePref, 0);
    memHandle2 = MemHandleNew(8202);
    if (!memHandle2) {
        MemHandleFree(memHandlePref);
        return 1;
    }
    MemHandleSetOwner(memHandle2, 0);
    memHandle3 = MemHandleNew(414);
    if (!memHandle3) {
        MemHandleFree(memHandlePref);
        MemHandleFree(memHandle2);
        return 1;
    }
    MemHandleSetOwner(memHandle3, 0);
    if (FtrSet('HW99', 10, (UInt32)memHandlePref) ||
        FtrSet('HW99', 11, (UInt32)memHandle2) ||
        FtrSet('HW99', 12, (UInt32)memHandle3))
    {
        MemHandleFree(memHandlePref);
        MemHandleFree(memHandle2);
        MemHandleFree(memHandle3);
        return 1;
    }
    pPref = (HW_PREF*)MemHandleLock(memHandlePref); // a2
    mp2 = MemHandleLock(memHandle3); // d4
    mp3 = MemHandleLock(memHandle2); // d5
    if (PrefGetAppPreferences('HW99', 0, pPref, &sz, true) == noPreferenceFound) {
        pPref->bInstallHW = true;
        pPref->flags = 3;
        pPref->RecogRange = HW_COMMONCCHAR; // 默认识别范围为: 常用汉字
        pPref->RecogWaitTime = 3;
        pPref->PenThickness = 2;
        pPref->PenColor = 0;
        pPref->ShotcutPenDownX = 0;
        pPref->ShotcutPenDownY = 0;
        pPref->ShotcutPenUpX = 0;
        pPref->ShotcutPenUpY = 0;
        pPref->bSetting = false;
        pPref->bUsingShortcut = false;
        pPref->bSplitScreen = false;
        pPref->bHalfToFull = false;
        pPref->bLowerToUpper = false;
        pPref->bUpperToLower = false;
        pPref->bOpenHW = true;
        pPref->bHalfScrnInput = false;
        pPref->bMouse = false;
        pPref->bRedrawMenu = false;
        pPref->Phase = READY;
        if (ChkReg() == 99)
            pPref->bReged = 0xff;
        else
            pPref->bReged = 0;
        pPref->MenuMode = HIDDEN;
        pPref->bMenuFolded = 1;
        PrefSetAppPreferences('HW99', 6, 0, pPref, sz, true);
    }
    else {
        if (ChkReg() == 99)
            pPref->bReged = 0xff;
        else
            pPref->bReged = 0;
    }
    MemSet(mp2, 414, 0);
    MemSet(mp3, 8202, 0);
    if (FtrSet('HW99', 13, (UInt32)SysGetTrapAddress(sysTrapSysHandleEvent)))
        return 1;
    SysSetTrapAddress(sysTrapSysHandleEvent, HW_SysHandleEvent);
    dbID = DmFindDatabase(0, "HWPenS-1"); // d4
    if (dbID) {
        SysNotifyRegister(
            0,        // cardNo of the storage card on which the app code resource resides.
            dbID,    // Local ID of the application or code resource
            'sync', // The notification that the application wants to receive
            NULL,    // Set to NULL to receive the notification as an app launch code.
            sysNotifyNormalPriority,
            0        // userDataP Caller-defined data to pass to the notification handler
        );
    }
    MemHandleUnlock(memHandlePref);
    MemHandleUnlock(memHandle2);
    MemHandleUnlock(memHandle3);
    FtrSet('HW99', 24, 0);
    return 0;
}
int UnloadRecognitionDB(void)
{
    void** mp;
    int i;
    if (FtrGet('HW99', 1, (UInt32*)&mp) || !mp)
        return -1;
    for (i = 0; i < 22; i++)
        MemPtrUnlock(mp[i]);
    MemChunkFree(mp);
    FtrUnregister('HW99', 1);
    return 0;
}
int UnloadPhraseDB(void)
{
    void** mp;
    int i;
    if (FtrGet('HW99', 2, (UInt32*)&mp) || !mp)
        return -1;
    for (i = 0; i < 4; i++)
        MemPtrUnlock(mp[i]);
    MemChunkFree(mp);
    FtrUnregister('HW99', 2);
    return 0;
}

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

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

0 0 0 举报
复制成功