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

📄 dialog.c

📁 这是早期MiniGUI DOS版本的最终版
💻 C
📖 第 1 页 / 共 5 页
字号:
    }
    else
        hdlImage = SaveImageUseVirtualMem(
                            pDlgHeader->lx, 
                            pDlgHeader->ty,
                            pDlgHeader->rx - pDlgHeader->lx, 
                            pDlgHeader->by - pDlgHeader->ty);

    CtrlIndex = 0;
    fAlreadyUp = TRUE;
    
    if(!StartDialog(pDlgHeader))
    {
        SetPtrVis(SHOW);
        return FALSE;
    }
    DrawBox(pDlgHeader->lx, pDlgHeader->ty, pDlgHeader->rx, pDlgHeader->by);
    (*DlgProc)(pDlgHeader, INITDIALOG, (WORD)NULL, (LONG)lpStr);
    CreateDialog(pDlgHeader, DlgProc);
    SetPtrVis(SHOW);
    
    if( CLOSE == (*DlgProc)(pDlgHeader, INITIALIZED, 0, 0L))
        goto enddlg;
    
    Msg.uMsg = SETFOCUS;
    Msg.pStr = (PSTR)(GetNextTabstop(pDlgHeader, pDlgHeader->pCtrlData));
    
    GetKey(CLEAR);
    do
    {
        if( Msg.uMsg == SETFOCUS 
                || Msg.uMsg == FOCUSCOMMAND 
                || Msg.uMsg == COMMAND
                || Msg.uMsg == CANCEL) 
        {
            SetFocus(((PCTRLDATA)Msg.pStr));
            if(((PCTRLDATA)Msg.pStr)->bClass == EDIT)
                ProcEdit(pDlgHeader, ((PCTRLDATA)Msg.pStr), &Msg);
            else if(((PCTRLDATA)Msg.pStr)->bClass == LISTBOX)
                ProcListBox(pDlgHeader, ((PCTRLDATA)Msg.pStr), &Msg);
            else
            {
                do
                {
                    GetMessage(&Msg);
                }while(Msg.uMsg == NULLINPUT);
                TranslateBoxMsg(TRUE, pDlgHeader, &Msg);
            }
        }
        else
        {
            do
            {
                GetMessage(&Msg);
            }while(Msg.uMsg == NULLINPUT);
            TranslateBoxMsg(TRUE, pDlgHeader, &Msg);
        }
        
        switch(Msg.uMsg)
        {
            case NEXTTAB:
                Msg.uMsg = SETFOCUS;
                Msg.pStr = (PSTR)GetNextTabstop(pDlgHeader, ((PCTRLDATA)Msg.pStr));
                if(((PCTRLDATA)Msg.pStr)->lStyle & WS_GROUP)
                {
                    PCTRLDATA pCtrlBuff;
                    pCtrlBuff = ((PCTRLDATA)Msg.pStr);
                    
                    while(TRUE)
                    {   
                        pCtrlBuff = GetNextItemInGroup(pDlgHeader, pCtrlBuff);
                        
                        if( pCtrlBuff->lStyle & WS_CHECKED)
                            break;
                        if( pCtrlBuff == ((PCTRLDATA)Msg.pStr) )
                            break;
                    }
                    Msg.pStr = (PSTR)pCtrlBuff;
                }
            break;
            
            case LASTTAB:
                Msg.uMsg = SETFOCUS;
                if(!(((PCTRLDATA)Msg.pStr)->lStyle & WS_TABSTOP))
                    Msg.pStr = (PSTR)GetLastTabstop(pDlgHeader, ((PCTRLDATA)Msg.pStr));
                Msg.pStr = (PSTR)GetLastTabstop(pDlgHeader, ((PCTRLDATA)Msg.pStr));
                if(((PCTRLDATA)Msg.pStr)->lStyle & WS_GROUP)
                {
                    PCTRLDATA pCtrlBuff;
                    pCtrlBuff = ((PCTRLDATA)Msg.pStr);
                    
                    while(TRUE)
                    {   
                        pCtrlBuff = GetLastItemInGroup(pDlgHeader, pCtrlBuff);
                        
                        if( pCtrlBuff->lStyle & WS_CHECKED)
                            break;
                        if( pCtrlBuff == ((PCTRLDATA)Msg.pStr) )
                            break;
                    }
                    Msg.pStr = (PSTR)pCtrlBuff;
                }
            break;
            
            case NEXTGROUP:
                Msg.uMsg = FOCUSCOMMAND;
                do
                {
                    Msg.pStr = (PSTR)GetNextItemInGroup(pDlgHeader, ((PCTRLDATA)Msg.pStr));
                }while(((PCTRLDATA)Msg.pStr)->lStyle & WS_DISABLED);
                CheckCtrl(pDlgHeader, ((PCTRLDATA)Msg.pStr));
            break;
            
            case LASTGROUP:
                Msg.uMsg = FOCUSCOMMAND;
                do
                {
                    Msg.pStr = (PSTR)GetLastItemInGroup(pDlgHeader, ((PCTRLDATA)Msg.pStr));
                }while(((PCTRLDATA)Msg.pStr)->lStyle & WS_DISABLED);
                CheckCtrl(pDlgHeader, ((PCTRLDATA)Msg.pStr));
            break;
            
            case CANCEL:
                if(HaveCancelButton(pDlgHeader))
                {
                    Msg.uMsg = COMMAND;
                    Msg.pStr = (PSTR)GetControlData(pDlgHeader, IDCANCEL);
                }
                else
                    break;
            break;
            
            case CHECK:
                Msg.uMsg = COMMAND;
                if(((((PCTRLDATA)Msg.pStr)->lStyle & 0x0000000fL) == BS_PUSHBUTTON) &&
                    (((PCTRLDATA)Msg.pStr)->bClass == BUTTON))
                {
                    PushButton(((PCTRLDATA)Msg.pStr), TRUE);
                    Sleep(100);
                    PushButton(((PCTRLDATA)Msg.pStr), FALSE);
                }
                else
                    CheckCtrl(pDlgHeader, ((PCTRLDATA)Msg.pStr));
            break;
            
            case OK:
                Msg.uMsg = COMMAND;
                if(((((PCTRLDATA)Msg.pStr)->lStyle & 0x0000000fL) == BS_PUSHBUTTON) &&
                    (((PCTRLDATA)Msg.pStr)->bClass == BUTTON))
                {
                    PushButton(((PCTRLDATA)Msg.pStr), TRUE);
                    Sleep(100);
                    PushButton(((PCTRLDATA)Msg.pStr), FALSE);
                }
                else
                {
                    Msg.pStr = (PSTR)GetControlData(pDlgHeader, IDOK);
                    SetFocus(((PCTRLDATA)Msg.pStr));
                }
                break;
                
            case BEEP:
                Msg.uMsg = NONE;
                Beep(700, 50);
                break;
                
            case MOUSEFOCUS:
                Msg.uMsg = SETFOCUS;
                if(((((PCTRLDATA)Msg.pStr)->lStyle & 0x0000000fL) == BS_PUSHBUTTON) &&
                    (((PCTRLDATA)Msg.pStr)->bClass == BUTTON))
                    PushButton(((PCTRLDATA)Msg.pStr), TRUE);
                break;
                
            case MOUSECHECK:
                if(((((PCTRLDATA)Msg.pStr)->lStyle & 0x0000000fL) == BS_PUSHBUTTON) &&
                    (((PCTRLDATA)Msg.pStr)->bClass == BUTTON))
                    PushButton(((PCTRLDATA)Msg.pStr), FALSE);
                if(Msg.wParam)
                {
                    if(((PCTRLDATA)Msg.pStr)->lStyle & WS_DISABLED)
                    {
                        Msg.uMsg = NONE;
                        break;
                    }
                    Msg.uMsg = COMMAND;
                    CheckCtrl(pDlgHeader, ((PCTRLDATA)Msg.pStr));
                }
                else
                    Msg.uMsg = NONE;
                break;
                
            case FOCUSCOMMAND:
            case COMMAND:
                break;
                
            default:
                Msg.uMsg = NONE;
                break;
        }
        
        if(Msg.pStr == NULL)
            continue;

        if( CLOSE == (*DlgProc)(pDlgHeader, Msg.uMsg, ((PCTRLDATA)Msg.pStr)->wID, (LONG)NULL))
            break;
            
    }while(TRUE);

