void TreePropertySheet::addTree() { // Insert the space to the left CRect rcWindow,rcPage; HWND page = IndexToHwnd(0); ::GetWindowRect(page, &rcPage); ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rcPage, 2); CRect rc(SPACE_LEFT, rcPage.top, TREE_WIDTH, rcPage.bottom); ctrlTree.Create(m_hWnd, rc, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP | TVS_TRACKSELECT, WS_EX_CLIENTEDGE, IDC_PAGE); if(BOOLSETTING(USE_EXPLORER_THEME) && ((WinUtil::getOsMajor() >= 5 && WinUtil::getOsMinor() >= 1) //WinXP & WinSvr2003 || (WinUtil::getOsMajor() >= 6))) //Vista & Win7 { SetWindowTheme(ctrlTree.m_hWnd, L"explorer", NULL); } ctrlTree.SetImageList(tree_icons, TVSIL_NORMAL); }
bool CDeviceView::Initialize() { // Get the device image list m_ImageListData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA); BOOL bSuccess = SetupDiGetClassImageList(&m_ImageListData); if (bSuccess == FALSE) return false; // Create the main treeview m_hTreeView = CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_LINESATROOT, 0, 0, 0, 0, m_hMainWnd, (HMENU)IDC_TREEVIEW, g_hThisInstance, NULL); if (m_hTreeView) { // Set the image list against the treeview (void)TreeView_SetImageList(m_hTreeView, m_ImageListData.ImageList, TVSIL_NORMAL); // Give the treeview arrows instead of +/- boxes (on Win7) SetWindowTheme(m_hTreeView, L"explorer", NULL); // Create the root node m_RootNode = new CRootNode(&m_ImageListData); m_RootNode->SetupNode(); } return !!(m_hTreeView); }
BOOL CDeviceView::Initialize() { BOOL bSuccess; /* Initialize the devices class */ bSuccess = m_Devices->Initialize(); if (bSuccess == FALSE) return FALSE; /* Create the main treeview */ m_hTreeView = CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_LINESATROOT, 0, 0, 0, 0, m_hMainWnd, (HMENU)IDC_TREEVIEW, g_hInstance, NULL); if (m_hTreeView) { /* Get the devices image list */ m_ImageList = m_Devices->GetImageList(); /* Set the image list against the treeview */ (VOID)TreeView_SetImageList(m_hTreeView, m_ImageList, TVSIL_NORMAL); /* Give the treeview arrows instead of +/- boxes (on Win7) */ SetWindowTheme(m_hTreeView, L"explorer", NULL); } return !!(m_hTreeView); }
/********************************************************************** * The dialog subclass window proc. */ LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, ULONG_PTR dwRefData) { HTHEME theme = GetWindowTheme ( hWnd ); static const WCHAR themeClass[] = { 'W','i','n','d','o','w',0 }; BOOL themingActive = IsThemeDialogTextureEnabled (hWnd); BOOL doTheming = themingActive && (theme != NULL); LRESULT result; switch (msg) { case WM_CREATE: result = THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); theme = OpenThemeData( hWnd, themeClass ); return result; case WM_DESTROY: CloseThemeData ( theme ); SetWindowTheme( hWnd, NULL, NULL ); OpenThemeData( hWnd, NULL ); return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); case WM_THEMECHANGED: CloseThemeData ( theme ); OpenThemeData( hWnd, themeClass ); InvalidateRect( hWnd, NULL, TRUE ); return 0; case WM_SYSCOLORCHANGE: if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, * which will do the repaint. */ break; case WM_ERASEBKGND: if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); { RECT rc; WNDPROC dlgp = (WNDPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC); if (!CallWindowProcW(dlgp, hWnd, msg, wParam, lParam)) { /* Draw background*/ GetClientRect (hWnd, &rc); if (IsThemePartDefined (theme, WP_DIALOG, 0)) /* Although there is a theme for the WINDOW class/DIALOG part, * but I[res] haven't seen Windows using it yet... Even when * dialog theming is activated, the good ol' BTNFACE * background seems to be used. */ #if 0 DrawThemeBackground (theme, (HDC)wParam, WP_DIALOG, 0, &rc, NULL); #endif return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); else /* We might have gotten a TAB theme class, so check if we can * draw as a tab page. */ if (IsThemePartDefined (theme, TABP_BODY, 0)) DrawThemeBackground (theme, (HDC)wParam, TABP_BODY, 0, &rc, NULL); else return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); } return 1; }
BOOL CCopyDlg::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); ExtendFrameIntoClientArea(IDC_EXTGROUP); m_aeroControls.SubclassControl(this, IDC_DOSWITCH); m_aeroControls.SubclassControl(this, IDC_MAKEPARENTS); m_aeroControls.SubclassOkCancelHelp(this); m_bCancelled = false; DWORD exStyle = LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_CHECKBOXES; m_ExtList.SetExtendedStyle(exStyle); SetWindowTheme(m_ExtList.GetSafeHwnd(), L"Explorer", NULL); m_ExtList.ShowText(CString(MAKEINTRESOURCE(IDS_COPY_WAITFOREXTERNALS))); AdjustControlSize(IDC_COPYHEAD); AdjustControlSize(IDC_COPYREV); AdjustControlSize(IDC_COPYWC); AdjustControlSize(IDC_DOSWITCH); AdjustControlSize(IDC_MAKEPARENTS); CTSVNPath path(m_path); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, path.GetUIPathString(), sWindowTitle); m_History.SetMaxHistoryItems((LONG)CRegDWORD(L"Software\\TortoiseSVN\\MaxHistoryItems", 25)); SetRevision(m_CopyRev); m_tooltips.AddTool(IDC_HISTORY, IDS_COMMITDLG_HISTORY_TT); if (SVN::PathIsURL(path)) { DialogEnableWindow(IDC_COPYWC, FALSE); DialogEnableWindow(IDC_DOSWITCH, FALSE); SetDlgItemText(IDC_COPYSTARTLABEL, CString(MAKEINTRESOURCE(IDS_COPYDLG_FROMURL))); } SVN svn; CString sUUID; m_repoRoot = svn.GetRepositoryRootAndUUID(path, true, sUUID); m_repoRoot.TrimRight('/'); m_wcURL = svn.GetURLFromPath(path); if (m_wcURL.IsEmpty() || (!path.IsUrl() && !path.Exists())) { CString Wrong_URL=path.GetSVNPathString(); CString temp; temp.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)Wrong_URL); ::MessageBox(this->m_hWnd, temp, L"TortoiseSVN", MB_ICONERROR); this->EndDialog(IDCANCEL); //exit } m_URLCombo.LoadHistory(L"Software\\TortoiseSVN\\History\\repoPaths\\"+sUUID, L"url"); m_URLCombo.SetCurSel(0); CString relPath = m_wcURL.Mid(m_repoRoot.GetLength()); if (!m_URL.IsEmpty()) { // allow the use of urls relative to the repo root if (m_URL[0] != '^') relPath = m_URL.Mid(m_repoRoot.GetLength()); else relPath = m_URL.Mid(1); } CTSVNPath r = CTSVNPath(relPath); relPath = r.GetUIPathString(); relPath.Replace('\\', '/'); m_URLCombo.AddString(relPath, 0); m_URLCombo.SelectString(-1, relPath); m_URL = m_wcURL; SetDlgItemText(IDC_DESTURL, CPathUtils::CombineUrls(m_repoRoot, relPath)); SetDlgItemText(IDC_FROMURL, m_wcURL); CString reg; reg.Format(L"Software\\TortoiseSVN\\History\\commit%s", (LPCTSTR)sUUID); m_History.Load(reg, L"logmsgs"); m_ProjectProperties.ReadProps(m_path); if (CRegDWORD(L"Software\\TortoiseSVN\\AlwaysWarnIfNoIssue", FALSE)) m_ProjectProperties.bWarnIfNoIssue = TRUE; m_cLogMessage.Init(m_ProjectProperties); m_cLogMessage.SetFont((CString)CRegString(L"Software\\TortoiseSVN\\LogFontName", L"Courier New"), (DWORD)CRegDWORD(L"Software\\TortoiseSVN\\LogFontSize", 8)); GetDlgItem(IDC_BUGTRAQBUTTON)->ShowWindow(SW_HIDE); GetDlgItem(IDC_BUGTRAQBUTTON)->EnableWindow(FALSE); CBugTraqAssociations bugtraq_associations; bugtraq_associations.Load(m_ProjectProperties.GetProviderUUID(), m_ProjectProperties.sProviderParams); if (bugtraq_associations.FindProvider(CTSVNPathList(m_path), &m_bugtraq_association)) { CComPtr<IBugTraqProvider> pProvider; HRESULT hr = pProvider.CoCreateInstance(m_bugtraq_association.GetProviderClass()); if (SUCCEEDED(hr)) { m_BugTraqProvider = pProvider; ATL::CComBSTR temp; ATL::CComBSTR parameters; parameters.Attach(m_bugtraq_association.GetParameters().AllocSysString()); hr = pProvider->GetLinkText(GetSafeHwnd(), parameters, &temp); if (SUCCEEDED(hr)) { SetDlgItemText(IDC_BUGTRAQBUTTON, temp == 0 ? L"" : temp); GetDlgItem(IDC_BUGTRAQBUTTON)->EnableWindow(TRUE); GetDlgItem(IDC_BUGTRAQBUTTON)->ShowWindow(SW_SHOW); } } GetDlgItem(IDC_LOGMESSAGE)->SetFocus(); } if (m_ProjectProperties.sMessage.IsEmpty()) { GetDlgItem(IDC_BUGID)->ShowWindow(SW_HIDE); GetDlgItem(IDC_BUGIDLABEL)->ShowWindow(SW_HIDE); GetDlgItem(IDC_LOGMESSAGE)->SetFocus(); } else { GetDlgItem(IDC_BUGID)->ShowWindow(SW_SHOW); GetDlgItem(IDC_BUGIDLABEL)->ShowWindow(SW_SHOW); if (!m_ProjectProperties.sLabel.IsEmpty()) SetDlgItemText(IDC_BUGIDLABEL, m_ProjectProperties.sLabel); GetDlgItem(IDC_BUGID)->SetFocus(); } if (!m_sLogMessage.IsEmpty()) m_cLogMessage.SetText(m_sLogMessage); else m_cLogMessage.SetText(m_ProjectProperties.GetLogMsgTemplate(PROJECTPROPNAME_LOGTEMPLATEBRANCH)); OnEnChangeLogmessage(); m_linkControl.ConvertStaticToLink(m_hWnd, IDC_CHECKALL); m_linkControl.ConvertStaticToLink(m_hWnd, IDC_CHECKNONE); // line up all controls and adjust their sizes. #define LINKSPACING 9 RECT rc = AdjustControlSize(IDC_SELECTLABEL); rc.right -= 15; // AdjustControlSize() adds 20 pixels for the checkbox/radio button bitmap, but this is a label... rc = AdjustStaticSize(IDC_CHECKALL, rc, LINKSPACING); rc = AdjustStaticSize(IDC_CHECKNONE, rc, LINKSPACING); CAppUtils::SetAccProperty(m_cLogMessage.GetSafeHwnd(), PROPID_ACC_ROLE, ROLE_SYSTEM_TEXT); CAppUtils::SetAccProperty(m_cLogMessage.GetSafeHwnd(), PROPID_ACC_HELP, CString(MAKEINTRESOURCE(IDS_INPUT_ENTERLOG))); CAppUtils::SetAccProperty(m_cLogMessage.GetSafeHwnd(), PROPID_ACC_KEYBOARDSHORTCUT, L"Alt+"+CString(CAppUtils::FindAcceleratorKey(this, IDC_INVISIBLE))); CAppUtils::SetAccProperty(GetDlgItem(IDC_CHECKALL)->GetSafeHwnd(), PROPID_ACC_ROLE, ROLE_SYSTEM_LINK); CAppUtils::SetAccProperty(GetDlgItem(IDC_CHECKNONE)->GetSafeHwnd(), PROPID_ACC_ROLE, ROLE_SYSTEM_LINK); CAppUtils::SetAccProperty(m_URLCombo.GetSafeHwnd(), PROPID_ACC_KEYBOARDSHORTCUT, L"Alt+"+CString(CAppUtils::FindAcceleratorKey(this, IDC_TOURLLABEL))); CAppUtils::SetAccProperty(GetDlgItem(IDC_FROMURL)->GetSafeHwnd(), PROPID_ACC_KEYBOARDSHORTCUT, L"Alt+"+CString(CAppUtils::FindAcceleratorKey(this, IDC_COPYSTARTLABEL))); CAppUtils::SetAccProperty(GetDlgItem(IDC_DESTURL)->GetSafeHwnd(), PROPID_ACC_KEYBOARDSHORTCUT, L"Alt+"+CString(CAppUtils::FindAcceleratorKey(this, IDC_DESTLABEL))); AddAnchor(IDC_REPOGROUP, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_COPYSTARTLABEL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_FROMURL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_TOURLLABEL, TOP_LEFT); AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_BROWSE, TOP_RIGHT); AddAnchor(IDC_DESTLABEL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_DESTURL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_MSGGROUP, TOP_LEFT, MIDDLE_RIGHT); AddAnchor(IDC_HISTORY, TOP_LEFT); AddAnchor(IDC_BUGTRAQBUTTON, TOP_LEFT); AddAnchor(IDC_BUGIDLABEL, TOP_RIGHT); AddAnchor(IDC_BUGID, TOP_RIGHT); AddAnchor(IDC_INVISIBLE, TOP_RIGHT); AddAnchor(IDC_LOGMESSAGE, TOP_LEFT, MIDDLE_RIGHT); AddAnchor(IDC_FROMGROUP, MIDDLE_LEFT, MIDDLE_RIGHT); AddAnchor(IDC_COPYHEAD, MIDDLE_LEFT); AddAnchor(IDC_COPYREV, MIDDLE_LEFT); AddAnchor(IDC_COPYREVTEXT, MIDDLE_RIGHT); AddAnchor(IDC_BROWSEFROM, MIDDLE_RIGHT); AddAnchor(IDC_COPYWC, MIDDLE_LEFT); AddAnchor(IDC_EXTGROUP, MIDDLE_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_SELECTLABEL, MIDDLE_LEFT); AddAnchor(IDC_CHECKALL, MIDDLE_LEFT); AddAnchor(IDC_CHECKNONE, MIDDLE_LEFT); AddAnchor(IDC_EXTERNALSLIST, MIDDLE_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_DOSWITCH, BOTTOM_LEFT); AddAnchor(IDC_MAKEPARENTS, BOTTOM_LEFT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); if ((m_pParentWnd==NULL)&&(GetExplorerHWND())) CenterWindow(CWnd::FromHandle(GetExplorerHWND())); EnableSaveRestore(L"CopyDlg"); m_bSettingChanged = false; if (!m_path.IsUrl()) { // start a thread to obtain the highest revision number of the working copy // without blocking the dialog if ((m_pThread = AfxBeginThread(FindRevThreadEntry, this))==NULL) { OnCantStartThread(); } } return TRUE; }
INT_PTR CDestroyFilesDialog::OnInitDialog() { m_hDialogIcon = LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(IDI_MAIN_SMALL)); SetClassLongPtr(m_hDlg,GCLP_HICONSM,reinterpret_cast<LONG_PTR>(m_hDialogIcon)); HWND hListView = GetDlgItem(m_hDlg,IDC_DESTROYFILES_LISTVIEW); HIMAGELIST himlSmall; Shell_GetImageLists(NULL,&himlSmall); ListView_SetImageList(hListView,himlSmall,LVSIL_SMALL); SetWindowTheme(hListView,L"Explorer",NULL); ListView_SetExtendedListViewStyleEx(hListView, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); LVCOLUMN lvColumn; TCHAR szTemp[128]; LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_FILE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,0,&lvColumn); LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_TYPE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,1,&lvColumn); LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_SIZE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,2,&lvColumn); LoadString(GetInstance(),IDS_DESTROY_FILES_COLUMN_DATE_MODIFIED, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,3,&lvColumn); int iItem = 0; for each(auto strFullFilename in m_FullFilenameList) { TCHAR szFullFilename[MAX_PATH]; StringCchCopy(szFullFilename,SIZEOF_ARRAY(szFullFilename), strFullFilename.c_str()); /* TODO: Perform in background thread. */ SHFILEINFO shfi; SHGetFileInfo(szFullFilename,0,&shfi,sizeof(shfi),SHGFI_SYSICONINDEX| SHGFI_TYPENAME); LVITEM lvItem; lvItem.mask = LVIF_TEXT|LVIF_IMAGE; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.pszText = szFullFilename; lvItem.iImage = shfi.iIcon; ListView_InsertItem(hListView,&lvItem); ListView_SetItemText(hListView,iItem,1,shfi.szTypeName); WIN32_FILE_ATTRIBUTE_DATA wfad; GetFileAttributesEx(szFullFilename,GetFileExInfoStandard,&wfad); TCHAR szFileSize[32]; ULARGE_INTEGER lFileSize = {wfad.nFileSizeLow,wfad.nFileSizeHigh}; FormatSizeString(lFileSize,szFileSize,SIZEOF_ARRAY(szFileSize)); ListView_SetItemText(hListView,iItem,2,szFileSize); TCHAR szDateModified[32]; CreateFileTimeString(&wfad.ftLastWriteTime,szDateModified, SIZEOF_ARRAY(szDateModified),m_bShowFriendlyDates); ListView_SetItemText(hListView,iItem,3,szDateModified); iItem++; }
BOOL CSetOverlayIcons::OnInitDialog() { ISettingsPropPage::OnInitDialog(); m_cIconList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_SUBITEMIMAGES); // get the path to our icon sets TCHAR buf[MAX_PATH] = {0}; SHGetSpecialFolderPath(m_hWnd, buf, CSIDL_PROGRAM_FILES_COMMON, true); m_sIconPath = buf; m_sIconPath += _T("\\TortoiseOverlays\\Icons"); // list all the icon sets CDirFileEnum filefinder(m_sIconPath); bool isDir = false; CString item; while (filefinder.NextFile(item, &isDir)) { if (!isDir) continue; m_cIconSet.AddString(CPathUtils::GetFileNameFromPath(item)); } CheckRadioButton(IDC_LISTRADIO, IDC_SYMBOLRADIO, IDC_LISTRADIO); CString sModifiedIcon = m_regModified; if (sModifiedIcon.IsEmpty()) { // no custom icon set, use the default sModifiedIcon = m_sIconPath + _T("\\XPStyle\\ModifiedIcon.ico"); } if (sModifiedIcon.Left(m_sIconPath.GetLength()).CompareNoCase(m_sIconPath)!=0) { // an icon set outside our own installation? We don't support that, // so fall back to the default! sModifiedIcon = m_sIconPath + _T("\\XPStyle\\ModifiedIcon.ico"); } // the name of the icon set is the folder of the icon location m_sOriginalIconSet = sModifiedIcon.Mid(m_sIconPath.GetLength()+1); m_sOriginalIconSet = m_sOriginalIconSet.Left(m_sOriginalIconSet.ReverseFind('\\')); // now we have the name of the icon set. Set the combobox to show // that as selected CString ComboItem; for (int i=0; i<m_cIconSet.GetCount(); ++i) { m_cIconSet.GetLBText(i, ComboItem); if (ComboItem.CompareNoCase(m_sOriginalIconSet)==0) m_cIconSet.SetCurSel(i); } m_sNormal = CString(MAKEINTRESOURCE(IDS_STATUSNORMAL)); m_sModified = CString(MAKEINTRESOURCE(IDS_STATUSMODIFIED)); m_sConflicted = CString(MAKEINTRESOURCE(IDS_STATUSCONFLICTED)); m_sDeleted = CString(MAKEINTRESOURCE(IDS_STATUSDELETED)); m_sAdded = CString(MAKEINTRESOURCE(IDS_STATUSADDED)); m_sIgnored = CString(MAKEINTRESOURCE(IDS_STATUSIGNORED)); m_sUnversioned = CString(MAKEINTRESOURCE(IDS_STATUSUNVERSIONED)); m_sReadOnly.LoadString(IDS_SETTINGS_READONLYNAME); m_sLocked.LoadString(IDS_SETTINGS_LOCKEDNAME); SetWindowTheme(m_hWnd, L"Explorer", NULL); ShowIconSet(true); return TRUE; }
LRESULT playlist_view::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_NCCREATE: wnd_playlist = wnd; initialised = true; list_playlist.add_item(this); g_playlist_message_window.add_ref(); break; case WM_CREATE: { pfc::com_ptr_t<IDropTarget_playlist> IDT_playlist = new IDropTarget_playlist(this); RegisterDragDrop(wnd, IDT_playlist.get_ptr()); if (true) { m_theme = IsThemeActive() && IsAppThemed() ? OpenThemeData(wnd, L"ListView") : NULL; SetWindowTheme(wnd, L"Explorer", NULL); } m_always_show_focus = config_object::g_get_data_bool_simple(standard_config_objects::bool_playback_follows_cursor, false); on_playlist_font_change(); create_header(true); drawing_enabled = true; m_cache.initialise(); } return 0; case WM_DESTROY: m_edit_save = false; exit_inline_edit(); m_cache.deinitialise(); RevokeDragDrop(wnd); SendMessage(wnd, WM_SETFONT, 0, 0); SendMessage(wnd_header, WM_SETFONT, 0, 0); { if (m_theme) CloseThemeData(m_theme); m_theme = NULL; } m_selection_holder.release(); break; case WM_NCDESTROY: g_playlist_message_window.release(); wnd_playlist = 0; initialised = false; list_playlist.remove_item(this); m_shown = false; // if (!list_playlist.get_count()) // { // g_playlist_entries.rebuild_all(); // } break; case WM_THEMECHANGED: { if (m_theme) CloseThemeData(m_theme); m_theme = IsThemeActive() && IsAppThemed() ? OpenThemeData(wnd, L"ListView") : 0; } break; case WM_SHOWWINDOW: if (wp == TRUE && lp == 0 && !m_shown) { static_api_ptr_t<playlist_manager> playlist_api; ensure_visible(playlist_api->activeplaylist_get_focus_item()); m_shown = true; } break; case WM_WINDOWPOSCHANGED: { LPWINDOWPOS lpwp = (LPWINDOWPOS)lp; if (!(lpwp->flags & SWP_NOSIZE)) { on_size(lpwp->cx, lpwp->cy); } } break; case WM_ERASEBKGND: return TRUE; break; case WM_PAINT: { PAINTSTRUCT ps; HDC dc_paint = BeginPaint(wnd, &ps); RECT rc_update, rc_playlist; get_playlist_rect(&rc_playlist); rc_update = ps.rcPaint; if (rc_update.top<rc_playlist.top) rc_update.top = rc_playlist.top; if (rc_update.bottom >= rc_update.top) { int item_height = get_item_height(); int start_item = (rc_update.top - rc_playlist.top) / item_height; int end_item = (rc_update.bottom - rc_playlist.top) / item_height; if (((end_item - start_item) + 1)*item_height < rc_update.bottom - rc_update.top) end_item++; { draw_items(dc_paint, start_item, 1 + (end_item - start_item)); } } EndPaint(wnd, &ps); } return 0; case WM_SETREDRAW: drawing_enabled = (wp != 0); return 0; case WM_MOUSEACTIVATE: if (GetFocus() != wnd) m_no_next_edit = true; return MA_ACTIVATE; case WM_UPDATEUISTATE: RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE); break; case WM_KILLFOCUS: RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); m_selection_holder.release(); break; case WM_SETFOCUS: //if (msg == WM_SETFOCUS && (HWND)wp != wnd) //m_no_next_edit = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); m_selection_holder = static_api_ptr_t<ui_selection_manager>()->acquire(); m_selection_holder->set_playlist_selection_tracking(); break; case WM_GETDLGCODE: return DLGC_WANTALLKEYS; case WM_KEYDOWN: { static_api_ptr_t<playlist_manager> playlist_api; uie::window_ptr p_this = this; //DWORD vk_slash = VkKeyScan('/'); if (wp == VK_CONTROL) g_drag_lmb = true; if (m_prevent_wm_char_processing = process_keydown(msg, lp, wp, true)) return 0; else { SendMessage(wnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEFOCUS), NULL); if (wp == VK_HOME || wp == VK_DOWN || wp == VK_END || wp == VK_PRIOR || wp == VK_NEXT || wp == VK_UP) { int focus = playlist_api->activeplaylist_get_focus_item(); int total = playlist_api->activeplaylist_get_item_count(); if ((wp == VK_HOME || wp == VK_PRIOR || wp == VK_UP)) { // if (focus == 0) return 0; } if ((wp == VK_END || wp == VK_NEXT || wp == VK_DOWN)) { // if (focus == total - 1) return 0; } SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int offset = 0; int scroll = scroll_item_offset; if (wp == VK_HOME) scroll = 0; else if (wp == VK_PRIOR && focus == scroll_item_offset) scroll -= si.nPage; else if (wp == VK_UP) { if (focus <= scroll_item_offset) scroll = focus - 1; else if (focus > si.nPos + si.nPage - 1) scroll = focus - 1 - si.nPage + 1; } else if (wp == VK_DOWN) { if (focus < scroll_item_offset) scroll = focus + 1; else if (focus >= si.nPos + si.nPage - 1) scroll = focus + 1 - si.nPage + 1; } else if (wp == VK_END) scroll = total - 1; else if (wp == VK_NEXT && focus == si.nPos + si.nPage - 1) scroll += si.nPage; drawing_enabled = false; si.nPos = scroll; si.fMask = SIF_POS; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (wp == VK_HOME) offset = 0 - focus; else if (wp == VK_PRIOR) offset = scroll_item_offset - focus; else if (wp == VK_END) offset = total - focus - 1; else if (wp == VK_NEXT) offset = get_last_viewable_item() - focus; else if (wp == VK_DOWN) offset = 1; else if (wp == VK_UP) offset = -1; //if (offset) process_keydown(offset, ((HIWORD(lp) & KF_ALTDOWN) != 0), drawing_enabled, (HIWORD(lp) & KF_REPEAT) != 0); drawing_enabled = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); return 0; } else if (wp == VK_SPACE) { int focus = playlist_api->activeplaylist_get_focus_item(); set_sel_single(focus, true, false, false); return 0; } else if (wp == VK_RETURN) { bool ctrl_down = 0 != (GetKeyState(VK_CONTROL) & KF_UP); int focus = playlist_api->activeplaylist_get_focus_item(); unsigned active = playlist_api->get_active_playlist(); if (ctrl_down) { if (active != -1 && focus != -1) playlist_api->queue_add_item_playlist(active, focus); } else { // playlist_api->set_playing_playlist(active); unsigned focus = playlist_api->activeplaylist_get_focus_item(); //unsigned active = playlist_api->get_active_playlist(); //playlist_api->playlist_set_playback_cursor(active, focus); playlist_api->activeplaylist_execute_default_action(focus); //static_api_ptr_t<play_control>()->play_start(play_control::track_command_settrack); } return 0; } else if (wp == VK_SHIFT) { if (!(HIWORD(lp) & KF_REPEAT)) g_shift_item_start = playlist_api->activeplaylist_get_focus_item(); } else if (wp == VK_F2) { unsigned count = g_get_cache().active_column_get_active_count(); if (count) { unsigned focus = playlist_api->activeplaylist_get_focus_item(); if (focus != pfc_infinite) { t_size i, pcount = playlist_api->activeplaylist_get_item_count(); bit_array_bittable sel(pcount); playlist_api->activeplaylist_get_selection_mask(sel); pfc::list_t<t_size> indices; indices.prealloc(32); for (i = 0; i<pcount; i++) if (sel[i]) indices.add_item(i); /*t_size start = focus, end = focus; if (sel[start] && pcount) { while (start>0 && sel[start-1]) start--; while (end<pcount-1 && sel[end+1]) end++; }*/ unsigned count = g_get_cache().active_column_get_active_count(); unsigned column; for (column = 0; column<count; column++) { if (!g_get_columns()[g_get_cache().active_column_active_to_actual(column)]->edit_field.is_empty()) { //create_inline_edit_v2(start, end-start+1, column); create_inline_edit_v2(indices, column); break; } } } } } else if (wp == VK_DELETE) { playlist_api->activeplaylist_undo_backup(); playlist_api->activeplaylist_remove_selection(); } else if (wp == VK_F3) { standard_commands::main_playlist_search(); } /*else if (vk_slash != -1 && wp == LOWORD(vk_slash)) { HWND wnd_search = m_searcher.create(wnd); on_size(); ShowWindow(wnd_search, SW_SHOWNORMAL); ; }*/ } } break; case WM_CHAR: if (!m_prevent_wm_char_processing) { //if (!(HIWORD(lp) & KF_REPEAT)) { if ((GetKeyState(VK_CONTROL) & KF_UP)) { static_api_ptr_t<playlist_manager> playlist_api; if (wp == 1) //Ctrl-A { playlist_api->activeplaylist_set_selection(bit_array_true(), bit_array_true()); return 0; } else if (wp == 26) //Ctrl-Z { playlist_api->activeplaylist_undo_restore(); return 0; } else if (wp == 25) //Ctrl-Y { playlist_api->activeplaylist_redo_restore(); return 0; } else if (wp == 24) //Ctrl-X { playlist_utils::cut(); return 0; } else if (wp == 3) //Ctrl-C { playlist_utils::copy(); return 0; } else if (wp == 6) //Ctrl-F { standard_commands::main_playlist_search(); return 0; } else if (wp == 22) //Ctrl-V { playlist_utils::paste(wnd); return 0; } } } } break; case WM_KEYUP: if (process_keydown(msg, lp, wp, true)) return 0; break; case WM_SYSKEYUP: if (process_keydown(msg, lp, wp, true)) return 0; break; case WM_SYSKEYDOWN: { uie::window_ptr p_this = this; if (m_prevent_wm_char_processing = process_keydown(msg, lp, wp, true)) return 0; } break; case WM_LBUTTONDOWN: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; uSendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } bool b_was_focused = GetFocus() == wnd; if (!b_was_focused) m_no_next_edit = true; //#ifdef INLINE_EDIT exit_inline_edit(); // g_no_next_edit = false; //#endif dragged = false; SetFocus(wnd); SetCapture(wnd); static_api_ptr_t<playlist_manager> playlist_api; g_drag_lmb = true; int focus = playlist_api->activeplaylist_get_focus_item(); drag_start_lmb.x = GET_X_LPARAM(lp); drag_start_lmb.y = GET_Y_LPARAM(lp); int item_height = get_item_height(); int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); // int idx = ((GET_Y_LPARAM(lp) -get_header_height()) / item_height) + scroll_item_offset; // if( idx >= 0 && idx <playlist_api->activeplaylist_get_item_count() && GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual()) if (idx >= 0) { // playlist_oper * playlist_api = playlist_api; // playlist_api->set_playback_cursor(idx); //#ifdef INLINE_EDIT m_prev_sel = (playlist_api->activeplaylist_is_item_selected(idx) && !m_wnd_edit && (playlist_api->activeplaylist_get_selection_count(2) == 1)); //#endif if (!is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); if (wp & MK_CONTROL && wp & MK_SHIFT) { playlist_api->activeplaylist_move_selection(idx - focus); dragged = true; drag_type = 0; } else if (wp & MK_SHIFT) { drag_type = 2; dragitem = idx, dragstartitem = idx; int n = (cfg_alternative_sel ? focus : g_shift_item_start), t = idx; bool focus_sel = playlist_api->activeplaylist_is_item_selected(focus); set_sel_range(n, t, (cfg_alternative_sel != 0), (cfg_alternative_sel ? !focus_sel : false)); playlist_api->activeplaylist_set_focus_item(idx); dragged = true; } else if (wp & MK_CONTROL) { /* drag_type = 2; dragitem = idx,dragstartitem=idx; set_sel_single(idx, false, true, false); dragged = true;*/ } else if (playlist_api->activeplaylist_is_item_selected(idx)) { drag_type = 1; dragitem = idx, dragstartitem = idx; playlist_api->activeplaylist_undo_backup(); playlist_api->activeplaylist_set_focus_item(idx); dragged = false; } else { drag_type = 2; dragitem = idx, dragstartitem = idx;//item irrelevant actually; set_sel_single(idx, false, true, true); /* bit_array_bittable mask(playlist_api->activeplaylist_get_item_count()); // playlist_api->activeplaylist_is_item_selected_mask(mask); int n, t = playlist_api->activeplaylist_get_item_count(); for (n = 0;n <t;n++) { if (n==idx) mask.set(n, true); else mask.set(n, false); } console::info("crap"); playlist_api->set_sel_mask(mask); playlist_api->activeplaylist_set_focus_item(idx);*/ dragged = false; } } else { // console::info("wow"); // bit_array_bittable mask(playlist_api->activeplaylist_get_item_count()); playlist_api->activeplaylist_set_selection(bit_array_true(), bit_array_false()); dragged = true; drag_type = 0; } } break; case WM_RBUTTONUP: m_no_next_edit = false; break; case WM_MBUTTONUP: { m_no_next_edit = false; unsigned idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); playlist_mclick_actions::run(cfg_playlist_middle_action, idx != -1, idx); } break; case WM_LBUTTONUP: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; uSendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } ReleaseCapture(); g_drag_lmb = false; int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); //((GET_Y_LPARAM(lp) -get_header_height()) / get_item_height()) + scroll_item_offset; static_api_ptr_t<playlist_manager> playlist_api; if (!dragged) { if (wp & MK_CONTROL) { // int idx_down = hittest_item(drag_start_lmb.x, drag_start_lmb.y); if (idx >= 0) set_sel_single(idx, true, true, false); } else { // int item_height = get_item_height(); // int idx = ((GET_Y_LPARAM(lp) - get_header_height()) / item_height) + scroll_item_offset; if (idx >= 0 /*&& idx < playlist_api->activeplaylist_get_item_count() && (GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual())*/) { if (!m_no_next_edit && cfg_inline_edit && playlist_api->activeplaylist_is_item_selected(idx) && m_prev_sel /*&& !dragged*/) { //if (m_no_next_edit && GetCapture() == wnd) ReleaseCapture(); { exit_inline_edit(); if (main_window::config_get_inline_metafield_edit_mode() != main_window::mode_disabled) { m_edit_index = idx; long width; m_edit_column = hittest_column(GET_X_LPARAM(lp), width); if (m_edit_column >= 0 && !g_get_columns()[g_get_cache().active_column_active_to_actual(m_edit_column)]->edit_field.is_empty()) { m_edit_timer = (SetTimer(wnd, EDIT_TIMER_ID, GetDoubleClickTime(), 0) != 0); } } } } int focus = playlist_api->activeplaylist_get_focus_item(); set_sel_single(focus, false, false, true); } } } dragged = true; drag_type = 0; dragstartitem = 0; dragitem = 0; //#ifdef INLINE_EDIT m_no_next_edit = false; //#endif } break; case WM_MOUSEMOVE: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; uSendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } const unsigned cx_drag = (unsigned)abs(GetSystemMetrics(SM_CXDRAG)); const unsigned cy_drag = (unsigned)abs(GetSystemMetrics(SM_CYDRAG)); if (!g_dragging && ((g_dragging1 && wp & MK_RBUTTON && (abs(drag_start.x - GET_X_LPARAM(lp)) > cx_drag || abs(drag_start.y - GET_Y_LPARAM(lp)) > cy_drag)) || (g_drag_lmb && (wp & MK_LBUTTON) && (wp & MK_CONTROL) && (abs(drag_start_lmb.x - GET_X_LPARAM(lp)) > 3 || abs(drag_start_lmb.y - GET_Y_LPARAM(lp)) > 3)))) { static_api_ptr_t<playlist_manager> playlist_api; metadb_handle_list data; playlist_api->activeplaylist_get_selected_items(data); if (data.get_count() > 0) { static_api_ptr_t<playlist_incoming_item_filter> incoming_api; IDataObject * pDataObject = incoming_api->create_dataobject(data); if (pDataObject) { //RegisterClipboardFormat(_T("foo_ui_columns"); if (g_tooltip) { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } DWORD blah; { pfc::com_ptr_t<IDropSource_playlist> p_IDropSource_playlist = new IDropSource_playlist(this); DoDragDrop(pDataObject, p_IDropSource_playlist.get_ptr(), DROPEFFECT_COPY, &blah); } pDataObject->Release(); } } data.remove_all(); g_dragging = false; g_dragging1 = false; g_drag_lmb = false; if (wp & MK_LBUTTON) { dragged = true; drag_type = 0; dragstartitem = 0; dragitem = 0; } } if (cfg_tooltip && (GET_Y_LPARAM(lp) > get_header_height())) { int item_height = get_item_height(); int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); long cx; int column = hittest_column(GET_X_LPARAM(lp), cx); // unsigned act_col = g_cache.active_column_active_to_actual(column); if (column >= 0 && idx >= 0) { if (last_idx != (idx) || last_column != column) { if (!cfg_tooltips_clipped || is_item_clipped(idx, column)) { pfc::string8 src; g_cache.active_get_display_name(idx, column, src); pfc::string8 temp; titleformat_compiler::remove_color_marks(src, temp); temp.replace_char(9, 0x20); CreateToolTip(temp); } else { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } POINT a; a.x = cx + 3; a.y = (idx - scroll_item_offset) * item_height + get_header_height(); ClientToScreen(wnd_playlist, &a); tooltip.top = a.y; tooltip.bottom = a.y + item_height; tooltip.left = a.x; tooltip.right = a.x + get_column_width(column); } last_idx = idx; last_column = column; } else { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } } if (drag_type && (wp & MK_LBUTTON) && !(GetKeyState(VK_SHIFT) & KF_UP) && !(GetKeyState(VK_CONTROL) & KF_UP)) { RECT rc; get_playlist_rect(&rc); static_api_ptr_t<playlist_manager> playlist_api; int total = playlist_api->activeplaylist_get_item_count(); int item_height = get_item_height(); int valid_idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), false); int idx = hittest_item_no_scroll(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), false); // (GET_Y_LPARAM(lp) - get_header_height()) / (item_height); int items_count = ((rc.bottom - rc.top) / item_height) + 1; if ((idx + scroll_item_offset) != dragitem || GET_Y_LPARAM(lp) < get_header_height()) //(idx + scroll_item_offset) < playlist_api->activeplaylist_get_item_count() { if (idx >= items_count - 1) { bool need_redrawing = false; int focus = playlist_api->activeplaylist_get_focus_item(); SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int old_offset = si.nPos; si.nPos += 3; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (old_offset != scroll_item_offset) need_redrawing = true; int t = scroll_item_offset + items_count - 2; //n=dragitem, if (t > total) t = total - 1; if (t != dragitem) { drawing_enabled = false; if (drag_type == 1) playlist_api->activeplaylist_move_selection((rc.bottom - rc.top) / item_height + scroll_item_offset - focus - 1); else if (drag_type == 2) { set_sel_range(dragstartitem, t, false); playlist_api->activeplaylist_set_focus_item(t); } dragitem = t; drawing_enabled = true; need_redrawing = true; } if (need_redrawing) RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } else if (idx < 0 || GET_Y_LPARAM(lp) < get_header_height() || GET_Y_LPARAM(lp) < 0) { int focus = playlist_api->activeplaylist_get_focus_item(); bool need_redrawing = false; SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int old_offset = si.nPos; si.nPos -= 3; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (old_offset != scroll_item_offset) need_redrawing = true; if (dragitem != scroll_item_offset) { drawing_enabled = false; if (drag_type == 1) playlist_api->activeplaylist_move_selection(scroll_item_offset - focus); else if (drag_type == 2) { set_sel_range(dragstartitem, scroll_item_offset, false); playlist_api->activeplaylist_set_focus_item(scroll_item_offset); RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } dragitem = scroll_item_offset; drawing_enabled = true; need_redrawing = true; } if (need_redrawing) RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } else { int focus = playlist_api->activeplaylist_get_focus_item(); if (drag_type == 1) playlist_api->activeplaylist_move_selection(idx + scroll_item_offset - focus); else if (drag_type == 2) { if (valid_idx >= 0) { drawing_enabled = false; set_sel_range(dragstartitem, valid_idx, false); playlist_api->activeplaylist_set_focus_item(valid_idx); drawing_enabled = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } } dragitem = valid_idx; dragged = true; } } } else if (!(wp & MK_LBUTTON)) drag_type = 0; } break; case WM_LBUTTONDBLCLK: { int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); if (idx >= 0) { //#ifdef INLINE_EDIT exit_inline_edit(); m_no_next_edit = true; //#endif //if (!is_visible(idx)) uSendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0),0); #if 0 // DEATH's code case WM_LBUTTONDBLCLK: { int idx = item_from_point((short)HIWORD(lp)); if (idx >= 0 && idx<(int)m_api->activeplaylist_get_item_count()) { m_api->activeplaylist_set_focus_item(idx); static_api_ptr_t<play_control>()->play_start(play_control::TRACK_COMMAND_SETTRACK); } } return 0; #endif static_api_ptr_t<playlist_manager> playlist_api; //unsigned active = playlist_api->get_active_playlist(); // playlist_api->set_playing_playlist(active); //playlist_api->playlist_set_playback_cursor(active, idx); //playlist_api->queue_flush(); unsigned focus = playlist_api->activeplaylist_get_focus_item(); playlist_api->activeplaylist_execute_default_action(focus); } else if (cfg_playlist_double.get_value().m_command != pfc::guid_null) { mainmenu_commands::g_execute(cfg_playlist_double.get_value().m_command); } dragged = true; } break; case WM_RBUTTONDOWN: { if (wnd_playlist) SetFocus(wnd_playlist); g_dragging1 = true; drag_start.x = GET_X_LPARAM(lp); drag_start.y = GET_Y_LPARAM(lp); static_api_ptr_t<playlist_manager> playlist_api; // int item_height = get_item_height(); // int idx = ((GET_Y_LPARAM(lp) - get_header_height()) / item_height) + scroll_item_offset; int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); if (idx != -1 && !is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); if (idx >= 0 /*&& idx < playlist_api->activeplaylist_get_item_count() && (GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual())*/) { if (!playlist_api->activeplaylist_is_item_selected(idx) && !(GetKeyState(VK_CONTROL) & KF_UP)) { set_sel_single(idx, false, false, true); } playlist_api->activeplaylist_set_focus_item(idx); } } break; case WM_MOUSEWHEEL: {//GET_WHEEL_DELTA_WPARAM exit_inline_edit(); if (1 || (wp & MK_CONTROL)) { LONG_PTR style = GetWindowLongPtr(wnd_playlist, GWL_STYLE); if (!(style & WS_VSCROLL) || ((wp & MK_CONTROL) && (style & WS_HSCROLL))) { if ((style & WS_HSCROLL)) { SCROLLINFO si; memset(&si, 0, sizeof(SCROLLINFO)); si.fMask = SIF_PAGE; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(wnd, SB_HORZ, &si); int new_pos = horizontal_offset; int old_pos = horizontal_offset; unsigned scroll_lines = GetNumScrollLines(); int zDelta = short(HIWORD(wp)); if (scroll_lines == -1) { scroll_lines = si.nPage > 1 ? si.nPage - 1 : 1; } else scroll_lines *= 3; int delta = MulDiv(zDelta, scroll_lines, 120); if (!si.nPage) si.nPage++; if (delta < 0 && delta*-1 > si.nPage) { delta = si.nPage*-1; if (delta >1) delta--; } else if (delta > 0 && delta > si.nPage) { delta = si.nPage; if (delta >1) delta--; } scroll(scroll_horizontally, scroll_position_delta, -delta); } return 1; } } SCROLLINFO si; memset(&si, 0, sizeof(SCROLLINFO)); si.fMask = SIF_PAGE; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(wnd, SB_VERT, &si); int new_pos = scroll_item_offset; int old_pos = scroll_item_offset; unsigned scroll_lines = GetNumScrollLines(); int zDelta = short(HIWORD(wp)); if (scroll_lines == -1) { scroll_lines = si.nPage > 1 ? si.nPage - 1 : 1; } int delta = MulDiv(zDelta, scroll_lines, 120); if (!si.nPage) si.nPage++; if (delta < 0 && delta*-1 > si.nPage) { delta = si.nPage*-1; if (delta >1) delta--; } else if (delta > 0 && delta > si.nPage) { delta = si.nPage; if (delta >1) delta--; } scroll(scroll_vertically, scroll_position_delta, -delta); } return 1; case WM_VSCROLL: { exit_inline_edit(); scroll(scroll_vertically, scroll_sb, LOWORD(wp)); } return 0; case WM_HSCROLL: { exit_inline_edit(); scroll(scroll_horizontally, scroll_sb, LOWORD(wp)); } return 0; case WM_MENUSELECT: { if (HIWORD(wp) & MF_POPUP) { m_status_override.release(); } else { if (g_main_menu_a.is_valid() || g_main_menu_b.is_valid()) { unsigned id = LOWORD(wp); bool set = false; pfc::string8 desc; if (g_main_menu_a.is_valid() && id < MENU_B_BASE) { set = g_main_menu_a->get_description(id - MENU_A_BASE, desc); } else if (g_main_menu_b.is_valid()) { contextmenu_node * node = g_main_menu_b->find_by_id(id - MENU_B_BASE); if (node) set = node->get_description(desc); } service_ptr_t<ui_status_text_override> p_status_override; if (set) { get_host()->override_status_text_create(p_status_override); if (p_status_override.is_valid()) { p_status_override->override_text(desc); } } m_status_override = p_status_override; } } } break; case WM_CONTEXTMENU: { uie::window_ptr p_this_temp = this; if ((HWND)wp == wnd_header) { POINT pt = { (short)LOWORD(lp), (short)HIWORD(lp) }; POINT temp; temp.x = pt.x; temp.y = pt.y; ScreenToClient(wnd_header, &temp); HDHITTESTINFO hittest; hittest.pt.x = temp.x; hittest.pt.y = temp.y; uSendMessage(wnd_header, HDM_HITTEST, 0, (LPARAM)&hittest); enum { IDM_ASC = 1, IDM_DES = 2, IDM_SEL_ASC, IDM_SEL_DES, IDM_AUTOSIZE, IDM_PREFS, IDM_EDIT_COLUMN, IDM_CUSTOM_BASE }; HMENU menu = CreatePopupMenu(); HMENU selection_menu = CreatePopupMenu(); if (!(hittest.flags & HHT_NOWHERE)) { uAppendMenu(menu, (MF_STRING), IDM_ASC, "&Sort ascending"); uAppendMenu(menu, (MF_STRING), IDM_DES, "Sort &descending"); uAppendMenu(selection_menu, (MF_STRING), IDM_SEL_ASC, "Sort a&scending"); uAppendMenu(selection_menu, (MF_STRING), IDM_SEL_DES, "Sort d&escending"); uAppendMenu(menu, MF_STRING | MF_POPUP, (UINT)selection_menu, "Se&lection"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); uAppendMenu(menu, (MF_STRING), IDM_EDIT_COLUMN, "&Edit this column"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); uAppendMenu(menu, (MF_STRING | (cfg_nohscroll ? MF_CHECKED : MF_UNCHECKED)), IDM_AUTOSIZE, "&Auto-sizing columns"); uAppendMenu(menu, (MF_STRING), IDM_PREFS, "&Preferences"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); pfc::string8 playlist_name; static_api_ptr_t<playlist_manager> playlist_api; playlist_api->activeplaylist_get_name(playlist_name); pfc::string8_fast_aggressive filter, name; int s, e = columns.get_count(); for (s = 0; s<e; s++) { bool add = false; switch (columns[s]->filter_type) { case FILTER_NONE: { add = true; break; } case FILTER_SHOW: { if (wildcard_helper::test(playlist_name, columns[s]->filter, true)) { add = true; /* g_columns.get_string(s, name, STRING_NAME); uAppendMenu(menu,MF_STRING|MF_CHECKED,IDM_CUSTOM_BASE+s,name);*/ } } break; case FILTER_HIDE: { if (!wildcard_helper::test(playlist_name, columns[s]->filter, true)) { add = true; /* g_columns.get_string(s, name, STRING_NAME); uAppendMenu(menu,MF_STRING|MF_CHECKED,IDM_CUSTOM_BASE+s,name);*/ } } break; } if (add) { uAppendMenu(menu, MF_STRING | (columns[s]->show ? MF_CHECKED : MF_UNCHECKED), IDM_CUSTOM_BASE + s, columns[s]->name); } } } else { uAppendMenu(menu, (MF_STRING | (cfg_nohscroll ? MF_CHECKED : MF_UNCHECKED)), IDM_AUTOSIZE, "&Auto-sizing columns"); uAppendMenu(menu, (MF_STRING), IDM_PREFS, "&Preferences"); } menu_helpers::win32_auto_mnemonics(menu); int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, wnd, 0); DestroyMenu(menu); if (cmd == IDM_ASC) { g_set_sort(hittest.iItem, false); } else if (cmd == IDM_DES) { g_set_sort(hittest.iItem, true); } else if (cmd == IDM_SEL_ASC) { g_set_sort(hittest.iItem, false, true); } else if (cmd == IDM_SEL_DES) { g_set_sort(hittest.iItem, true, true); } else if (cmd == IDM_EDIT_COLUMN) { g_set_tab("Columns"); cfg_cur_prefs_col = g_cache.active_column_active_to_actual(hittest.iItem); //get_idx static_api_ptr_t<ui_control>()->show_preferences(columns::config_get_playlist_view_guid()); } else if (cmd == IDM_AUTOSIZE) { cfg_nohscroll = cfg_nohscroll == 0; update_all_windows(); pvt::ng_playlist_view_t::g_on_autosize_change(); } else if (cmd == IDM_PREFS) { static_api_ptr_t<ui_control>()->show_preferences(columns::config_get_main_guid()); } else if (cmd >= IDM_CUSTOM_BASE) { if (t_size(cmd - IDM_CUSTOM_BASE) < columns.get_count()) { columns[cmd - IDM_CUSTOM_BASE]->show = !columns[cmd - IDM_CUSTOM_BASE]->show; //g_columns //if (!cfg_nohscroll) g_save_columns(); //g_cache.flush_all(); g_reset_columns(); update_all_windows(); pvt::ng_playlist_view_t::g_on_columns_change(); } } return 0; } else if ((HWND)wp == wnd) { //DWORD mp = GetMessagePos(); POINT px, pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; static_api_ptr_t<playlist_manager> playlist_api; if (playlist_api->activeplaylist_get_selection_count(1) > 0 && 1) { if (pt.x == -1 && pt.y == -1) { int focus = playlist_api->activeplaylist_get_focus_item(); unsigned last = get_last_viewable_item(); if (focus == -1 || focus < scroll_item_offset || focus > last) { px.x = 0; px.y = 0; } else { RECT rc; get_playlist_rect(&rc); px.x = 0; unsigned item_height = get_item_height(); px.y = (focus - scroll_item_offset)*(item_height)+item_height / 2 + rc.top; } pt = px; MapWindowPoints(wnd, HWND_DESKTOP, &pt, 1); } else { px = pt; ScreenToClient(wnd, &px); //int idx = hittest_item(px.x, px.y); //if (!is_visible(idx)) // SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0),0); } // int idx = hittest_item(px.x, px.y); enum { ID_PLAY = 1, ID_CUT, ID_COPY, ID_PASTE, ID_SELECTION, ID_CUSTOM_BASE = 0x8000 }; HMENU menu = CreatePopupMenu();//LoadMenu(core_api::get_my_instance(),MAKEINTRESOURCE(IDR_TREEPOPUP)); service_ptr_t<mainmenu_manager> p_manager_selection; service_ptr_t<contextmenu_manager> p_manager_context; p_manager_selection = standard_api_create_t<mainmenu_manager>(); contextmenu_manager::g_create(p_manager_context); if (p_manager_selection.is_valid()) { p_manager_selection->instantiate(mainmenu_groups::edit_part2_selection); p_manager_selection->generate_menu_win32(menu, ID_SELECTION, ID_CUSTOM_BASE - ID_SELECTION, standard_config_objects::query_show_keyboard_shortcuts_in_menus() ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); if (GetMenuItemCount(menu) > 0) uAppendMenu(menu, MF_SEPARATOR, 0, ""); } AppendMenu(menu, MF_STRING, ID_CUT, L"Cut"); AppendMenu(menu, MF_STRING, ID_COPY, L"Copy"); if (playlist_utils::check_clipboard()) AppendMenu(menu, MF_STRING, ID_PASTE, L"Paste"); AppendMenu(menu, MF_SEPARATOR, 0, NULL); if (p_manager_context.is_valid()) { const keyboard_shortcut_manager::shortcut_type shortcuts[] = { keyboard_shortcut_manager::TYPE_CONTEXT_PLAYLIST, keyboard_shortcut_manager::TYPE_CONTEXT }; p_manager_context->set_shortcut_preference(shortcuts, tabsize(shortcuts)); p_manager_context->init_context_playlist(standard_config_objects::query_show_keyboard_shortcuts_in_menus() ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); p_manager_context->win32_build_menu(menu, ID_CUSTOM_BASE, -1); } menu_helpers::win32_auto_mnemonics(menu); MENU_A_BASE = ID_SELECTION; MENU_B_BASE = ID_CUSTOM_BASE; g_main_menu_a = p_manager_selection; g_main_menu_b = p_manager_context; int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, wnd, 0); if (m_status_override.is_valid()) { m_status_override.release(); } DestroyMenu(menu); if (cmd) { if (cmd == ID_CUT) { playlist_utils::cut(); } else if (cmd == ID_COPY) { playlist_utils::copy(); } else if (cmd == ID_PASTE) { playlist_utils::paste(wnd); } else if (cmd >= ID_SELECTION && cmd<ID_CUSTOM_BASE) { if (p_manager_selection.is_valid()) { p_manager_selection->execute_command(cmd - ID_SELECTION); } } else if (cmd >= ID_CUSTOM_BASE) { if (p_manager_context.is_valid()) { p_manager_context->execute_by_id(cmd - ID_CUSTOM_BASE); } } } g_main_menu_a.release(); g_main_menu_b.release(); } // contextmenu_manager::win32_run_menu_context_playlist(wnd, 0, config_object::g_get_data_bool_simple(standard_config_objects::bool_show_keyboard_shortcuts_in_menus, true) ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); } } return 0; //#ifdef INLINE_EDIT case WM_PARENTNOTIFY: { if (wp == WM_DESTROY) { if (m_wnd_edit && (HWND)lp == m_wnd_edit) m_wnd_edit = 0; } } break; case MSG_KILL_INLINE_EDIT: exit_inline_edit(); return 0; #if 1 case WM_COMMAND: switch (wp) { case (EN_CHANGE << 16) | 667: { m_edit_changed = true; } break; } break; #endif case WM_TIMER: { if (wp == EDIT_TIMER_ID) { create_inline_edit_v2(m_edit_index, m_edit_column); if (m_edit_timer) { KillTimer(wnd_playlist, EDIT_TIMER_ID); m_edit_timer = false; } return 0; } } break; //#endif case WM_NOTIFY: switch (((LPNMHDR)lp)->idFrom) { case ID_PLAYLIST_TOOLTIP: switch (((LPNMHDR)lp)->code) { case TTN_SHOW: RECT rc, rc_tt; rc = tooltip; GetWindowRect(g_tooltip, &rc_tt); int offset = MulDiv(get_item_height() - rc_tt.bottom + rc_tt.top, 1, 2); rc.top += offset; SetWindowPos(g_tooltip, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); return TRUE; } break; case 5001: switch (((LPNMHDR)lp)->code) { case HDN_BEGINTRACKA: case HDN_BEGINTRACKW: { return (cfg_nohscroll ? TRUE : FALSE); } case HDN_ENDDRAG: { if (((LPNMHEADERA)lp)->iButton == 0) { if (((LPNMHEADERA)lp)->pitem && (((LPNMHEADERA)lp)->pitem->mask & HDI_ORDER)) { int from = ((LPNMHEADERA)lp)->iItem; int to = ((LPNMHEADERA)lp)->pitem->iOrder; if (to >= 0 && from != to) { int act_from = g_cache.active_column_active_to_actual(from), act_to = g_cache.active_column_active_to_actual(to); columns.move(act_from, act_to); //if (!cfg_nohscroll) g_save_columns(); g_reset_columns(); update_all_windows(); pvt::ng_playlist_view_t::g_on_columns_change(); } } else { } } return (TRUE); } case HDN_DIVIDERDBLCLICK: if (!cfg_nohscroll) { static_api_ptr_t<playlist_manager> playlist_api; HDC hdc; hdc = GetDC(wnd_playlist); int size; pfc::string8 text; SelectObject(hdc, g_font); int w = 0, n, t = playlist_api->activeplaylist_get_item_count(); for (n = 0; n<t; n++) { // playlist_api->format_title(n, text, g_playlist_entries.get_display_spec(((LPNMHEADER)lp)->iItem), NULL); g_cache.active_get_display_name(n, ((LPNMHEADER)lp)->iItem, text); size = ui_helpers::get_text_width_color(hdc, text, text.length()); if (size > w) w = size; } // g_playlist_entries.get_column(((LPNMHEADER)lp)->iItem)->_set_width(w+5); columns[g_cache.active_column_active_to_actual(((LPNMHEADER)lp)->iItem)]->width = w + 15; ReleaseDC(wnd_playlist, hdc); update_all_windows(); g_save_columns(); pvt::ng_playlist_view_t::g_on_column_widths_change(); } return 0; case HDN_ITEMCLICK: { bool des = false; static_api_ptr_t<playlist_manager> playlist_api; unsigned col; bool descending; bool sorted = g_cache.active_get_playlist_sort(col, &descending); if (sorted && col == ((LPNMHEADER)lp)->iItem) des = !descending; g_set_sort(((LPNMHEADER)lp)->iItem, des /*, playlist_api->activeplaylist_get_selection_count(1) && cfg_sortsel != 0*/); } break; case HDN_ITEMCHANGED: { if (!cfg_nohscroll) { if (((LPNMHEADER)lp)->pitem->mask & HDI_WIDTH) columns[g_cache.active_column_active_to_actual(((LPNMHEADER)lp)->iItem)]->width = ((LPNMHEADER)lp)->pitem->cxy; update_all_windows(wnd_header); g_save_columns(); pvt::ng_playlist_view_t::g_on_column_widths_change(); } } break; } break; } } return uDefWindowProc(wnd, msg, wp, lp); }
void DialogInstall::TabInstall::Initialize() { HWND item = GetDlgItem(m_Window, IDC_INSTALLTAB_COMPONENTS_LIST); DWORD extendedFlags = LVS_EX_CHECKBOXES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT; if (GetOSPlatform() >= OSPLATFORM_VISTA) { extendedFlags |= LVS_EX_DOUBLEBUFFER; SetWindowTheme(item, L"explorer", nullptr); } ListView_EnableGroupView(item, TRUE); ListView_SetExtendedListViewStyleEx(item, 0, extendedFlags); // Add columns LVCOLUMN lvc; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = 0; lvc.cx = 180; lvc.pszText = L"Name"; ListView_InsertColumn(item, 0, &lvc); lvc.iSubItem = 1; lvc.cx = 150; lvc.pszText = L"Action"; ListView_InsertColumn(item, 1, &lvc); // Add groups and items LVGROUP lvg; lvg.cbSize = sizeof(LVGROUP); lvg.mask = LVGF_HEADER | LVGF_GROUPID | LVGF_STATE; lvg.state = (GetOSPlatform() >= OSPLATFORM_VISTA) ? LVGS_COLLAPSIBLE : LVGS_NORMAL; LVITEM lvi; lvi.mask = LVIF_TEXT | LVIF_GROUPID | LVIF_PARAM; lvi.iSubItem = 0; auto addComponent = [&](const WCHAR* name, const std::set<std::wstring>& items, const std::wstring& path, int groupId) { lvg.iGroupId = groupId; lvg.pszHeader = (WCHAR*)name; ListView_InsertGroup(item, groupId, &lvg); lvi.iGroupId = groupId; lvi.iItem = 0; for (auto iter = items.cbegin(); iter != items.cend(); ++iter) { lvi.pszText = (WCHAR*)(*iter).c_str(); lvi.lParam = (LPARAM)&(*iter); ListView_InsertItem(item, &lvi); ListView_SetCheckState(item, lvi.iItem, TRUE); std::wstring itemPath = path + *iter; WCHAR* text = L"Add"; if (_waccess(itemPath.c_str(), 0) != -1) { bool backup = groupId == 0 && c_Dialog->m_BackupSkins && !c_Dialog->m_BackupPackage; text = backup ? L"Backup and replace" : L"Replace"; } ListView_SetItemText(item, lvi.iItem, 1, text); ++lvi.iItem; } }; addComponent(L"Skins", c_Dialog->m_PackageSkins, g_Data.skinsPath, 0); addComponent(L"Layouts", c_Dialog->m_PackageLayouts, g_Data.settingsPath + L"Layouts\\", 1); addComponent(L"Addons", c_Dialog->m_PackageAddons, g_Data.settingsPath + L"Addons\\", 2); addComponent(L"Plugins", c_Dialog->m_PackagePlugins, g_Data.settingsPath + L"Plugins\\", 3); item = GetDlgItem(m_Window, IDC_INSTALLTAB_THEME_CHECKBOX); if (!c_Dialog->m_LoadLayout.empty()) { Button_SetCheck(item, BST_CHECKED); } else if (!c_Dialog->m_LoadSkins.empty()) { SetWindowText(item, L"Load included skins"); Button_SetCheck(item, BST_CHECKED); } else { ShowWindow(item, SW_HIDE); } m_Initialized = true; }
static void DisableVisualStylesFilters(HWND hDlg) { SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_EDIT), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_VECTOR), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_CLONES), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_NONWORKING), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_HORIZONTAL), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_UNAVAILABLE), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_RASTER), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_ORIGINALS), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_WORKING), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_VERTICAL), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_AVAILABLE), L" ", L" "); }
static void DisableVisualStylesInterface(HWND hDlg) { SetWindowTheme(GetDlgItem(hDlg, IDC_DISABLE_TRAY_ICON), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_EXIT_DIALOG), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_JOY_GUI), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_USE_BROKEN_ICON), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_FILTER_INHERIT), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_DISPLAY_NO_ROMS), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_ENABLE_FASTAUDIT), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_ENABLE_SEVENZIP), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_ENABLE_DATAFILES), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_SKIP_BIOS), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_HISTORY_TAB), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_RESET_PLAYCOUNT), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_RESET_PLAYTIME), L" ", L" "); SetWindowTheme(GetDlgItem(hDlg, IDC_STRETCH_SCREENSHOT_LARGER), L" ", L" "); }
INT_PTR CALLBACK AddCustomFileDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_INITDIALOG: { CenterWindow(hDlg); hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAMEUI_ICON)); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); hBrush = CreateSolidBrush(RGB(240, 240, 240)); if (IsWindowsSevenOrHigher()) SendMessage(GetDlgItem(hDlg, IDC_CUSTOM_TREE), TVM_SETEXTENDEDSTYLE, TVS_EX_DOUBLEBUFFER, TVS_EX_DOUBLEBUFFER); SetWindowTheme(GetDlgItem(hDlg, IDC_CUSTOM_TREE), L"Explorer", NULL); TREEFOLDER **folders; int num_folders = 0; TVINSERTSTRUCT tvis; TVITEM tvi; bool first_entry = true; HIMAGELIST treeview_icons = GetTreeViewIconList(); // current game passed in using DialogBoxParam() driver_index = lParam; (void)TreeView_SetImageList(GetDlgItem(hDlg, IDC_CUSTOM_TREE), treeview_icons, LVSIL_NORMAL); GetFolders(&folders, &num_folders); // insert custom folders into our tree view for (int i = 0; i < num_folders; i++) { if (folders[i]->m_dwFlags & F_CUSTOM) { HTREEITEM hti; if (folders[i]->m_nParent == -1) { memset(&tvi, 0, sizeof(TVITEM)); tvis.hParent = TVI_ROOT; tvis.hInsertAfter = TVI_SORT; tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.pszText = folders[i]->m_lptTitle; tvi.lParam = (LPARAM)folders[i]; tvi.iImage = GetTreeViewIconIndex(folders[i]->m_nIconId); tvi.iSelectedImage = 0; tvis.item = tvi; hti = TreeView_InsertItem(GetDlgItem(hDlg, IDC_CUSTOM_TREE), &tvis); /* look for children of this custom folder */ for (int jj = 0; jj < num_folders; jj++) { if (folders[jj]->m_nParent == i) { HTREEITEM hti_child; tvis.hParent = hti; tvis.hInsertAfter = TVI_SORT; tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.pszText = folders[jj]->m_lptTitle; tvi.lParam = (LPARAM)folders[jj]; tvi.iImage = GetTreeViewIconIndex(folders[jj]->m_nIconId); tvi.iSelectedImage = 0; tvis.item = tvi; hti_child = TreeView_InsertItem(GetDlgItem(hDlg, IDC_CUSTOM_TREE), &tvis); if (folders[jj] == default_selection) (void)TreeView_SelectItem(GetDlgItem(hDlg, IDC_CUSTOM_TREE), hti_child); } } /*TreeView_Expand(GetDlgItem(hDlg,IDC_CUSTOM_TREE),hti,TVE_EXPAND);*/ if (first_entry || folders[i] == default_selection) { (void)TreeView_SelectItem(GetDlgItem(hDlg, IDC_CUSTOM_TREE),hti); first_entry = false; } } } } win_set_window_text_utf8(GetDlgItem(hDlg, IDC_CUSTOMFILE_GAME), GetDriverGameTitle(driver_index)); return true; } case WM_CTLCOLORDLG: return (LRESULT) hBrush; case WM_CTLCOLORSTATIC: case WM_CTLCOLORBTN: hDC = (HDC)wParam; SetBkMode(hDC, TRANSPARENT); SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT)); return (LRESULT) hBrush; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: { TVITEM tvi; tvi.hItem = TreeView_GetSelection(GetDlgItem(hDlg, IDC_CUSTOM_TREE)); tvi.mask = TVIF_PARAM; if (TreeView_GetItem(GetDlgItem(hDlg, IDC_CUSTOM_TREE),&tvi) == true) { /* should look for New... */ default_selection = (LPTREEFOLDER)tvi.lParam; /* start here next time */ AddToCustomFolder((LPTREEFOLDER)tvi.lParam, driver_index); } DestroyIcon(hIcon); DeleteObject(hBrush); EndDialog(hDlg, 0); return true; } case IDCANCEL: DestroyIcon(hIcon); DeleteObject(hBrush); EndDialog(hDlg, 0); return true; } break; } return false; }
BOOL CSetOverlayIcons::OnInitDialog() { ISettingsPropPage::OnInitDialog(); m_cIconList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_SUBITEMIMAGES); // get the path to our icon sets TCHAR buf[MAX_PATH] = {0}; SHGetSpecialFolderPath(m_hWnd, buf, CSIDL_PROGRAM_FILES_COMMON, true); m_sIconPath = buf; m_sIconPath += _T("\\TortoiseOverlays\\Icons"); // list all the icon sets CDirFileEnum filefinder(m_sIconPath); bool isDir = false; CString item; while (filefinder.NextFile(item, &isDir)) { if (!isDir) continue; m_cIconSet.AddString(CPathUtils::GetFileNameFromPath(item)); } CheckRadioButton(IDC_LISTRADIO, IDC_SYMBOLRADIO, IDC_LISTRADIO); CString sModifiedIcon = m_regModified; if (sModifiedIcon.IsEmpty()) { // no custom icon set, use the default sModifiedIcon = m_sIconPath + _T("\\XPStyle\\ModifiedIcon.ico"); } if (sModifiedIcon.Left(m_sIconPath.GetLength()).CompareNoCase(m_sIconPath)!=0) { // an icon set outside our own installation? We don't support that, // so fall back to the default! sModifiedIcon = m_sIconPath + _T("\\XPStyle\\ModifiedIcon.ico"); } // the name of the icon set is the folder of the icon location m_sOriginalIconSet = sModifiedIcon.Mid(m_sIconPath.GetLength()+1); m_sOriginalIconSet = m_sOriginalIconSet.Left(m_sOriginalIconSet.ReverseFind('\\')); // now we have the name of the icon set. Set the combobox to show // that as selected CString ComboItem; for (int i=0; i<m_cIconSet.GetCount(); ++i) { m_cIconSet.GetLBText(i, ComboItem); if (ComboItem.CompareNoCase(m_sOriginalIconSet)==0) m_cIconSet.SetCurSel(i); } WORD langID = (WORD)(DWORD)CRegStdDWORD(_T("Software\\TortoiseGit\\LanguageID"), GetUserDefaultLangID()); TCHAR statustext[MAX_STATUS_STRING_LENGTH] = { 0 }; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_normal, statustext, _countof(statustext), langID); m_sNormal = statustext; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_modified, statustext, _countof(statustext), langID); m_sModified = statustext; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_conflicted, statustext, _countof(statustext), langID); m_sConflicted = statustext; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_deleted, statustext, _countof(statustext), langID); m_sDeleted = statustext; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_added, statustext, _countof(statustext), langID); m_sAdded = statustext; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_ignored, statustext, _countof(statustext), langID); m_sIgnored = statustext; GitStatus::GetStatusString(AfxGetResourceHandle(), git_wc_status_unversioned, statustext, _countof(statustext), langID); m_sUnversioned = statustext; m_sReadOnly.LoadString(IDS_SETTINGS_READONLYNAME); m_sLocked.LoadString(IDS_SETTINGS_LOCKEDNAME); SetWindowTheme(m_hWnd, L"Explorer", NULL); ShowIconSet(true); return TRUE; }
VOID WINAPI HashVerifyDlgInit( PHASHVERIFYCONTEXT phvctx ) { HWND hWnd = phvctx->hWnd; UINT i; // Load strings { static const UINT16 arStrMap[][2] = { { IDC_SUMMARY, IDS_HV_SUMMARY }, { IDC_MATCH_LABEL, IDS_HV_MATCH }, { IDC_MISMATCH_LABEL, IDS_HV_MISMATCH }, { IDC_UNREADABLE_LABEL, IDS_HV_UNREADABLE }, { IDC_PENDING_LABEL, IDS_HV_PENDING }, { IDC_PAUSE, IDS_HV_PAUSE }, { IDC_STOP, IDS_HV_STOP }, { IDC_EXIT, IDS_HV_EXIT } }; for (i = 0; i < countof(arStrMap); ++i) SetControlText(hWnd, arStrMap[i][0], arStrMap[i][1]); } // Set the window icon and title { PTSTR pszFileName = StrRChr(phvctx->pszPath, NULL, TEXT('\\')); if (!(pszFileName && *++pszFileName)) pszFileName = phvctx->pszPath; SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)pszFileName ); SendMessage( hWnd, WM_SETICON, ICON_BIG, // No need to explicitly set the small icon (LPARAM)LoadIcon(g_hModThisDll, MAKEINTRESOURCE(IDI_FILETYPE)) ); } // Initialize the list box { typedef struct { UINT16 iStringID; UINT16 iAlign; UINT16 iWidth; } COLINFO, *PCOLINFO; static const COLINFO arCols[] = { { IDS_HV_COL_FILENAME, LVCFMT_LEFT, 245 }, { IDS_HV_COL_SIZE, LVCFMT_RIGHT, 64 }, { IDS_HV_COL_STATUS, LVCFMT_CENTER, 64 }, { IDS_HV_COL_EXPECTED, LVCFMT_CENTER, 0 }, { IDS_HV_COL_ACTUAL, LVCFMT_CENTER, 0 }, }; // We will be using the list window handle a lot throughout HashVerify, // so we should cache it to reduce the number of lookups phvctx->hWndList = GetDlgItem(hWnd, IDC_LIST); for (i = 0; i < countof(arCols); ++i) { TCHAR szBuffer[MAX_STRINGRES]; LVCOLUMN lvc; RECT rc; LoadString(g_hModThisDll, arCols[i].iStringID, szBuffer, countof(szBuffer)); rc.left = arCols[i].iWidth; if (rc.left == 0) { if (phvctx->whctx.flags == WHEX_CHECKCRC32) rc.left = 8 * 4 + 20 + 40; // extra size to accommodate the header labels else if (phvctx->whctx.flags == WHEX_CHECKSHA1) rc.left = 40 * 4 + 20; else if (phvctx->whctx.flags & WHEX_ALL128) rc.left = 32 * 4 + 20; } MapDialogRect(hWnd, &rc); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = arCols[i].iAlign; lvc.cx = rc.left; lvc.pszText = szBuffer; ListView_InsertColumn(phvctx->hWndList, i, &lvc); } ListView_SetExtendedListViewStyle(phvctx->hWndList, LISTVIEW_EXSTYLES); ListView_SetItemCount(phvctx->hWndList, phvctx->cTotal); // Use the new-fangled list view style for Vista if (g_uWinVer >= 0x0600) SetWindowTheme(phvctx->hWndList, L"Explorer", NULL); phvctx->sort.iColumn = -1; } // Initialize the status strings { UINT i; for (i = 1; i <= 3; ++i) { LoadString( g_hModThisDll, i + (IDS_HV_STATUS_MATCH - 1), phvctx->szStatus[i], countof(phvctx->szStatus[i]) ); } } // Initialize miscellaneous stuff { phvctx->uMaxBatch = (phvctx->cTotal < (0x20 << 8)) ? 0x20 : phvctx->cTotal >> 8; } }
static LRESULT CALLBACK GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PROGGROUP* group; INT iItem; LVITEMW lvItem; POINT pt; group = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0); switch (uMsg) { case WM_NCCREATE: { LPCREATESTRUCTW pcs = (LPCREATESTRUCTW)lParam; LPMDICREATESTRUCTW pMDIcs = (LPMDICREATESTRUCTW)pcs->lpCreateParams; group = (PROGGROUP*)pMDIcs->lParam; SetWindowLongPtrW(hWnd, 0, (LONG_PTR)group); if (group->bIsCommonGroup) { DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG, (LPARAM)CopyImage(Globals.hCommonGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_COPYFROMRESOURCE)); DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)CopyImage(Globals.hCommonGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE)); } else { DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG, (LPARAM)CopyImage(Globals.hPersonalGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_COPYFROMRESOURCE)); DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)CopyImage(Globals.hPersonalGroupIcon, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_COPYFROMRESOURCE)); } break; } case WM_NCDESTROY: SetWindowLongPtrW(hWnd, 0, 0); break; case WM_CREATE: { DWORD dwStyle; RECT rect; GetClientRect(hWnd, &rect); group->hListView = CreateWindowW(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_OVERLAPPED, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hWnd, NULL, Globals.hInstance, NULL); dwStyle = (GetWindowLongPtrW(group->hListView, GWL_STYLE) | LVS_SHOWSELALWAYS) & ~LVS_AUTOARRANGE; SetWindowLongPtrW(group->hListView, GWL_STYLE, dwStyle); dwStyle = SendMessageA(group->hListView, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) | LVS_EX_BORDERSELECT; SendMessageA(group->hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_SNAPTOGRID, dwStyle); InitUxTheme(); SetWindowTheme(group->hListView, L"Explorer", NULL); group->hListLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), ILC_COLOR24 | ILC_MASK, 1, 1); SendMessageA(group->hListView, LVM_SETIMAGELIST, 0, (LPARAM)group->hListLarge); SendMessageA(group->hListView, LVM_SETICONSPACING, 0, MAKELPARAM(80, 64)); break; } case WM_DESTROY: { SendMessageA(group->hListView, LVM_SETIMAGELIST, 0, 0); ImageList_Destroy(group->hListLarge); DestroyWindow(group->hListView); break; } case WM_SIZE: { RECT rect; rect.left = 0; rect.top = 0; rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); AdjustWindowRectEx(&rect, GetWindowLongPtrW(group->hListView, GWL_STYLE), FALSE, GetWindowLongPtrW(group->hListView, GWL_EXSTYLE)); MoveWindow(group->hListView, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE); break; } case WM_CLOSE: SendMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); break; case WM_SYSCOMMAND: if (wParam == SC_CLOSE) wParam = SC_MINIMIZE; break; case WM_CHILDACTIVATE: case WM_NCLBUTTONDOWN: Globals.hActiveGroup = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0); Globals.hActiveGroup->hActiveProgram = NULL; break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { iItem = ((LPNMITEMACTIVATE)lParam)->iItem; if (iItem == -1) { group->hActiveProgram = NULL; break; } lvItem.mask = LVIF_PARAM; lvItem.iItem = iItem; SendMessageW(group->hListView, LVM_GETITEMW, 0, (LPARAM)&lvItem); group->hActiveProgram = (PROGRAM*)lvItem.lParam; break; } case NM_DBLCLK: { iItem = ((LPNMITEMACTIVATE)lParam)->iItem; if (iItem == -1) break; lvItem.mask = LVIF_PARAM; lvItem.iItem = iItem; SendMessageW(group->hListView, LVM_GETITEMW, 0, (LPARAM)&lvItem); /* ... or use group->hActiveProgram */ PROGRAM_ExecuteProgram((PROGRAM*)lvItem.lParam); break; } case LVN_BEGINDRAG: { POINT ptMin; BOOL bFirst = TRUE; for (iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, -1, LVNI_SELECTED); iItem != -1; iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, iItem, LVNI_SELECTED)) { if (bFirst) { group->hDragImageList = (HIMAGELIST)SendMessageA(group->hListView, LVM_CREATEDRAGIMAGE, iItem, (LPARAM)&pt); ptMin = pt; bFirst = FALSE; } else { HIMAGELIST hOneImageList, hTempImageList; hOneImageList = (HIMAGELIST)SendMessageA(group->hListView, LVM_CREATEDRAGIMAGE, iItem, (LPARAM)&pt); hTempImageList = ImageList_Merge(group->hDragImageList, 0, hOneImageList, 0, pt.x - ptMin.x, pt.y - ptMin.y); ImageList_Destroy(group->hDragImageList); ImageList_Destroy(hOneImageList); group->hDragImageList = hTempImageList; ptMin.x = min(ptMin.x, pt.x); ptMin.y = min(ptMin.y, pt.y); } } // pt = ((LPNMLISTVIEW)lParam)->ptAction; pt.x = ((LPNMLISTVIEW)lParam)->ptAction.x; pt.y = ((LPNMLISTVIEW)lParam)->ptAction.y; group->ptStart = pt; pt.x -= ptMin.x; pt.y -= ptMin.y; ImageList_BeginDrag(group->hDragImageList, 0, pt.x, pt.y); MapWindowPoints(group->hListView, Globals.hMDIWnd, &pt, 1); ImageList_DragEnter(Globals.hMDIWnd, pt.x, pt.y); group->bDragging = TRUE; group->hOldCursor = GetCursor(); SetCapture(group->hWnd); break; } } break; case WM_MOUSEMOVE: if (group->bDragging) { pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam); MapWindowPoints(group->hWnd, Globals.hMDIWnd, &pt, 1); ImageList_DragMove(pt.x, pt.y); } break; case WM_LBUTTONUP: if (group->bDragging) { // LVHITTESTINFO lvhti; POINT ptHit; group->bDragging = FALSE; ImageList_DragLeave(Globals.hMDIWnd); ImageList_EndDrag(); ImageList_Destroy(group->hDragImageList); ReleaseCapture(); SetCursor(group->hOldCursor); ptHit.x = GET_X_LPARAM(lParam); ptHit.y = GET_Y_LPARAM(lParam); MapWindowPoints(group->hWnd, group->hListView, &ptHit, 1); for (iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, -1, LVNI_SELECTED); iItem != -1; iItem = SendMessageA(group->hListView, LVM_GETNEXTITEM, iItem, LVNI_SELECTED)) { SendMessageA(group->hListView, LVM_GETITEMPOSITION, iItem, (LPARAM)&pt); pt.x += ptHit.x - group->ptStart.x; pt.y += ptHit.y - group->ptStart.y; SendMessageA(group->hListView, LVM_SETITEMPOSITION, iItem, MAKELPARAM(pt.x, pt.y)); } } break; } return DefMDIChildProcW(hWnd, uMsg, wParam, lParam); }
BOOL CEditPropExternals::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); ExtendFrameIntoClientArea(IDC_EXTERNALSLIST); m_aeroControls.SubclassControl(this, IDC_ADD); m_aeroControls.SubclassControl(this, IDC_EDIT); m_aeroControls.SubclassControl(this, IDC_REMOVE); m_aeroControls.SubclassControl(this, IDC_FINDHEAD); m_aeroControls.SubclassOkCancelHelp(this); ATLASSERT(m_pathList.GetCount() == 1); SVN svn; m_url = CTSVNPath(svn.GetURLFromPath(m_pathList[0])); m_repoRoot = CTSVNPath(svn.GetRepositoryRoot(m_pathList[0])); m_externals.Add(m_pathList[0], m_PropValue, false); DWORD exStyle = LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER; m_ExtList.SetExtendedStyle(exStyle); SetWindowTheme(m_ExtList.GetSafeHwnd(), L"Explorer", NULL); m_ExtList.SetRedraw(false); m_ExtList.DeleteAllItems(); int c = m_ExtList.GetHeaderCtrl()->GetItemCount()-1; while (c>=0) m_ExtList.DeleteColumn(c--); CString temp; temp.LoadString(IDS_STATUSLIST_COLFILE); m_ExtList.InsertColumn(0, temp); temp.LoadString(IDS_STATUSLIST_COLURL); m_ExtList.InsertColumn(1, temp); temp.LoadString(IDS_EXTERNALS_PEG); m_ExtList.InsertColumn(2, temp); temp.LoadString(IDS_EXTERNALS_OPERATIVE); m_ExtList.InsertColumn(3, temp); temp.LoadString(IDS_EXTERNALS_HEADREV); m_ExtList.InsertColumn(4, temp); m_ExtList.SetItemCountEx((int)m_externals.size()); CRect rect; m_ExtList.GetClientRect(&rect); m_ExtList.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER); int cx = (rect.Width()-240-m_ExtList.GetColumnWidth(0)); m_ExtList.SetColumnWidth(1, cx); m_ExtList.SetColumnWidth(2, 80); m_ExtList.SetColumnWidth(3, 80); m_ExtList.SetColumnWidth(4, 80); m_ExtList.SetRedraw(true); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, m_pathList.GetCommonRoot().GetUIPathString(), sWindowTitle); AddAnchor(IDC_EXTERNALSLIST, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_ADD, BOTTOM_LEFT); AddAnchor(IDC_EDIT, BOTTOM_LEFT); AddAnchor(IDC_REMOVE, BOTTOM_LEFT); AddAnchor(IDC_FINDHEAD, BOTTOM_LEFT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); EnableSaveRestore(L"EditPropsExternals"); return TRUE; }
LRESULT UploadQueueFrame::onCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { showTree = BOOLSETTING(UPLOADQUEUEFRAME_SHOW_TREE); // status bar CreateSimpleStatusBar(ATL_IDS_IDLEMESSAGE, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP); ctrlStatus.Attach(m_hWndStatusBar); ctrlList.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS, WS_EX_CLIENTEDGE, IDC_UPLOAD_QUEUE); ctrlList.SetExtendedListViewStyle(LVS_EX_LABELTIP | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP); ctrlQueued.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP | TVS_TRACKSELECT, WS_EX_CLIENTEDGE, IDC_DIRECTORIES); if(BOOLSETTING(USE_EXPLORER_THEME) && ((WinUtil::getOsMajor() >= 5 && WinUtil::getOsMinor() >= 1) //WinXP & WinSvr2003 || (WinUtil::getOsMajor() >= 6))) //Vista & Win7 { SetWindowTheme(ctrlQueued.m_hWnd, L"explorer", NULL); } ctrlQueued.SetImageList(WinUtil::fileImages, TVSIL_NORMAL); ctrlList.SetImageList(WinUtil::fileImages, LVSIL_SMALL); m_nProportionalPos = 2500; SetSplitterPanes(ctrlQueued.m_hWnd, ctrlList.m_hWnd); // Create listview columns WinUtil::splitTokens(columnIndexes, SETTING(UPLOADQUEUEFRAME_ORDER), UploadQueueItem::COLUMN_LAST); WinUtil::splitTokens(columnSizes, SETTING(UPLOADQUEUEFRAME_WIDTHS), UploadQueueItem::COLUMN_LAST); // column names, sizes for (uint8_t j=0; j<UploadQueueItem::COLUMN_LAST; j++) { int fmt = (j == UploadQueueItem::COLUMN_TRANSFERRED || j == UploadQueueItem::COLUMN_SIZE) ? LVCFMT_RIGHT : LVCFMT_LEFT; ctrlList.InsertColumn(j, CTSTRING_I(columnNames[j]), fmt, columnSizes[j], j); } ctrlList.setColumnOrderArray(UploadQueueItem::COLUMN_LAST, columnIndexes); ctrlList.setSortColumn(UploadQueueItem::COLUMN_NICK); // colors ctrlList.SetBkColor(WinUtil::bgColor); ctrlList.SetTextBkColor(WinUtil::bgColor); ctrlList.SetTextColor(WinUtil::textColor); ctrlQueued.SetBkColor(WinUtil::bgColor); ctrlQueued.SetTextColor(WinUtil::textColor); ctrlShowTree.Create(ctrlStatus.m_hWnd, rcDefault, _T("+/-"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); ctrlShowTree.SetButtonStyle(BS_AUTOCHECKBOX, false); ctrlShowTree.SetCheck(showTree); showTreeContainer.SubclassWindow(ctrlShowTree.m_hWnd); memzero(statusSizes, sizeof(statusSizes)); statusSizes[0] = 16; ctrlStatus.SetParts(4, statusSizes); UpdateLayout(); UploadManager::getInstance()->addListener(this); SettingsManager::getInstance()->addListener(this); rootItem = ctrlQueued.InsertItem(CTSTRING(ALL), TVI_ROOT, TVI_LAST); LoadAll(); ctrlQueued.Expand(rootItem); bHandled = FALSE; return TRUE; }
static intptr_t InternalColumnDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, int nColumnMax, int *shown, int *order, const wchar_t* const *names, void (*pfnGetRealColumnOrder)(int *), void (*pfnGetColumnInfo)(int *pnOrder, int *pnShown), void (*pfnSetColumnInfo)(int *pnOrder, int *pnShown)) { RECT rectClient; LVCOLUMN LVCol; int nShown = 0; int nAvail = 0; LVITEM lvi; switch (uMsg) { case WM_INITDIALOG: CenterWindow(hDlg); hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAMEUI_ICON)); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); hBrush = CreateSolidBrush(RGB(240, 240, 240)); hShown = GetDlgItem(hDlg, IDC_LISTSHOWCOLUMNS); hAvailable = GetDlgItem(hDlg, IDC_LISTAVAILABLECOLUMNS); SetWindowTheme(hShown, L"Explorer", NULL); SetWindowTheme(hAvailable, L"Explorer", NULL); if(IsWindowsSevenOrHigher()) { (void)ListView_SetExtendedListViewStyle(hShown, LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_DOUBLEBUFFER); (void)ListView_SetExtendedListViewStyle(hAvailable, LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_DOUBLEBUFFER); } else { (void)ListView_SetExtendedListViewStyle(hShown, LVS_EX_FULLROWSELECT | LVS_EX_UNDERLINEHOT | LVS_EX_ONECLICKACTIVATE | LVS_EX_DOUBLEBUFFER); (void)ListView_SetExtendedListViewStyle(hAvailable, LVS_EX_FULLROWSELECT | LVS_EX_UNDERLINEHOT | LVS_EX_ONECLICKACTIVATE | LVS_EX_DOUBLEBUFFER); } GetClientRect(hShown, &rectClient); memset(&LVCol, 0, sizeof(LVCOLUMN)); LVCol.mask = LVCF_WIDTH; LVCol.cx = rectClient.right - rectClient.left; (void)ListView_InsertColumn(hShown, 0, &LVCol); (void)ListView_InsertColumn(hAvailable, 0, &LVCol); pfnGetColumnInfo(order, shown); showMsg = true; nShown = 0; nAvail = 0; lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; lvi.stateMask = 0; lvi.iSubItem = 0; lvi.iImage = -1; /* Get the Column Order and save it */ pfnGetRealColumnOrder(order); for (int i = 0 ; i < nColumnMax; i++) { lvi.pszText = (wchar_t*)names[order[i]]; lvi.lParam = order[i]; if (shown[order[i]]) { lvi.iItem = nShown; (void)ListView_InsertItem(hShown, &lvi); nShown++; } else { lvi.iItem = nAvail; (void)ListView_InsertItem(hAvailable, &lvi); nAvail++; } } if(nShown > 0) /*Set to Second, because first is not allowed*/ ListView_SetItemState(hShown, 1, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); if(nAvail > 0) ListView_SetItemState(hAvailable, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), true); return true; case WM_CTLCOLORDLG: return (LRESULT) hBrush; case WM_CTLCOLORSTATIC: case WM_CTLCOLORBTN: hDC = (HDC)wParam; SetBkMode(hDC, TRANSPARENT); SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT)); return (LRESULT) hBrush; case WM_NOTIFY: { NMHDR *nm = (NMHDR *)lParam; NM_LISTVIEW *pnmv; int nPos = 0; switch (nm->code) { case NM_DBLCLK: // Do Data Exchange here, which ListView was double clicked? switch (nm->idFrom) { case IDC_LISTAVAILABLECOLUMNS: // Move selected Item from Available to Shown column nPos = DoExchangeItem(hAvailable, hShown, 0); if (nPos) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); } break; case IDC_LISTSHOWCOLUMNS: // Move selected Item from Show to Available column if (DoExchangeItem(hShown, hAvailable, 1)) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); } break; } return true; case LVN_ITEMCHANGED: // Don't handle this message for now pnmv = (NM_LISTVIEW *)nm; if (pnmv->uNewState & LVIS_SELECTED) { if (pnmv->iItem == 0 && pnmv->hdr.idFrom == IDC_LISTSHOWCOLUMNS) { // Don't allow selecting the first item ListView_SetItemState(hShown, pnmv->iItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); if (showMsg) { ErrorMessageBox("Changing this item is not permitted"); showMsg = false; } EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); return true; } else showMsg = true; } if( pnmv->uOldState & LVIS_SELECTED && pnmv->iItem == 0 && pnmv->hdr.idFrom == IDC_LISTSHOWCOLUMNS) { /*we enable the buttons again, if the first Entry loses selection*/ EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), true); } break; case NM_SETFOCUS: switch (nm->idFrom) { case IDC_LISTAVAILABLECOLUMNS: if (ListView_GetItemCount(nm->hwndFrom) != 0) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); } break; case IDC_LISTSHOWCOLUMNS: if (ListView_GetItemCount(nm->hwndFrom) != 0) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), false); if (ListView_GetNextItem(hShown, -1, LVIS_SELECTED | LVIS_FOCUSED) == 0) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); } else { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), true); } } break; } break; case LVN_KEYDOWN: case NM_CLICK: pnmv = (NM_LISTVIEW *)nm; if (pnmv->uNewState & LVIS_SELECTED) { if (pnmv->iItem == 0 && pnmv->hdr.idFrom == IDC_LISTSHOWCOLUMNS) { // nothing to do here... } } switch (nm->idFrom) { case IDC_LISTAVAILABLECOLUMNS: if (ListView_GetItemCount(nm->hwndFrom) != 0) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); } break; case IDC_LISTSHOWCOLUMNS: if (ListView_GetItemCount(nm->hwndFrom) != 0) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), false); if (ListView_GetNextItem(hShown, -1, LVIS_SELECTED | LVIS_FOCUSED) == 0) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); } else { EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), true); } } break; } return true; } } return false; case WM_COMMAND: { WORD wID = GET_WM_COMMAND_ID(wParam, lParam); HWND hWndCtrl = GET_WM_COMMAND_HWND(wParam, lParam); int nPos = 0; switch (wID) { case IDC_LISTSHOWCOLUMNS: break; case IDC_BUTTONADD: // Move selected Item in Available to Shown nPos = DoExchangeItem(hAvailable, hShown, 0); if (nPos) { EnableWindow(hWndCtrl,false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONREMOVE), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); } break; case IDC_BUTTONREMOVE: // Move selected Item in Show to Available if (DoExchangeItem(hShown, hAvailable, 1)) { EnableWindow(hWndCtrl,false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONADD), true); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEUP), false); EnableWindow(GetDlgItem(hDlg, IDC_BUTTONMOVEDOWN), false); } break; case IDC_BUTTONMOVEDOWN: // Move selected item in the Show window up 1 item DoMoveItem(hShown, true); break; case IDC_BUTTONMOVEUP: // Move selected item in the Show window down 1 item DoMoveItem(hShown, false); break; case IDOK: { // Save users choices nShown = ListView_GetItemCount(hShown); nAvail = ListView_GetItemCount(hAvailable); int nCount = 0; for (int i = 0; i < nShown; i++) { lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; lvi.pszText = 0; lvi.iItem = i; (void)ListView_GetItem(hShown, &lvi); order[nCount++] = lvi.lParam; shown[lvi.lParam] = true; } for (int i = 0; i < nAvail; i++) { lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; lvi.pszText = 0; lvi.iItem = i; (void)ListView_GetItem(hAvailable, &lvi); order[nCount++] = lvi.lParam; shown[lvi.lParam] = false; } pfnSetColumnInfo(order, shown); DestroyIcon(hIcon); DeleteObject(hBrush); EndDialog(hDlg, 1); return true; } case IDCANCEL: DestroyIcon(hIcon); DeleteObject(hBrush); EndDialog(hDlg, 0); return true; } break; } } return false; }
BOOL CRepositoryBrowser::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDC_STATIC_REPOURL, TOP_LEFT); AddAnchor(IDC_REPOBROWSER_URL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_STATIC_REF, TOP_RIGHT); AddAnchor(IDC_BUTTON_REVISION, TOP_RIGHT); AddAnchor(IDC_REPOTREE, TOP_LEFT, BOTTOM_LEFT); AddAnchor(IDC_REPOLIST, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_CURRENT_USER); if (CRepositoryBrowser::s_bSortLogical) CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_LOCAL_MACHINE); CString temp; temp.LoadString(IDS_STATUSLIST_COLFILENAME); m_RepoList.InsertColumn(eCol_Name, temp, 0, 150); temp.LoadString(IDS_STATUSLIST_COLEXT); m_RepoList.InsertColumn(eCol_Extension, temp, 0, 100); temp.LoadString(IDS_LOG_SIZE); m_RepoList.InsertColumn(eCol_FileSize, temp, 0, 100); // set up the list control // set the extended style of the list control // the style LVS_EX_FULLROWSELECT interferes with the background watermark image but it's more important to be able to select in the whole row. CRegDWORD regFullRowSelect(_T("Software\\TortoiseGit\\FullRowSelect"), TRUE); DWORD exStyle = LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_SUBITEMIMAGES; if (DWORD(regFullRowSelect)) exStyle |= LVS_EX_FULLROWSELECT; m_RepoList.SetExtendedStyle(exStyle); m_RepoList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); CAppUtils::SetListCtrlBackgroundImage(m_RepoList.GetSafeHwnd(), IDI_REPOBROWSER_BKG); m_RepoTree.SetImageList(&SYS_IMAGE_LIST(), TVSIL_NORMAL); if (SysInfo::Instance().IsVistaOrLater()) { DWORD exStyle = TVS_EX_FADEINOUTEXPANDOS | TVS_EX_AUTOHSCROLL | TVS_EX_DOUBLEBUFFER; m_RepoTree.SetExtendedStyle(exStyle, exStyle); } SetWindowTheme(m_RepoTree.GetSafeHwnd(), L"Explorer", NULL); SetWindowTheme(m_RepoList.GetSafeHwnd(), L"Explorer", NULL); m_nIconFolder = SYS_IMAGE_LIST().GetDirIconIndex(); m_nOpenIconFolder = SYS_IMAGE_LIST().GetDirOpenIconIndex(); EnableSaveRestore(L"Reposbrowser"); DWORD xPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RepobrowserDivider"), 0); if (xPos == 0) { RECT rc; GetDlgItem(IDC_REPOTREE)->GetClientRect(&rc); xPos = rc.right - rc.left; } bDragMode = false; HandleDividerMove(CPoint(xPos + 20, 10), false); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); m_bHasWC = !g_GitAdminDir.IsBareRepo(g_Git.m_CurrentDir); Refresh(); m_RepoList.SetFocus(); return FALSE; }
INT_PTR CALLBACK ToolsPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { hToolsPage = hDlg; hToolsListCtrl = GetDlgItem(hToolsPage, IDC_TOOLS_LIST); // // Initialize the styles. // DWORD dwStyle = ListView_GetExtendedListViewStyle(hToolsListCtrl); ListView_SetExtendedListViewStyle(hToolsListCtrl, dwStyle | LVS_EX_FULLROWSELECT); SetWindowTheme(hToolsListCtrl, L"Explorer", NULL); // // Initialize the application page's controls. // LVCOLUMN column = {}; // First column : Tool's name. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_TOOLS_COLUMN_NAME); column.cx = 150; ListView_InsertColumn(hToolsListCtrl, 0, &column); MemFree(column.pszText); // Second column : Whether the tool is a standard one or not. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_TOOLS_COLUMN_STANDARD); column.cx = 60; ListView_InsertColumn(hToolsListCtrl, 1, &column); MemFree(column.pszText); // Third column : Description. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_TOOLS_COLUMN_DESCR); column.cx = 500; ListView_InsertColumn(hToolsListCtrl, 2, &column); MemFree(column.pszText); // // Populate and sort the list. // FillListView(); ListView_Sort(hToolsListCtrl, 0); // Force an update in case of an empty list (giving focus on it when empty won't emit a LVN_ITEMCHANGED message). Update_States(-1 /* Wrong index to initialize all the controls with their default state (i.e. disabled) */); PropSheet_UnChanged(GetParent(hToolsPage), hToolsPage); return TRUE; } case WM_DESTROY: { LVITEM lvitem = {}; lvitem.mask = LVIF_PARAM; lvitem.iItem = -1; // From the beginning. while ((lvitem.iItem = ListView_GetNextItem(hToolsListCtrl, lvitem.iItem, LVNI_ALL)) != -1) { // ListView_Update(); // Updates a list-view item. // ListView_FindItem(); // peut être intéressant pour faire de la recherche itérative à partir du nom (ou partie du...) de l'item. ListView_GetItem(hToolsListCtrl, &lvitem); delete reinterpret_cast<TOOL*>(lvitem.lParam); lvitem.lParam = NULL; } ListView_DeleteAllItems(hToolsListCtrl); return 0; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_BTN_RUN: { RunSelectedTool(); return TRUE; } case IDC_CBX_TOOLS_ADVOPT: { Update_States(ListView_GetSelectionMark(hToolsListCtrl)); return TRUE; } default: return FALSE; } return FALSE; } case WM_NOTIFY: { if (((LPNMHDR)lParam)->hwndFrom == hToolsListCtrl) { switch (((LPNMHDR)lParam)->code) { case LVN_ITEMCHANGED: { if ( (((LPNMLISTVIEW)lParam)->uChanged & LVIF_STATE) && /* The state has changed */ (((LPNMLISTVIEW)lParam)->uNewState & LVIS_SELECTED) /* The item has been (de)selected */ ) { Update_States(((LPNMLISTVIEW)lParam)->iItem); } return TRUE; } case NM_DBLCLK: case NM_RDBLCLK: { RunSelectedTool(); return TRUE; } case LVN_COLUMNCLICK: { int iSortingColumn = ((LPNMLISTVIEW)lParam)->iSubItem; ListView_SortEx(hToolsListCtrl, iSortingColumn, iToolsPageSortedColumn); iToolsPageSortedColumn = iSortingColumn; return TRUE; } default: break; } } else { switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { // Since there are nothing to modify, applying modifications // cannot return any error. SetWindowLongPtr(hToolsPage, DWLP_MSGRESULT, PSNRET_NOERROR); PropSheet_UnChanged(GetParent(hToolsPage), hToolsPage); return TRUE; } case PSN_HELP: { MessageBoxW(hToolsPage, L"Help not implemented yet!", L"Help", MB_ICONINFORMATION | MB_OK); return TRUE; } case PSN_KILLACTIVE: // Is going to lose activation. { // Changes are always valid of course. SetWindowLongPtr(hToolsPage, DWLP_MSGRESULT, FALSE); return TRUE; } case PSN_QUERYCANCEL: { // Allows cancellation since there are nothing to cancel... SetWindowLongPtr(hToolsPage, DWLP_MSGRESULT, FALSE); return TRUE; } case PSN_QUERYINITIALFOCUS: { // Give the focus on and select the first item. ListView_SetItemState(hToolsListCtrl, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); SetWindowLongPtr(hToolsPage, DWLP_MSGRESULT, (LONG_PTR)hToolsListCtrl); return TRUE; } // // DO NOT TOUCH THESE NEXT MESSAGES, THEY ARE OK LIKE THIS... // case PSN_RESET: // Perform final cleaning, called before WM_DESTROY. return TRUE; case PSN_SETACTIVE: // Is going to gain activation. { SetWindowLongPtr(hToolsPage, DWLP_MSGRESULT, 0); return TRUE; } default: break; } } return FALSE; } default: return FALSE; } // return FALSE; }
BOOL CTreePropSheet::OnInitDialog() { if (m_bTreeViewMode) { // be sure, there are no stacked tabs, because otherwise the // page caption will be to large in tree view mode EnableStackedTabs(FALSE); // Initialize image list. if (m_DefaultImages.GetSafeHandle()) { IMAGEINFO ii; m_DefaultImages.GetImageInfo(0, &ii); if (ii.hbmImage) DeleteObject(ii.hbmImage); if (ii.hbmMask) DeleteObject(ii.hbmMask); m_Images.Create(ii.rcImage.right-ii.rcImage.left, ii.rcImage.bottom-ii.rcImage.top, ILC_COLOR32|ILC_MASK, 0, 1); } else m_Images.Create(16, 16, ILC_COLOR32|ILC_MASK, 0, 1); } // perform default implementation BOOL bResult = CPropertySheet::OnInitDialog(); if (!m_bTreeViewMode) // stop here, if we would like to use tabs return bResult; // Get tab control... CTabCtrl *pTab = GetTabControl(); if (!IsWindow(pTab->GetSafeHwnd())) { ASSERT(FALSE); return bResult; } // ... and hide it pTab->ShowWindow(SW_HIDE); pTab->EnableWindow(FALSE); // Place another (empty) tab ctrl, to get a frame instead CRect rectFrame; pTab->GetWindowRect(rectFrame); ScreenToClient(rectFrame); m_pFrame = CreatePageFrame(); if (!m_pFrame) { ASSERT(FALSE); AfxThrowMemoryException(); } m_pFrame->Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0xFFFF); m_pFrame->ShowCaption(m_bPageCaption); // Lets make place for the tree ctrl const int nTreeWidth = m_nPageTreeWidth; const int nTreeSpace = 5; CRect rectSheet; GetWindowRect(rectSheet); rectSheet.right+= nTreeWidth; SetWindowPos(NULL, -1, -1, rectSheet.Width(), rectSheet.Height(), SWP_NOZORDER|SWP_NOMOVE); CenterWindow(); MoveChildWindows(nTreeWidth, 0); // Lets calculate the rectangle for the tree ctrl CRect rectTree(rectFrame); rectTree.right = rectTree.left + nTreeWidth - nTreeSpace; // calculate caption height CTabCtrl wndTabCtrl; wndTabCtrl.Create(WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, rectFrame, this, 0x1234); wndTabCtrl.InsertItem(0, _T("")); CRect rectFrameCaption; wndTabCtrl.GetItemRect(0, rectFrameCaption); wndTabCtrl.DestroyWindow(); m_pFrame->SetCaptionHeight(rectFrameCaption.Height()); // if no caption should be displayed, make the window smaller in // height if (!m_bPageCaption) { // make frame smaller m_pFrame->GetWnd()->GetWindowRect(rectFrame); ScreenToClient(rectFrame); rectFrame.top+= rectFrameCaption.Height(); m_pFrame->GetWnd()->MoveWindow(rectFrame); // move all child windows up MoveChildWindows(0, -rectFrameCaption.Height()); // modify rectangle for the tree ctrl rectTree.bottom-= rectFrameCaption.Height(); // make us smaller CRect rect; GetWindowRect(rect); rect.top+= rectFrameCaption.Height()/2; rect.bottom-= rectFrameCaption.Height()-rectFrameCaption.Height()/2; if (GetParent()) GetParent()->ScreenToClient(rect); MoveWindow(rect); } // finally create the tree control const DWORD dwTreeStyle = TVS_SHOWSELALWAYS|TVS_TRACKSELECT|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS; m_pwndPageTree = CreatePageTreeObject(); if (!m_pwndPageTree) { ASSERT(FALSE); AfxThrowMemoryException(); } // MFC7-support here (Thanks to Rainer Wollgarten) // YT: Cast tree control to CWnd and calls CWnd::CreateEx in all cases (VC 6 and7). ((CWnd*)m_pwndPageTree)->CreateEx( WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY|TVS_EX_DOUBLEBUFFER, _T("SysTreeView32"), _T("PageTree"), WS_TABSTOP|WS_CHILD|WS_VISIBLE|dwTreeStyle, rectTree, this, s_unPageTreeId); if (m_bTreeImages) { m_pwndPageTree->SetImageList(&m_Images, TVSIL_NORMAL); m_pwndPageTree->SetImageList(&m_Images, TVSIL_STATE); } SetWindowTheme(m_pwndPageTree->GetSafeHwnd(), L"Explorer", NULL); // Fill the tree ctrl RefillPageTree(); // Select item for the current page if (pTab->GetCurSel() > -1) SelectPageTreeItem(pTab->GetCurSel()); return bResult; }
BOOL GLWindow::createGLWindow(char* title, WNDPROC WndProc) { WNDCLASS wc; DWORD dwExStyle; DWORD dwStyle; RECT WindowRect; int width = isFullscreen?videoModes[fullscreenMode].width:videoModes[windowedMode].width; int height = isFullscreen?videoModes[fullscreenMode].height:videoModes[windowedMode].height; int bits = isFullscreen?videoModes[fullscreenMode].bpp:videoModes[windowedMode].bpp; windowPosition = Point(nativeMode.dmPelsWidth/2 - width/2, nativeMode.dmPelsHeight/2 - height/2); int x = isFullscreen?0:windowPosition.x; int y = isFullscreen?0:windowPosition.y; WindowRect.left = (long) x; WindowRect.right = (long) x + width; WindowRect.top = (long) y; WindowRect.bottom = (long) y + height; hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = __TEXT("OGL"); RegisterClass(&wc); if (isFullscreen) { DEVMODE dm; memset(&dm,0,sizeof(dm)); dm.dmSize=sizeof(dm); dm.dmPelsWidth = width; dm.dmPelsHeight = height; dm.dmBitsPerPel = bits; dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; ChangeDisplaySettings(&dm,CDS_FULLSCREEN); dwExStyle = WS_EX_APPWINDOW; dwStyle = WS_POPUP; } else { dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPEDWINDOW | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE; } AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle); HMENU hMenu; hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU)); HBRUSH hBrush = CreateSolidBrush(RGB(150, 150, 150)); MENUINFO mi = { 0 }; mi.cbSize = sizeof(mi); mi.fMask = MIM_BACKGROUND|MIM_APPLYTOSUBMENUS; mi.hbrBack = hBrush; SetMenuInfo(hMenu, &mi); hWnd=CreateWindowEx( dwExStyle, __TEXT("OGL"), title, dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WindowRect.left, WindowRect.top, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top, NULL, hMenu, hInstance, NULL); if(!isFullscreen) { dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPEDWINDOW | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE; SetWindowLongPtr(hWnd, GWL_EXSTYLE, dwExStyle); SetWindowLongPtr(hWnd, GWL_STYLE, dwStyle); } SetWindowTheme(hWnd, L" ", L" "); RECT rcClient,rcWind; GetClientRect(hWnd, &rcClient); GetWindowRect(hWnd, &rcWind); borderWidth = 2*((rcWind.right - rcWind.left) - rcClient.right)/2; borderHeight = 2*((rcWind.bottom - rcWind.top) - rcClient.bottom)/2; initGL(bits); SetForegroundWindow(hWnd); SetFocus(hWnd); return true; }
INT_PTR CSearchDialog::OnInitDialog() { HIMAGELIST himl = ImageList_Create(16,16,ILC_COLOR32|ILC_MASK,0,48); HBITMAP hBitmap = LoadBitmap(GetModuleHandle(0),MAKEINTRESOURCE(IDB_SHELLIMAGES)); ImageList_Add(himl,hBitmap,NULL); m_hDirectoryIcon = ImageList_GetIcon(himl,SHELLIMAGES_NEWTAB,ILD_NORMAL); m_hDialogIcon = ImageList_GetIcon(himl,SHELLIMAGES_SEARCH,ILD_NORMAL); SendMessage(GetDlgItem(m_hDlg,IDC_BUTTON_DIRECTORY),BM_SETIMAGE, IMAGE_ICON,reinterpret_cast<LPARAM>(m_hDirectoryIcon)); SetClassLongPtr(m_hDlg,GCLP_HICONSM,reinterpret_cast<LONG_PTR>(m_hDialogIcon)); DeleteObject(hBitmap); ImageList_Destroy(himl); HWND hListView = GetDlgItem(m_hDlg,IDC_LISTVIEW_SEARCHRESULTS); ListView_SetExtendedListViewStyleEx(hListView,LVS_EX_GRIDLINES|LVS_EX_DOUBLEBUFFER, LVS_EX_GRIDLINES|LVS_EX_DOUBLEBUFFER); HIMAGELIST himlSmall; Shell_GetImageLists(NULL,&himlSmall); ListView_SetImageList(hListView,himlSmall,LVSIL_SMALL); SetWindowTheme(hListView,L"Explorer",NULL); int i = 0; for each(auto ci in m_sdps->m_Columns) { TCHAR szTemp[128]; LoadString(GetInstance(),ci.uStringID,szTemp,SIZEOF_ARRAY(szTemp)); LVCOLUMN lvColumn; lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,i,&lvColumn); i++; } RECT rc; GetClientRect(hListView,&rc); ListView_SetColumnWidth(hListView,0,(1.0/3.0) * GetRectWidth(&rc)); ListView_SetColumnWidth(hListView,1,(1.80/3.0) * GetRectWidth(&rc)); UpdateListViewHeader(); lCheckDlgButton(m_hDlg,IDC_CHECK_ARCHIVE,m_sdps->m_bArchive); lCheckDlgButton(m_hDlg,IDC_CHECK_HIDDEN,m_sdps->m_bHidden); lCheckDlgButton(m_hDlg,IDC_CHECK_READONLY,m_sdps->m_bReadOnly); lCheckDlgButton(m_hDlg,IDC_CHECK_SYSTEM,m_sdps->m_bSystem); lCheckDlgButton(m_hDlg,IDC_CHECK_SEARCHSUBFOLDERS,m_sdps->m_bSearchSubFolders); lCheckDlgButton(m_hDlg,IDC_CHECK_CASEINSENSITIVE,m_sdps->m_bCaseInsensitive); lCheckDlgButton(m_hDlg,IDC_CHECK_USEREGULAREXPRESSIONS,m_sdps->m_bUseRegularExpressions); for each(auto strDirectory in *m_sdps->m_pSearchDirectories) { SendDlgItemMessage(m_hDlg,IDC_COMBO_DIRECTORY,CB_INSERTSTRING,static_cast<WPARAM>(-1), reinterpret_cast<LPARAM>(strDirectory.c_str())); } for each(auto strPattern in *m_sdps->m_pSearchPatterns) { SendDlgItemMessage(m_hDlg,IDC_COMBO_NAME,CB_INSERTSTRING,static_cast<WPARAM>(-1), reinterpret_cast<LPARAM>(strPattern.c_str())); } SetDlgItemText(m_hDlg,IDC_COMBO_NAME,m_sdps->m_szSearchPattern); SetDlgItemText(m_hDlg,IDC_COMBO_DIRECTORY,m_szSearchDirectory); CComboBox::CreateNew(GetDlgItem(m_hDlg,IDC_COMBO_NAME)); CComboBox::CreateNew(GetDlgItem(m_hDlg,IDC_COMBO_DIRECTORY)); if(m_sdps->m_bStateSaved) { /* These dummy values will be in use if these values have not previously been saved. */ if(m_sdps->m_iColumnWidth1 != -1 && m_sdps->m_iColumnWidth2 != -1) { ListView_SetColumnWidth(hListView,0,m_sdps->m_iColumnWidth1); ListView_SetColumnWidth(hListView,1,m_sdps->m_iColumnWidth2); } } m_sdps->RestoreDialogPosition(m_hDlg,true); SetFocus(GetDlgItem(m_hDlg,IDC_COMBO_NAME)); return FALSE; }
INT_PTR CMergeFilesDialog::OnInitDialog() { m_hDialogIcon = LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(IDI_MAIN_SMALL)); SetClassLongPtr(m_hDlg,GCLP_HICONSM,reinterpret_cast<LONG_PTR>(m_hDialogIcon)); std::wregex rxPattern; bool bAllMatchPattern = true; rxPattern.assign(_T(".*[\\.]?part[0-9]+"),std::regex_constants::icase); /* If the files all match the pattern .*[\\.]?part[0-9]+ (e.g. document.txt.part1), order them alphabetically. */ for each(auto strFullFilename in m_FullFilenameList) { if(!std::tr1::regex_match(strFullFilename,rxPattern)) { bAllMatchPattern = false; break; } } std::wstring strOutputFilename; if(bAllMatchPattern) { m_FullFilenameList.sort(CompareFilenames); /* Since the filenames all match the pattern, construct the output filename from the first files name. */ rxPattern.assign(_T("[\\.]?part[0-9]+"),std::regex_constants::icase); strOutputFilename = std::tr1::regex_replace(m_FullFilenameList.front(), rxPattern,std::wstring(_T(""))); } else { /* TODO: Improve output name. */ strOutputFilename = _T("output"); } TCHAR szOutputFile[MAX_PATH]; PathCombine(szOutputFile,m_strOutputDirectory.c_str(),strOutputFilename.c_str()); SetDlgItemText(m_hDlg,IDC_MERGE_EDIT_FILENAME,szOutputFile); HWND hListView = GetDlgItem(m_hDlg,IDC_MERGE_LISTVIEW); HIMAGELIST himlSmall; Shell_GetImageLists(NULL,&himlSmall); ListView_SetImageList(hListView,himlSmall,LVSIL_SMALL); SetWindowTheme(hListView,L"Explorer",NULL); ListView_SetExtendedListViewStyleEx(hListView, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, LVS_EX_DOUBLEBUFFER|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); LVCOLUMN lvColumn; TCHAR szTemp[32]; LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_FILE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,0,&lvColumn); LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_TYPE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,1,&lvColumn); LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_SIZE, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,2,&lvColumn); LoadString(GetInstance(),IDS_MERGE_FILES_COLUMN_DATE_MODIFIED, szTemp,SIZEOF_ARRAY(szTemp)); lvColumn.mask = LVCF_TEXT; lvColumn.pszText = szTemp; ListView_InsertColumn(hListView,3,&lvColumn); int iItem = 0; for each(auto strFullFilename in m_FullFilenameList) { TCHAR szFullFilename[MAX_PATH]; StringCchCopy(szFullFilename,SIZEOF_ARRAY(szFullFilename), strFullFilename.c_str()); /* TODO: Perform in background thread. */ SHFILEINFO shfi; SHGetFileInfo(szFullFilename,0,&shfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_TYPENAME); LVITEM lvItem; lvItem.mask = LVIF_TEXT|LVIF_IMAGE; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.pszText = szFullFilename; lvItem.iImage = shfi.iIcon; ListView_InsertItem(hListView,&lvItem); ListView_SetItemText(hListView,iItem,1,shfi.szTypeName); WIN32_FILE_ATTRIBUTE_DATA wfad; GetFileAttributesEx(szFullFilename,GetFileExInfoStandard,&wfad); TCHAR szFileSize[32]; ULARGE_INTEGER lFileSize = {wfad.nFileSizeLow,wfad.nFileSizeHigh}; FormatSizeString(lFileSize,szFileSize,SIZEOF_ARRAY(szFileSize)); ListView_SetItemText(hListView,iItem,2,szFileSize); TCHAR szDateModified[32]; CreateFileTimeString(&wfad.ftLastWriteTime,szDateModified, SIZEOF_ARRAY(szDateModified),m_bShowFriendlyDates); ListView_SetItemText(hListView,iItem,3,szDateModified); iItem++; }
//-------------------------------------------------------------------------- // 다이얼로그 초기화 //-------------------------------------------------------------------------- BOOL CDrawProperty::OnInitDialog() { CDialog::OnInitDialog(); ////////////////////////////////////////////////////////////////////////// //라인 굵기 스핀 컨트롤 초기화 m_sLineWeightSpin.SetRange(1,30); //최소 두께 1~최대 두께 30 m_sLineWeightSpin.SetPos(1); //기본 값 1 ////////////////////////////////////////////////////////////////////////// //알파값 스핀 컨트롤 초기화 m_sAlphaSpin.SetRange(1, 100); //최소 불투명도 1% ~ 최대 불투명도 100% m_sAlphaSpin.SetPos(100); //기본값 100 ////////////////////////////////////////////////////////////////////////// // 라인 패턴 콤보 박스 초기화 for(int i=0; i<5; i++) m_sLinePtnCombo.AddItem(i, LINEPATTERN); m_sLinePtnCombo.SetCurSel(0); ////////////////////////////////////////////////////////////////////////// //브러쉬 패턴 콤보 박스 초기화 for(int i=0; i<52; i++) m_sFillPtnCombo.AddItem(i, HATCHPATTERN); m_sFillPtnCombo.SetCurSel(0); ////////////////////////////////////////////////////////////////////////// //선 시작-끝 모양 콤보박스 초기화 m_sStartCapCombo.SetCurSel(1); m_sEndCapCombo.SetCurSel(1); ////////////////////////////////////////////////////////////////////////// //외곽선 모양 콤보 박스 초기화 m_sLineJoinCombo.SetCurSel(0); ////////////////////////////////////////////////////////////////////////// // 그라디언트 콤보 박스 초기화 for(int i=0; i<4; i++) m_sGradientCombo.AddItem(i, GRADIENTPATTERN); m_sGradientCombo.SetCurSel(0); ////////////////////////////////////////////////////////////////////////// // 면 타입 라디오 버튼 초기화 m_sFaceTypeOutlinedFill.SetCheck(1); m_sFaceTypeOutline.SetCheck(0); m_sFillTypeSolid.SetCheck(1); m_sFillTypeHatch.SetCheck(0); m_sFillTypeGradient.SetCheck(0); m_sGradientEndColorBtn.EnableWindow(FALSE); ////////////////////////////////////////////////////////////////////////// // 윈도우 비스타 이상에서는 라디오버튼에 XP 테마 적용이 제대로 되지 않는 문제 해결을 위해 추가 OSVERSIONINFO sInfo; sInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // 윈도우 버전 정보를 구해 비스타 이상일 경우 아래 내용 적용 if(::GetVersionEx(&sInfo) && (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT && sInfo.dwMajorVersion >= 6 && sInfo.dwMinorVersion >= 0)) { SetWindowTheme(GetDlgItem(IDC_FACE_FILL)->GetSafeHwnd(), L"", L""); SetWindowTheme(GetDlgItem(IDC_FACE_ONLYFILL)->GetSafeHwnd(), L"", L""); SetWindowTheme(GetDlgItem(IDC_FACE_OUTLINED)->GetSafeHwnd(), L"", L""); SetWindowTheme(GetDlgItem(IDC_FILLTYPE_GRADIENT)->GetSafeHwnd(), L"", L""); SetWindowTheme(GetDlgItem(IDC_FILLTYPE_HATCH)->GetSafeHwnd(), L"", L""); SetWindowTheme(GetDlgItem(IDC_FILLTYPE_SOLID)->GetSafeHwnd(), L"", L""); } ////////////////////////////////////////////////////////////////////////// // 툴팁 컨트롤 초기화 CMFCToolTipInfo params; params.m_bBoldLabel = TRUE; params.m_bDrawDescription = TRUE; params.m_bDrawIcon = TRUE; params.m_bRoundedCorners = TRUE; params.m_bDrawSeparator = FALSE; params.m_clrFill = RGB (255, 255, 255); params.m_clrFillGradient = RGB (228, 228, 240); params.m_clrText = RGB (61, 83, 80); params.m_clrBorder = RGB (144, 149, 168); m_sCtrlToolTip.SetParams(¶ms); m_sCtrlToolTip.Create(this); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_BUTTON_FONT), L"폰트"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_BUTTON_LINECOLOR), L"라인색(텍스트색)"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_BUTTON_FILLCOLOR), L"채우기색"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_BUTTON_FILLCOLOR2), L"그라디언트 채우기색"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FACE_OUTLINED), L"외곽선만 그리기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FACE_FILL), L"외곽선+채우기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FACE_ONLYFILL), L"내부만 채우기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FILLTYPE_SOLID), L"단색으로 채우기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FILLTYPE_HATCH), L"격자무늬 채우기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FILLTYPE_GRADIENT), L"그라디언트 채우기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_COMBO_STARTCAP), L"라인 시작 모양"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_COMBO_ENDCAP),L"라인 끝 모양"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_EDIT_LINEWEIGHT), L"라인 굵기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_SPIN1), L"라인 굵기"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_LINEPATTERN), L"라인 패턴"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_COMBO_LINEJOIN), L"외곽선 처리"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_FILLPATTERN), L"채우기 패턴"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_EDIT_ALPHA), L"불투명도"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_SPIN2), L"불투명도"); m_sCtrlToolTip.AddTool(GetDlgItem(IDC_COMBO_GRADIENT), L"그라디언트 패턴"); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
HRESULT CMenuToolbarBase::CreateToolbar(HWND hwndParent, DWORD dwFlags) { LONG tbStyles = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TBSTYLE_TOOLTIPS | TBSTYLE_TRANSPARENT | TBSTYLE_REGISTERDROP | TBSTYLE_LIST | TBSTYLE_FLAT | TBSTYLE_CUSTOMERASE | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_TOP; LONG tbExStyles = TBSTYLE_EX_DOUBLEBUFFER | WS_EX_TOOLWINDOW; if (dwFlags & SMINIT_VERTICAL) { // Activate vertical semantics tbStyles |= CCS_VERT; #if USE_TBSTYLE_EX_VERTICAL tbExStyles |= TBSTYLE_EX_VERTICAL; #endif } m_initFlags = dwFlags; // Get a temporary rect to use while creating the toolbar window. // Ensure that it is not a null rect. RECT rc; if (!::GetClientRect(hwndParent, &rc) || (rc.left == rc.right) || (rc.top == rc.bottom)) { rc.left = 0; rc.top = 0; rc.right = 1; rc.bottom = 1; } SubclassWindow(CToolbar::Create(hwndParent, tbStyles, tbExStyles)); SetWindowTheme(m_hWnd, L"", L""); if (IsAppThemed()) GetThemeSysBool(GetWindowTheme(m_hWnd), TMT_FLATMENUS); else SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0); m_menuBand->AdjustForTheme(m_useFlatMenus); // If needed, create the pager. if (m_usePager) { LONG pgStyles = PGS_VERT | WS_CHILD | WS_VISIBLE; LONG pgExStyles = 0; HWND hwndPager = CreateWindowEx( pgExStyles, WC_PAGESCROLLER, NULL, pgStyles, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hwndParent, NULL, _AtlBaseModule.GetModuleInstance(), 0); m_pager.SubclassWindow(hwndPager); ::SetParent(m_hWnd, hwndPager); m_pager.SendMessageW(PGM_SETCHILD, 0, reinterpret_cast<LPARAM>(m_hWnd)); } // Configure the image lists UpdateImageLists(); return S_OK; }
BOOL CRepositoryBrowser::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDC_STATIC_REPOURL, TOP_LEFT); AddAnchor(IDC_REPOBROWSER_URL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_STATIC_REF, TOP_RIGHT); AddAnchor(IDC_BUTTON_REVISION, TOP_RIGHT); AddAnchor(IDC_REPOTREE, TOP_LEFT, BOTTOM_LEFT); AddAnchor(IDC_REPOLIST, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddAnchor(IDC_INFOLABEL, BOTTOM_LEFT, BOTTOM_RIGHT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_CURRENT_USER); if (CRepositoryBrowser::s_bSortLogical) CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_LOCAL_MACHINE); static UINT columnNames[] = { IDS_STATUSLIST_COLFILENAME, IDS_STATUSLIST_COLEXT, IDS_LOG_SIZE }; static int columnWidths[] = { 150, 100, 100 }; DWORD dwDefaultColumns = (1 << eCol_Name) | (1 << eCol_Extension) | (1 << eCol_FileSize); m_ColumnManager.SetNames(columnNames, _countof(columnNames)); m_ColumnManager.ReadSettings(dwDefaultColumns, 0, _T("RepoBrowser"), _countof(columnNames), columnWidths); // set up the list control // set the extended style of the list control // the style LVS_EX_FULLROWSELECT interferes with the background watermark image but it's more important to be able to select in the whole row. CRegDWORD regFullRowSelect(_T("Software\\TortoiseGit\\FullRowSelect"), TRUE); DWORD exStyle = LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_SUBITEMIMAGES; if (DWORD(regFullRowSelect)) exStyle |= LVS_EX_FULLROWSELECT; m_RepoList.SetExtendedStyle(exStyle); m_RepoList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); CAppUtils::SetListCtrlBackgroundImage(m_RepoList.GetSafeHwnd(), IDI_REPOBROWSER_BKG); m_RepoTree.SetImageList(&SYS_IMAGE_LIST(), TVSIL_NORMAL); if (SysInfo::Instance().IsVistaOrLater()) { DWORD exStyle = TVS_EX_FADEINOUTEXPANDOS | TVS_EX_AUTOHSCROLL | TVS_EX_DOUBLEBUFFER; m_RepoTree.SetExtendedStyle(exStyle, exStyle); } m_nExternalOvl = SYS_IMAGE_LIST().AddIcon((HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_EXTERNALOVL), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE)); // set externaloverlay in SYS_IMAGE_LIST() in Refresh method, so that it is updated after every launch of the logdialog SetWindowTheme(m_RepoTree.GetSafeHwnd(), L"Explorer", NULL); SetWindowTheme(m_RepoList.GetSafeHwnd(), L"Explorer", NULL); m_nIconFolder = SYS_IMAGE_LIST().GetDirIconIndex(); m_nOpenIconFolder = SYS_IMAGE_LIST().GetDirOpenIconIndex(); EnableSaveRestore(L"Reposbrowser"); DWORD xPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RepobrowserDivider"), 0); if (xPos == 0) { RECT rc; GetDlgItem(IDC_REPOTREE)->GetClientRect(&rc); xPos = rc.right - rc.left; } HandleDividerMove(CPoint(xPos + 20, 10), false); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); m_bHasWC = !g_GitAdminDir.IsBareRepo(g_Git.m_CurrentDir); Refresh(); m_RepoList.SetFocus(); return FALSE; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static uint32_t lanLastPing = 0; static HFONT _hFont = 0; switch (message) { case WM_CREATE: { HFONT hFont = 0; NONCLIENTMETRICS ncm = { sizeof(ncm) }; if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)) { hFont = CreateFontIndirect(&ncm.lfMessageFont); _hFont = hFont; } if (!hFont) hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); RECT rcClient; GetClientRect(hWnd, &rcClient); g_hWndListViewServers = CreateWindow(WC_LISTVIEW, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_OWNERDATA, 1, 21, rcClient.right - UI_PLAYERLIST_WIDTH - 4, rcClient.bottom - UI_SERVERINFO_HEIGHT - 21 - 2, hWnd, nullptr, g_hInst, nullptr); if (g_hWndListViewServers) { SetWindowTheme(g_hWndListViewServers, L"Explorer", nullptr); ListView_SetExtendedListViewStyle(g_hWndListViewServers, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = 30; ListView_InsertColumn(g_hWndListViewServers, 0, &lvc); lvc.mask = LVCF_WIDTH | LVCF_TEXT; lvc.cx = 240; lvc.pszText = LoadStr(L"Server Name", IDS_SERVERNAME); ListView_InsertColumn(g_hWndListViewServers, 1, &lvc); lvc.cx = 60; lvc.pszText = LoadStr(L"Ping", IDS_PING); ListView_InsertColumn(g_hWndListViewServers, 2, &lvc); lvc.cx = 80; lvc.pszText = LoadStr(L"Players", IDS_PLAYERS); ListView_InsertColumn(g_hWndListViewServers, 3, &lvc); lvc.cx = 70; lvc.pszText = LoadStr(L"Version", IDS_VERSION); ListView_InsertColumn(g_hWndListViewServers, 4, &lvc); lvc.cx = 120; lvc.pszText = LoadStr(L"Gamemode", IDS_GAMEMODE); ListView_InsertColumn(g_hWndListViewServers, 5, &lvc); lvc.cx = 100; lvc.pszText = LoadStr(L"Map Name", IDS_MAPNAME); ListView_InsertColumn(g_hWndListViewServers, 6, &lvc); } g_hWndListViewHistory = CreateWindow(WC_LISTVIEW, nullptr, WS_CHILD | WS_CLIPSIBLINGS | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | LVS_OWNERDATA, 1, 21, rcClient.right - UI_PLAYERLIST_WIDTH - 4, rcClient.bottom - UI_SERVERINFO_HEIGHT - 21 - 2, hWnd, nullptr, g_hInst, nullptr); if (g_hWndListViewHistory) { SetWindowTheme(g_hWndListViewHistory, L"Explorer", nullptr); ListView_SetExtendedListViewStyle(g_hWndListViewHistory, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = 30; ListView_InsertColumn(g_hWndListViewHistory, 0, &lvc); lvc.mask = LVCF_WIDTH | LVCF_TEXT; lvc.cx = 220; lvc.pszText = LoadStr(L"Server Name", IDS_SERVERNAME); ListView_InsertColumn(g_hWndListViewHistory, 1, &lvc); lvc.cx = 60; lvc.pszText = LoadStr(L"Ping", IDS_PING); ListView_InsertColumn(g_hWndListViewHistory, 2, &lvc); lvc.cx = 80; lvc.pszText = LoadStr(L"Players", IDS_PLAYERS); ListView_InsertColumn(g_hWndListViewHistory, 3, &lvc); lvc.cx = 70; lvc.pszText = LoadStr(L"Version", IDS_VERSION); ListView_InsertColumn(g_hWndListViewHistory, 4, &lvc); lvc.cx = 100; lvc.pszText = LoadStr(L"Gamemode", IDS_GAMEMODE); ListView_InsertColumn(g_hWndListViewHistory, 5, &lvc); lvc.cx = 160; lvc.pszText = LoadStr(L"Last Played", IDS_LASTPLAYED); ListView_InsertColumn(g_hWndListViewHistory, 6, &lvc); } g_hWndTab = CreateWindow(WC_TABCONTROL, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 0, 0, rcClient.right - UI_PLAYERLIST_WIDTH, rcClient.bottom - UI_SERVERINFO_HEIGHT, hWnd, nullptr, g_hInst, nullptr); if (g_hWndTab) { SetWindowFont(g_hWndTab, hFont, FALSE); HIMAGELIST hTabIml = ImageList_Create(16, 16, ILC_COLOR32, 0, 0); if (hTabIml) { for (int i = IDI_FAVORITE; i <= IDI_HISTORY; ++i) ImageList_AddIcon(hTabIml, LoadIcon(g_hInst, MAKEINTRESOURCE(i))); TabCtrl_SetImageList(g_hWndTab, hTabIml); } TCITEM tie; tie.mask = TCIF_TEXT | TCIF_IMAGE; tie.iImage = 0; tie.pszText = LoadStr(L"Favorites", IDS_FAVORITES); TabCtrl_InsertItem(g_hWndTab, 0, &tie); tie.iImage = 1; tie.pszText = LoadStr(L"Internet", IDS_INTERNET); TabCtrl_InsertItem(g_hWndTab, 1, &tie); tie.iImage = 1; tie.pszText = LoadStr(L"Official", IDS_OFFICIAL); TabCtrl_InsertItem(g_hWndTab, 2, &tie); tie.iImage = 2; tie.pszText = LoadStr(L"Lan", IDS_LAN); TabCtrl_InsertItem(g_hWndTab, 3, &tie); tie.iImage = 3; tie.pszText = LoadStr(L"History", IDS_HISTORY); TabCtrl_InsertItem(g_hWndTab, 4, &tie); } g_hWndListViewPlayers = CreateWindowEx(0, WC_LISTVIEW, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_SINGLESEL | LVS_OWNERDATA, rcClient.right - UI_PLAYERLIST_WIDTH + 1, 18, UI_PLAYERLIST_WIDTH - 2, rcClient.bottom - UI_SERVERINFO_HEIGHT - 18 - 2, hWnd, nullptr, g_hInst, nullptr); if (g_hWndListViewPlayers) { SetWindowTheme(g_hWndListViewPlayers, L"Explorer", nullptr); ListView_SetExtendedListViewStyle(g_hWndListViewPlayers, LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = UI_PLAYERLIST_WIDTH - 2; ListView_InsertColumn(g_hWndListViewPlayers, 0, &lvc); } g_hWndGroupBox1 = CreateWindow(WC_BUTTON, LoadStr(L"Players", IDS_PLAYERSLIST), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_GROUPBOX, rcClient.right - UI_PLAYERLIST_WIDTH, 0, UI_PLAYERLIST_WIDTH, rcClient.bottom - UI_SERVERINFO_HEIGHT, hWnd, nullptr, g_hInst, nullptr); if (g_hWndGroupBox1) { SetWindowFont(g_hWndGroupBox1, hFont, FALSE); } g_hWndGroupBox2 = CreateWindow(WC_BUTTON, LoadStr(L"Server Info", IDS_SERVERINFO), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_GROUPBOX, 0, rcClient.bottom - UI_SERVERINFO_HEIGHT, rcClient.right, 118, hWnd, nullptr, g_hInst, nullptr); if (g_hWndGroupBox2) { SetWindowFont(g_hWndGroupBox2, hFont, FALSE); int y = 18; #define LINE_GAP 20 HWND hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Name:", IDS_SERVERNAME_), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); HWND hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1001, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server IP:", IDS_SERVERIP), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1002, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Players:", IDS_SERVERPLAYERS), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1003, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Ping:", IDS_SERVERPING), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1004, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); y += LINE_GAP; hStatic = CreateWindow(WC_STATIC, LoadStr(L"Server Gamemode:", IDS_SERVERGAMEMODE), WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SS_RIGHT, 10, y, 100, 16, g_hWndGroupBox2, nullptr, g_hInst, nullptr); if (hStatic) SetWindowFont(hStatic, hFont, FALSE); hEdit = CreateWindow(WC_EDIT, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_READONLY, 112, y, 300, 16, g_hWndGroupBox2, (HMENU)1005, g_hInst, nullptr); if (hEdit) SetWindowFont(hEdit, hFont, FALSE); } g_hWndStatusBar = CreateWindow(STATUSCLASSNAME, nullptr, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hWnd, nullptr, g_hInst, nullptr); do { g_UDPSocket = socket(AF_INET, SOCK_DGRAM, 0); if (g_UDPSocket == INVALID_SOCKET) break; uint32_t timeout = 2000; setsockopt(g_UDPSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); struct sockaddr_in bindaddr = { AF_INET }; if (bind(g_UDPSocket, (sockaddr *)&bindaddr, 16) != NO_ERROR) { closesocket(g_UDPSocket); break; } if (WSAAsyncSelect(g_UDPSocket, hWnd, WM_SOCKET, FD_READ) == SOCKET_ERROR) { closesocket(g_UDPSocket); break; } return 0; } while (0); } break; case WM_COMMAND: { int wmId = LOWORD(wParam); switch (wmId) { case IDM_TOOLS_SETTINGS: ShowSettings(); break; case IDM_ABOUT: DialogBox(g_hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { case TCN_SELCHANGE: { g_currentTab = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); switch (g_currentTab) { case 0: // Favorites case 1: // Internet case 2: // Official case 3: // Lan ListView_DeleteAllItems(g_hWndListViewServers); ListView_DeleteAllItems(g_hWndListViewPlayers); g_serversList.clear(); ShowWindow(g_hWndListViewServers, SW_SHOW); ShowWindow(g_hWndListViewHistory, SW_HIDE); UpdateWindow(g_hWndListViewServers); if (g_currentTab == 1 || g_currentTab == 2) { HWND hDialog = CreateDialog(g_hInst, MAKEINTRESOURCEW(IDD_LOADING), hWnd, nullptr); SetWindowPos(hDialog, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); UpdateWindow(hDialog); if (g_serversMasterList) { delete g_serversMasterList; g_serversMasterList = nullptr; } std::string data; data.reserve(2048); const char *url; if (g_currentTab == 1) url = (g_browserSettings.masterlistURL + "/servers").c_str(); else url = (g_browserSettings.masterlistURL + "/official").c_str(); CURLcode curlRet = CurlRequset(url, data, "VCMP/0.4"); if (curlRet == CURLE_OK) { serverMasterList serversList; if (ParseJson(data.data(), serversList)) { for (auto it = serversList.begin(); it != serversList.end(); ++it) { SendQuery(it->address, 'i'); it->lastPing = GetTickCount(); } g_serversMasterList = new serverMasterList(serversList); } else { MessageBox(hWnd, LoadStr(L"Can't parse master list data.", IDS_MASTERLISTDATA), LoadStr(L"Error", IDS_ERROR), MB_ICONWARNING); } } else { wchar_t message[512]; swprintf_s(message, LoadStr(L"Can't get information from master list.\n%hs", IDS_MASTERLISTFAILED), curl_easy_strerror(curlRet)); MessageBox(hWnd, message, LoadStr(L"Error", IDS_ERROR), MB_ICONWARNING); } DestroyWindow(hDialog); } else if (g_currentTab == 3) { BOOL broadcast = TRUE; setsockopt(g_UDPSocket, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast)); for (uint16_t port = 8000; port <= 8200; ++port) { serverAddress address = { INADDR_BROADCAST, port }; SendQuery(address, 'i'); } broadcast = FALSE; setsockopt(g_UDPSocket, SOL_SOCKET, SO_BROADCAST, (char *)&broadcast, sizeof(broadcast)); lanLastPing = GetTickCount(); } break; case 4: // History ShowWindow(g_hWndListViewHistory, SW_SHOW); ShowWindow(g_hWndListViewServers, SW_HIDE); break; } } break; case LVN_GETDISPINFO: { LPNMLVDISPINFOW di = (LPNMLVDISPINFOW)lParam; if (di->hdr.hwndFrom == g_hWndListViewServers) { size_t i = di->item.iItem; if (g_serversList.size() > i) { if (di->item.iSubItem == 0 && di->item.mask & LVIF_IMAGE) di->item.iImage = 0; if (di->item.mask & LVIF_TEXT) { switch (di->item.iSubItem) { case 0: // Icon break; case 1: // Server Name if (di->item.cchTextMax > 0 && di->item.pszText) { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.serverName.c_str(), -1, di->item.pszText, di->item.cchTextMax); } break; case 2: // Ping { uint32_t ping = g_serversList[i].lastRecv - g_serversList[i].lastPing[1]; _itow_s(ping, di->item.pszText, di->item.cchTextMax, 10); } break; case 3: // Players swprintf_s(di->item.pszText, di->item.cchTextMax, L"%hu/%hu", g_serversList[i].info.players, g_serversList[i].info.maxPlayers); break; case 4: // Version { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.versionName, -1, di->item.pszText, di->item.cchTextMax); } break; case 5: // Gamemode { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.gameMode.c_str(), -1, di->item.pszText, di->item.cchTextMax); } break; case 6: // Map name { MultiByteToWideChar(CP_ACP, 0, g_serversList[i].info.mapName.c_str(), -1, di->item.pszText, di->item.cchTextMax); } break; } } } } else if (di->hdr.hwndFrom == g_hWndListViewHistory) // FIXME { } else if (di->hdr.hwndFrom == g_hWndListViewPlayers) { size_t i = ListView_GetSelectionMark(g_hWndListViewServers); if (g_serversList.size() > i) { serverPlayers &players = g_serversList[i].players; size_t j = di->item.iItem; if (players.size() > j) { if (di->item.mask & LVIF_TEXT) { MultiByteToWideChar(CP_ACP, 0, players[j].name, -1, di->item.pszText, di->item.cchTextMax); } } } } } break; case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW nmcd = (LPNMLVCUSTOMDRAW)lParam; if (nmcd->nmcd.hdr.hwndFrom == g_hWndListViewServers) { switch (nmcd->nmcd.dwDrawStage) { case CDDS_PREPAINT: return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: { COLORREF crText; size_t i = nmcd->nmcd.dwItemSpec; if (g_serversList.size() > i && g_serversList[i].isOfficial) crText = g_browserSettings.officialColor; else crText = 0; nmcd->clrText = crText; return CDRF_DODEFAULT; } } } } break; case LVN_ITEMCHANGED: { LPNMITEMACTIVATE nmitem = (LPNMITEMACTIVATE)lParam; if (nmitem->hdr.hwndFrom == g_hWndListViewServers) { size_t i = nmitem->iItem; if (i != -1 && g_serversList.size() > i) { if (g_serversList[i].info.players == 0) ListView_DeleteAllItems(g_hWndListViewPlayers); std::wstring wstr; ConvertCharset(g_serversList[i].info.serverName.c_str(), wstr); SetDlgItemText(g_hWndGroupBox2, 1001, wstr.c_str()); // Server Name wchar_t ipstr[22]; char *ip = (char *)&(g_serversList[i].address.ip); swprintf_s(ipstr, L"%hhu.%hhu.%hhu.%hhu:%hu", ip[0], ip[1], ip[2], ip[3], g_serversList[i].address.port); SetDlgItemText(g_hWndGroupBox2, 1002, ipstr); // Server IP wchar_t playersstr[12]; swprintf_s(playersstr, L"%hu/%hu", g_serversList[i].info.players, g_serversList[i].info.maxPlayers); SetDlgItemText(g_hWndGroupBox2, 1003, playersstr); // Server Players wchar_t pingsstr[12]; uint32_t ping = g_serversList[i].lastRecv - g_serversList[i].lastPing[1]; _itow_s(ping, pingsstr, 10); SetDlgItemText(g_hWndGroupBox2, 1004, pingsstr); // Server Ping ConvertCharset(g_serversList[i].info.gameMode.c_str(), wstr); SetDlgItemText(g_hWndGroupBox2, 1005, wstr.c_str()); // Server Gamemode SendQuery(g_serversList[i].address, 'i'); SendQuery(g_serversList[i].address, 'c'); g_serversList[i].lastPing[0] = GetTickCount(); } else { ListView_DeleteAllItems(g_hWndListViewPlayers); for (int i = 1001; i <= 1005; ++i) SetDlgItemText(g_hWndGroupBox2, i, nullptr); } } } break; case LVN_ITEMACTIVATE: { LPNMITEMACTIVATE nmia = (LPNMITEMACTIVATE)lParam; if (nmia->hdr.hwndFrom == g_hWndListViewServers) { size_t i = nmia->iItem; if (i != -1 && g_serversList.size() > i) { char ipstr[16]; char *ip = (char *)&(g_serversList[i].address.ip); snprintf(ipstr, sizeof(ipstr), "%hhu.%hhu.%hhu.%hhu", ip[0], ip[1], ip[2], ip[3]); char vcmpDll[MAX_PATH]; snprintf(vcmpDll, sizeof(vcmpDll), "%ls%s\\vcmp-game.dll", g_exePath, g_serversList[i].info.versionName); LaunchVCMP(ipstr, g_serversList[i].address.port, g_browserSettings.playerName, nullptr, g_browserSettings.gamePath, vcmpDll); } } } break; } } break; case WM_SIZE: { int clientWidth = GET_X_LPARAM(lParam), clientHeight = GET_Y_LPARAM(lParam); SetWindowPos(g_hWndTab, 0, 0, 0, clientWidth - UI_PLAYERLIST_WIDTH, clientHeight - UI_SERVERINFO_HEIGHT, SWP_NOZORDER); SetWindowPos(g_hWndListViewServers, 0, 1, 21, clientWidth - UI_PLAYERLIST_WIDTH - 4, clientHeight - UI_SERVERINFO_HEIGHT - 21 - 2, SWP_NOZORDER); SetWindowPos(g_hWndListViewHistory, 0, 1, 21, clientWidth - UI_PLAYERLIST_WIDTH - 4, clientHeight - UI_SERVERINFO_HEIGHT - 21 - 2, SWP_NOZORDER); SetWindowPos(g_hWndGroupBox1, 0, clientWidth - UI_PLAYERLIST_WIDTH, 0, UI_PLAYERLIST_WIDTH, clientHeight - UI_SERVERINFO_HEIGHT, SWP_NOZORDER); SetWindowPos(g_hWndListViewPlayers, 0, clientWidth - UI_PLAYERLIST_WIDTH + 1, 18, UI_PLAYERLIST_WIDTH - 2, clientHeight - UI_SERVERINFO_HEIGHT - 18 - 2, SWP_NOZORDER); SetWindowPos(g_hWndGroupBox2, 0, 0, clientHeight - UI_SERVERINFO_HEIGHT, clientWidth, 118, SWP_NOZORDER); SendMessage(g_hWndStatusBar, WM_SIZE, 0, 0); } break; case WM_GETMINMAXINFO: ((LPMINMAXINFO)lParam)->ptMinTrackSize = { 750, 500 }; break; case WM_DESTROY: if (_hFont) DeleteObject(_hFont); PostQuitMessage(0); break; case WM_SOCKET: { if (WSAGETSELECTEVENT(lParam) == FD_READ) { char *recvBuf = (char *)calloc(1024, sizeof(char)); if (recvBuf) { struct sockaddr_in recvAddr; int addrLen = sizeof(recvAddr); int recvLen = recvfrom(g_UDPSocket, recvBuf, 1024, 0, (sockaddr *)&recvAddr, &addrLen); if (recvLen != -1 && recvLen >= 11) { if (recvLen > 1024) recvLen = 1024; if (*(int *)recvBuf == 0x3430504D) // MP04 { char opcode = recvBuf[10]; if (opcode == 'i' || opcode == 'c') { uint32_t ip = recvAddr.sin_addr.s_addr; uint16_t port = ntohs(recvAddr.sin_port); bool found = false; serverMasterListInfo masterInfo; if (g_currentTab == 1 || g_currentTab == 2) { for (auto it = g_serversMasterList->begin(); it != g_serversMasterList->end(); ++it) { if (it->address.ip == ip && it->address.port == port) { found = true; masterInfo = *it; break; } } } else if (g_currentTab == 3) // Lan { found = true; masterInfo.address = { ip, port }; masterInfo.isOfficial = false; masterInfo.lastPing = lanLastPing; } if (found) { switch (opcode) { case 'i': { serverInfo info; if (GetServerInfo(recvBuf, recvLen, info)) { bool inList = false; for (auto it = g_serversList.begin(); it != g_serversList.end(); ++it) { if (it->address.ip == ip && it->address.port == port) { inList = true; it->lastRecv = GetTickCount(); it->lastPing[1] = it->lastPing[0]; it->info = info; auto i = it - g_serversList.begin(); ListView_Update(g_hWndListViewServers, i); break; } } if (!inList) { serverAllInfo allInfo; allInfo.address = masterInfo.address; allInfo.info = info; allInfo.isOfficial = masterInfo.isOfficial; allInfo.lastPing[0] = masterInfo.lastPing; allInfo.lastPing[1] = masterInfo.lastPing; allInfo.lastRecv = GetTickCount(); g_serversList.push_back(allInfo); LVITEM lvi = { 0 }; ListView_InsertItem(g_hWndListViewServers, &lvi); } } } break; case 'c': { serverPlayers players; if (GetServerPlayers(recvBuf, recvLen, players)) { for (auto it = g_serversList.begin(); it != g_serversList.end(); ++it) { if (it->address.ip == ip && it->address.port == port) { it->lastRecv = GetTickCount(); it->lastPing[1] = it->lastPing[0]; it->players = players; auto i = it - g_serversList.begin(); ListView_SetItemCount(g_hWndListViewPlayers, players.size()); break; } } } } break; } } } } } free(recvBuf); } } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
BOOL CFilePatchesDlg::Init(GitPatch * pPatch, CPatchFilesDlgCallBack * pCallBack, CString sPath, CWnd * pParent) { if (!pCallBack || !pPatch) { m_cFileList.DeleteAllItems(); return FALSE; } m_arFileStates.RemoveAll(); m_pPatch = pPatch; m_pCallBack = pCallBack; m_sPath = sPath; if (m_sPath.IsEmpty()) { CString title(MAKEINTRESOURCE(IDS_DIFF_TITLE)); SetWindowText(title); } else { CRect rect; GetClientRect(&rect); SetTitleWithPath(rect.Width()); m_sPath.TrimRight(L'\\'); m_sPath += L'\\'; } SetWindowTheme(m_cFileList.GetSafeHwnd(), L"Explorer", nullptr); m_cFileList.SetExtendedStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); m_cFileList.DeleteAllItems(); int c = m_cFileList.GetHeaderCtrl()->GetItemCount() - 1; while (c>=0) m_cFileList.DeleteColumn(c--); m_cFileList.InsertColumn(0, CString(MAKEINTRESOURCE(IDS_PATH))); m_cFileList.InsertColumn(1, CString(MAKEINTRESOURCE(IDS_STATE))); m_cFileList.SetRedraw(false); for(int i=0; i<m_pPatch->GetNumberOfFiles(); i++) { CString sFile = CPathUtils::GetFileNameFromPath(m_pPatch->GetStrippedPath(i)); int state; if (m_sPath.IsEmpty()) state = 0; else { state = m_pPatch->GetFailedHunks(i); } if (m_pPatch->GetHasConflict(i)) state = FPDLG_FILESTATE_CONFLICT; if (state > 0) state = FPDLG_FILESTATE_ERROR; m_arFileStates.Add(state); CString sFileName = GetFullPath(i); sFileName = CPathUtils::GetFileNameFromPath(sFileName); m_cFileList.InsertItem(i, sFile, SYS_IMAGE_LIST().GetPathIconIndex(sFileName)); SetStateText(i, state); } int mincol = 0; int maxcol = m_cFileList.GetHeaderCtrl()->GetItemCount() - 1; int col; for (col = mincol; col <= maxcol; col++) { m_cFileList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER); } m_cFileList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); m_cFileList.SetRedraw(true); RECT parentrect; pParent->GetWindowRect(&parentrect); RECT windowrect; GetWindowRect(&windowrect); int width = windowrect.right - windowrect.left; int height = windowrect.bottom - windowrect.top; windowrect.right = parentrect.left; windowrect.left = windowrect.right - width; windowrect.top = parentrect.top; windowrect.bottom = windowrect.top + height; auto hMonitor = MonitorFromRect(&windowrect, MONITOR_DEFAULTTONULL); if (hMonitor) SetWindowPos(nullptr, windowrect.left, windowrect.top, width, height, SWP_NOACTIVATE | SWP_NOZORDER); m_nWindowHeight = windowrect.bottom - windowrect.top; m_pMainFrame = pParent; return TRUE; }
INT_PTR CALLBACK ServicesPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(wParam); switch (message) { case WM_INITDIALOG: { hServicesPage = hDlg; hServicesListCtrl = GetDlgItem(hServicesPage, IDC_SERVICES_LIST); // // Correctly display message strings. // LPCWSTR szOSVendor = (bIsWindows ? IDS_MICROSOFT : IDS_REACTOS); size_t itemLength = 0; LPWSTR szItem = NULL, szNewItem = NULL; itemLength = GetWindowTextLength(GetDlgItem(hServicesPage, IDC_STATIC_SERVICES_WARNING)) + 1; szItem = (LPWSTR)MemAlloc(0, itemLength * sizeof(WCHAR)); GetDlgItemText(hServicesPage, IDC_STATIC_SERVICES_WARNING, szItem, (int)itemLength); szNewItem = FormatString(szItem, szOSVendor); SetDlgItemText(hServicesPage, IDC_STATIC_SERVICES_WARNING, szNewItem); MemFree(szNewItem); MemFree(szItem); itemLength = GetWindowTextLength(GetDlgItem(hServicesPage, IDC_CBX_SERVICES_MASK_PROPRIETARY_SVCS)) + 1; szItem = (LPWSTR)MemAlloc(0, itemLength * sizeof(WCHAR)); GetDlgItemText(hServicesPage, IDC_CBX_SERVICES_MASK_PROPRIETARY_SVCS, szItem, (int)itemLength); szNewItem = FormatString(szItem, szOSVendor); SetDlgItemText(hServicesPage, IDC_CBX_SERVICES_MASK_PROPRIETARY_SVCS, szNewItem); MemFree(szNewItem); MemFree(szItem); // // Initialize the styles. // DWORD dwStyle = ListView_GetExtendedListViewStyle(hServicesListCtrl); ListView_SetExtendedListViewStyle(hServicesListCtrl, dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); SetWindowTheme(hServicesListCtrl, L"Explorer", NULL); // // Initialize the application page's controls. // LVCOLUMN column = {}; // First column : Service's name. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_SERVICES_COLUMN_SERVICE); column.cx = 150; ListView_InsertColumn(hServicesListCtrl, 0, &column); MemFree(column.pszText); // Second column : Whether the service is required or not. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_SERVICES_COLUMN_REQ); column.cx = 60; ListView_InsertColumn(hServicesListCtrl, 1, &column); MemFree(column.pszText); // Third column : Service's vendor. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_SERVICES_COLUMN_VENDOR); column.cx = 150; ListView_InsertColumn(hServicesListCtrl, 2, &column); MemFree(column.pszText); // Fourth column : Service's status. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_SERVICES_COLUMN_STATUS); column.cx = 60; ListView_InsertColumn(hServicesListCtrl, 3, &column); MemFree(column.pszText); // Fifth column : Service's disabled date. column.mask = LVCF_TEXT | LVCF_WIDTH; column.pszText = LoadResourceString(hInst, IDS_SERVICES_COLUMN_DATEDISABLED); column.cx = 120; ListView_InsertColumn(hServicesListCtrl, 4, &column); MemFree(column.pszText); // // Populate and sort the list. // GetServices(); ListView_Sort(hServicesListCtrl, 0); Update_Btn_States(hDlg); // Select the first item. ListView_SetItemState(hServicesListCtrl, 0, LVIS_SELECTED, LVIS_SELECTED); return TRUE; } case WM_DESTROY: { ClearServicesList(); userModificationsList.RemoveAll(); return 0; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_BTN_SERVICES_ACTIVATE: { BOOL bAreThereModifs = FALSE; int index = -1; // From the beginning. while ((index = ListView_GetNextItem(hServicesListCtrl, index, LVNI_ALL)) != -1) { bAreThereModifs = ValidateItem(index, TRUE, FALSE) || bAreThereModifs; // The order is verrrrrry important !!!! } if (bAreThereModifs) { Update_Btn_States(hDlg); PropSheet_Changed(GetParent(hServicesPage), hServicesPage); } return TRUE; } case IDC_BTN_SERVICES_DEACTIVATE: { BOOL bAreThereModifs = FALSE; int index = -1; // From the beginning. while ((index = ListView_GetNextItem(hServicesListCtrl, index, LVNI_ALL)) != -1) { bAreThereModifs = ValidateItem(index, FALSE, FALSE) || bAreThereModifs; // The order is verrrrrry important !!!! } if (bAreThereModifs) { Update_Btn_States(hDlg); PropSheet_Changed(GetParent(hServicesPage), hServicesPage); } return TRUE; } case IDC_CBX_SERVICES_MASK_PROPRIETARY_SVCS: { bMaskProprietarySvcs = !bMaskProprietarySvcs; GetServices(bMaskProprietarySvcs); Update_Btn_States(hDlg); return TRUE; } default: return FALSE; } return FALSE; } case UM_CHECKSTATECHANGE: { BOOL bNewCheckState = !!((ListView_GetCheckState(hServicesListCtrl, int(lParam)) + 1) % 2); if (ValidateItem(/*reinterpret_cast<int>*/ int(lParam), bNewCheckState, !HideEssentialServiceWarning())) { Update_Btn_States(hDlg); PropSheet_Changed(GetParent(hServicesPage), hServicesPage); } return TRUE; } case WM_NOTIFY: { if (reinterpret_cast<LPNMHDR>(lParam)->hwndFrom == hServicesListCtrl) { switch (reinterpret_cast<LPNMHDR>(lParam)->code) { case NM_CLICK: case NM_RCLICK: { DWORD dwpos = GetMessagePos(); LVHITTESTINFO ht = {}; ht.pt.x = GET_X_LPARAM(dwpos); ht.pt.y = GET_Y_LPARAM(dwpos); MapWindowPoints(HWND_DESKTOP /*NULL*/, hServicesListCtrl, &ht.pt, 1); /* * We use ListView_SubItemHitTest(...) and not ListView_HitTest(...) * because ListView_HitTest(...) returns bad flags when one clicks * on a sub-item different from 0. The flags then contain LVHT_ONITEMSTATEICON * which must not be obviously present in this case. */ ListView_SubItemHitTest(hServicesListCtrl, &ht); if (LVHT_ONITEMSTATEICON & ht.flags) { PostMessage(hDlg, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.iItem); // Disable default behaviour. Needed for the UM_CHECKSTATECHANGE // custom notification to work as expected. SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE); } return TRUE; } case NM_DBLCLK: case NM_RDBLCLK: { // We deactivate double-clicks. SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE); return TRUE; } case LVN_KEYDOWN: { if (reinterpret_cast<LPNMLVKEYDOWN>(lParam)->wVKey == VK_SPACE) { int iItem = ListView_GetSelectionMark(hServicesListCtrl); PostMessage(hDlg, UM_CHECKSTATECHANGE, 0, (LPARAM)iItem); // Disable default behaviour. Needed for the UM_CHECKSTATECHANGE // custom notification to work as expected. SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE); } return TRUE; } case LVN_COLUMNCLICK: { int iSortingColumn = reinterpret_cast<LPNMLISTVIEW>(lParam)->iSubItem; ListView_SortEx(hServicesListCtrl, iSortingColumn, iSortedColumn); iSortedColumn = iSortingColumn; return TRUE; } } } else { switch (reinterpret_cast<LPNMHDR>(lParam)->code) { case PSN_APPLY: { // Try to apply the modifications to the system. MessageBox(NULL, _T("In Services page: PSN_APPLY"), _T("Info"), MB_ICONINFORMATION); /* // // Move this away... // int iRetVal = MessageBox(NULL, _T("Would you really want to modify the configuration of your system ?"), _T("Warning"), MB_ICONWARNING | MB_YESNOCANCEL); if (iRetVal == IDYES /\* modifications are OK *\/) SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, PSNRET_NOERROR); else if (iRetVal == IDNO /\* modifications are not OK *\/) SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, PSNRET_NOERROR); else // if (iRetVal == IDCANCEL) // There was an error... SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, PSNRET_INVALID); */ // // We modify the services which are stored in the user modification list. // // 1- Open the Service Control Manager for modifications. SC_HANDLE hSCManager = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager != NULL) { LPCWSTR svcName; for (POSITION it = userModificationsList.GetHeadPosition(); it; userModificationsList.GetNext(it)) { svcName = userModificationsList.GetAt(it); // 2- Retrieve a handle to the service. SC_HANDLE hService = OpenServiceW(hSCManager, svcName, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG); if (hService == NULL) { // TODO : Show a message box. continue; } DWORD dwBytesNeeded = 0; QueryServiceConfigW(hService, NULL, 0, &dwBytesNeeded); // if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) LPQUERY_SERVICE_CONFIG lpServiceConfig = (LPQUERY_SERVICE_CONFIG)MemAlloc(0, dwBytesNeeded); if (!lpServiceConfig) { CloseServiceHandle(hService); continue; // TODO ? Show a message box... } QueryServiceConfigW(hService, lpServiceConfig, dwBytesNeeded, &dwBytesNeeded); if (lpServiceConfig->dwStartType == SERVICE_DISABLED) // We have a disabled service which is becoming to be enabled. { // 3a- Retrive the properties of the disabled service from the registry. RegistryDisabledServiceItemParams params = {}; QUERY_REGISTRY_KEYS_TABLE KeysQueryTable[2] = {}; KeysQueryTable[0].QueryRoutine = GetRegistryKeyedDisabledServicesQueryRoutine; KeysQueryTable[0].EntryContext = ¶ms; RegQueryRegistryKeys(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services", KeysQueryTable, (PVOID)svcName); if (bIsWindows && bIsPreVistaOSVersion && !params.bIsPresent) { QUERY_REGISTRY_VALUES_TABLE ValuesQueryTable[2] = {}; ValuesQueryTable[0].QueryRoutine = GetRegistryValuedDisabledServicesQueryRoutine; ValuesQueryTable[0].EntryContext = ¶ms; RegQueryRegistryValues(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services", ValuesQueryTable, (PVOID)svcName); } if (params.bIsPresent) { // 4a- Modify the service. ChangeServiceConfigW(hService, SERVICE_NO_CHANGE, params.dwStartType, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); // 5a- Remove the registry entry of the service. if (params.bIsKeyed) { CAtlStringW serviceRegKey(L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services\\"); serviceRegKey += svcName; RegDeleteKeyW(HKEY_LOCAL_MACHINE, serviceRegKey); /***** HACK for Windows < Vista (e.g. 2000, Xp, 2003...) *****/ // // Delete also the valued-entry of the service. // if (bIsWindows && bIsPreVistaOSVersion) { HKEY hSubKey = NULL; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services", 0, KEY_SET_VALUE /*KEY_READ*/, &hSubKey) == ERROR_SUCCESS) { RegDeleteValue(hSubKey, svcName); RegCloseKey(hSubKey); } } /*************************************************************/ } else { HKEY hSubKey = NULL; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services", 0, KEY_SET_VALUE /*KEY_READ*/, &hSubKey) == ERROR_SUCCESS) { RegDeleteValue(hSubKey, svcName); RegCloseKey(hSubKey); } } ////////// HACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACK /////////// // userModificationsList.RemoveAt(it); } else { // Ohoh !! We have a very big problem. MessageBox(NULL, _T("WTF ??"), _T("FATAL ERROR !!!!"), MB_ICONERROR); } } else // We have an enabled service which is becoming to be disabled. { // 3b- Retrieve the local time of disabling. SYSTEMTIME disableDate = {}; GetLocalTime(&disableDate); // 4b- Modify the service. ChangeServiceConfigW(hService, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); // 5b- Register the service into the registry. CAtlStringW serviceRegKey(L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services\\"); serviceRegKey += svcName; HKEY hSubKey = NULL; if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, serviceRegKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hSubKey, NULL) == ERROR_SUCCESS) { RegSetDWORDValue(hSubKey, NULL, svcName, FALSE, lpServiceConfig->dwStartType); #if 1 // DisableDate RegSetDWORDValue(hSubKey, NULL, L"DAY" , FALSE, disableDate.wDay ); RegSetDWORDValue(hSubKey, NULL, L"HOUR" , FALSE, disableDate.wHour ); RegSetDWORDValue(hSubKey, NULL, L"MINUTE", FALSE, disableDate.wMinute); RegSetDWORDValue(hSubKey, NULL, L"MONTH" , FALSE, disableDate.wMonth ); RegSetDWORDValue(hSubKey, NULL, L"SECOND", FALSE, disableDate.wSecond); RegSetDWORDValue(hSubKey, NULL, L"YEAR" , FALSE, disableDate.wYear ); #endif RegCloseKey(hSubKey); } /***** HACK for Windows < Vista (e.g. 2000, Xp, 2003...) *****/ // // Save also a valued-entry for the service. // if (bIsWindows && bIsPreVistaOSVersion) { RegSetDWORDValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\services", svcName, TRUE, lpServiceConfig->dwStartType); } /*************************************************************/ ////////// HACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACK /////////// // userModificationsList.RemoveAt(it); } MemFree(lpServiceConfig); CloseServiceHandle(hService); } //////////// HACK HACK !!!! //////////// userModificationsList.RemoveAll(); //////////////////////////////////////// CloseServiceHandle(hSCManager); //// PropSheet_UnChanged(GetParent(hServicesPage), hServicesPage); //// PropSheet_CancelToClose(GetParent(hDlg)); /* Modifications are OK */ SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, PSNRET_NOERROR); } else { MessageBox(hDlg, _T("Impossible to open the SC manager..."), _T("Error"), MB_ICONERROR); // There was an error... SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, PSNRET_INVALID); } GetServices(bMaskProprietarySvcs); Update_Btn_States(hDlg); return TRUE; } case PSN_HELP: { MessageBox(hServicesPage, _T("Help not implemented yet!"), _T("Help"), MB_ICONINFORMATION | MB_OK); return TRUE; } case PSN_KILLACTIVE: // Is going to lose activation. { // Changes are always valid of course. SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, FALSE); return TRUE; } case PSN_QUERYCANCEL: { // RefreshStartupList(); // Allows cancellation. SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, FALSE); return TRUE; } case PSN_QUERYINITIALFOCUS: { // Give the focus on and select the first item. ListView_SetItemState(hServicesListCtrl, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, (LONG_PTR)hServicesListCtrl); return TRUE; } // // DO NOT TOUCH THESE NEXT MESSAGES, THEY ARE OK LIKE THIS... // case PSN_RESET: // Perform final cleaning, called before WM_DESTROY. return TRUE; case PSN_SETACTIVE: // Is going to gain activation. { SetWindowLongPtr(hServicesPage, DWLP_MSGRESULT, 0); return TRUE; } default: break; } } } default: return FALSE; } return FALSE; }