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

📄 window.c

📁 linux下的图形界面开发minigui最新源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        return SBPOS_RIGHTSPACE;    return SBPOS_THUMB;}static int wndGetVScrollBarPos (PMAINWIN pWin, int x, int y){    RECT rcBar;    RECT rcArea;    if (pWin->vscroll.status & SBS_DISABLED)        return SBPOS_UNKNOWN;    wndGetVScrollBarRect (pWin, &rcBar);    if (!PtInRect (&rcBar, x, y))        return SBPOS_UNKNOWN;    rcArea.left  = rcBar.left;    rcArea.right = rcBar.right;    // Left arrow area    rcArea.top = rcBar.top;    rcArea.bottom = rcArea.top + GetMainWinMetrics (MWM_CYVSCROLL);    if (PtInRect (&rcArea, x, y))        return SBPOS_UPARROW;    // Right arrow area    rcArea.top = rcBar.bottom - GetMainWinMetrics (MWM_CYVSCROLL);    rcArea.bottom = rcBar.bottom;    if (PtInRect (&rcArea, x, y))        return SBPOS_DOWNARROW;    if (y < (rcBar.top + pWin->vscroll.barStart            + GetMainWinMetrics (MWM_CYVSCROLL)))        return SBPOS_UPSPACE;    if (y > (rcBar.top + pWin->vscroll.barStart + pWin->vscroll.barLen            + GetMainWinMetrics (MWM_CYVSCROLL)))        return SBPOS_DOWNSPACE;    return SBPOS_THUMB;}#ifndef _FLAT_WINDOW_STYLEstatic BOOL sbGetSBarArrowPos (PMAINWIN pWin, int location,                             int* x, int* y, int* w, int* h){    RECT rcBar;    if (location < SBPOS_UPARROW)         wndGetHScrollBarRect (pWin, &rcBar);    else        wndGetVScrollBarRect (pWin, &rcBar);    *w = GetMainWinMetrics (MWM_CXHSCROLL);    *h = GetMainWinMetrics (MWM_CYHSCROLL);    switch (location) {        case SBPOS_LEFTARROW:            *x = rcBar.left;            *y = rcBar.top;        break;                case SBPOS_RIGHTARROW:            *x = rcBar.right - GetMainWinMetrics (MWM_CXHSCROLL) ;            *y = rcBar.top;        break;        case SBPOS_UPARROW:            *x = rcBar.left;            *y = rcBar.top;        break;        case SBPOS_DOWNARROW:            *x = rcBar.left;            *y = rcBar.bottom - GetMainWinMetrics (MWM_CYVSCROLL);        break;        default:        return FALSE;    }    *x -= pWin->left;    *y -= pWin->top;    return TRUE;}static BOOL sbGetButtonPos (PMAINWIN pWin, int location,                             int* x, int* y, int* w, int* h){    RECT rc;    int iBorder;    int iCaption = 0, bCaption;    int iIconX = 0;    int iIconY = 0;    // scroll bar position    if (location & SBPOS_MASK)        return sbGetSBarArrowPos (pWin, location, x, y, w, h);    iBorder = wndGetBorder (pWin);    if (!(pWin->dwStyle & WS_CAPTION))         return FALSE;    if (pWin->hIcon)    {        iIconX = GetMainWinMetrics(MWM_ICONX);        iIconY = GetMainWinMetrics(MWM_ICONY);    }    iCaption = GetMainWinMetrics(MWM_CAPTIONY);    bCaption = iBorder + iCaption - 1;    rc.left = iBorder;    rc.top = iBorder;    rc.right = pWin->right - pWin->left - iBorder;    rc.bottom = iBorder + iCaption;                        // close button    *x = rc.right - GetMainWinMetrics (MWM_SB_WIDTH);    *y = GetMainWinMetrics (MWM_SB_HEIGHT);    *w = GetMainWinMetrics (MWM_SB_WIDTH);    if (*y < bCaption) {        *y = iBorder + ((bCaption - *y)>>1);        *h = GetMainWinMetrics (MWM_SB_HEIGHT);    }    else {        *y = iBorder;        *h = iIconY;    }    if (!(pWin->dwExStyle & WS_EX_NOCLOSEBOX)) {        if (location == HT_CLOSEBUTTON)            return TRUE;        *x -= GetMainWinMetrics (MWM_SB_WIDTH);        *x -= GetMainWinMetrics (MWM_SB_INTERX)<<1;    }    if (pWin->dwStyle & WS_MAXIMIZEBOX) {        // restore/maximize button        if (location == HT_MAXBUTTON)            return TRUE;        *x -= GetMainWinMetrics (MWM_SB_WIDTH);        *x -= GetMainWinMetrics (MWM_SB_INTERX);    }    if (pWin->dwStyle & WS_MINIMIZEBOX) {        // minimize button.        if (location == HT_MINBUTTON)            return TRUE;    }    return FALSE;}static BOOL sbDownButton (PMAINWIN pWin, int downCode){    HDC hdc;    int x, y, w, h;        if (!sbGetButtonPos (pWin, downCode, &x, &y, &w, &h))        return FALSE;    hdc = GetDC ((HWND)pWin);    w += x - 1;    h += y - 1;#if 0    Draw3DDownFrame (hdc, x, y, w, h, 0);#else    SetPenColor (hdc, GetWindowElementColor (WEC_FLAT_BORDER));    Rectangle (hdc, x, y, w, h);    SetPenColor (hdc, GetWindowElementColor (BKC_CONTROL_DEF));    Rectangle (hdc, x + 1, y + 1, w - 1, h - 1);#endif    ReleaseDC (hdc);    return TRUE;}static BOOL sbUpButton (PMAINWIN pWin, int downCode){    HDC hdc;    int x, y, w, h;    PBITMAP bmp = NULL;    int xo = 0, yo = 0, bw = 0, bh = 0;        if (!sbGetButtonPos (pWin, downCode, &x, &y, &w, &h))        return FALSE;    hdc = GetDC ((HWND)pWin);    switch (downCode) {        case HT_MAXBUTTON:            bmp = GetSystemBitmap (SYSBMP_CAPBTNS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight;            xo = yo = 0;            break;        case HT_MINBUTTON:            bmp = GetSystemBitmap (SYSBMP_CAPBTNS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight;            xo = bw; yo = 0;            break;        case HT_CLOSEBUTTON:            bmp = GetSystemBitmap (SYSBMP_CAPBTNS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight;            xo = (bw << 1) + bw; yo = 0;            break;        case SBPOS_UPARROW:            bmp = GetSystemBitmap (SYSBMP_ARROWS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight >> 1;            xo = yo = 0;            break;        case SBPOS_DOWNARROW:            bmp = GetSystemBitmap (SYSBMP_ARROWS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight >> 1;            xo = bw; yo = 0;            break;        case SBPOS_LEFTARROW:            bmp = GetSystemBitmap (SYSBMP_ARROWS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight >> 1;            xo = bw << 1; yo = 0;            break;        case SBPOS_RIGHTARROW:            bmp = GetSystemBitmap (SYSBMP_ARROWS);            bw = bmp->bmWidth >> 2;            bh = bmp->bmHeight >> 1;            xo = (bw << 1) + bw; yo = 0;            break;    }    if (bmp)        FillBoxWithBitmapPart (hdc, x, y, bw, bh, 0, 0, bmp, xo, yo);    ReleaseDC (hdc);    return TRUE;}#else#define sbDownButton(pWin, downCode)#define sbUpButton(pWin, downCode)#endifint MenuBarHitTest (HWND hwnd, int x, int y);static void wndTrackMenuBarOnMouseMove(PMAINWIN pWin, int message,                                     int location, int x, int y){    PMENUBAR pMenuBar;    int oldBarItem;    int barItem;    pMenuBar = (PMENUBAR)(pWin->hMenu);    if (!pMenuBar) return;    oldBarItem = pMenuBar->hilitedItem;        if (location == HT_OUT) {        if (oldBarItem >= 0)            HiliteMenuBarItem ((HWND)pWin, oldBarItem, HMF_DEFAULT);        return;    }    barItem = MenuBarHitTest ((HWND)pWin, x, y);    if (barItem != oldBarItem) {        if (oldBarItem >= 0)            HiliteMenuBarItem ((HWND)pWin, oldBarItem, HMF_DEFAULT);        if (barItem >= 0) {            HiliteMenuBarItem ((HWND)pWin, barItem, HMF_UPITEM);            pMenuBar->hilitedItem = barItem;            pMenuBar->hiliteFlag = HMF_UPITEM;        }        else            pMenuBar->hilitedItem = -1;    }}static BOOL wndHandleHScrollBar (PMAINWIN pWin, int message, int x, int y){    static int downPos = SBPOS_UNKNOWN;    static int movePos = SBPOS_UNKNOWN;    static int sbCode;    static int oldBarStart;    static int oldThumbPos;    static int oldx;    int curPos;    RECT rcBar;    wndGetHScrollBarRect (pWin, &rcBar);    rcBar.left += GetMainWinMetrics (MWM_CXHSCROLL);    rcBar.right -= GetMainWinMetrics (MWM_CXHSCROLL);    curPos = wndGetHScrollBarPos (pWin, x, y);    if (curPos == SBPOS_UNKNOWN && downPos == SBPOS_UNKNOWN)        return FALSE;        switch( message )    {        case MSG_NCLBUTTONDOWN:            oldBarStart = pWin->hscroll.barStart;            oldThumbPos = pWin->hscroll.curPos;            oldx = x;            downPos = curPos;            movePos = curPos;            if (curPos == SBPOS_LEFTARROW) {                sbDownButton (pWin, curPos);                if (pWin->hscroll.curPos == pWin->hscroll.minPos)                    break;                sbCode = SB_LINELEFT;            }            else if (curPos == SBPOS_RIGHTARROW) {                sbDownButton (pWin, curPos);                if (pWin->hscroll.curPos == pWin->hscroll.maxPos)                    break;                                sbCode = SB_LINERIGHT;            }            else if (curPos == SBPOS_LEFTSPACE) {                if (pWin->hscroll.curPos == pWin->hscroll.minPos)                    break;                sbCode = SB_PAGELEFT;            }            else if (curPos == SBPOS_RIGHTSPACE) {                if (pWin->hscroll.curPos == pWin->hscroll.maxPos)                    break;                                sbCode = SB_PAGERIGHT;            }            else if (curPos == SBPOS_THUMB) {                sbCode = SB_THUMBTRACK;                break;            }            SendNotifyMessage ((HWND)pWin, MSG_HSCROLL, sbCode, 0);            SetAutoRepeatMessage ((HWND)pWin, MSG_HSCROLL, sbCode, 0);        break;        case MSG_NCLBUTTONUP:            if (sbCode == SB_THUMBTRACK && downPos == SBPOS_THUMB) {                int newBarStart = oldBarStart + x - oldx;                int newThumbPos = newBarStart                    * (pWin->hscroll.maxPos - pWin->hscroll.minPos + 1)                     / (rcBar.right - rcBar.left) + pWin->hscroll.minPos;                                    if (newThumbPos != oldThumbPos                    && newThumbPos >= pWin->hscroll.minPos                    && newThumbPos <= pWin->hscroll.maxPos)                    SendNotifyMessage ((HWND)pWin,                        MSG_HSCROLL, SB_THUMBPOSITION, newThumbPos);                downPos = SBPOS_UNKNOWN;                movePos = SBPOS_UNKNOWN;                break;            }                        if (downPos != SBPOS_UNKNOWN) {                sbUpButton (pWin, curPos);                SendNotifyMessage ((HWND)pWin, MSG_HSCROLL, SB_ENDSCROLL, 0);                SetAutoRepeatMessage (HWND_DESKTOP, 0, 0, 0);            }            downPos = SBPOS_UNKNOWN;            movePos = SBPOS_UNKNOWN;        break;            case MSG_NCMOUSEMOVE:            if (sbCode == SB_THUMBTRACK && downPos == SBPOS_THUMB) {                int newBarStart = oldBarStart + x - oldx;                int newThumbPos = newBarStart                    * (pWin->hscroll.maxPos - pWin->hscroll.minPos + 1)                     / (rcBar.right - rcBar.left) + pWin->hscroll.minPos;                                    if (newThumbPos != oldThumbPos                        && newThumbPos >= pWin->hscroll.minPos                        && newThumbPos <= pWin->hscroll.maxPos) {                    SendNotifyMessage ((HWND)pWin,                        MSG_HSCROLL, SB_THUMBTRACK, newThumbPos);                    oldThumbPos = newThumbPos;                }                movePos = curPos;                break;            }            if (movePos == downPos && curPos != downPos)                sbUpButton (pWin, downPos);            else if (movePos != downPos && curPos == downPos)                sbDownButton (pWin, downPos);            movePos = curPos;        break;    }    return TRUE;}static BOOL wndHandleVScrollBar (PMAINWIN pWin, int message, int x, int y){    static int downPos = SBPOS_UNKNOWN;    static int movePos = SBPOS_UNKNOWN;    static int sbCode;    static int oldBarStart;    static int oldThumbPos;    static int oldy;    int curPos;    RECT rcBar;    int newBarStart;    int newThumbPos;

⌨️ 快捷键说明

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