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

📄 ccide.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 5 页
字号:
                    item.iSubItem = 0;
                    item.mask = LVIF_PARAM;
                    ListView_GetItem(GetDlgItem(hwnd, IDC_FILELIST), &item);
                    SendMessage(hwndClient, WM_MDIACTIVATE, (WPARAM)item.lParam,
                        0);
                    DeleteObject(hfont);
                    EndDialog(hwnd, IDOK);
                }
            }
            return 0;
        case WM_COMMAND:
            switch (wParam &0xffff)
            {
            case IDCANCEL:
                DeleteObject(hfont);
                EndDialog(hwnd, IDCANCEL);
                break;
            }
            break;
        case WM_CLOSE:
            PostMessage(hwnd, WM_COMMAND, IDCANCEL, 0);
            break;
    }
    return 0;
}

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

void ShowWindowList(void)
{
    DialogBoxParam(hInstance, "DLG_MANYWINDOWS", 0, (DLGPROC)WindowShowProc, 0);
}

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

BOOL CALLBACK winmenEnumProc(HWND window, LPARAM param)
{
    HANDLE hsub = (HANDLE)param;
    MENUITEMINFO mi;
    if (GetParent(window) != hwndClient)
        return TRUE;
    if (!IsWindowVisible(window))
        return TRUE;
    if (winMenuCount == 0)
    {
        memset(&mi, 0, sizeof(mi));
        mi.cbSize = sizeof(mi);
        mi.fMask = MIIM_TYPE;
        mi.fType = MFT_SEPARATOR;
        InsertMenuItem(hsub, WindowItemCount, TRUE, &mi);
    }
    memset(&mi, 0, sizeof(mi));
    mi.cbSize = sizeof(mi);
    mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
    mi.fType = MFT_STRING;
    if (winMenuCount == MAX_WINMENU)
    {
        mi.wID = IDM_WINDOW_MORE;
        mi.dwTypeData = "More Windows...";
        InsertMenuItem(hsub, 1+winMenuCount + WindowItemCount, TRUE, &mi);
        return FALSE;
    }
    else
    {
        GetWindowText(window, windowTexts[winMenuCount], 60);
        mi.dwTypeData = &windowTexts[winMenuCount][0];
        mi.wID = ID_WINDOW_LIST + winMenuCount;
        InsertMenuItem(hsub, 1+winMenuCount + WindowItemCount, TRUE, &mi);
        winMenu[winMenuCount] = window;
        winMenuCount++;
        return TRUE;
    }

}

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

void SetWindowMenu(void)
{
    HANDLE hsub = GetSubMenu(hMenuMain, WINDOW_MENU_OFFSET);
    int count = GetMenuItemCount(hsub);
    int i;
    for (i = WindowItemCount; i < count; i++)
        DeleteMenu(hsub, WindowItemCount, MF_BYPOSITION);
    winMenuCount = 0;
    EnumChildWindows(hwndClient, winmenEnumProc, (LPARAM)hsub);

}

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

UINT GetMenuCheckedState(int Id)
{
    return !!(GetMenuState(hMenuMain, Id, MF_BYCOMMAND) &MF_CHECKED);
}

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

void SetMenuCheckedState(int did, int id)
{
    MENUITEMINFO info;

    info.cbSize = sizeof(MENUITEMINFO);
    info.fMask = MIIM_STATE;
    GetMenuItemInfo(hMenuMain, id, MF_BYCOMMAND, &info);
    info.fState = (info.fState &~MFS_CHECKED) | (dmgrGetHiddenState(did) ? 0 :
        MFS_CHECKED);
    SetMenuItemInfo(hMenuMain, id, MF_BYCOMMAND, &info);
}

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

