📄 mywindows.c
字号:
if (buf) free (buf); if (x + width > g_rcScr.right) x = g_rcScr.right - width; if (y + height > g_rcScr.bottom) y = g_rcScr.bottom - height; MoveWindow (hwnd, x, y, width, height, TRUE); ShowWindow (hwnd, SW_SHOWNORMAL);}void destroyToolTipWin (HWND hwnd){ DestroyMainWindow (hwnd); MainWindowThreadCleanup (hwnd);}#ifdef _CTRL_PROGRESSBARHWND createProgressWin (HWND hParentWnd, char * title, char * label, int id, int range){ HWND hwnd; MAINWINCREATE CreateInfo; int ww, wh; HWND hStatic, hProgBar; ww = ClientWidthToWindowWidth (WS_CAPTION | WS_BORDER, 400); wh = ClientHeightToWindowHeight (WS_CAPTION | WS_BORDER, (range > 0) ? 70 : 35, FALSE); CreateInfo.dwStyle = WS_ABSSCRPOS | WS_CAPTION | WS_BORDER | WS_VISIBLE; CreateInfo.dwExStyle = WS_EX_NONE; CreateInfo.spCaption = title; CreateInfo.hMenu = 0; CreateInfo.hCursor = GetSystemCursor(IDC_WAIT); CreateInfo.hIcon = 0; CreateInfo.MainWindowProc = DefaultMainWinProc; CreateInfo.lx = (GetGDCapability (HDC_SCREEN, GDCAP_MAXX) - ww) >> 1; CreateInfo.ty = (GetGDCapability (HDC_SCREEN, GDCAP_MAXY) - wh) >> 1; CreateInfo.rx = CreateInfo.lx + ww; CreateInfo.by = CreateInfo.ty + wh; CreateInfo.iBkColor = COLOR_lightgray; CreateInfo.dwAddData = 0L; CreateInfo.hHosting = hParentWnd; hwnd = CreateMainWindow (&CreateInfo); if (hwnd == HWND_INVALID) return hwnd; hStatic = CreateWindowEx ("static", label, WS_VISIBLE | SS_SIMPLE, WS_EX_USEPARENTCURSOR, IDC_STATIC, 10, 10, 380, 16, hwnd, 0); if (range > 0) { hProgBar = CreateWindowEx ("progressbar", NULL, WS_VISIBLE, WS_EX_USEPARENTCURSOR, id, 10, 30, 380, 30, hwnd, 0); SendDlgItemMessage (hwnd, id, PBM_SETRANGE, 0, range); } else hProgBar = HWND_INVALID; UpdateWindow (hwnd, TRUE); return hwnd;}void destroyProgressWin (HWND hwnd){ DestroyAllControls (hwnd); DestroyMainWindow (hwnd); ThrowAwayMessages (hwnd); MainWindowThreadCleanup (hwnd);}#endif#define INTERW_CTRLS 5#define INTERH_CTRLS 5#define LABEL_HEIGHT 16#define LABEL_WIDTH 100#define BUTTON_WIDTH 80#define BUTTON_HEIGHT 24#define ENTRY_HEIGHT 22#define MARGIN_TOP 10#define MARGIN_BOTTOM 10#define MARGIN_LEFT 50#define MARGIN_RIGHT 10static intWinMenuBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam){ switch (message) { case MSG_INITDIALOG: { myWINMENUITEMS* pWinMenuItems = (myWINMENUITEMS*)lParam; int i = 0; char** items = pWinMenuItems->items; while (items[i]) { SendDlgItemMessage (hDlg, pWinMenuItems->listboxid, LB_ADDSTRING, 0, (LPARAM)(items[i])); i++; } SendDlgItemMessage (hDlg, pWinMenuItems->listboxid, LB_SETCURSEL, (WPARAM)(*(pWinMenuItems->selected)), 0L); SetWindowAdditionalData (hDlg, (DWORD)lParam); return 1; } break; case MSG_COMMAND: { myWINMENUITEMS* pWinMenuItems = (myWINMENUITEMS*)GetWindowAdditionalData (hDlg); if ( (wParam >= pWinMenuItems->minbuttonid) && (wParam <= pWinMenuItems->maxbuttonid) ) { *(pWinMenuItems->selected) = SendDlgItemMessage (hDlg, pWinMenuItems->listboxid, LB_GETCURSEL, 0, 0L); EndDialog (hDlg, wParam); } } break; } return DefaultDialogProc (hDlg, message, wParam, lParam);}int myWinMenu (HWND hParentWnd, const char* title, const char* label, int width, int listboxheight, char** items, int* listItem, myWINBUTTON* buttons){ DLGTEMPLATE DlgBoxData; CTRLDATA* pCtrlData; int buttonCount = 0, ctrlCount; int i, rc; int cw, ch, ww, wh; int maxid = 0, minbuttonid, maxbuttonid; int buttonx, buttony; myWINMENUITEMS WinMenuItems; RECT rcText; int listboxy; minbuttonid = buttons->id; maxbuttonid = buttons->id; while ((buttons + buttonCount)->text) { int id; id = (buttons + buttonCount)->id; maxid += id; if ( id > maxbuttonid) maxbuttonid = id; else if (id < minbuttonid) minbuttonid = id; buttonCount ++; } maxid ++; if (buttonCount == 0) return 0; ctrlCount = buttonCount + 3; if ( !(pCtrlData = malloc (sizeof (CTRLDATA) * ctrlCount)) ) return 0; DlgBoxData.dwStyle = WS_ABSSCRPOS | WS_CAPTION | WS_BORDER; DlgBoxData.dwExStyle = WS_EX_NONE; DlgBoxData.caption = title; DlgBoxData.hIcon = 0; DlgBoxData.hMenu = 0; DlgBoxData.controlnr = ctrlCount; DlgBoxData.controls = pCtrlData; DlgBoxData.dwAddData = 0L; cw = BUTTON_WIDTH * buttonCount + INTERW_CTRLS * (buttonCount - 1); cw = MAX (cw, width); cw += MARGIN_LEFT + MARGIN_RIGHT; rcText.left = 0; rcText.top = 0; rcText.right = cw - MARGIN_LEFT - MARGIN_RIGHT; rcText.bottom = GetSysCharHeight (); DrawText (HDC_SCREEN, label, -1, &rcText, DT_LEFT | DT_TOP | DT_WORDBREAK | DT_EXPANDTABS | DT_CALCRECT); ch = listboxheight + BUTTON_HEIGHT + INTERH_CTRLS + MARGIN_TOP + MARGIN_BOTTOM + RECTH (rcText) + INTERH_CTRLS; ww = ClientWidthToWindowWidth (DlgBoxData.dwStyle, cw); wh = ClientHeightToWindowHeight (DlgBoxData.dwStyle, ch, FALSE); DlgBoxData.x = (GetGDCapability (HDC_SCREEN, GDCAP_HPIXEL) - ww)/2; DlgBoxData.y = (GetGDCapability (HDC_SCREEN, GDCAP_VPIXEL) - wh)/2; DlgBoxData.w = ww; DlgBoxData.h = wh; // LOGO: pCtrlData->class_name = "static"; pCtrlData->dwStyle = WS_CHILD | WS_VISIBLE | SS_ICON; pCtrlData->dwExStyle= 0; pCtrlData->x = 10; pCtrlData->y = MARGIN_TOP; pCtrlData->w = 40; pCtrlData->h = 40;; pCtrlData->id = IDC_STATIC; pCtrlData->caption = "LOGO"; pCtrlData->dwAddData = GetLargeSystemIcon (IDI_APPLICATION); // label: (pCtrlData + 1)->class_name = "static"; (pCtrlData + 1)->dwStyle = WS_CHILD | WS_VISIBLE | SS_LEFT; (pCtrlData + 1)->dwExStyle= 0; (pCtrlData + 1)->x = MARGIN_LEFT; (pCtrlData + 1)->y = MARGIN_TOP; (pCtrlData + 1)->w = cw - MARGIN_LEFT - MARGIN_RIGHT; (pCtrlData + 1)->h = RECTH (rcText); (pCtrlData + 1)->id = IDC_STATIC; (pCtrlData + 1)->caption = label; (pCtrlData + 1)->dwAddData = 0; // listbox: listboxy = MARGIN_TOP + RECTH (rcText) + INTERH_CTRLS; (pCtrlData + 2)->class_name = "listbox"; (pCtrlData + 2)->dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | WS_BORDER; (pCtrlData + 2)->dwExStyle = 0; (pCtrlData + 2)->x = MARGIN_LEFT; (pCtrlData + 2)->y = listboxy; (pCtrlData + 2)->w = cw - MARGIN_LEFT - MARGIN_RIGHT; (pCtrlData + 2)->h = listboxheight; (pCtrlData + 2)->id = maxid; (pCtrlData + 2)->caption = NULL; (pCtrlData + 2)->dwAddData = 0; buttony = (pCtrlData + 2)->y + (pCtrlData + 2)->h + INTERH_CTRLS; buttonx = ((cw - MARGIN_LEFT - MARGIN_RIGHT - BUTTON_WIDTH * buttonCount - INTERW_CTRLS * (buttonCount - 1))>>1) + MARGIN_LEFT; // buttons for (i = 3; i < buttonCount + 3; i++) { (pCtrlData + i)->class_name = "button"; (pCtrlData + i)->dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP; (pCtrlData + i)->dwStyle |= (buttons + i - 3)->flags; (pCtrlData + i)->dwExStyle = 0; (pCtrlData + i)->x = buttonx; (pCtrlData + i)->y = buttony; (pCtrlData + i)->w = BUTTON_WIDTH; (pCtrlData + i)->h = BUTTON_HEIGHT; (pCtrlData + i)->id = (buttons + i - 3)->id; (pCtrlData + i)->caption = (buttons + i - 3)->text; (pCtrlData + i)->dwAddData = 0; buttonx += BUTTON_WIDTH + INTERW_CTRLS; } WinMenuItems.items = items; WinMenuItems.listboxid = maxid; WinMenuItems.selected = listItem; WinMenuItems.minbuttonid = minbuttonid; WinMenuItems.maxbuttonid = maxbuttonid; rc = DialogBoxIndirectParam (&DlgBoxData, hParentWnd, WinMenuBoxProc, (LPARAM)(&WinMenuItems)); free (pCtrlData); return rc;}static intWinEntryBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam){ switch (message) { case MSG_INITDIALOG: { int i; myWINENTRYITEMS* pWinEntryItems = (myWINENTRYITEMS*)lParam; for (i = 0; i < pWinEntryItems->entrycount; i++) { if ((pWinEntryItems->entries + i)->maxlen > 0) SendDlgItemMessage (hDlg, pWinEntryItems->firstentryid + i, EM_LIMITTEXT, (pWinEntryItems->entries + i)->maxlen, 0L); } SetWindowAdditionalData (hDlg, (DWORD)lParam); return 1; } break; case MSG_COMMAND: { int i; myWINENTRYITEMS* pWinEntryItems = (myWINENTRYITEMS*)GetWindowAdditionalData (hDlg); if ( (wParam >= pWinEntryItems->minbuttonid) && (wParam <= pWinEntryItems->maxbuttonid) ) { for (i = 0; i < pWinEntryItems->entrycount; i++) { char** value; value = (pWinEntryItems->entries + i)->value; *value = GetDlgItemText2 (hDlg, pWinEntryItems->firstentryid + i, NULL); } EndDialog (hDlg, wParam); } } break; } return DefaultDialogProc (hDlg, message, wParam, lParam);}int myWinEntries (HWND hParentWnd, const char* title, const char* label, int width, int editboxwidth, BOOL fIME, myWINENTRY* items, myWINBUTTON* buttons){ DLGTEMPLATE DlgBoxData; CTRLDATA* pCtrlData; int buttonCount = 0, entryCount = 0, ctrlCount, count; int i, rc; int cw, ch, ww, wh, labelwidth; int maxid = 0, minbuttonid, maxbuttonid; int entryx, entryy; int buttonx, buttony; myWINENTRYITEMS WinEntryItems; RECT rcText; minbuttonid = buttons->id; maxbuttonid = buttons->id; while ((buttons + buttonCount)->text) { int id; id = (buttons + buttonCount)->id; maxid += id; if ( id > maxbuttonid) maxbuttonid = id; else if (id < minbuttonid) minbuttonid = id; buttonCount ++; } maxid ++; while ((items + entryCount)->text) { entryCount ++; } if (buttonCount == 0 || entryCount == 0) return 0; ctrlCount = buttonCount + (entryCount<<1) + 2; if ( !(pCtrlData = malloc (sizeof (CTRLDATA) * ctrlCount)) ) return 0; DlgBoxData.dwStyle = WS_ABSSCRPOS | WS_CAPTION | WS_BORDER; DlgBoxData.dwExStyle = fIME?WS_EX_IMECOMPOSE:WS_EX_NONE; DlgBoxData.caption = title; DlgBoxData.hIcon = 0; DlgBoxData.hMenu = 0; DlgBoxData.controlnr = ctrlCount; DlgBoxData.controls = pCtrlData; DlgBoxData.dwAddData = 0L; cw = BUTTON_WIDTH * buttonCount + INTERW_CTRLS * (buttonCount - 1); if (width < editboxwidth + INTERW_CTRLS + LABEL_WIDTH) width = editboxwidth + INTERW_CTRLS + LABEL_WIDTH; cw = MAX (cw, width); labelwidth = cw - editboxwidth - INTERW_CTRLS; cw += MARGIN_LEFT + MARGIN_RIGHT; rcText.left = 0; rcText.top = 0; rcText.right = cw - MARGIN_LEFT - MARGIN_RIGHT; rcText.bottom = GetSysCharHeight (); DrawText (HDC_SCREEN, label, -1, &rcText, DT_LEFT | DT_TOP | DT_WORDBREAK | DT_EXPANDTABS | DT_CALCRECT); ch = MARGIN_TOP + RECTH (rcText) + INTERH_CTRLS + (ENTRY_HEIGHT + INTERH_CTRLS) * entryCount + BUTTON_HEIGHT + MARGIN_BOTTOM; ww = ClientWidthToWindowWidth (DlgBoxData.dwStyle, cw); wh = ClientHeightToWindowHeight (DlgBoxData.dwStyle, ch, FALSE); DlgBoxData.x = (GetGDCapability (HDC_SCREEN, GDCAP_HPIXEL) - ww)/2; DlgBoxData.y = (GetGDCapability (HDC_SCREEN, GDCAP_VPIXEL) - wh)/2; DlgBoxData.w = ww; DlgBoxData.h = wh; // LOGO: pCtrlData->class_name = "static"; pCtrlData->dwStyle = WS_CHILD | WS_VISIBLE | SS_ICON; pCtrlData->dwExStyle= 0; pCtrlData->x = 10; pCtrlData->y = MARGIN_TOP; pCtrlData->w = 40; pCtrlData->h = 40;; pCtrlData->id = IDC_STATIC; pCtrlData->caption = "LOGO"; pCtrlData->dwAddData = GetLargeSystemIcon (IDI_APPLICATION); // label: (pCtrlData + 1)->class_name = "static"; (pCtrlData + 1)->dwStyle = WS_CHILD | WS_VISIBLE | SS_LEFT; (pCtrlData + 1)->dwExStyle= 0; (pCtrlData + 1)->x = MARGIN_LEFT; (pCtrlData + 1)->y = MARGIN_TOP; (pCtrlData + 1)->w = cw - MARGIN_LEFT - MARGIN_RIGHT; (pCtrlData + 1)->h = RECTH (rcText); (pCtrlData + 1)->id = IDC_STATIC; (pCtrlData + 1)->caption = label; (pCtrlData + 1)->dwAddData = 0; // entries: entryy = MARGIN_TOP + RECTH (rcText) + INTERH_CTRLS; entryx = MARGIN_LEFT + labelwidth + INTERW_CTRLS; for (i = 0; i < entryCount; i++) { // label (pCtrlData + i*2 + 2)->class_name = "static"; (pCtrlData + i*2 + 2)->dwStyle = WS_CHILD | WS_VISIBLE | SS_RIGHT; (pCtrlData + i*2 + 2)->dwExStyle= 0; (pCtrlData + i*2 + 2)->x = MARGIN_LEFT; (pCtrlData + i*2 + 2)->y = entryy + 3; (pCtrlData + i*2 + 2)->w = labelwidth; (pCtrlData + i*2 + 2)->h = LABEL_HEIGHT; (pCtrlData + i*2 + 2)->id = IDC_STATIC; (pCtrlData + i*2 + 2)->caption = (items + i)->text; (pCtrlData + i*2 + 2)->dwAddData = 0; // editbox (pCtrlData + i*2 + 3)->class_name = "edit"; (pCtrlData + i*2 + 3)->dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP; (pCtrlData + i*2 + 3)->dwStyle |= WS_BORDER | (items + i)->flags; (pCtrlData + i*2 + 3)->dwExStyle= 0; (pCtrlData + i*2 + 3)->x = entryx; (pCtrlData + i*2 + 3)->y = entryy; (pCtrlData + i*2 + 3)->w = editboxwidth; (pCtrlData + i*2 + 3)->h = ENTRY_HEIGHT; (pCtrlData + i*2 + 3)->id = maxid + i; (pCtrlData + i*2 + 3)->caption = *(items + i)->value; (pCtrlData + i*2 + 3)->dwAddData = 0; entryy += ENTRY_HEIGHT + INTERH_CTRLS; } buttony = entryy; buttonx = ((cw - MARGIN_LEFT - MARGIN_RIGHT - BUTTON_WIDTH*buttonCount - INTERW_CTRLS * (buttonCount - 1))>>1) + MARGIN_LEFT; // buttons count = (entryCount<<1) + 2; for (i = count; i < buttonCount + count; i++) { (pCtrlData + i)->class_name = "button"; (pCtrlData + i)->dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP; (pCtrlData + i)->dwStyle |= (buttons + i - count)->flags; (pCtrlData + i)->dwExStyle = 0; (pCtrlData + i)->x = buttonx; (pCtrlData + i)->y = buttony; (pCtrlData + i)->w = BUTTON_WIDTH; (pCtrlData + i)->h = BUTTON_HEIGHT; (pCtrlData + i)->id = (buttons + i - count)->id; (pCtrlData + i)->caption = (buttons + i - count)->text; (pCtrlData + i)->dwAddData = 0; buttonx += BUTTON_WIDTH + INTERW_CTRLS; } WinEntryItems.entries = items; WinEntryItems.entrycount = entryCount; WinEntryItems.firstentryid = maxid; WinEntryItems.minbuttonid = minbuttonid; WinEntryItems.maxbuttonid = maxbuttonid; rc = DialogBoxIndirectParam (&DlgBoxData, hParentWnd, WinEntryBoxProc, (LPARAM)(&WinEntryItems)); free (pCtrlData); return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -