📄 dialog.c
字号:
if (pCtrl->dwStyle & WS_GROUP) { if (pCtrl->dwStyle & WS_VISIBLE && !(pCtrl->dwStyle & WS_DISABLED) ) return (HWND)pCtrl; else break; } pCtrl = pCtrl->prev; } if (pCtrl) { // pCtrl is the first control in group. pCtrl = pCtrl->next; while (pCtrl) { if ( !(pCtrl->dwStyle & WS_GROUP) ) { if (pCtrl->dwStyle & WS_VISIBLE && !(pCtrl->dwStyle & WS_DISABLED) ) return (HWND)pCtrl; } else break; pCtrl = pCtrl->next; } } } return hCtl;}HWND GetNextDlgTabItem (HWND hDlg, HWND hCtl, BOOL bPrevious){ PCONTROL pFirstCtrl, pLastCtrl, pCtrl; PMAINWIN pMainWin = (PMAINWIN)hDlg; pFirstCtrl = pCtrl = (PCONTROL)(pMainWin->hFirstChild); if (!pCtrl) return hCtl; while (pCtrl->next) { pCtrl = pCtrl->next; } pLastCtrl = pCtrl; if (hCtl) { pCtrl = (PCONTROL)hCtl; if (bPrevious) pCtrl = pCtrl->prev; else pCtrl = pCtrl->next; } else if (bPrevious) pCtrl = pLastCtrl; else pCtrl = pFirstCtrl; if (bPrevious) { while (pCtrl) { if (pCtrl->dwStyle & WS_TABSTOP && pCtrl->dwStyle & WS_VISIBLE && !(pCtrl->dwStyle & WS_DISABLED) ) return (HWND)pCtrl; pCtrl = pCtrl->prev; } pCtrl = pLastCtrl; while (pCtrl) { if (pCtrl->dwStyle & WS_TABSTOP && pCtrl->dwStyle & WS_VISIBLE && !(pCtrl->dwStyle & WS_DISABLED) ) return (HWND)pCtrl; pCtrl = pCtrl->prev; } } else { while (pCtrl) { if (pCtrl->dwStyle & WS_TABSTOP && pCtrl->dwStyle & WS_VISIBLE && !(pCtrl->dwStyle & WS_DISABLED) ) return (HWND)pCtrl; pCtrl = pCtrl->next; } pCtrl = pFirstCtrl; while (pCtrl) { if (pCtrl->dwStyle & WS_TABSTOP && pCtrl->dwStyle & WS_VISIBLE && !(pCtrl->dwStyle & WS_DISABLED) ) return (HWND)pCtrl; pCtrl = pCtrl->next; } } return hCtl;}int SendDlgItemMessage (HWND hDlg, int nIDDlgItem, int message, WPARAM wParam, LPARAM lParam){ HWND hCtrl; hCtrl = GetDlgItem (hDlg, nIDDlgItem); if (hCtrl) return SendMessage (hCtrl, message, wParam, lParam); return -1;}UINT GetDlgItemInt (HWND hDlg, int nIDDlgItem, BOOL *lpTranslated, BOOL bSigned){ HWND hCtrl; char buffer [101]; unsigned long int result; if ( !(hCtrl = GetDlgItem (hDlg, nIDDlgItem))) goto error; if (SendMessage (hCtrl, MSG_GETTEXT, 100, (LPARAM)buffer) == 0) goto error; if (bSigned) result = strtoul (buffer, NULL, 0); else result = (unsigned long int)strtol (buffer, NULL, 0); if (lpTranslated) *lpTranslated = TRUE; return (UINT)result; error: if (lpTranslated) *lpTranslated = FALSE; return 0;}BOOL SetDlgItemInt (HWND hDlg, int nIDDlgItem, UINT uValue, BOOL bSigned){ HWND hCtrl; char buffer [101]; if ( !(hCtrl = GetDlgItem (hDlg, nIDDlgItem))) return FALSE; if (bSigned) snprintf (buffer, 100, "%ld", (long)uValue); else snprintf (buffer, 100, "%u", uValue); buffer [100] = '\0'; return SendMessage (hCtrl, MSG_SETTEXT, 0, (LPARAM)buffer) == 0;}int GetDlgItemText (HWND hDlg, int nIDDlgItem, char* lpString, int nMaxCount){ HWND hCtrl; if ( !(hCtrl = GetDlgItem (hDlg, nIDDlgItem))) return 0; return SendMessage (hCtrl, MSG_GETTEXT, (WPARAM)nMaxCount, (LPARAM)lpString);}char* GUIAPI GetDlgItemText2 (HWND hDlg, int id, int* lenPtr){ int len; char* buff; len = SendDlgItemMessage (hDlg, id, MSG_GETTEXTLENGTH, 0, 0L); if (len > 0) { buff = malloc (len + 1); if (buff) SendDlgItemMessage (hDlg, id, MSG_GETTEXT, len, (LPARAM)(buff)); } else buff = NULL; if (lenPtr) *lenPtr = len; return buff;}#ifdef _CTRL_BUTTONBOOL SetDlgItemText (HWND hDlg, int nIDDlgItem, const char* lpString){ HWND hCtrl; if ( !(hCtrl = GetDlgItem (hDlg, nIDDlgItem))) return FALSE; return SendMessage (hCtrl, MSG_SETTEXT, 0, (LPARAM)lpString) == 0;}void GUIAPI CheckDlgButton (HWND hDlg, int nIDDlgItem, int nCheck){ HWND hCtrl; int DlgCode; if ( !(hCtrl = GetDlgItem (hDlg, nIDDlgItem))) return; DlgCode = SendMessage (hCtrl, MSG_GETDLGCODE, 0, 0L); if (DlgCode & DLGC_BUTTON) SendMessage (hCtrl, BM_SETCHECK, nCheck?BST_CHECKED:BST_UNCHECKED, 0L); else if (DlgCode & DLGC_3STATE) { SendMessage (hCtrl, BM_SETCHECK, nCheck, 0L); }}void GUIAPI CheckRadioButton (HWND hDlg, int idFirstButton, int idLastButton, int idCheckButton){ HWND hCtrl; if ( !(hCtrl = GetDlgItem (hDlg, idCheckButton))) return; SendMessage (hCtrl, BM_SETCHECK, BST_CHECKED, 0L);}int GUIAPI IsDlgButtonChecked (HWND hDlg, int idButton){ HWND hCtrl; if ( !(hCtrl = GetDlgItem (hDlg, idButton))) return -1; return SendMessage (hCtrl, BM_GETCHECK, 0, 0L);}#ifdef _CTRL_STATICstatic int MsgBoxProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){ switch (message) { case MSG_INITDIALOG: { HWND hFocus = GetDlgDefPushButton (hWnd); if (hFocus) SetFocus (hFocus); SetWindowAdditionalData2 (hWnd, (DWORD)lParam); return 0; } case MSG_COMMAND: { switch (wParam) { case IDOK: case IDCANCEL: case IDABORT: case IDRETRY: case IDIGNORE: case IDYES: case IDNO: if (GetDlgItem (hWnd, wParam)) EndDialog (hWnd, wParam); break; } break; } case MSG_CHAR: { int id = 0; if (HIBYTE (wParam)) break; switch (LOBYTE (wParam)) { case 'Y': case 'y': id = IDYES; break; case 'N': case 'n': id = IDNO; break; case 'A': case 'a': id = IDABORT; break; case 'R': case 'r': id = IDRETRY; break; case 'I': case 'i': id = IDIGNORE; break; } if (id != 0 && GetDlgItem (hWnd, id)) EndDialog (hWnd, id); break; } default: break; } return DefaultDialogProc (hWnd, message, wParam, lParam);}#define MB_MARGIN 10#define MB_BUTTONW 80#define MB_BUTTONH 26#define MB_TEXTW 400int GUIAPI MessageBox (HWND hParentWnd, const char* pszText, const char* pszCaption, DWORD dwStyle){ DLGTEMPLATE MsgBoxData = { WS_CAPTION | WS_BORDER, WS_EX_NONE, 0, 0, 0, 0, NULL, 0, 0, 0, NULL, 0L }; CTRLDATA CtrlData [5] = { {"button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE | WS_GROUP, 0, 0, 0, 0, 0, NULL, 0L}, {"button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 0, 0, 0, 0, 0, NULL, 0L}, {"button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 0, 0, 0, 0, 0, NULL, 0L} }; int i, nButtons, buttonx; RECT rcText, rcButtons, rcIcon; int width, height; if (pszCaption) MsgBoxData.caption = pszCaption; else MsgBoxData.caption = "MiniGUI"; MsgBoxData.hIcon = GetSmallSystemIcon (IDI_APPLICATION); switch (dwStyle & MB_TYPEMASK) { case MB_OK: MsgBoxData.controlnr = 1; CtrlData [0].caption = GetSysText (SysText[10]); CtrlData [0].id = IDOK; break; case MB_OKCANCEL: MsgBoxData.controlnr = 2; CtrlData [0].caption = GetSysText (SysText[10]); CtrlData [0].id = IDOK; CtrlData [1].caption = (dwStyle & MB_CANCELASBACK) ? GetSysText (SysText[13]) : GetSysText (SysText[12]); CtrlData [1].id = IDCANCEL; break; case MB_YESNO: MsgBoxData.controlnr = 2; CtrlData [0].caption = GetSysText (SysText[14]); CtrlData [0].id = IDYES; CtrlData [1].caption = GetSysText (SysText[15]); CtrlData [1].id = IDNO; break; case MB_RETRYCANCEL: MsgBoxData.controlnr = 2; CtrlData [0].caption = GetSysText (SysText[17]); CtrlData [0].id = IDRETRY; CtrlData [1].caption = (dwStyle & MB_CANCELASBACK) ? GetSysText (SysText[13]) : GetSysText (SysText[12]); CtrlData [1].id = IDCANCEL; break; case MB_ABORTRETRYIGNORE: MsgBoxData.controlnr = 3; CtrlData [0].caption = GetSysText (SysText[16]); CtrlData [0].id = IDABORT; CtrlData [1].caption = GetSysText (SysText[17]); CtrlData [1].id = IDRETRY; CtrlData [2].caption = GetSysText (SysText[18]); CtrlData [2].id = IDIGNORE; break; case MB_YESNOCANCEL: MsgBoxData.controlnr = 3; CtrlData [0].caption = GetSysText (SysText[14]); CtrlData [0].id = IDYES; CtrlData [1].caption = GetSysText (SysText[15]); CtrlData [1].id = IDNO; CtrlData [2].caption = (dwStyle & MB_CANCELASBACK) ? GetSysText (SysText[13]) : GetSysText (SysText[12]); CtrlData [2].id = IDCANCEL; break; } switch (dwStyle & MB_DEFMASK) { case MB_DEFBUTTON1: CtrlData [0].dwStyle |= BS_DEFPUSHBUTTON; break; case MB_DEFBUTTON2: if (MsgBoxData.controlnr > 1) CtrlData [1].dwStyle |= BS_DEFPUSHBUTTON; break; case MB_DEFBUTTON3: if (MsgBoxData.controlnr > 2) CtrlData [2].dwStyle |= BS_DEFPUSHBUTTON; break; } nButtons = MsgBoxData.controlnr; rcButtons.left = 0; rcButtons.top = 0; rcButtons.bottom = MB_BUTTONH; rcButtons.right = MsgBoxData.controlnr * MB_BUTTONW + (MsgBoxData.controlnr - 1) * (MB_MARGIN << 1); rcIcon.left = 0; rcIcon.top = 0; rcIcon.right = 0; rcIcon.bottom = 0; if (dwStyle & MB_ICONMASK) { i = MsgBoxData.controlnr; CtrlData [i].class_name= "static"; CtrlData [i].dwStyle = WS_VISIBLE | SS_ICON | WS_GROUP; CtrlData [i].x = MB_MARGIN; CtrlData [i].y = MB_MARGIN; CtrlData [i].w = 32; CtrlData [i].h = 32; CtrlData [i].id = IDC_STATIC; CtrlData [i].caption = "Hello"; switch (dwStyle & MB_ICONMASK) { case MB_ICONSTOP: CtrlData [i].dwAddData = GetLargeSystemIcon (IDI_STOP); break; case MB_ICONINFORMATION: CtrlData [i].dwAddData = GetLargeSystemIcon (IDI_INFORMATION); break; case MB_ICONEXCLAMATION: CtrlData [i].dwAddData = GetLargeSystemIcon (IDI_EXCLAMATION); break; case MB_ICONQUESTION: CtrlData [i].dwAddData = GetLargeSystemIcon (IDI_QUESTION); break; } MsgBoxData.controlnr ++; rcIcon.right = 32; rcIcon.bottom = 32; } rcText.left = 0; rcText.top = 0; rcText.right = rcButtons.right + (MB_MARGIN << 1); rcText.right = max (rcText.right, MB_TEXTW); rcText.bottom = GetSysCharHeight (); DrawText (HDC_SCREEN, pszText, -1, &rcText, DT_LEFT | DT_TOP | DT_WORDBREAK | DT_EXPANDTABS | DT_CALCRECT); i = MsgBoxData.controlnr; CtrlData [i].class_name= "static"; CtrlData [i].dwStyle = WS_VISIBLE | SS_LEFT | WS_GROUP; CtrlData [i].x = RECTW (rcIcon) + (MB_MARGIN << 1); CtrlData [i].y = MB_MARGIN; CtrlData [i].w = RECTW (rcText); CtrlData [i].h = RECTH (rcText); CtrlData [i].id = IDC_STATIC; CtrlData [i].caption = pszText; CtrlData [i].dwAddData = 0; MsgBoxData.controlnr ++; width = max (RECTW (rcText), RECTW (rcButtons)) + RECTW (rcIcon) + (MB_MARGIN << 2) + (GetMainWinMetrics(MWM_BORDER) << 1); height = max (RECTH (rcText), RECTH (rcIcon)) + RECTH (rcButtons) + MB_MARGIN + (MB_MARGIN << 1) + (GetMainWinMetrics (MWM_BORDER) << 1) + GetMainWinMetrics (MWM_CAPTIONY); buttonx = (width - RECTW (rcButtons)) >> 1; for (i = 0; i < nButtons; i++) { CtrlData[i].x = buttonx + i*(MB_BUTTONW + MB_MARGIN); CtrlData[i].y = max (RECTH (rcIcon), RECTH (rcText)) + (MB_MARGIN<<1); CtrlData[i].w = MB_BUTTONW; CtrlData[i].h = MB_BUTTONH; } MsgBoxData.x = (GetGDCapability (HDC_SCREEN, GDCAP_HPIXEL) - width)/2; MsgBoxData.y = (GetGDCapability (HDC_SCREEN, GDCAP_VPIXEL) - height)/2; MsgBoxData.w = width; MsgBoxData.h = height; MsgBoxData.controls = CtrlData; return DialogBoxIndirectParam (&MsgBoxData, hParentWnd, MsgBoxProc, (LPARAM)dwStyle);}#endif /* _CTRL_STATIC */#endif /* _CTRL_BUTTON */void GUIAPI MessageBeep (DWORD dwBeep){ Beep ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -