diff --git a/Scylla/PickDllGui.cpp b/Scylla/PickDllGui.cpp index 39832bb..939102b 100644 --- a/Scylla/PickDllGui.cpp +++ b/Scylla/PickDllGui.cpp @@ -1,61 +1,115 @@ #include "PickDllGui.h" BOOL PickDllGui::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { ListDLLSelect.Attach(GetDlgItem(IDC_LIST_DLLSELECT)); addColumnsToModuleList(ListDLLSelect); displayModuleList(ListDLLSelect); CenterWindow(); + GetClientRect(&MinSize); + return TRUE; } +void PickDllGui::OnGetMinMaxInfo(MINMAXINFO* lpMMI) +{ + lpMMI->ptMinTrackSize.x = MinSize.right; + lpMMI->ptMinTrackSize.y = MinSize.bottom; +} + +void PickDllGui::OnSizing(UINT fwSide, RECT* pRect) +{ + int toResize[] = {IDC_LIST_DLLSELECT}; + int toMove[] = {IDC_BTN_PICKDLL_OK, IDC_BTN_PICKDLL_CANCEL}; + + // Get size difference + RECT rectOld; + GetWindowRect(&rectOld); + long deltaX = (pRect->right - pRect->left) - (rectOld.right - rectOld.left); + long deltaY = (pRect->bottom - pRect->top) - (rectOld.bottom - rectOld.top); + + HDWP hdwp = BeginDeferWindowPos(_countof(toResize) + _countof(toMove)); + + for(int i = 0; i < _countof(toResize); i++) + { + RECT rectControl; + CWindow control(GetDlgItem(toResize[i])); + + control.GetWindowRect(&rectControl); // Why doesn't GetClientRect work? + // calculate new width and height + int cx = rectControl.right - rectControl.left + deltaX; + int cy = rectControl.bottom - rectControl.top + deltaY; + + control.DeferWindowPos(hdwp, NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOOWNERZORDER); + } + + for(int i = 0; i < _countof(toMove); i++) + { + RECT rectControl; + CWindow control(GetDlgItem(toMove[i])); + control.GetClientRect(&rectControl); + control.MapWindowPoints(m_hWnd, &rectControl); + control.DeferWindowPos(hdwp, NULL, rectControl.left + deltaX, rectControl.top + deltaY, 0, 0, SWP_NOSIZE | SWP_NOOWNERZORDER); + } + + EndDeferWindowPos(hdwp); +} + void PickDllGui::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl) { int index = ListDLLSelect.GetSelectionMark(); if (index != -1) { selectedModule = &moduleList[index]; EndDialog(1); } } void PickDllGui::OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl) { EndDialog(0); } void PickDllGui::addColumnsToModuleList(CListViewCtrl& list) { list.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); list.InsertColumn(COL_PATH, L"Path", LVCFMT_LEFT, 210); list.InsertColumn(COL_NAME, L"Name", LVCFMT_CENTER, 130); list.InsertColumn(COL_IMAGEBASE, L"ImageBase", LVCFMT_CENTER, 70); list.InsertColumn(COL_IMAGESIZE, L"ImageSize", LVCFMT_CENTER, 70); } void PickDllGui::displayModuleList(CListViewCtrl& list) { WCHAR temp[20]; list.DeleteAllItems(); std::vector::const_iterator iter; int count = 0; for( iter = moduleList.begin(); iter != moduleList.end(); iter++ , count++) { list.InsertItem(count, iter->fullPath); list.SetItemText(count, COL_NAME, iter->getFilename()); swprintf_s(temp,_countof(temp),L"%08X",iter->modBaseAddr); list.SetItemText(count, COL_IMAGEBASE, temp); swprintf_s(temp,_countof(temp),L"%08X",iter->modBaseSize); list.SetItemText(count, COL_IMAGESIZE, temp); } + + //list.SetColumnWidth(COL_PATH, LVSCW_AUTOSIZE); + list.SetColumnWidth(COL_NAME, LVSCW_AUTOSIZE); + //list.SetColumnWidth(COL_IMAGEBASE, LVSCW_AUTOSIZE); + + list.SetColumnWidth(COL_IMAGESIZE, LVSCW_AUTOSIZE_USEHEADER); + + //m_hotkeysListView.SetColumnWidth(1, LVSCW_AUTOSIZE_USEHEADER); } diff --git a/Scylla/PickDllGui.h b/Scylla/PickDllGui.h index e677e0d..dd23c8d 100644 --- a/Scylla/PickDllGui.h +++ b/Scylla/PickDllGui.h @@ -1,64 +1,70 @@ #pragma once #include #include "resource.h" // WTL #include // base ATL classes #include // base WTL classes #include // ATL GUI classes #include // WTL utility classes like CString #include // WTL enhanced msg map macros #include // WTL controls #include #include "ProcessAccessHelp.h" class PickDllGui : public CDialogImpl { public: enum { IDD = IDD_DLG_PICKDLL }; BEGIN_MSG_MAP(PickDllGui) MSG_WM_INITDIALOG(OnInitDialog) + MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo) + MSG_WM_SIZING(OnSizing) COMMAND_ID_HANDLER_EX(IDC_BTN_PICKDLL_OK, OnOK) COMMAND_ID_HANDLER_EX(IDC_BTN_PICKDLL_CANCEL, OnCancel) COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel) END_MSG_MAP() PickDllGui(std::vector &moduleList) : moduleList(moduleList), selectedModule(0) { } ModuleInfo* getSelectedModule() const { return selectedModule; } protected: // Variables std::vector &moduleList; ModuleInfo* selectedModule; // Controls CListViewCtrl ListDLLSelect; enum ListColumns { COL_PATH, COL_NAME, COL_IMAGEBASE, COL_IMAGESIZE }; + RECT MinSize; + protected: // Message handlers BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam); + void OnGetMinMaxInfo(MINMAXINFO* lpMMI); + void OnSizing(UINT fwSide, RECT* pRect); void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl); void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl); // GUI functions void addColumnsToModuleList(CListViewCtrl& list); void displayModuleList(CListViewCtrl& list); };