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

📄 window.c

📁 在ecos 下mingui 的移植开发
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (fGetDC)        ReleaseDC (hdc);}// this function is CONTROL safe.static void wndDrawNCFrame(MAINWIN* pWin, HDC hdc, const RECT* prcInvalid){    BOOL fGetDC = FALSE;        if (hdc == 0) {        hdc = GetDC ((HWND)pWin);        fGetDC = TRUE;    }            if (prcInvalid)        ClipRectIntersect (hdc, prcInvalid);    wndDrawNCArea (pWin, hdc);    wndDrawScrollBar (pWin, hdc);    if (pWin->WinType == TYPE_MAINWIN) {        wndDrawCaption (pWin, hdc, !(pWin->dwStyle & WS_DISABLED)             && (GetActiveWindow() == (HWND)pWin));        DrawMenuBarHelper (pWin, hdc, prcInvalid);    }    else {        wndDrawCaption (pWin, hdc, !(pWin->dwStyle & WS_DISABLED) &&                 ((PCONTROL)pWin)->pParent->active == (PCONTROL)pWin);    }    if (fGetDC)        ReleaseDC (hdc);}// this function is CONTROL safe.static void wndActiveMainWindow (PMAINWIN pWin, BOOL fActive){    HDC hdc;    hdc = GetDC ((HWND)pWin);    wndDrawCaption (pWin, hdc, fActive);            ReleaseDC (hdc);}static void OnShowWindow (PMAINWIN pWin, int iShowCmd){    PCONTROL pCtrl;        if (iShowCmd != SW_HIDE) {                pCtrl = (PCONTROL)(pWin->hFirstChild);        while (pCtrl) {            ShowWindow ((HWND)pCtrl, iShowCmd);            pCtrl = pCtrl->next;        }    }}static int DefaultPaintMsgHandler(PMAINWIN pWin, int message,                           WPARAM wParam, LPARAM lParam){    switch( message )    {        case MSG_SHOWWINDOW:            OnShowWindow (pWin, (int)wParam);        break;                case MSG_NCPAINT:            wndDrawNCFrame (pWin, (HDC)wParam, (const RECT*)lParam);        break;        case MSG_ERASEBKGND:            wndEraseBackground (pWin, (HDC)wParam, (const RECT*)lParam);        break;        case MSG_NCACTIVATE:            wndActiveMainWindow (pWin, (BOOL)wParam);        break;        case MSG_SYNCPAINT:            wndActiveMainWindow (pWin, (BOOL)wParam);            PostMessage ((HWND)pWin, MSG_NCPAINT, 0, 0);            PostMessage ((HWND)pWin, MSG_ERASEBKGND, 0, 0);        break;        case MSG_PAINT:        {            PINVRGN pInvRgn;            pInvRgn = &pWin->InvRgn;            pthread_mutex_lock (&pInvRgn->lock);            EmptyClipRgn (&pInvRgn->rgn);            pthread_mutex_unlock (&pInvRgn->lock);        }        break;    }    return 0;}static int DefaultControlMsgHandler(PMAINWIN pWin, int message,                           WPARAM wParam, LPARAM lParam){    HDC hdc;    switch( message )    {        case MSG_ENABLE:            if ( (!(pWin->dwStyle & WS_DISABLED) && !wParam)                    || ((pWin->dwStyle & WS_DISABLED) && wParam) ) {                if (wParam)                    pWin->dwStyle &= ~WS_DISABLED;                else                    pWin->dwStyle |=  WS_DISABLED;            }        break;                case MSG_SYSCOMMAND:            if (wParam == SC_CLOSE)                SendNotifyMessage ((HWND)pWin, MSG_CLOSE, 0, 0);        break;        case MSG_GETTEXTLENGTH:            if (pWin->spCaption)                return strlen (pWin->spCaption);            else                return 0;        case MSG_GETTEXT:            if (pWin->spCaption) {                int len;                char* buffer = (char*)lParam;                len = min (strlen (pWin->spCaption), wParam);                memcpy (buffer, pWin->spCaption, len);                buffer [len] = '\0';                return len;            }            else                return 0;        break;        case MSG_SETTEXT://// NOTE:// this message is only implemented for main window.// for CONTROL, must handle this message and should NOT // call default window procedure// when handle MSG_SETTEXT.//            if (pWin->WinType == TYPE_CONTROL)                return 0;            FreeFixStr (pWin->spCaption);            pWin->spCaption = FixStrAlloc (strlen ((char*)lParam));            strcpy (pWin->spCaption, (char*)lParam);            hdc = GetDC ((HWND)pWin);            wndDrawCaption(pWin, hdc, GetForegroundWindow () == (HWND)pWin);            ReleaseDC (hdc);        break;    }    return 0;}static int DefaultSessionMsgHandler(PMAINWIN pWin, int message,                           WPARAM wParam, LPARAM lParam){// NOTE:// Currently does nothing, should handle fowllowing messages://// MSG_QUERYENDSESSION:// MSG_ENDSESSION:        return 0;}static int DefaultSystemMsgHandler(PMAINWIN pWin, int message,                            WPARAM wParam, LPARAM lParam){// NOTE:// Currently does nothing, should handle following messages://// MSG_IDLE, MSG_CARETBLINK:    if (message == MSG_IDLE) {        if (pWin == GetMainWindow (sg_repeat_msg.hwnd))            SendNotifyMessage (sg_repeat_msg.hwnd,                     sg_repeat_msg.message, sg_repeat_msg.wParam, sg_repeat_msg.lParam);    }    else if (message == MSG_CARETBLINK) {        BlinkCaret ((HWND)pWin);    }        return 0;}// NOTE:// This default main window call-back procedure// also implemented for control.int DefaultMainWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam){    PMAINWIN pWin = (PMAINWIN)hWnd;    if (message >= MSG_FIRSTMOUSEMSG && message <= MSG_NCMOUSEOFF)        return DefaultMouseMsgHandler(pWin, message,             wParam, LOWORD (lParam), HIWORD (lParam));    else if (message > MSG_NCMOUSEOFF && message <= MSG_LASTMOUSEMSG)        return DefaultNCMouseMsgHandler(pWin, message,             (int)wParam, LOWORD (lParam), HIWORD (lParam));    else if (message >= MSG_FIRSTKEYMSG && message <= MSG_LASTKEYMSG)        return DefaultKeyMsgHandler(pWin, message, wParam, lParam);    else if (message >= MSG_FIRSTPOSTMSG && message <= MSG_LASTPOSTMSG)        return DefaultPostMsgHandler(pWin, message, wParam, lParam);    else if (message >= MSG_FIRSTCREATEMSG && message <= MSG_LASTCREATEMSG)         return DefaultCreateMsgHandler(pWin, message, wParam, lParam);    else if (message >= MSG_FIRSTPAINTMSG && message <= MSG_LASTPAINTMSG)         return DefaultPaintMsgHandler(pWin, message, wParam, lParam);    else if (message >= MSG_FIRSTSESSIONMSG && message <= MSG_LASTSESSIONMSG)         return DefaultSessionMsgHandler(pWin, message, wParam, lParam);    else if (message >= MSG_FIRSTCONTROLMSG && message <= MSG_LASTCONTROLMSG)         return DefaultControlMsgHandler(pWin, message, wParam, lParam);    else if (message >= MSG_FIRSTSYSTEMMSG && message <= MSG_LASTSYSTEMMSG)         return DefaultSystemMsgHandler(pWin, message, wParam, lParam);    return 0;}int DefaultControlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){    if (message == MSG_SETTEXT)        return 0;    else if (message == MSG_SETCURSOR) {        if (GetWindowExStyle (hWnd) & WS_EX_USEPARENTCURSOR)            return 0;        SetCursor (GetWindowCursor (hWnd));        return 0;    }    else if (message == MSG_NCSETCURSOR) {        SetCursor (GetSystemCursor (IDC_ARROW));        return 0;    }    return DefaultMainWinProc (hWnd, message, wParam, lParam);}/************************* GUI calls support ********************************/HWND GUIAPI SetFocus (HWND hWnd){    PMAINWIN pWin;    PMAINWIN pActiveMain;    HWND hOldActive;        if (IsMainWindow (hWnd))        return SetActiveWindow (hWnd);    pWin = GetMainWindow (hWnd);    if (pWin->hActiveChild != hWnd) {        pActiveMain = (PMAINWIN)GetActiveWindow ();        if (pActiveMain == pWin) {                    hOldActive =  pWin->hActiveChild;                        if (hOldActive)                SendMessage (hOldActive, MSG_KILLFOCUS, 0, 0);                            pWin->hActiveChild = hWnd;            SendMessage (hWnd, MSG_SETFOCUS, 0, 0);            return hOldActive;        }        else {            hOldActive =  pWin->hActiveChild;            pWin->hActiveChild = hWnd;            return hOldActive;        }    }        return HWND_DESKTOP;}HWND GUIAPI GetFocus(void){    HWND hActiveMainWin;    PMAINWIN pActiveMainWin;    hActiveMainWin = GetActiveWindow ();    if (hActiveMainWin != HWND_DESKTOP) {        pActiveMainWin = (PMAINWIN)hActiveMainWin;        if (pActiveMainWin->hActiveChild)            return pActiveMainWin->hActiveChild;        return hActiveMainWin;    }            return HWND_DESKTOP; }HWND GUIAPI GetFocusChild (HWND hMainWnd){    PMAINWIN pWin;        pWin = GetMainWindow (hMainWnd);    if (pWin)        return pWin->hActiveChild;        return 0;}HWND GUIAPI SetCapture(HWND hWnd){    return (HWND) SendMessage (HWND_DESKTOP, MSG_SETCAPTURE, (WPARAM)hWnd, 0);}HWND GUIAPI GetCapture(void){    return (HWND) SendMessage (HWND_DESKTOP, MSG_GETCAPTURE, 0, 0);}void GUIAPI ReleaseCapture(void){    SendMessage (HWND_DESKTOP, MSG_SETCAPTURE, 0, 0);}// NOTE: this function support ONLY main window.HWND GUIAPI SetActiveWindow(HWND hMainWnd){    HWND hOld;        if (!IsMainWindow (hMainWnd))        return HWND_INVALID;    hOld = (HWND) SendMessage (HWND_DESKTOP, MSG_SETACTIVEMAIN,                (WPARAM)hMainWnd, 0);    SendMessage (hMainWnd, MSG_NCACTIVATE, TRUE, 0);    if (hOld)        SendMessage (hOld, MSG_NCACTIVATE, FALSE, 0);    return hOld;}// NOTE: this function support ONLY main window.HWND GUIAPI GetActiveWindow(void){    return (HWND)SendMessage (HWND_DESKTOP, MSG_GETACTIVEMAIN, 0, 0);}int WinMainMetrics[MWM_ITEM_NUMBER];void InitMainWinMetrics(){    WinMainMetrics[MWM_MINWIDTH] = 50;    WinMainMetrics[MWM_MINHEIGHT] = 50;    WinMainMetrics[MWM_BORDER] = 2;    WinMainMetrics[MWM_THICKFRAME] = 2;    WinMainMetrics[MWM_THINFRAME] = 1;    WinMainMetrics[MWM_CAPTIONY] = GetSysCharHeight() + 4;    WinMainMetrics[MWM_ICONX] = 16;    WinMainMetrics[MWM_ICONY] = 16;    WinMainMetrics[MWM_MENUBARY] = GetSysCharHeight();    WinMainMetrics[MWM_MENUBAROFFX] = 8;    WinMainMetrics[MWM_MENUBAROFFY] = 5;    WinMainMetrics[MWM_MENUITEMY] = GetSysCharHeight();    WinMainMetrics[MWM_INTERMENUITEMX] = GetSysCharWidth() << 1;    WinMainMetrics[MWM_INTERMENUITEMY] = 2;    WinMainMetrics[MWM_MENUITEMOFFX] = 18;    WinMainMetrics[MWM_MENUTOPMARGIN] = 4;    WinMainMetrics[MWM_MENUBOTTOMMARGIN] = 4;    WinMainMetrics[MWM_MENULEFTMARGIN] = 4;    WinMainMetrics[MWM_MENURIGHTMARGIN] = 4;    WinMainMetrics[MWM_MENUITEMMINX] = 64;    WinMainMetrics[MWM_MENUSEPARATORY] = 4;    WinMainMetrics[MWM_MENUSEPARATORX] = 4;    WinMainMetrics[MWM_SB_WIDTH] = 16;    WinMainMetrics[MWM_SB_HEIGHT] = 14;    WinMainMetrics[MWM_SB_INTERX] = 2;    WinMainMetrics[MWM_CXVSCROLL] = GetSysCCharWidth();    WinMainMetrics[MWM_CYVSCROLL] = GetSysCCharWidth();    WinMainMetrics[MWM_CXHSCROLL] = GetSysCCharWidth();    WinMainMetrics[MWM_CYHSCROLL] = GetSysCCharWidth();    WinMainMetrics[MWM_MINBARLEN] = 8;    WinMainMetrics[MWM_DEFBARLEN] = 18;}/*************************** Main window and thread **************************/BOOL GUIAPI IsWindow (HWND hWnd){    PCONTROL pWin;    pWin = (PCONTROL) hWnd;    if (hWnd == HWND_DESKTOP || pWin->DataType != TYPE_HWND)        return FALSE;    return TRUE;}BOOL GUIAPI IsMainWindow(HWND hWnd){    PCONTROL pChildWin;    pChildWin = (PCONTROL)hWnd;    if(pChildWin->DataType != TYPE_HWND) return FALSE;    if(pChildWin->WinType == TYPE_MAINWIN) return TRUE;    return FALSE;}BOOL GUIAPI IsControl(HWND hWnd){    PCONTROL pChildWin;    pChildWin = (PCONTROL)hWnd;    if(pChildWin->DataType != TYPE_HWND) return FALSE;    if(pChildWin->WinType == TYPE_CONTR

⌨️ 快捷键说明

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