|
先ほどテストしてみたんですが、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;
}
---------------------------------------------------------------------
|
|