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

📄 project.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 3 页
字号:
    PROJLIST *tp;
    NM_TREEVIEW *nm;
    FILELIST *list;
    DWINFO info;
    HMENU menu, popup;
    POINT pos;
    char buf[256];
    OPENFILENAME ofn;
    LPNMTVKEYDOWN key;
    switch (iMessage)
    {
        case WM_SYSCOMMAND:
            if (wParam == SC_CLOSE)
                SendMessage(hwnd, WM_CLOSE, 0, 0);
            break;
        case WM_SETTEXT:
            return SendMessage(hwndTab, iMessage, wParam, lParam);
        case WM_LBUTTONDOWN:
        case WM_RBUTTONDOWN:
            SetFocus(hwnd);
            break;
        case WM_NOTIFY:
            nm = (NM_TREEVIEW*)lParam;
            switch (nm->hdr.code)
            {
            case TVN_KEYDOWN:
                key = (LPNMTVKEYDOWN)lParam;
                switch (key->wVKey)
                {
                case VK_INSERT:
                    if (GetKeyState(VK_CONTROL) &0x80000000)
                        CollapseExpand(selectedProj, selectedItem, TVE_EXPAND);
                    else if (!(GetKeyState(VK_SHIFT) &0x8000000))
                    {
                        if (selectedItem > 0 && !selectedHeader)
                        {
                            PostMessage(hwnd, WM_COMMAND, IDM_ADDFILES, 0);
                        }
                        else if (selectedItem == 0)
                        {
                            PostMessage(hwnd, WM_COMMAND, IDM_ADDTARGET, 0);
                        }
                    }
                    break;
                case VK_DELETE:
                    if (GetKeyState(VK_CONTROL) &0x80000000)
                        CollapseExpand(selectedProj, selectedItem, TVE_COLLAPSE)
                            ;
                    else if (!(GetKeyState(VK_SHIFT) &0x8000000))
                    {
                        if (selectedItem > 0 && !selectedHeader)
                        {
                            if (ExtendedMessageBox("Remove File", MB_YESNO, 
                                "Delete the selected file?") == IDYES)
                                PostMessage(hwnd, WM_COMMAND, IDM_REMOVEFILES,
                                    0);
                        }
                        else if (selectedItem == 0)
                        {
                            if (ExtendedMessageBox("Remove Target", MB_YESNO, 
                                "Delete the selected target?") == IDYES)
                                PostMessage(hwnd, WM_COMMAND, IDM_REMOVETARGET,
                                    0);
                        }
                    }
                    break;
                case VK_RETURN:
                    if (selectedItem && selectedItem > 0)
                        SendMessage(hwnd, WM_COMMAND, IDM_OPENFILES, 0);
                    break;
                }
                break;
            case NM_DBLCLK:
                FindItemByPoint(hwnd, &selectedProj, &selectedItem,
                    &selectedHeader);
                if (selectedItem < 0)
                    break;
                PostMessage(hwnd, WM_COMMAND, IDM_OPENFILES, 0);
                return 0;
            case NM_RCLICK:
                FindItemByPoint(hwnd, &selectedProj, &selectedItem,
                    &selectedHeader);
                menu = LoadMenu(hInstance, "PROJECTMENU");
                popup = GetSubMenu(menu, 0);
                if (!selectedItem)
                {
                    EnableMenuItem(menu, IDM_OPENFILES, MF_GRAYED);
                    EnableMenuItem(menu, IDM_COMPILEVIAPROJ, MF_GRAYED);
                }
                else if (!selectedHeader && selectedItem !=  - 1 &&
                    selectedItem !=  - 3)
                {
                    EnableMenuItem(menu, IDM_PROJECTPROPERTIES, MF_GRAYED);
                    EnableMenuItem(menu, IDM_CALCDEPENDS, MF_GRAYED);
                    EnableMenuItem(menu, IDM_ADDTARGET, MF_GRAYED);
                    EnableMenuItem(menu, IDM_REMOVETARGET, MF_GRAYED);
                }
                else
                {
                    if (selectedItem !=  - 3)
                        EnableMenuItem(menu, IDM_CALCDEPENDS, MF_GRAYED);
                    if (selectedItem !=  - 1)
                        EnableMenuItem(menu, IDM_ADDTARGET, MF_GRAYED);
                    else
                        EnableMenuItem(menu, IDM_OPENFILES, MF_GRAYED);
                    EnableMenuItem(menu, IDM_REMOVETARGET, MF_GRAYED);
                    EnableMenuItem(menu, IDM_ADDFILES, MF_GRAYED);
                    EnableMenuItem(menu, IDM_REMOVEFILES, MF_GRAYED);
                    EnableMenuItem(menu, IDM_COMPILEVIAPROJ, MF_GRAYED);
                    EnableMenuItem(menu, IDM_PROJECTPROPERTIES, MF_GRAYED);
                }
                GetCursorPos(&pos);
                TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON, pos.x,
                    pos.y, hwnd, NULL);
                DestroyMenu(menu);
                break;
            case TVN_SELCHANGED:
                nm = (NM_TREEVIEW*)lParam;
                treeViewSelected = nm->itemNew.hItem;
                FindItemBySelected(hwnd, &selectedProj, &selectedItem,
                    &selectedHeader);
                break;
            }
            break;
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case IDM_CALCDEPENDS:
                changedProject = TRUE;
                CalcDepends(treeWindow, projectList);
                break;
            case IDM_ADDFILES:
                ProjectAddFile(selectedProj, selectedItem);
                SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
                break;
            case IDM_REMOVEFILES:
                ProjectDeleteFile(selectedProj, selectedItem);
                SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
                break;
            case IDM_ADDTARGET:
                ProjectAddTarget(selectedProj);
                SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
                break;
            case IDM_REMOVETARGET:
                ProjectDeleteTarget(selectedProj);
                SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
                break;
            case IDM_COMPILEVIAPROJ:
                Compiler(selectedProj, selectedItem);
                break;
            case IDM_GENMAKE:
                if (projectList && projectList->files)
                {
                    genMakeFile(projectList);
                }
                else
                    ExtendedMessageBox("Makegen Error", MB_SETFOREGROUND |
                        MB_SYSTEMMODAL, 
                        "You need a project with targets and source files to generate a make file");
                break;
            case IDM_STOPBUILD:
            case IDM_BUILDALL:
            case IDM_MAKE:
                Maker(LOWORD(wParam));
                break;
            case IDM_PROJECTPROPERTIES:
                TargetProperties(hInstance, hwnd, selectedProj);
                break;
            case IDM_OPENFILES:
                doopen: if (selectedItem < 0)
                    break;
                selectedItem--;
                list = selectedProj->files;
                for (i = 0; i < selectedItem; i++)
                    if (list)
                        list = list->next;
                if (selectedHeader)
                {
                    DEPENDSLIST *llist = list->depends;
                    for (i = 1; i < selectedHeader; i++)
                        if (llist)
                            llist = llist->next;
                    if (llist)
                    {
                        strcpy(info.dwName, llist->name);
                        strcpy(info.dwTitle, llist->title);
                        info.dwLineNo =  - 1;
                        info.logMRU = FALSE;
                        CreateDrawWindow(&info);
                    }

                }
                else if (list)
                {
                    strcpy(info.dwName, list->name);
                    strcpy(info.dwTitle, list->title);
                    info.dwLineNo =  - 1;
                    info.logMRU = FALSE;
                    CreateDrawWindow(&info);
                }
                break;
            case IDM_CLOSE:
                SendMessage(hwnd, WM_CLOSE, 0, 0);
                break;
            default:
                return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
            }
            break;
        case WM_SETFOCUS:
            SendMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0);
            break;
        case WM_CREATE:
            hwndProject = hwnd;
            SetWindowText(hwnd, szProjectTitle);
            GetClientRect(hwnd, &rs);

            treeViewSelected = 0;
            flyellow = LoadBitmap(hInstance, "ID_FLYELLOW");
            flred = LoadBitmap(hInstance, "ID_FLRED");
            flcyan = LoadBitmap(hInstance, "ID_FLCYAN");
            flgreen = LoadBitmap(hInstance, "ID_FLGREEN");
            flwhite = LoadBitmap(hInstance, "ID_FLWHITE");
            fllib = LoadBitmap(hInstance, "ID_FLLIB");
            fldll = LoadBitmap(hInstance, "ID_FLDLL");
            flexe = LoadBitmap(hInstance, "ID_FLEXE");
            treeIml = ImageList_Create(16, 16, FALSE, 8, 0);
            ilyellow = ImageList_Add(treeIml, flyellow, 0);
            ilred = ImageList_Add(treeIml, flred, 0);
            ilcyan = ImageList_Add(treeIml, flcyan, 0);
            ilgreen = ImageList_Add(treeIml, flgreen, 0);
            ilwhite = ImageList_Add(treeIml, flwhite, 0);
            illib = ImageList_Add(treeIml, fllib, 0);
            ildll = ImageList_Add(treeIml, fldll, 0);
            ilexe = ImageList_Add(treeIml, flexe, 0);
            DeleteObject(flyellow);
            DeleteObject(flred);
            DeleteObject(flcyan);
            DeleteObject(flgreen);
            DeleteObject(flwhite);
            DeleteObject(fllib);
            DeleteObject(fldll);
            DeleteObject(flexe);
            treeWindow = CreateWindowEx(0, WC_TREEVIEW, "", WS_VISIBLE |
                WS_CHILD | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS |
                WS_BORDER, 0, 0, rs.right, rs.bottom, hwnd, (HMENU)ID_TREEVIEW,
                hInstance, NULL);
            TreeView_SetImageList(treeWindow, treeIml, TVSIL_NORMAL);
            projFont = CreateFontIndirect(&fontdata);
            SendMessage(treeWindow, WM_SETFONT, (WPARAM)projFont, 1);
            InitItems(treeWindow, projectList);
            selectedProj = 0;
            selectedItem = selectedHeader = 0;
            return 0;
        case WM_CLOSE:
            break;
        case WM_DESTROY:
            ProjectSaveList(TRUE);
            SaveWorkspace(0);
            DestroyWindow(treeWindow);
            DeleteObject(projFont);
            hwndProject = 0;
            ProjectFreeList();
            break;
        case WM_SIZE:
            MoveWindow(treeWindow, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
            break;
        default:
            break;
    }
    return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}

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

