📄 maingui.c
字号:
TRUE,
(pPopupMenuItem + iCur)->fItemFlags,
x, CP_HEIGHT,
iWidth);
}
if(iCur >= 0)
{
SBData.lpStr = (LPSTR)((pPopupMenuItem + iCur)->spPromptInfo);
SetStatusBarInfo( 0, &SBData );
}
else
SetStatusBarInfo( 0, NULL );
SetPtrVis(SHOW);
}
/*
* Function: int GUIAPI TrackPopupMenu(PPOPUPMENUITEM pPopupMenuItem, int iIndex, int x, int y, PPOINT pPt)
* Parameters:
* Return:
* None;
*/
int GUIAPI TrackPopupMenu(PPOPUPMENUITEM pPopupMenuItem, int iIndex, int x, int y, PPOINT pPt)
{
unsigned uKey; // unsigned key code
int iPrev; // Previous index
int iCur; // Current index
EVENT meEvent;
static BOOL fBtnDown = FALSE;
static BOOL fBtnDownA = FALSE;
PNORMALMENUITEM pBuffer;
int iID;
BOOL fReturn = FALSE;
int iWidth;
int iHeight;
char achHilite[MAXITEM];
char* pchT; // Temporary character pointer
_vmhnd_t hdlImage;
pBuffer = (pPopupMenuItem + iIndex)->pNormalMenuItem;
iWidth = GetPopupMenuWidth(pPopupMenuItem + iIndex);
iHeight = GetPopupMenuHeight(pPopupMenuItem + iIndex);
CreateHiliteStringOfPopupMenu(pBuffer, achHilite);
hdlImage = SaveImageUseVirtualMem(x - 1, y - 1, iWidth + 3, iHeight + 3);
// Draw popup menu.
DrawPopupMenu(pPopupMenuItem + iIndex, x, y);
iPrev = -1;
iCur = 0;
GetKey(CLEAR);
while( TRUE )
{
// Redisplay current and previous if we get here through arrow
// move or drag.
if(iPrev != iCur)
{
RedrawNormalMenuItem(pBuffer, iPrev, iCur, x, y, iWidth);
iPrev = iCur;
if(iCur < 0)
{
STATUSBARDATA SBData;
SetPtrVis(HIDE);
SBData.fgcolor = 0;
SBData.lpStr = (LPSTR)((pPopupMenuItem + iIndex)->spPromptInfo);
SetStatusBarInfo( 0, &SBData );
SetPtrVis(SHOW);
}
}
if( uKey = GetKey( NO_WAIT ) )
{
switch( uKey )
{
case KB_UP: // Up key
iCur = GetPreviousNormalMenuItem(pBuffer, iCur);
break;
case KB_DOWN: // Down key
iCur = GetNextNormalMenuItem(pBuffer, iCur);
break;
case KB_RIGHT: // Right key
iID = NEXTPOPUPMENU;
fReturn = TRUE;
break;
case KB_LEFT: // Left key
iID = PREVIOUSPOPUPMENU;
fReturn = TRUE;
break;
case KB_ESC:
iID = NULLCHOICE;
fReturn = TRUE;
break;
case KB_ALT:
iID = ENDTRACKMENU;
fReturn = TRUE;
break;
case KB_ENTER:
if((pBuffer+iCur)->fItemFlags & MF_DISABLED)
iID = INVALIDCHOICE;
else
iID = (pBuffer+iCur)->iMenuID;
fReturn = TRUE;
break;
default:
if( uKey > 256 ) // Ignore unknown function key
continue;
pchT = strchr( achHilite, (char)tolower( uKey ) );
if( pchT != NULL ) // If in highlight string, evaluate
{
iCur = pchT - achHilite;// and fall through
if((pBuffer+iCur)->fItemFlags & MF_DISABLED)
iID = INVALIDCHOICE;
else
iID = (pBuffer+iCur)->iMenuID;
fReturn = TRUE;
}
else
continue; // Ignore unkown ASCII key
break;
}
}
else if( GetMouseEvent( &meEvent ) )
{
pPt->x = meEvent.hotx;
pPt->y = meEvent.hoty;
// If mouse is on the menu, respond to various events.
if( (pPt->x >= x) && (pPt->x < (x + iWidth))
&&(pPt->y >= y) && (pPt->y < (y + iHeight)) )
{
// If button is down, drag selection.
if( meEvent.fsBtn & LEFT_DOWN )
{
fBtnDown = TRUE;
iCur = WhichItemMouseIn(pBuffer, y, pPt->y);
}
// If button goes up from down, select current.
else if( fBtnDown && !(meEvent.fsBtn & LEFT_DOWN) )
{
fBtnDown = FALSE;
iCur = WhichItemMouseIn(pBuffer, y, pPt->y);
if((pBuffer+iCur)->fItemFlags & MF_DISABLED || iCur < 0)
iCur = 0;
else
{
iID = (pBuffer+iCur)->iMenuID;
fReturn = TRUE;
}
}
// Ignore if no button has been pushed.
else
continue;
}
else
{
int lx = GetPositionOfPopupMenuItem(pPopupMenuItem, iIndex);
int rx = lx + GetOutWidth((pPopupMenuItem + iIndex)->spItemText);
rx += MP_START_WIDTH + MP_END_WIDTH;
if( meEvent.fsBtn & LEFT_DOWN )
{
fBtnDownA = TRUE;
if((pPt->x >= lx) && (pPt->x < rx)
&& (pPt->y >= CP_HEIGHT) && (pPt->y < y) )
iCur = -1;
else if((pPt->y < y) && (pPt->y >= CP_HEIGHT))
{
iID = MOUSEDETERMINE;
fReturn = TRUE;
}
else
iCur = -1;
}
// If button goes up from down
else if( fBtnDownA && !(meEvent.fsBtn & LEFT_DOWN) )
{
fBtnDownA = FALSE;
if((pPt->x >= lx) && (pPt->x < rx)
&& (pPt->y >= CP_HEIGHT) && (pPt->y < y) )
iCur = 0;
else
{
iID = INVALIDCHOICE;
fReturn = TRUE;
}
}
else
continue;
}
}
else
continue;
if(fReturn)
break;
}
if(hdlImage != _VM_NULL)
RestoreImageUseVirtualMem(hdlImage, x - 1, y - 1);
return iID;
}
/*
* Function: static void RedrawNormalMenuItem(PNORMALMENUITEM pNormalMenuItem, int iPrev, int iCur, int x, int y, int iWidth)
* Parameters:
* Return:
* None;
*/
static void RedrawNormalMenuItem(PNORMALMENUITEM pNormalMenuItem, int iPrev, int iCur, int x, int y, int iWidth)
{
int iPos;
STATUSBARDATA SBData;
SBData.fgcolor = 0;
SetPtrVis(HIDE);
if( iPrev >= 0)
{
iPos = GetPositionOfNormalMenuItem(pNormalMenuItem, iPrev, y);
DrawMenuItem((pNormalMenuItem + iPrev)->spItemText, FALSE, (pNormalMenuItem + iPrev)->fItemFlags, x, iPos, iWidth);
}
if( iCur >= 0)
{
iPos = GetPositionOfNormalMenuItem(pNormalMenuItem, iCur, y);
DrawMenuItem((pNormalMenuItem + iCur)->spItemText, TRUE, (pNormalMenuItem + iCur)->fItemFlags, x, iPos, iWidth);
}
if(iCur >= 0)
{
SBData.lpStr = (LPSTR)((pNormalMenuItem + iCur)->spPromptInfo);
SetStatusBarInfo( 0, &SBData );
}
SetPtrVis(SHOW);
}
/*
* Function: static viod CreateHiliteStringOfPopupMenu(PNORMALMENUITEM pNormalMenuItem, char* achHilite)
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static void CreateHiliteStringOfPopupMenu(PNORMALMENUITEM pNormalMenuItem, char* achHilite)
{
int i = 0;
PNORMALMENUITEM pBuffer = pNormalMenuItem;
do
{
if(pBuffer->fItemFlags & MF_MENUBREAK)
*(achHilite + i) = '\v';
else
*(achHilite + i) = GetHiliteAscii(pBuffer->spItemText);
if(pBuffer->fItemFlags & MF_END)
break;
pBuffer++;
i++;
}while(TRUE);
*(achHilite + i + 1) = '\0';
}
/*
* Function: static viod CreateHiliteStringOfMenuBar(PPOPUPMENUITEM pPopupMenuItem, char* achHilite)
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static void CreateHiliteStringOfMenuBar(PPOPUPMENUITEM pPopupMenuItem, char* achHilite)
{
int i = 0;
PPOPUPMENUITEM pBuffer = pPopupMenuItem;
do
{
if(pBuffer->fItemFlags & MF_MENUBARBREAK)
*(achHilite + i) = '\v';
else
*(achHilite + i) = GetHiliteAscii(pBuffer->spItemText);
if(pBuffer->fItemFlags & MF_END)
break;
pBuffer++;
i++;
}while(TRUE);
*(achHilite + i + 1) = '\0';
}
/*
* Function: static char GetHiliteAscii(PSTR pStr)
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static char GetHiliteAscii(PSTR pStr)
{
int i = 0;
char cBuff;
do
{
if(*(pStr + i) == '(')
{
cBuff = *(pStr + i + 1);
return tolower(cBuff);
}
if(*(pStr + i) == '\0')
return '\0';
i++;
}while(TRUE);
}
/*
* Function: static int GetPositionOfPopupMenuItem(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
* Parameters:
* Return:
* x;
*
* 1995.8.9.AM.
*
*/
static int GetPositionOfPopupMenuItem(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
{
int i = 0;
int x = MB_START_WIDTH;
PPOPUPMENUITEM pBuffer = pPopupMenuItem;
do
{
if(i == iIndex)
break;
if(pBuffer->fItemFlags & MF_END)
break;
if(pBuffer->fItemFlags & MF_MENUBARBREAK)
x += MB_WIDTH;
else
{
x += MP_START_WIDTH;
x += GetOutWidth(pBuffer->spItemText);
x += MP_END_WIDTH;
}
pBuffer++;
i++;
}while(TRUE);
return x;
}
/*
* Function: static int GetPositionOfNormalMenuItem(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
* Parameters:
* Return:
* y
*
* 1995.8.9.AM.
*
*/
static int GetPositionOfNormalMenuItem(PNORMALMENUITEM pNormalMenuItem, int iIndex, int y)
{
int i = 0;
PNORMALMENUITEM pBuffer = pNormalMenuItem;
do
{
if(i == iIndex)
break;
if(pBuffer->fItemFlags & MF_END)
break;
if(pBuffer->fItemFlags & MF_MENUBREAK)
y += MB_HEIGHT*2 + 1;
else
y += MN_HEIGHT;
pBuffer++;
i++;
}while(TRUE);
return y;
}
/*
* Function: static int GetNextPopupMenu(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static int GetNextPopupMenu(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
{
int iNum;
iNum = GetNumOfPopupMenuItem(pPopupMenuItem);
iIndex ++;
if(iIndex == iNum)
iIndex = 0;
if((pPopupMenuItem + iIndex)->fItemFlags & MF_MENUBARBREAK)
iIndex = GetNextPopupMenu(pPopupMenuItem, iIndex);
return iIndex;
}
/*
* Function: static int GetPreviousPopupMenu(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static int GetPreviousPopupMenu(PPOPUPMENUITEM pPopupMenuItem, int iIndex)
{
int iNum;
iNum = GetNumOfPopupMenuItem(pPopupMenuItem);
if(iIndex == 0)
iIndex = iNum;
iIndex--;
if((pPopupMenuItem + iIndex)->fItemFlags & MF_MENUBARBREAK)
iIndex = GetPreviousPopupMenu(pPopupMenuItem, iIndex);
return iIndex;
}
/*
* Function: static int GetNumOfPopupMenuItem(PPOPUPMENUITEM pPopupMenuItem);
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static int GetNumOfPopupMenuItem(PPOPUPMENUITEM pPopupMenuItem)
{
int iNum = 0;
PPOPUPMENUITEM pBuffer = pPopupMenuItem;
do
{
iNum++;
if(pBuffer->fItemFlags & MF_END)
break;
pBuffer++;
}while(TRUE);
return iNum;
}
/*
* Function: static int GetNextNormalMenuItem(PNORMALMENUITEM pNormalMenuItem, int iIndex)
* Parameters:
* Return:
* None;
*
* 1995.8.9.AM.
*
*/
static int GetNextNormalMenuItem(PNORMALMENUITEM pNormalMenuItem, int iIndex)
{
int iNum;
iNum = GetNumOfNormalMenuItem(pNormalMenuItem);
iIndex ++;
if(iIndex == iNum)
iIndex = 0;
if((pNormalMenuItem + iIndex)->fItemFlags & MF_MENUBREAK)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -