LRESULT COption::ExtractProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static CFolderDialog FolderDlg; static SOption* pOption = &m_option_tmp; // Extraction Settings static constexpr std::array<LPCTSTR, 3> ExtractCheckText{{ _T("Extract each folder"), _T("Fix the CRC of OGG files upon extraction"), _T("Enable simple decoding") }}; static const std::array<BOOL*, 4> ExtractCheckFlag{{ &pOption->bCreateFolder, &pOption->bFixOgg, &pOption->bEasyDecrypt, &pOption->bRenameScriptExt }}; static std::array<CCheckBox, ExtractCheckText.size()> ExtractCheck; static CCheckBox ExtractCheckAlpha; static CLabel ExtractLabelPng, ExtractLabelAlpha, ExtractLabelBuf, ExtractLabelTmp; static CRadioBtn ExtractRadioImage, ExtractRadioSave; static CUpDown ExtractUpDownPng; static CEditBox ExtractEditPng, ExtractEditAlpha, ExtractEditSave, ExtractEditBuf, ExtractEditTmp; static CButton ExtractBtnSave, ExtractBtnTmp; static CGroupBox ExtractGroupImage, ExtractGroupSave; switch (msg) { case WM_INITDIALOG: { UINT ID = 10000; const int x = 10; const int xx = 15; int y = 0; // Extraction Settings for (size_t i = 0; i < ExtractCheckText.size(); i++) { ExtractCheck[i].Create(hWnd, ExtractCheckText[i], ID++, x, y += 20, 230, 20); ExtractCheck[i].SetCheck(*ExtractCheckFlag[i]); } // int y_image = y; ExtractGroupImage.Create(hWnd, _T("Output image format"), ID++, x, y_image += 34, 240, 110); ExtractRadioImage.Close(); ExtractRadioImage.Create(hWnd, _T("BMP"), ID++, x + xx, y_image += 18, 50, 20); ExtractRadioImage.Create(hWnd, _T("PNG"), ID++, x + xx, y_image += 20, 50, 20); ExtractRadioImage.SetCheck(0, pOption->bDstBMP); ExtractRadioImage.SetCheck(1, pOption->bDstPNG); ExtractLabelPng.Create(hWnd, _T("Compression Level"), ID++, x + xx + 50, y_image + 3, 100, 20); ExtractEditPng.Create(hWnd, _T(""), ID++, x + xx + 150, y_image, 40, 22); ExtractEditPng.SetLimit(1); ExtractUpDownPng.Create(hWnd, ExtractEditPng.GetCtrlHandle(), pOption->CmplvPng, ID++, 9, 0); // ExtractCheckAlpha.Create(hWnd, _T("Enable alpha blending"), ID++, x + xx, y_image += 22, 140, 20); ExtractCheckAlpha.SetCheck(pOption->bAlphaBlend); ExtractLabelAlpha.Create(hWnd, _T("Background color"), ID++, x + xx * 2 + 4, y_image += 24, 100, 20); ExtractEditAlpha.Create(hWnd, pOption->szBgRGB, ID++, x + xx * 2 + 100, y_image - 4, 100, 22); ExtractEditAlpha.SetLimit(6); ExtractEditAlpha.Enable(pOption->bAlphaBlend); // const int x_save = x + 200; int y_save = y; ExtractGroupSave.Create(hWnd, _T("Destination"), ID++, x_save + 50, y_save += 34, 290, 110); ExtractRadioSave.Close(); ExtractRadioSave.Create(hWnd, _T("Specify each time"), ID++, x_save + xx + 50, y_save += 18, 220, 20); ExtractRadioSave.Create(hWnd, _T("Same folder as input source"), ID++, x_save + xx + 50, y_save += 20, 200, 20); ExtractRadioSave.Create(hWnd, _T("The following folder"), ID++, x_save + xx + 50, y_save += 20, 200, 20); ExtractRadioSave.SetCheck(0, pOption->bSaveSel); ExtractRadioSave.SetCheck(1, pOption->bSaveSrc); ExtractRadioSave.SetCheck(2, pOption->bSaveDir); ExtractEditSave.Create(hWnd, pOption->SaveDir, ID++, x_save + xx * 2 + 40, y_save += 20, 200, 22); ExtractEditSave.Enable(pOption->bSaveDir); ExtractBtnSave.Create(hWnd, _T("Browse"), ID++, x_save + xx * 2 + 250, y_save + 1, 50, 20); ExtractBtnSave.Enable(pOption->bSaveDir); // y = (y_image > y_save) ? y_image : y_save; ExtractLabelBuf.Create(hWnd, _T("Buffer Size(KB)"), ID++, x, y += 44, 100, 20); ExtractEditBuf.Create(hWnd, pOption->BufSize, ID++, x + 100, y - 4, 110, 22); // ExtractLabelTmp.Create(hWnd, _T("Temporary Folder"), ID++, x, y += 24, 100, 20); ExtractEditTmp.Create(hWnd, pOption->TmpDir, ID++, x + 100, y - 4, 200, 22); ExtractBtnTmp.Create(hWnd, _T("Browse"), ID++, x + 310, y - 3, 50, 20); break; } case WM_COMMAND: // Checkbox if (LOWORD(wp) >= ExtractCheck.front().GetID() && LOWORD(wp) <= ExtractCheck.back().GetID()) { PropSheet_Changed(::GetParent(hWnd), hWnd); break; } // Alpha blend check box if (LOWORD(wp) == ExtractCheckAlpha.GetID()) { ExtractEditAlpha.Enable(ExtractCheckAlpha.GetCheck()); PropSheet_Changed(::GetParent(hWnd), hWnd); break; } //Output image format radio button if (LOWORD(wp) >= ExtractRadioImage.GetID(0) && LOWORD(wp) <= ExtractRadioImage.GetID(1)) { PropSheet_Changed(::GetParent(hWnd), hWnd); break; } // Destination radio button if (LOWORD(wp) >= ExtractRadioSave.GetID(0) && LOWORD(wp) <= ExtractRadioSave.GetID(2)) { ExtractEditSave.Enable(ExtractRadioSave.GetCheck(2)); ExtractBtnSave.Enable(ExtractRadioSave.GetCheck(2)); PropSheet_Changed(::GetParent(hWnd), hWnd); break; } // Output folder browse if (LOWORD(wp) == ExtractBtnSave.GetID()) { TCHAR szSaveDir[_MAX_DIR]; ExtractEditSave.GetText(szSaveDir, sizeof(szSaveDir)); if (FolderDlg.DoModal(hWnd, _T("Select the output folder"), szSaveDir)) ExtractEditSave.SetText(szSaveDir); break; } // Temporary folder browse if (LOWORD(wp) == ExtractBtnTmp.GetID()) { TCHAR szTmpDir[_MAX_DIR]; ExtractEditTmp.GetText(szTmpDir, sizeof(szTmpDir)); if (FolderDlg.DoModal(hWnd, _T("Select a temporary folder"), szTmpDir)) ExtractEditTmp.SetText(szTmpDir); break; } // Contents of the edit box have been changed if (HIWORD(wp) == EN_CHANGE) { PropSheet_Changed(::GetParent(hWnd), hWnd); break; } break; case WM_NOTIFY: { const auto* const hdr = reinterpret_cast<LPNMHDR>(lp); switch (hdr->code) { // OK/Apply, Tabbing case PSN_APPLY: case PSN_KILLACTIVE: // Extraction Settings for (size_t i = 0; i < ExtractCheck.size(); i++) *ExtractCheckFlag[i] = ExtractCheck[i].GetCheck(); // pOption->bDstBMP = ExtractRadioImage.GetCheck(0); pOption->bDstPNG = ExtractRadioImage.GetCheck(1); ExtractEditPng.GetText(&pOption->CmplvPng, FALSE); // pOption->bAlphaBlend = ExtractCheckAlpha.GetCheck(); ExtractEditAlpha.GetText(&pOption->BgRGB, TRUE); _stprintf(pOption->szBgRGB, _T("%06x"), pOption->BgRGB); // pOption->bSaveSel = ExtractRadioSave.GetCheck(0); pOption->bSaveSrc = ExtractRadioSave.GetCheck(1); pOption->bSaveDir = ExtractRadioSave.GetCheck(2); ExtractEditSave.GetText(pOption->SaveDir); // ExtractEditBuf.GetText(&pOption->BufSize, FALSE); // ExtractEditTmp.GetText(pOption->TmpDir); // OK/Apply if (hdr->code == PSN_APPLY) Apply(); return TRUE; } break; } } return FALSE; }
LRESULT OnCompleted( WPARAM wParam, LPARAM lParam ){ TString str; str.Format(_T("___Task #%u was the last task of the batch____"), lParam); AddMessage( (LPCTSTR)str ); m_btnStart.Enable( TRUE ); return 0; }
void OnStartBatch( void ){ m_btnStart.Enable( FALSE ); AddMessage(_T("---- start a new batch ----")); SubmitThreadpoolWork( m_pWorkItem ); SubmitThreadpoolWork( m_pWorkItem ); SubmitThreadpoolWork( m_pWorkItem ); SubmitThreadpoolWork( m_pWorkItem ); AddMessage(_T("4 tasks are submitted.")); }
LRESULT COption::SusieProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static CFolderDialog FolderDlg; static SOption* pOption = &m_option_tmp; static CCheckBox SusieCheckUse, SusieCheckFirst; static CLabel SusieLabelDir; static CEditBox SusieEditDir; static CButton SusieBtnDir, SusieBtnUpdate; static std::array<CButton, 2> SusieBtn; static CSusieListView SusieListView; static CSusie susie; switch (msg) { case WM_INITDIALOG: { UINT ID = 10000; const int x = 10; const int xx = 15; int y = 0; SusieCheckUse.Create(hWnd, _T("Use Susie Plugins"), ID++, x + 15, y += 20, 200, 20); SusieCheckUse.SetCheck(pOption->bSusieUse); SusieLabelDir.Create(hWnd, _T("Susie Folder"), ID++, x + xx, y += 24, 75, 20); SusieEditDir.Create(hWnd, pOption->SusieDir, ID++, x + xx + 75, y - 4, 200, 22); SusieEditDir.Enable(pOption->bSusieUse); SusieBtnDir.Create(hWnd, _T("Browse"), ID++, x + xx + 280, y - 3, 50, 20); SusieBtnDir.Enable(pOption->bSusieUse); SusieCheckFirst.Create(hWnd, _T("Give Susie plugins priority when decoding"), ID++, x + xx, y += 20, 250, 20); SusieCheckFirst.SetCheck(pOption->bSusieFirst); SusieCheckFirst.Enable(pOption->bSusieUse); SusieListView.Create(hWnd, *pOption, x + xx, y += 30, 500, 190); SusieListView.Close(); SusieListView.Enable(pOption->bSusieUse); SusieListView.Show(); SusieBtnUpdate.Create(hWnd, _T("Update"), ID++, x + 290, y += 200, 50, 20); SusieBtnUpdate.Enable(pOption->bSusieUse); SusieBtn[0].Create(hWnd, _T("All ON"), ID++, x + 350, y, 80, 20); SusieBtn[0].Enable(pOption->bSusieUse); SusieBtn[1].Create(hWnd, _T("All OFF"), ID++, x + 430, y, 80, 20); SusieBtn[1].Enable(pOption->bSusieUse); break; } case WM_COMMAND: // Use Susie plugins if (LOWORD(wp) == SusieCheckUse.GetID()) { const BOOL flag = SusieCheckUse.GetCheck(); SusieEditDir.Enable(flag); SusieBtnDir.Enable(flag); SusieCheckFirst.Enable(flag); SusieListView.Enable(flag); SusieBtnUpdate.Enable(flag); SusieBtn[0].Enable(flag); SusieBtn[1].Enable(flag); PropSheet_Changed(::GetParent(hWnd), hWnd); // Click here to show / hide the list of checkboxes, de-selected state pOption->bSusieUse = flag; SusieListView.SetItemSelAll(0); break; } // Susie Folder Browse if (LOWORD(wp) == SusieBtnDir.GetID()) { TCHAR szSusieDir[_MAX_DIR]; SusieEditDir.GetText(szSusieDir, sizeof(szSusieDir)); if (FolderDlg.DoModal(hWnd, _T("Select the Susie folder"), szSusieDir)) SusieEditDir.SetText(szSusieDir); } // Give Susie plugins priority on decoding if (LOWORD(wp) == SusieCheckFirst.GetID()) { PropSheet_Changed(::GetParent(hWnd), hWnd); break; } // Update if (LOWORD(wp) == SusieBtnUpdate.GetID()) { susie.LoadSpi(pOption->SusieDir); susie.Init(); SusieListView.Show(); SusieListView.Update(); break; } // All ON if (LOWORD(wp) == SusieBtn[0].GetID()) { SusieListView.SetCheckAll(true); PropSheet_Changed(::GetParent(hWnd), hWnd); break; } // All OFF if (LOWORD(wp) == SusieBtn[1].GetID()) { SusieListView.SetCheckAll(false); PropSheet_Changed(::GetParent(hWnd), hWnd); break; } // Settings if (LOWORD(wp) == IDM_SUSIE_SET) { const SSusieInfo* const susie_info = SusieListView.GetFocusSusieInfo(); // Get ConfigurationDlg() const auto ConfigurationDlg = reinterpret_cast<ConfigurationDlgProc>(susie_info->plugin.GetProcAddress(_T("ConfigurationDlg"))); if (ConfigurationDlg == nullptr) break; // Call settings ConfigurationDlg(hWnd, 1); break; } // Contents of the editbox have changed if (HIWORD(wp) == EN_CHANGE) { PropSheet_Changed(::GetParent(hWnd), hWnd); break; } break; case WM_NOTIFY: { const auto* const hdr = reinterpret_cast<LPNMHDR>(lp); switch (hdr->code) { // OK/Apply, Tabbing case PSN_APPLY: case PSN_KILLACTIVE: pOption->bSusieUse = SusieCheckUse.GetCheck(); pOption->bSusieFirst = SusieCheckFirst.GetCheck(); SusieEditDir.GetText(pOption->SusieDir); SusieListView.SaveIni(); // OK/Apply if (hdr->code == PSN_APPLY) { const bool update = m_option.SusieDir == pOption->SusieDir; Apply(); // Re-acquire plugin folder only when Susie has been changed if (pOption->bSusieUse && update) { susie.LoadSpi(pOption->SusieDir); susie.Init(); SusieListView.Show(); SusieListView.Update(); } } return TRUE; // Check processing case NM_CLICK: case NM_DBLCLK: if (hdr->idFrom == idsSusieList) { if (SusieListView.SetCheck()) PropSheet_Changed(::GetParent(hWnd), hWnd); break; } } // List view if (wp == idsSusieList) { const auto* const plv = reinterpret_cast<LPNMLISTVIEW>(lp); switch (plv->hdr.code) { // Custom draw case NM_CUSTOMDRAW: return SusieListView.CustomDraw(reinterpret_cast<LPNMLVCUSTOMDRAW>(lp)); // Show tool tip case LVN_GETINFOTIP: SusieListView.ShowTip(reinterpret_cast<LPNMLVGETINFOTIP>(lp)); break; // View case LVN_GETDISPINFO: SusieListView.Show(reinterpret_cast<NMLVDISPINFO*>(lp)); break; } } break; } case WM_MOUSEWHEEL: { POINT pos; GetCursorPos(&pos); HWND pWnd = WindowFromPoint(pos); if (pWnd == SusieListView.GetHandle()) SendMessage(pWnd, WM_MOUSEWHEEL, wp, lp); break; } // Right-click menu (Context menu) case WM_CONTEXTMENU: { if (wp == reinterpret_cast<WPARAM>(SusieListView.GetHandle())) SusieListView.CreateMenu(lp); break; } } return FALSE; }