void RegisterProjectWindow(void)
{
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.style = CS_DBLCLKS;
    wc.lpfnWndProc = &ProjectProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = sizeof(void*);
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = 0;
    wc.lpszClassName = szProjectClassName;
    RegisterClass(&wc);
}

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

void NewProject(char *name)
{
    PROJLIST *list = 0;
    RECT rect;
    char buf[256];
    WaitForSingleObject(projectSem, INFINITE);
    if (projectList)
    {
        ProjectSaveList(TRUE);
        SaveWorkspace(0);
    }
    strcpy(szProjectName, name);
    strcpy(szProjectTitle, name);
    if (!strrchr(szProjectName, '.'))
    {
        strcat(szProjectName, ".prj");
        strcat(szProjectTitle, ".prj");
    }
    if (!(list = ProjectLoadList(szProjectName)))
    {
        ReleaseSemaphore(projectSem, 1, 0);
        return ;
    }
    ProjectFreeList();
    ProjectNewList(list);
    RestoreWorkSpace(0, FALSE);
    sprintf(buf, "%s - CC386 IDE", szProjectTitle);
    SetWindowText(hwndFrame, buf);
    InitItems(treeWindow, projectList);
    SetWindowText(hwndProject, szProjectTitle);
    ReleaseSemaphore(projectSem, 1, 0);
}

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

