📄 winhelp.c
字号:
curPos = GetScrollPos(win->hTextWnd, SB_VERT); GetScrollRange(win->hTextWnd, SB_VERT, &min, &max); if (keyDelta == 0) { GetClientRect(win->hTextWnd, &rect); keyDelta = (rect.bottom - rect.top) / 2; if (wParam == VK_PRIOR) keyDelta = -keyDelta; } curPos += keyDelta; if (curPos > max) curPos = max; else if (curPos < min) curPos = min; dy = GetScrollPos(win->hTextWnd, SB_VERT) - curPos; SetScrollPos(win->hTextWnd, SB_VERT, curPos, TRUE); ScrollWindow(win->hTextWnd, 0, dy, NULL, NULL); UpdateWindow(win->hTextWnd); return 0; case VK_ESCAPE: MACRO_Exit(); return 0; } break; } return DefWindowProc(hWnd, msg, wParam, lParam);}/*********************************************************************** * * WINHELP_ButtonBoxWndProc */static LRESULT CALLBACK WINHELP_ButtonBoxWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ WINDOWPOS *winpos; WINHELP_WINDOW *win; WINHELP_BUTTON *button; SIZE button_size; INT x, y; WINHELP_CheckPopup(msg); switch (msg) { case WM_NCCREATE: win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams; SetWindowLong(hWnd, 0, (LONG) win); win->hButtonBoxWnd = hWnd; break; case WM_WINDOWPOSCHANGING: winpos = (WINDOWPOS*) lParam; win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0); /* Update buttons */ button_size.cx = 0; button_size.cy = 0; for (button = win->first_button; button; button = button->next) { HDC hDc; SIZE textsize; if (!button->hWnd) { button->hWnd = CreateWindow(STRING_BUTTON, button->lpszName, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, hWnd, (HMENU) button->wParam, Globals.hInstance, 0); if (button->hWnd) { if (Globals.button_proc == NULL) Globals.button_proc = (WNDPROC) GetWindowLongPtr(button->hWnd, GWLP_WNDPROC); SetWindowLongPtr(button->hWnd, GWLP_WNDPROC, (LONG_PTR) WINHELP_ButtonWndProc); } } hDc = GetDC(button->hWnd); GetTextExtentPoint(hDc, button->lpszName, lstrlen(button->lpszName), &textsize); ReleaseDC(button->hWnd, hDc); button_size.cx = max(button_size.cx, textsize.cx + BUTTON_CX); button_size.cy = max(button_size.cy, textsize.cy + BUTTON_CY); } x = 0; y = 0; for (button = win->first_button; button; button = button->next) { SetWindowPos(button->hWnd, HWND_TOP, x, y, button_size.cx, button_size.cy, 0); if (x + 2 * button_size.cx <= winpos->cx) x += button_size.cx; else x = 0, y += button_size.cy; } winpos->cy = y + (x ? button_size.cy : 0); break; case WM_COMMAND: SendMessage(GetParent(hWnd), msg, wParam, lParam); break; case WM_KEYDOWN: switch (wParam) { case VK_UP: case VK_DOWN: case VK_PRIOR: case VK_NEXT: case VK_ESCAPE: return SendMessage(GetParent(hWnd), msg, wParam, lParam); } break; } return DefWindowProc(hWnd, msg, wParam, lParam);}/*********************************************************************** * * WINHELP_ButtonWndProc */static LRESULT CALLBACK WINHELP_ButtonWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ if (msg == WM_KEYDOWN) { switch (wParam) { case VK_UP: case VK_DOWN: case VK_PRIOR: case VK_NEXT: case VK_ESCAPE: return SendMessage(GetParent(hWnd), msg, wParam, lParam); } } return CallWindowProc(Globals.button_proc, hWnd, msg, wParam, lParam);}/*********************************************************************** * * WINHELP_TextWndProc */static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ WINHELP_WINDOW *win; WINHELP_LINE *line; WINHELP_LINE_PART *part; WINDOWPOS *winpos; PAINTSTRUCT ps; HDC hDc; POINT mouse; INT scroll_pos; HWND hPopupWnd; BOOL bExit; if (msg != WM_LBUTTONDOWN) WINHELP_CheckPopup(msg); switch (msg) { case WM_NCCREATE: win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams; SetWindowLong(hWnd, 0, (LONG) win); win->hTextWnd = hWnd; win->hBrush = CreateSolidBrush(win->info->sr_color); if (win->info->win_style & WS_POPUP) Globals.hPopupWnd = win->hMainWnd = hWnd; WINHELP_InitFonts(hWnd); break; case WM_CREATE: win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0); /* Calculate vertical size and position of a popup window */ if (win->info->win_style & WS_POPUP) { POINT origin; RECT old_window_rect; RECT old_client_rect; SIZE old_window_size; SIZE old_client_size; SIZE new_client_size; SIZE new_window_size; GetWindowRect(hWnd, &old_window_rect); origin.x = old_window_rect.left; origin.y = old_window_rect.top; old_window_size.cx = old_window_rect.right - old_window_rect.left; old_window_size.cy = old_window_rect.bottom - old_window_rect.top; GetClientRect(hWnd, &old_client_rect); old_client_size.cx = old_client_rect.right - old_client_rect.left; old_client_size.cy = old_client_rect.bottom - old_client_rect.top; new_client_size = old_client_size; WINHELP_SplitLines(hWnd, &new_client_size); if (origin.y + POPUP_YDISTANCE + new_client_size.cy <= GetSystemMetrics(SM_CYSCREEN)) origin.y += POPUP_YDISTANCE; else origin.y -= POPUP_YDISTANCE + new_client_size.cy; new_window_size.cx = old_window_size.cx - old_client_size.cx + new_client_size.cx; new_window_size.cy = old_window_size.cy - old_client_size.cy + new_client_size.cy; win->hShadowWnd = CreateWindow(SHADOW_WIN_CLASS_NAME, "", WS_POPUP, origin.x + SHADOW_DX, origin.y + SHADOW_DY, new_window_size.cx, new_window_size.cy, 0, 0, Globals.hInstance, 0); SetWindowPos(hWnd, HWND_TOP, origin.x, origin.y, new_window_size.cx, new_window_size.cy, 0); SetWindowPos(win->hShadowWnd, hWnd, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); ShowWindow(win->hShadowWnd, SW_NORMAL); SetActiveWindow(hWnd); } break; case WM_WINDOWPOSCHANGED: winpos = (WINDOWPOS*) lParam; if (!(winpos->flags & SWP_NOSIZE)) WINHELP_SetupText(hWnd); break; case WM_MOUSEWHEEL: { int wheelDelta = 0; UINT scrollLines = 3; int curPos = GetScrollPos(hWnd, SB_VERT); int min, max; GetScrollRange(hWnd, SB_VERT, &min, &max); SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0, &scrollLines, 0); if (wParam & (MK_SHIFT | MK_CONTROL)) return DefWindowProc(hWnd, msg, wParam, lParam); wheelDelta -= GET_WHEEL_DELTA_WPARAM(wParam); if (abs(wheelDelta) >= WHEEL_DELTA && scrollLines) { int dy; curPos += wheelDelta; if (curPos > max) curPos = max; else if (curPos < min) curPos = min; dy = GetScrollPos(hWnd, SB_VERT) - curPos; SetScrollPos(hWnd, SB_VERT, curPos, TRUE); ScrollWindow(hWnd, 0, dy, NULL, NULL); UpdateWindow(hWnd); } } break; case WM_VSCROLL: { BOOL update = TRUE; RECT rect; INT Min, Max; INT CurPos = GetScrollPos(hWnd, SB_VERT); INT dy; GetScrollRange(hWnd, SB_VERT, &Min, &Max); GetClientRect(hWnd, &rect); switch (wParam & 0xffff) { case SB_THUMBTRACK: case SB_THUMBPOSITION: CurPos = wParam >> 16; break; case SB_TOP: CurPos = Min; break; case SB_BOTTOM: CurPos = Max; break; case SB_PAGEUP: CurPos -= (rect.bottom - rect.top) / 2; break; case SB_PAGEDOWN: CurPos += (rect.bottom - rect.top) / 2; break; case SB_LINEUP: CurPos -= GetSystemMetrics(SM_CXVSCROLL); break; case SB_LINEDOWN: CurPos += GetSystemMetrics(SM_CXVSCROLL); break; default: update = FALSE; } if (update) { if (CurPos > Max) CurPos = Max; else if (CurPos < Min) CurPos = Min; dy = GetScrollPos(hWnd, SB_VERT) - CurPos; SetScrollPos(hWnd, SB_VERT, CurPos, TRUE); ScrollWindow(hWnd, 0, dy, NULL, NULL); UpdateWindow(hWnd); } } break; case WM_PAINT: hDc = BeginPaint(hWnd, &ps); win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0); scroll_pos = GetScrollPos(hWnd, SB_VERT); /* No DPtoLP needed - MM_TEXT map mode */ if (ps.fErase) FillRect(hDc, &ps.rcPaint, win->hBrush); for (line = win->first_line; line; line = line->next) { for (part = &line->first_part; part; part = part->next) { switch (part->cookie) { case hlp_line_part_text: SelectObject(hDc, part->u.text.hFont); SetTextColor(hDc, part->u.text.color); SetBkColor(hDc, win->info->sr_color); TextOut(hDc, part->rect.left, part->rect.top - scroll_pos, part->u.text.lpsText, part->u.text.wTextLen); if (part->u.text.wUnderline) { HPEN hPen; switch (part->u.text.wUnderline) { case 1: /* simple */ case 2: /* double */ hPen = CreatePen(PS_SOLID, 1, part->u.text.color); break; case 3: /* dotted */ hPen = CreatePen(PS_DOT, 1, part->u.text.color); break; default: WINE_FIXME("Unknow underline type\n"); continue; } SelectObject(hDc, hPen); MoveToEx(hDc, part->rect.left, part->rect.bottom - scroll_pos - 1, NULL); LineTo(hDc, part->rect.right, part->rect.bottom - scroll_pos - 1); if (part->u.text.wUnderline == 2) { MoveToEx(hDc, part->rect.left, part->rect.bottom - scroll_pos + 1, NULL); LineTo(hDc, part->rect.right, part->rect.bottom - scroll_pos + 1); } DeleteObject(hPen); } break; case hlp_line_part_bitmap: { HDC hMemDC; hMemDC = CreateCompatibleDC(hDc); SelectObject(hMemDC, part->u.bitmap.hBitmap); BitBlt(hDc, part->rect.left, part->rect.top - scroll_pos, part->rect.right - part->rect.left, part->rect.bottom - part->rect.top, hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); } break; case hlp_line_part_metafile: { HDC hMemDC; HBITMAP hBitmap; SIZE sz; RECT rc; sz.cx = part->rect.right - part->rect.left; sz.cy = part->rect.bottom - part->rect.top; hMemDC = CreateCompatibleDC(hDc); hBitmap = CreateCompatibleBitmap(hDc, sz.cx, sz.cy); SelectObject(hMemDC, hBitmap); SelectObject(hMemDC, win->hBrush); rc.left = 0; rc.top = 0; rc.right = sz.cx; rc.bottom = sz.cy; FillRect(hMemDC, &rc, win->hBrush); SetMapMode(hMemDC, part->u.metafile.mm); SetWindowExtEx(hMemDC, sz.cx, sz.cy, 0); SetViewportExtEx(hMemDC, sz.cx, sz.cy, 0); SetWindowOrgEx(hMemDC, 0, 0, 0); SetViewportOrgEx(hMemDC, 0, 0, 0); PlayMetaFile(hMemDC, part->u.metafile.hMetaFile); SetMapMode(hMemDC, MM_TEXT); SetWindowOrgEx(hMemDC, 0, 0, 0); SetViewportOrgEx(hMemDC, 0, 0, 0); BitBlt(hDc, part->rect.left, part->rect.top - scroll_pos, sz.cx, sz.cy, hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -