lsctrl.c

来自「CC386 is a general-purpose 32-bit C comp」· C语言 代码 · 共 564 行 · 第 1/2 页

C
564
字号
                    }
                    else if (RANGE(temppt.y, r.top))
                    {
                        cursor = SetCursor(rcurs);
                        oncursor = HTTOPRIGHT;
                    }
                    else if (!oldCursor)
                    {
                        cursor = SetCursor(hcurs);
                        oncursor = HTRIGHT;
                    }
                }
                else if (RANGE(temppt.y, r.bottom - 1))
                {
                    if (temppt.x == r.left)
                    {
                        cursor = SetCursor(rcurs);
                        oncursor = HTBOTTOMLEFT;
                    }
                    else
                    {
                        cursor = SetCursor(vcurs);
                        oncursor = HTBOTTOM;
                    }
                }
                else if (RANGE(temppt.x, r.left))
                {
                    if (RANGE(temppt.y, r.top))
                    {
                        cursor = SetCursor(lcurs);
                        oncursor = HTTOPLEFT;
                    }
                    else
                    {
                        cursor = SetCursor(hcurs);
                        oncursor = HTLEFT;
                    }
                }
                else if (RANGE(temppt.y, r.top))
                {
                    cursor = SetCursor(vcurs);
                    oncursor = HTTOP;
                }
                else if (oldCursor)
                {
                    ReleaseCapture();
                    SetCursor(oldCursor);
                    oldCursor = 0;
                    oncursor = 0;
                }
                if (cursor && !oldCursor)
                {
                    SetCapture(hwnd);
                    oldCursor = cursor;
                }
            }
            break;
        case WM_PAINT:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            dc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &r);
            DrawBorder(dc, &r, ptr->vertical, TRUE);
            if (!ptr->container)
            {
                DrawTitle(dc, &r, ptr->vertical);
            }
            EndPaint(hwnd, &ps);
            break;
        case WM_CREATE:
            ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof
                (CCW_params));
            SetWindowLong(hwnd, 0, (DWORD)ptr);
            *ptr = *(CCW_params*)(((LPCREATESTRUCT)lParam)->lpCreateParams);
            ptr->self = hwnd;
            ptr->type = LSCONTROL;
            ptr->container = 0;
            ptr->active = 0;
            dmgrAddClient(ptr);
            GetClientRect(hwnd, &r);
            ptr->u.cw.closebutton = CreateWindow("BUTTON", "", WS_VISIBLE |
                WS_CHILD | BS_PUSHBUTTON | BS_BITMAP, (!ptr->vertical ? r.right
                - BUTTONCORNER - BUTTONWIDTH: BUTTONCORNER), BUTTONCORNER,
                BUTTONWIDTH, BUTTONWIDTH, hwnd, (HMENU)64371, (HINSTANCE)
                GetWindowLong(hwnd, GWL_HINSTANCE), 0);
            ptr->u.cw.flexbutton = CreateWindow("BUTTON", "", WS_VISIBLE |
                WS_CHILD | BS_PUSHBUTTON | BS_BITMAP, (!ptr->vertical ? r.right
                - BUTTONCORNER - 2 * BUTTONWIDTH - 2: BUTTONCORNER), (!ptr
                ->vertical ? BUTTONCORNER : r.top + BUTTONCORNER + 2+2 *
                BUTTONWIDTH), BUTTONWIDTH, BUTTONWIDTH, hwnd, (HMENU)64372, 
                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 0);
            ptr->u.cw.disabled = TRUE;
            SetFlexBmp(ptr);
            SendMessage(ptr->u.cw.closebutton, BM_SETIMAGE, IMAGE_BITMAP, 
                (LPARAM)closebitmap);
            return 0;
        case WM_DESTROY:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            dmgrRemoveClient(ptr);
            DestroyWindow(ptr->u.cw.closebutton);
            DestroyWindow(ptr->u.cw.flexbutton);
            HeapFree(GetProcessHeap(), 0, ptr);
            break;
        case WM_CLOSE:
            SendMessage(ptr->parent, WM_SYSCOMMAND, SC_CLOSE, 0);

            return 0;
        case LCF_CONTAINER:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            if (lParam == ptr->container)
                return 0;
            ptr->container = lParam;
            if (ptr->container)
            {
                ShowWindow(ptr->u.cw.closebutton, SW_HIDE);
                ShowWindow(ptr->u.cw.flexbutton, SW_HIDE);
            }
            else
            {
                ShowWindow(ptr->u.cw.closebutton, SW_SHOW);
                ShowWindow(ptr->u.cw.flexbutton, SW_SHOW);
            }
            break;
        case LCF_ADJUSTRECT:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            pr = (RECT*)lParam;
            if (ptr->container)
            {
                pr->right -= EDGEWIDTH;
                pr->left += EDGEWIDTH;
                pr->top += EDGEWIDTH;
                pr->bottom -= EDGEWIDTH;
            }
            else if (ptr->vertical)
            {
                pr->right -= EDGEWIDTH;
                pr->left += TITLEWIDTH;
                pr->top += EDGEWIDTH;
                pr->bottom -= EDGEWIDTH;
            }
            else
            {
                pr->bottom -= EDGEWIDTH;
                pr->top += TITLEWIDTH;
                pr->left += EDGEWIDTH;
                pr->right -= EDGEWIDTH;

            }
            return 0;
        case LCF_SETFLEX:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            ptr->u.cw.disabled = !(int)lParam;
            ptr->u.cw.flexed = (int)wParam;
            SetFlexBmp(ptr);
            return 0;
        case LCF_SETVERTICAL:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            ptr->vertical = (int)lParam;
            InvalidateRect(hwnd, 0, 1);
            return 0;
        case LCF_SETACTIVE:
            #ifdef XXXXX	  
                ptr = (CCW_params*)GetWindowLong(hwnd, 0);
                if (ptr->active != !!lParam)
                {
                    ptr->active = !!lParam;
                    InvalidateRect(hwnd, 0, 0);
                }
            #endif 
            return TRUE;
        case WM_CTLCOLORBTN:
        case WM_CTLCOLORDLG:
        case WM_CTLCOLOREDIT:
        case WM_CTLCOLORLISTBOX:
        case WM_CTLCOLORMSGBOX:
        case WM_CTLCOLORSCROLLBAR:
        case WM_CTLCOLORSTATIC:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            return SendMessage(ptr->parent, iMessage, wParam, lParam);
        case WM_SIZE:
            ptr = (CCW_params*)GetWindowLong(hwnd, 0);
            SetFlexBmp(ptr);
            if (ptr->vertical)
            {
                MoveWindow(ptr->u.cw.closebutton, BUTTONCORNER, BUTTONCORNER,
                    BUTTONWIDTH, BUTTONWIDTH, 0);
                MoveWindow(ptr->u.cw.flexbutton, BUTTONCORNER, BUTTONCORNER +
                    BUTTONWIDTH + 2, BUTTONWIDTH, BUTTONWIDTH, 0);
            }
            else
            {
                MoveWindow(ptr->u.cw.closebutton, LOWORD(lParam) - BUTTONCORNER
                    - BUTTONWIDTH, BUTTONCORNER, BUTTONWIDTH, BUTTONWIDTH, 1);
                MoveWindow(ptr->u.cw.flexbutton, LOWORD(lParam) - BUTTONCORNER 
                    - 2 * BUTTONWIDTH - 2, BUTTONCORNER, BUTTONWIDTH,
                    BUTTONWIDTH, 1);
            }
            return 0;
        case WM_DRAWITEM:
            return SendMessage(GetParent(hwnd), iMessage, wParam, lParam);
    }
    return DefWindowProc(hwnd, iMessage, wParam, lParam);
}

//-------------------------------------------------------------------------

void RegisterControlWindow(HINSTANCE hInstance)
{
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.style = 0;
    wc.lpfnWndProc = &ControlWindWndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = sizeof(LPVOID);
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_INACTIVEBORDER));
    wc.lpszMenuName = 0;
    wc.lpszClassName = szControlWindClassName;
    RegisterClass(&wc);

    closebitmap = LoadBitmap(hInstance, "ID_CLOSEBMP");
    ChangeBitmapColor(closebitmap, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    uparr = LoadBitmap(hInstance, "ID_UPARR");
    ChangeBitmapColor(uparr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    downarr = LoadBitmap(hInstance, "ID_DOWNARR");
    ChangeBitmapColor(downarr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    leftarr = LoadBitmap(hInstance, "ID_LEFTARR");
    ChangeBitmapColor(leftarr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    rightarr = LoadBitmap(hInstance, "ID_RIGHTARR");
    ChangeBitmapColor(rightarr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    uparrdis = LoadBitmap(hInstance, "ID_UPARRDIS");
    ChangeBitmapColor(uparrdis, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    leftarrdis = LoadBitmap(hInstance, "ID_LEFTARRDIS");
    ChangeBitmapColor(leftarrdis, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
    hcurs = LoadCursor(NULL, IDC_SIZENS);
    vcurs = LoadCursor(NULL, IDC_SIZENS);
    lcurs = LoadCursor(NULL, IDC_SIZEWE);
    rcurs = LoadCursor(NULL, IDC_SIZEWE);
    mcurs = LoadCursor(NULL, IDC_SIZEALL);

}

//-------------------------------------------------------------------------

HWND CreateControlWindow(int id, HWND parent, RECT *r, int vertical, char
    *title)
{
    CCW_params p;
    HWND hwnd;
    RECT r1, r2;
    char buf[256];
    GetWindowText(parent, buf, 256);
    memset(&p, 0, sizeof(p));
    p.vertical = vertical;
    p.parent = parent;
    p.id = id;
    p.title = title;
    hwnd = CreateWindow(szControlWindClassName, buf, WS_CLIPSIBLINGS |
        WS_VISIBLE | WS_CHILD, r->left, r->top, r->right - r->left, r->bottom -
        r->top, parent, (HMENU)0, (HINSTANCE)GetWindowLong(parent,
        GWL_HINSTANCE), &p);

    return hwnd;
    #ifdef XXXXX
        GetWindowRect(hwnd, &r1);
        GetRelativeRect(hwndClient, hwnd, &r1);
        r2 = r1;
        r2.left = r2.right = r2.right + GetSystemMetrics(SM_CXDLGFRAME);
        r2.top -= GetSystemMetrics(SM_CYDLGFRAME);
        r2.bottom += GetSystemMetrics(SM_CYDLGFRAME);
        CreateFrameWindow(hwndClient, &r2, 1);

        GetClientRect(hwndClient, &r2);
        r1.left = 0;
        r1.right = r2.right;
        r1.top = r1.bottom = r1.bottom + GetSystemMetrics(SM_CYDLGFRAME);
        CreateFrameWindow(hwndClient, &r1, 0);
        return hwnd;
    #endif 
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?