⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maingui.c

📁 MiniGUI源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
                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 + -