void setProjectMRU(void)
{
    DWINFO info;
    if (szProjectName[0])
    {
        strcpy(info.dwName, szProjectName);
        strcpy(info.dwTitle, szProjectTitle);
        InsertMRU(&info, 1);
        MRUToMenu(1);
    }
}

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

void IndirectProjectThread(DWINFO *info)
{
    PROJLIST *list = 0;
    RECT rect;
    char buf[256];
    WaitForSingleObject(projectSem, INFINITE);
    if (projectList)
    {
        ProjectSaveList(TRUE);
        SaveWorkspace(0);
    }
    strcpy(szProjectTitle, info->dwTitle);
    strcpy(szProjectName, info->dwName);
    if (!(list = ProjectLoadList(szProjectName)))
    {
        ReleaseSemaphore(projectSem, 1, 0);
        return ;
    }
    ProjectFreeList();
    ProjectNewList(list);
    sprintf(buf, "%s - CC386 IDE", szProjectTitle);
    if (IsDebuggerPresent())
        strcat(buf, " (DEBUGEE)");
    SetWindowText(hwndFrame, buf);
    changedProject = FALSE;
    InitItems(treeWindow, projectList);
    SetWindowText(hwndProject, szProjectTitle);
    setProjectMRU();
    ReleaseSemaphore(projectSem, 1, 0);
}

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