LRESULT CALLBACK _export WndProc(HWND hwnd, UINT iMessage, WPARAM wParam,
    LPARAM lParam)
{
    LRESULT rv;
    static int timerid;
    PROJLIST *proj;
    int sel;
    CLIENTCREATESTRUCT csx;
    static DEBUG_EVENT *dbe;
    static int initted;
    HWND win;
    int mf_state, x_state;
    RECT rs, rf;
    RECT rp, rt;
    POINT pt;
    int parts[4], i;
    LPTOOLTIPTEXT lpt;
    char *name;
    PROJLIST *plist;
    char module[256];
    int linenum;
    HDWP deferstruct;
    char buf[256];
    int selstart, selend;
    switch (iMessage)
    {

        case WM_WINDOWPOSCHANGING:
            // Keeps it from drawing a smaller window prior to the initial
            // ShowWindow....
            if (!readytodraw)
            {
                ((LPWINDOWPOS)lParam)->flags |= SWP_NOREDRAW;
            }
            break;
        case WM_ACTIVATE:
            // check if edit windows changed
            if (LOWORD(wParam) != WA_INACTIVE)
                CheckEditWindowChanged();
            // first activation, init all the windows
            if (!initted)
            {
                initted = TRUE;
                MakeToolBar(hwnd);
                CreateErrorWindow();
                CreateTabWindow();
                CreateWatchWindow();
                CreateASMWindow();
                CreateDumpWindow();
                CreateStackWindow();
                CreateThreadWindow();
                CreateSourceTabWindow();
                CreateRegisterWindow();
                dmgrSetInfo(initialIDs, initialDocks, INITIAL_DOCK_COUNT);
                RestoreDocksFromRegistry();
                SendMessage(hwnd, WM_REDRAWTOOLBAR, 0, 0);
            }
            break;
        case WM_SYSCOMMAND:
            if (wParam == SC_CLOSE)
            {
                PostMessage(hwnd, WM_COMMAND, IDM_EXIT, 0);
                return 0;
            }
            break;
        case WM_EXCEPTION:
            dmgrHideWindow(DID_ASMWND, FALSE);
            dbe = (DEBUG_EVENT*)lParam;
            if (!GetBreakpointLine((DWORD)dbe
                ->u.Exception.ExceptionRecord.ExceptionAddress, &module,
                &linenum))
                dmgrHideWindow(DID_ASMWND, FALSE);
            else
                ApplyBreakAddress(module, linenum);
            if (hwndASM)
                SendMessage(hwndASM, WM_COMMAND, ID_SETADDRESS, lParam);
            SendMessage(hwndError, WM_SETTEXT, ERR_DEBUG_WINDOW, (LPARAM)
                exceptval(dbe->u.Exception.ExceptionRecord.ExceptionCode));
            SendMessage(hwndError, WM_SETTEXT, ERR_DEBUG_WINDOW, (LPARAM)"\r\n")
                ;
            ExtendedMessageBox("Exception", MB_SYSTEMMODAL, "%s", exceptval(dbe
                ->u.Exception.ExceptionRecord.ExceptionCode));
            break;
        case WM_PARENTNOTIFY:
            break;
        case WM_BREAKPOINT:
            dbe = (DEBUG_EVENT*)lParam;
            if (uState != notDebugging)
            {
                if (!GetBreakpointLine((DWORD)dbe
                    ->u.Exception.ExceptionRecord.ExceptionAddress, &module,
                    &linenum))
                    dmgrHideWindow(DID_ASMWND, FALSE);
                else
                    ApplyBreakAddress(module, linenum);
                if (hwndASM)
                    SendMessage(hwndASM, WM_COMMAND, ID_SETADDRESS, lParam);
            }
            break;
        case WM_CREATE:
            if (IsDebuggerPresent())
                SetWindowText(hwnd, "CC386 IDE (DEBUGEE)");
            csx.hWindowMenu = hMenuMain;
            csx.idFirstChild = IDM_FIRSTCHILD;
            hwndStatus = CreateStatusWindow(WS_VISIBLE | WS_CHILD, "", hwnd,
                ID_STATUS_WINDOW);
            GetClientRect(hwnd, &rf);

            hwndClient = CreateWindowEx(0, "MDICLIENT", 0, WS_CHILD +
                WS_CLIPCHILDREN + WS_VISIBLE | MDIS_ALLCHILDSTYLES | WS_BORDER,
                rf.left, rf.top, rf.right - rf.left, rf.bottom - rf.top, hwnd,
                0, hInstance, &csx);
            SendMessage(hwndClient, WM_MDISETMENU, (WPARAM)hMenuMain, (LPARAM)
                GetSubMenu(hMenuMain, ProjectsMenuItem));
            parts[0] = rf.right - 340;
            parts[1] = rf.right - 260;
            parts[2] = rf.right - 180;
            parts[3] = rf.right - 100;
            parts[4] = rf.right - 20;
            SendMessage(hwndStatus, SB_SETPARTS, 5, (LPARAM) &parts[0]);
            SendMessage(hwndStatus, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)
                "    ");
            dmgrInit(hInstance, hwnd, hwndClient, 20);
            dmgrAddStatusBar(hwndStatus);
            break;
        case WM_HELP:
            if (GetKeyState(VK_CONTROL) &0x80000000)
                PostMessage(hwnd, WM_COMMAND, IDM_CONTEXTHELP, 0);
            else
                PostMessage(hwnd, WM_COMMAND, IDM_CCIDEHELP, 0);
            break;
        case WM_COMMAND:
            switch (wParam &0xffff)
            {
            case IDM_WINHELP:
                ShowHelp(0);
                break;
            case IDM_TOOLSHELP:
                strcpy(buf, szInstallPath);
                strcat(buf, "\\help\\tools.hlp");
                WinHelp(hwnd, buf, HELP_CONTENTS, 0);
                break;
            case IDM_CCIDEHELP:
                strcpy(buf, szInstallPath);
                strcat(buf, "\\help\\ccide.hlp");
                WinHelp(hwnd, buf, HELP_CONTENTS, 0);
                break;
            case IDM_ADDWATCH:
                if (uState != atBreakpoint && uState != atException)
                    break;
                name = DialogBoxParam(hInstance, "ADDWATCHDIALOG", hwnd, 
                    (DLGPROC)WatchAddProc, 0);
                if (name)
                    SendMessage(hwndWatch, WM_ADDWATCH, StoppedThread->regs.Eip,
                        (LPARAM)name);
                break;
            case IDM_ADDWATCHINDIRECT:
                if (uState != atBreakpoint && uState != atException)
                    break;
                if (IsWindow(win = (HWND)SendMessage(hwndClient,
                    WM_MDIGETACTIVE, 0, 0)) && !IsSpecialWindow(win))
                    SendMessage(hwndWatch, WM_ADDWATCHINDIRECT, (WPARAM)win, 0);
                break;
            case IDM_DELETEWATCH:
                if (uState != atBreakpoint && uState != atException)
                    break;
                SendMessage(hwndWatch, iMessage, wParam, lParam);
                break;
                #ifdef HBREAK
                case IDM_HBREAK:
                    hbpDialog();
                    break;
                #endif 
            case IDM_STARTSTOP:
                i = SendMessage(hwndToolDebug, TB_GETSTATE, IDM_STARTSTOP, 0);
                if (!(i &TBSTATE_CHECKED))
                {
                    abortDebug();
                    break;
                }
                // fall through 
            case IDM_STARTDEBUGGING:
                if (uState != notDebugging)
                    break;
                dbgRebuildMain(wParam);
                break;
            case IDM_STOPDEBUGGING:
                if (uState == notDebugging)
                    break;
                abortDebug();
                break;
            case IDM_STEPIN:
                if (uState != notDebugging && uState != Running)
                {
                    StepIn(dbe);
                    if (hwndASM)
                        InvalidateRect(hwndASM, 0, 1);
                }
                break;
            case IDM_RUN:
            case IDM_RUNF5:
                if (uState != notDebugging && uState != Running)
                {
                    SaveRegisterContext();
                    ReleaseSemaphore(BreakpointSem, 1, 0);
                    if (hwndASM)
                        InvalidateRect(hwndASM, 0, 1);
                }
                else if (uState == notDebugging)
                {
                    PostMessage(hwnd, WM_COMMAND, IDM_STARTDEBUGGING, 0);
                }
                break;
            case IDM_STOP:
                if (uState != Running)
                    break;
                StopRunning(nullState);
                break;
            case IDM_STEPOVER:
                if (uState != notDebugging && uState != Running)
                {
                    StepOver(dbe);
                    if (hwndASM)
                        InvalidateRect(hwndASM, 0, 1);
                }
                break;
            case IDM_STEPOUT:
                if (uState != notDebugging && uState != Running)
                {
                    StepOut(dbe);
                    if (hwndASM)
                        InvalidateRect(hwndASM, 0, 1);
                }
                break;
            case IDM_RUNTO:
                if (RunTo(dbe))
                {
                    if (hwndASM)
                        InvalidateRect(hwndASM, 0, 1);
                }
                break;
            case IDM_BREAKPOINT:
                SetBP(dbe);
                break;
            case IDM_VIEWBUILDBAR:
                x_state = GetMenuCheckedState(IDM_VIEWBUILDBAR);
                dmgrHideWindow(DID_BUILDTOOL, x_state);
                break;
            case IDM_VIEWEDITBAR:
                x_state = GetMenuCheckedState(IDM_VIEWEDITBAR);
                dmgrHideWindow(DID_EDITTOOL, x_state);
                break;
            case IDM_VIEWDEBUGBAR:
                x_state = GetMenuCheckedState(IDM_VIEWDEBUGBAR);
                dmgrHideWindow(DID_DEBUGTOOL, x_state);
                break;
            case IDM_VIEWSTACK:
                dmgrHideWindow(DID_STACKWND, FALSE);
                break;
            case IDM_VIEWTHREAD:
                dmgrHideWindow(DID_THREADWND, FALSE);
                break;
            case IDM_VIEWASM:
                dmgrHideWindow(DID_ASMWND, FALSE);
                break;
            case IDM_VIEWDUMP:

⌨️ 快捷键说明

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