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

📄 maindialog.cpp

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        PriVal = ABOVE_NORMAL_PRIORITY_CLASS;
    else
    if (PriID == PriNormalID)
        PriVal = NORMAL_PRIORITY_CLASS;
    else
    if (PriID == PriBelowNormID)
        PriVal = BELOW_NORMAL_PRIORITY_CLASS;
    else
    if (PriID == PriIdleID)
        PriVal = IDLE_PRIORITY_CLASS;

    if (!GetRegKeys (&RegKey))
        return;

    RegSetValueEx
    (
        RegKey,
        L"Default Action",
        0,
        REG_DWORD,
        (CONST BYTE *)&DefragVal,
        sizeof (DefragVal)
    );

    RegSetValueEx
    (
        RegKey,
        L"Process Priority",
        0,
        REG_DWORD,
        (CONST BYTE *)&PriVal,
        sizeof (PriVal)
    );

    DoneRegKey (RegKey);
    return;
}


void LoadSettings (HWND Dlg)
{
    DefragType DType;
    DWORD      DTypeVal;
    LRESULT    DefragID;
    DWORD      PriVal;
    LRESULT    PriID;
    HKEY       RegKey;
    DWORD      RegType;
    DWORD      RegSize;
    LONG       Error;

    if (!GetRegKeys (&RegKey))
        return;

    RegSize = sizeof (DTypeVal);
    RegType = REG_DWORD;

    Error = RegQueryValueEx
    (
        RegKey,
        L"Default Action",
        0,
        &RegType,
        (BYTE *)&DTypeVal,
        &RegSize
    );

    if (Error != ERROR_SUCCESS)
        DTypeVal = DefragAnalyze;

    Error = RegQueryValueEx
    (
        RegKey,
        L"Process Priority",
        0,
        &RegType,
        (BYTE *)&PriVal,
        &RegSize
    );

    DoneRegKey (RegKey);

    if (Error != ERROR_SUCCESS)
        PriVal = NORMAL_PRIORITY_CLASS;

    DType = (DefragType) DTypeVal;
    switch (DType)
    {
        default:
        case DefragAnalyze:
            DefragID = AnalyzeID;
            break;

        case DefragFast:
            DefragID = FastID;
            break;

        case DefragExtensive:
            DefragID = ExtensiveID;
            break;
    }

    switch (PriVal)
    {
        case HIGH_PRIORITY_CLASS:
            PriID = PriHighID;
            break;

        case ABOVE_NORMAL_PRIORITY_CLASS:
            PriID = PriAboveNormID;
            break;

        default:
        case NORMAL_PRIORITY_CLASS:
            PriID = PriNormalID;
            break;

        case BELOW_NORMAL_PRIORITY_CLASS:
            PriID = PriBelowNormID;
            break;

        case IDLE_PRIORITY_CLASS:
            PriID = PriIdleID;
            break;
    }

    SendDlgItemMessage (Dlg, IDC_PRIORITY_LIST, CB_SETCURSEL, PriID,    0);
    SendDlgItemMessage (Dlg, IDC_METHODS_LIST,  CB_SETCURSEL, DefragID, 0);
    return;
}


#define IDLETIME 25
wstring OldWindowText = L"";