void IndirectProjectWindow(DWINFO *info)
{
    DWORD handle;
    CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)
        IndirectProjectThread, (LPVOID)info, 0, &handle));
}

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

void CreateProjectThread(int new)
{
    MDICREATESTRUCT mc;
    PROJLIST *list = 0;
    OPENFILENAME ofn;
    RECT rect;
    if (projectList)
    {
        ProjectSaveList(TRUE);
        SaveWorkspace(0);
    }
    if (!new)
    {
        if (!(OpenFileDialog(&ofn, 0, hwndClient, TRUE, FALSE, szProjectFilter,
            "ProjDir", "Open Project")))
            return ;
        WaitForSingleObject(projectSem, INFINITE);
        if (!strchr(ofn.lpstrFile, '.'))
        {
            strcat(ofn.lpstrFile, ".prj");
            strcat(ofn.lpstrFileTitle, ".prj");
        }
        strcpy(szProjectTitle, ofn.lpstrFileTitle);
        strcpy(szProjectName, ofn.lpstrFile);
        if (!(list = ProjectLoadList(szProjectName)))
            return ;
        RestoreWorkSpace(0, FALSE);
    }
    else
    {

        if (new == 2)
        {
            if (!SaveFileDialog(&ofn, 0, hwndProject, TRUE, szProjectFilter, 
                "ProjDir", "New Project"))
                return ;
            if (!strchr(ofn.lpstrFile, '.'))
            {
                strcat(ofn.lpstrFile, ".prj");
                strcat(ofn.lpstrFileTitle, ".prj");
            }
            WaitForSingleObject(projectSem, INFINITE);
            strcpy(szProjectTitle, ofn.lpstrFileTitle);
            strcpy(szProjectName, ofn.lpstrFile);

        }
        else
        {
            WaitForSingleObject(projectSem, INFINITE);
            szProjectTitle[0] = 0;
            szProjectName[0] = 0;
        }
    }
    if (hwndProject)
    {
        char buf[256];
        ProjectFreeList();
        ProjectNewList(list);
        RestoreWorkSpace(0, FALSE);
        changedProject = FALSE;
        InitItems(treeWindow, projectList);
        SetWindowText(hwndProject, szProjectTitle);
        sprintf(buf, "%s - CC386 IDE", szProjectTitle);
        if (IsDebuggerPresent())
            strcat(buf, " (DEBUGEE)");
        SetWindowText(hwndFrame, buf);
        setProjectMRU();
    }
    else
    {
        HWND parent;
        parent = hwndTabCtrl;
        ProjectNewList(list);
        RestoreWorkSpace(0, FALSE);
        changedProject = FALSE;
        GetTabRect(&rect);
        hwndProject = CreateWindow(szProjectClassName, szProjectTitle,
            WS_VISIBLE | WS_CHILD, rect.left, rect.top, rect.right - rect.left,
            rect.bottom - rect.top, parent, 0, hInstance, 0);
    }
    ReleaseSemaphore(projectSem, 1, 0);
}

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

void CreateProjectWindow(int new, HWND parent)
{
    DWORD handle;
    CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)CreateProjectThread,
        (LPVOID)new, 0, &handle));
}

⌨️ 快捷键说明

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