?? dialog.c
字號:
}
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 + -