INT_PTR CALLBACK MainDialogProc (HWND Dlg, UINT Msg, WPARAM WParam, LPARAM LParam)
{
    static bool ReEntrance = false;

    switch (Msg)
    {
        case WM_INITDIALOG:
            Stopping = false;
            SetWindowText (Dlg, GetDefaultTitle().c_str());
            SetDisables (Dlg);
            InitDialog (Dlg);
            SetTimer (Dlg, 1, IDLETIME, NULL);
            SetClassLong (Dlg, GCL_HICON, (LONG) LoadIcon (GlobalHInstance, MAKEINTRESOURCE(IDI_ICON)));
            QuitWhenDone = false;
            LoadSettings (Dlg);
            UpdatePriority (Dlg);
            return (1);


        case WM_TIMER:
            if (Defrag != NULL  &&  !ReEntrance)
            {
                wstring NewTitle;

                SendMessage (Dlg, WM_UPDATEINFO, 0, 0);

                NewTitle = GetDefragTitle ();
                if (NewTitle != OldWindowText)
                {
                    OldWindowText = NewTitle;
                    SetWindowText (Dlg, NewTitle.c_str());
                }

                if (Defrag->IsDoneYet()  ||  Defrag->HasError())
                {   // This is the code executed when defragging is finished (or stopped :)
                    if (Defrag->GetDefragType() == DefragAnalyze  &&  
                        !Defrag->HasError()  &&
                        !Stopping)
                    {   // Show report
                        ReEntrance = true;

                        DialogBoxParam (GlobalHInstance, MAKEINTRESOURCE (IDD_REPORT),
                            Dlg, ReportDialogProc, (LPARAM) Defrag);

                        ReEntrance = false;
                    }

                    delete Defrag;
                    Defrag = NULL;
                    SetDisables (Dlg);
                    SetWindowText (Dlg, GetDefaultTitle().c_str());

                    Stopping = false;

                    if (QuitWhenDone)
                        SendMessage (GetDlgItem (Dlg, IDC_QUIT), BM_CLICK, 0, 0);
                }
            }

            SetTimer (Dlg, 1, IDLETIME, NULL);
            return (0);


        case WM_UPDATEINFO:
            UpdateDefragInfo (Dlg);
            return (1);


        case WM_CLOSE:
            SendMessage (GetDlgItem (Dlg, IDC_QUIT), BM_CLICK, 0, 0);
            return (1);


        case WM_COMMAND:
            switch (LOWORD(WParam))
            {
                case IDC_PRIORITY_LIST:
                    UpdatePriority (Dlg);
                    return (1);


                case ID_MAIN_HELP:
                    ShellExecute (Dlg, L"open", L"Fraginator.chm", L"", L".", SW_SHOW);
                    return (1);


                case IDC_QUIT:
                    if (Defrag == NULL)
                    {   // This is the code executing when quitting
                        SaveSettings (Dlg);
                        EndDialog (Dlg, 0);
                    }
                    else
                    {   // Tell defragging to finish and disable our button
                        QuitWhenDone = true;
                        SendMessage (GetDlgItem (Dlg, IDC_STARTSTOP), BM_CLICK, 0, 0);
                        EnableWindow (GetDlgItem (Dlg, IDC_QUIT), FALSE);
                    }
                    return (1);


                case IDC_STARTSTOP:
                    if (Defrag == NULL)
                    {   // L"Start"
                        wchar_t Drive[10];
                        LRESULT ID;
                        DefragType Method;
                        HANDLE H;

                        if (Defrag != NULL)
                            return (1);

                        SendMessage (GetDlgItem (Dlg, IDC_DRIVES_LIST), WM_GETTEXT, 
                            sizeof (Drive) - 1, (LPARAM) Drive);

                        if (wcslen(Drive) != 2  ||  Drive[1] != L':')
                            return (1);

                        ID = SendMessage (GetDlgItem (Dlg, IDC_METHODS_LIST), CB_GETCURSEL, 0, 0);
                        Method = DefragInvalid;
                        if (ID == AnalyzeID)
                            Method = DefragAnalyze;
                        else
                        if (ID == FastID)
                            Method = DefragFast;
                        else
                        if (ID == ExtensiveID)
                            Method = DefragExtensive;

                        if (Method != DefragInvalid)
                        {
                            Defrag = StartDefragThread (Drive, Method, H);
                            Defrag->SetDoLimitLength (false);
                            SetWindowText (Dlg, GetDefragTitle().c_str());
                            SetDisables (Dlg);
                        }   
                    }
                    else
                    {   // L"Stop"
                        Stopping = true;
                        Defrag->Stop ();
                        EnableWindow (GetDlgItem (Dlg, IDC_STARTSTOP), FALSE);
                        EnableWindow (GetDlgItem (Dlg, IDC_QUIT), FALSE);
                    }
                    return (1);
            }
    }

    // Otherwise, return 0 to say we did not process the message.
    return (0);
}

⌨️ 快捷键说明

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