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

📄 winhelp.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 + -