enddlg:
    SetFocus(NULL);
    EndDialog(pDlgHeader);
    
    SetPtrVis(HIDE);
    if(pGUIInfo)
    {
        RECT rect;
        
        rect.left   = pDlgHeader->lx;
        rect.top    = pDlgHeader->ty;
        rect.right  = pDlgHeader->rx;
        rect.bottom = pDlgHeader->by;

        SendMessage(pGUIInfo, MSG_ERASEBKGND, (WPARAM)(&rect), 0L);

        PostMessage(pGUIInfo, MSG_SETFOCUS, 0, 0L);
    }
    else if(hdlImage != _VM_NULL)
        RestoreImageUseVirtualMem(hdlImage, pDlgHeader->lx, pDlgHeader->ty);

    SetPtrVis(SHOW);
    
    return TRUE;
}

/*
 * Function: static BOOL StartDialog( PDLGHEADER pDlgHeader );
 *      This function draw dialog box. This is a common function.
 * Parameters:
 *      pDlgHeader: a pointer to DLGHEADER struct;
 * Return: 
 *      success----TRUE;
 *      failure----FALSE.
 */
static BOOL StartDialog( PDLGHEADER pDlgHeader )
{
    int i;
    
    for(i=0; i<pDlgHeader->NumOfItems; i++)
    {
        // Allocate memory for special controls.
        switch((pDlgHeader->pCtrlData + i)->bClass)
        {
            case LISTBOX:
            {
                LPLISTBOXBUFF lpBuff;
                
                lpBuff = (LPLISTBOXBUFF)_fmalloc(sizeof(LISTBOXBUFF));
                if(lpBuff == NULL)
                    return FALSE;
                else
                {
                    lpBuff->iWndOffset = 0;
                    lpBuff->iCurSel = -1;
                    lpBuff->iCount = 0;
                    lpBuff->pHead = NULL;
                    (pDlgHeader->pCtrlData + i)->slpAdd = (LPSTR)lpBuff;
                }
                break;
            }
            case EDIT:
            {
                LPEDITBUFF lpBuff;
                
                lpBuff = (LPEDITBUFF)_fmalloc(sizeof(EDITBUFF));
                if(lpBuff == NULL)
                    return FALSE;
                else
                {
                    _fmemset(lpBuff, 0, sizeof(EDITBUFF));
                    (pDlgHeader->pCtrlData + i)->slpAdd = (LPSTR)lpBuff;
                }
                break;
            }
            default:
                break;
        }
    }
}

/*
 * Function: void GUIAPI EndDialog( PDLGHEADER pDlgHeader );
 *      This function draw dialog box. This is a common function.
 * Parameters:
 *      pDlgHeader: a pointer to DLGHEADER struct;
 * Return: 
 *      success----TRUE;
 *      failure----FALSE.
 */
static void EndDialog( PDLGHEADER pDlgHeader )
{
    int i;
    
    for(i=0; i<pDlgHeader->NumOfItems; i++)
    {
        if((pDlgHeader->pCtrlData + i)->bClass == LISTBOX)
        {
            ReleaseListBoxBuff(pDlgHeader->pCtrlData + i);
            _ffree((pDlgHeader->pCtrlData + i)->slpAdd);
        }
        else if((pDlgHeader->pCtrlData + i)->bClass == EDIT)
            _ffree((pDlgHeader->pCtrlData + i)->slpAdd);
    }
}

/*
 * Function: BOOL GUIAPI CreateDialog( PDLGHEADER pDlgHeader, int (FAR *DlgProc)());
 *      This function draw dialog box. This is a common function.
 * Parameters:
 *      pDlgHeader: a pointer to DLGHEADER struct;
 *      DlgProc   : a pointer to dialog callback function.
 * Return: 
 *      success----TRUE;
 *      failure----FALSE.
 */
static BOOL CreateDialog( PDLGHEADER pDlgHeader, int (FAR *DlgProc)() )
{
    int i;
    
    for(i=0; i<pDlgHeader->NumOfItems; i++)
    {
        if((*DlgProc)(pDlgHeader, DRAWCTRL, (pDlgHeader->pCtrlData + i)->wID, (LPSTR)(pDlgHeader->pCtrlData + i)) == OWNER)
            continue;
    
        DrawCtrl((pDlgHeader->pCtrlData + i)->bClass,
                 (pDlgHeader->pCtrlData + i)->lStyle,
                 (pDlgHeader->pCtrlData + i)->lx,
                 (pDlgHeader->pCtrlData + i)->ty,
                 (pDlgHeader->pCtrlData + i)->rx,
                 (pDlgHeader->pCtrlData + i)->by);
    }
    
    // Draw copyright information.

    if( !Bitmap(szDefaultLogo, 5, pDlgHeader->lx + 8, pDlgHeader->ty + 22))
    {
        set_color( 5 );
        cc_wt16(szMiniGUI, pDlgHeader->lx + 8, pDlgHeader->ty + 6);
    }

    set_color(15);
    cc_wt16(pDlgHeader->spCaption, 
                (pDlgHeader->lx + pDlgHeader->rx)/2 - GetOutWidth(pDlgHeader->spCaption)/2,
                pDlgHeader->ty + 8);
                
    for(i=0; i<pDlgHeader->NumOfItems; i++)
    {
        if((*DlgProc)(pDlgHeader, DRAWTEXT, (pDlgHeader->pCtrlData + i)->wID, (LPSTR)(pDlgHeader->pCtrlData + i)) == OWNER)
            continue;
        
        DrawCtrlClientArea(pDlgHeader->pCtrlData + i);
    }
    
    return TRUE;
}

/*
 * Function: BOOL HaveCancelButton()
 *      This function determine that if the dialog box have a button of IDCANCEL
 * Parameters:
 *      none.
 * Return: 
 *      TRUE: have a button of IDCANCEL;
 *      FALSE: have none button of IDCANCEL;
 */
static BOOL HaveCancelButton( PDLGHEADER pDlgHeader )
{
    short i;
    PCTRLDATA pCtrlData;
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -