01214 98/10/05 11:13 RE:01210 スクリプトのaddmenuで..?
投稿者 : 秀まるお   コメントを投稿する

 最近、マシンのマザーボード入れ替えとかやってる関係で、実はまだWindows98の
マシンがちゃんと動いてません(今、横でセットアップ中です)

 動きしだいテストしますので…。(他にもテスト項目が溜まってることだし)

 あ、僕のマシンはついにPentium II 300MHzになってしまいました。


01215 98/10/05 12:21 RE:01210 スクリプトのaddmenuで..?
投稿者 : 秀まるお   コメントを投稿する

 先ほどテストしてみたんですが、Windows98で、メニュー数を500にしても正常に動
作してしまいました。

 おかしいのはよこしまさんのマシンだけじゃなくて他の所でも同じなんでしょか?。
だとすると、どうしましょ?

 とりあえずソースコードを載せてしまいます。ScriptAddMenu()とScriptShowMenu
()がスクリプトに対応して呼ばれる関数です。

---------------------------------------------------------------------
static HMENU    hmenuScript;
static int  cMenu;
static int  iMenuNumber;
static int  cyMenu;
static int  id = CMD_SCRIPTMENU;

static void CreateScriptMenu( void ) {
    if( hmenuScript == NULL ) {
        hmenuScript = CreatePopupMenu();
    }
}

static void AddSeparator( void ) {
    CreateScriptMenu();
    AppendMenu( hmenuScript, MF_SEPARATOR, 0, szNone );
    cyMenu += GetSystemMetrics( SM_CYMENU ) / 2;
    cMenu ++;
}

static void AddMenuItem( char* psz ) {
    CreateScriptMenu();
    if( *psz != '\0' ) {
        AppendMenu( hmenuScript, MF_STRING, id, psz );
        cyMenu += GetSystemMetrics( SM_CYMENU );
        if( cyMenu > cyScreen - 50 ) {
            AppendMenu( hmenuScript, MF_MENUBARBREAK, 0, szNone );
            cyMenu = 0;
        }
    }
    id ++;
    cMenu ++;
    iMenuNumber ++;
}

static void ShowMenu( void ) {
    pos.value = -1;
    if( hmenuScript != NULL ) {
        if( cMenu != 0 ) {
            SetForegroundWindow( hwndFrame );
            RECT    rc;
            GetWindowRect( hwndFrame, &rc );
            pos.fSleeping = TRUE;
            pos.timeout = 0;
            POINT   pt;
            if( fOnline ) {
                GetCaretPos( &pt );
                ClientToScreen( GetFocus(), &pt );
            } else {
                pt.x = (rc.right + rc.left) / 2;
                pt.y = (rc.bottom + rc.top) / 2;
            }
            fSelectPopupMenu = TRUE;
            DebugPrint( "TrackPopupMenu\n" );
            int cmd = TrackPopupMenu( hmenuScript
                , TPM_CENTERALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD
                , pt.x, pt.y, 0, hwndFrame, NULL );
            pos.fSleeping = FALSE;
            timeLoopCheck = GetTickCount();
            if( cmd != 0 ) {
                pos.value = cmd - CMD_SCRIPTMENU;
            }
        }
        DestroyMenu( hmenuScript );
        hmenuScript = NULL;
        id = CMD_SCRIPTMENU;
        cyMenu = 0;
        cMenu = 0;
        iMenuNumber = 0;
    }
}

static BOOL ScriptMenuSub( BOOL fNumber ) {
    while( (SCRIPTATOM)*(pos.pbCur) != SCR_LINENO ) {
        while( (SCRIPTATOM)*(pos.pbCur) == F_COMMA ) {
            pos.pbCur ++;
        }
        if( !pos.GetValue() ) {
            ParamError( SCR_MENU );
            return FALSE;
        }
        if( pos.szToken[0] != '\0' ) {
            if( pos.fNum && pos.num == 0 ) {
                AddSeparator();
            } else {
                if( fNumber ) {
                    szVarValue[0] = '&';
                    szVarValue[1] = (char)(iMenuNumber + '1');
                    if( szVarValue[1] > '9' ) {
                        szVarValue[1] = (char)(szVarValue[1]-'9'+'A'-1);
                    }
                    szVarValue[2] = '\t';
                    strcpy( szVarValue + 3, pos.szToken );
                    AddMenuItem( szVarValue );
                } else {
                    AddMenuItem( pos.szToken );
                }
            }
        }
    }
    ShowMenu();
    if( pos.value == -1 ) {
        pos.timeout = 1;
        pos.fSleeping = TRUE;
        StartTimer();
        client.SetPortAccessFast();
        return FALSE;                   // millisleep 1を実行したのと同じ
    }
    return TRUE;
}

static BOOL ScriptMenu( void ) {
    return ScriptMenuSub( FALSE );
}

static BOOL ScriptNumberMenu( void ) {
    return ScriptMenuSub( TRUE );
}

static BOOL ScriptAddMenuSub( BOOL fNumber ) {
    if( !pos.GetValue() ) {
        ParamError( SCR_ADDMENU );
        return FALSE;
    }
    if( pos.szToken[0] != '\0' ) {
        if( pos.fNum && pos.num == 0 ) {
            AddSeparator();
        } else {
            if( fNumber ) {
                szVarValue[0] = '&';
                szVarValue[1] = (char)(iMenuNumber + '1');
                if( szVarValue[1] > '9' ) {
                    szVarValue[1] = (char)(szVarValue[1] - '9' + 'A' - 1);
                }
                szVarValue[2] = '\t';
                strcpy( szVarValue + 3, pos.szToken );
                AddMenuItem( szVarValue );
            } else {
                AddMenuItem( pos.szToken );
            }
        }
    }
    return TRUE;
}

static BOOL ScriptAddMenu( void ) {
    return ScriptAddMenuSub( FALSE );
}

static BOOL ScriptAddNumberMenu( void ) {
    return ScriptAddMenuSub( TRUE );
}

static BOOL ScriptShowMenu( void ) {
    ShowMenu();
    return TRUE;
}

---------------------------------------------------------------------


01216 98/10/05 20:56 RE:01215 スクリプトのaddmenuで..?
投稿者 : よこしま   コメントを投稿する

こんにちは, 秀まるおさん.

(あ, いつのまにか↑元に戻ってる!)


> 先ほどテストしてみたんですが、Windows98で、メニュー数を500にしても正常に動
>作してしまいました。
>
> おかしいのはよこしまさんのマシンだけじゃなくて他の所でも同じなんでしょ
か?。
>だとすると、どうしましょ?

うーむ, そうするとこちらの環境の問題でしょうか...?
結構安定して動いているようなきがするんですけど....

Visual Basic 5.0 SP3 をインストールしているせいとか...?
Delphi インストールしているせいとか...?
一太郎9インストールしたせいとか.....?

再現できないのでしたらなんともなりませんね(;;)

こちらでも引き続き調べてみます.

P.S. もう4回ぐらい Windows98をセットアップし直してるのですが,
その度に動作が違うのはなんででしょうねぇ...


よこしま

Send 98/10/05


新規に投稿する