99#include " Taskbar.h"
1010#include " Global.h"
1111#include " SettingsChangeListener.h"
12- #include " PathUtils.h"
13- #include < ShlGuid.h>
14- #include < ShlObj_core.h>
15- #include < winrt/Windows.System.Threading.h>
16- #include " ImageUtils.h"
17- #include < Windows.h>
18- #include < gdiplus.h>
12+
13+ #include " FileContextMenu.h"
1914#pragma comment(lib, "gdiplus.lib")
2015
2116using namespace winrt ;
@@ -156,81 +151,7 @@ namespace winrt::FastCopy::implementation
156151
157152 void CopyDialog::ShowMenu (winrt::hstring path, winrt::Microsoft::UI::Xaml::Controls::MenuFlyout flyout)
158153 {
159-
160- winrt::com_ptr<IShellItem> item, folderItem;
161- SHCreateItemFromParsingName (ToBackslash (path).data (), NULL , IID_PPV_ARGS (item.put ()));
162-
163- item->GetParent (folderItem.put ());
164-
165- winrt::com_ptr<IShellFolder> folder;
166- folderItem->BindToHandler (nullptr , BHID_SFObject, IID_PPV_ARGS (folder.put ()));
167-
168-
169- LPITEMIDLIST child{ };
170-
171- SHGetIDListFromObject (item.get (), &child);
172- auto last = ILFindLastID (child);
173-
174- LPCITEMIDLIST idl[2 ]{ last };
175-
176- winrt::com_ptr<IContextMenu> menu;
177- auto hr = folder->GetUIObjectOf (NULL , 1 , &idl[0 ], IID_IContextMenu, nullptr , menu.put_void ());
178-
179- auto hMenu = CreatePopupMenu ();
180- // menu->QueryContextMenu(hMenu, 0, 1, 0x7fff, CMF_OPTIMIZEFORINVOKE);
181- menu->QueryContextMenu (hMenu, 0 , 1 , 0x7fff , CMF_NORMAL);
182-
183- auto const itemCount = GetMenuItemCount (hMenu);
184- MENUITEMINFO menuItemInfo{
185- .cbSize = sizeof (menuItemInfo),
186- .fMask = MIIM_BITMAP | MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU
187- };
188- for (int i = 0 ; i < itemCount; ++i)
189- {
190- TCHAR buffer[500 ]{};
191- menuItemInfo.dwTypeData = buffer;
192- menuItemInfo.cch = std::size (buffer);
193- GetMenuItemInfo (hMenu, i, true , &menuItemInfo);
194- if (!std::wstring_view{buffer}.empty () && menu)
195- {
196- winrt::Microsoft::UI::Xaml::Controls::MenuFlyoutItem item;
197- item.Text (buffer);
198-
199- if (menuItemInfo.hbmpItem )
200- {
201- winrt::Microsoft::UI::Xaml::Controls::ImageIcon icon;
202- {
203- auto pbitmap = Gdiplus::Bitmap::FromHBITMAP (menuItemInfo.hbmpItem , NULL );
204- INT const height = pbitmap->GetHeight ();
205- INT const width = pbitmap->GetWidth ();
206-
207- Gdiplus::Color c{Gdiplus::Color::MakeARGB (255 , 0 , 0 , 0 )};
208-
209- Gdiplus::Rect bmBounds{0 , 0 , (INT)width, (INT)height};
210- Gdiplus::BitmapData data{};
211- pbitmap->LockBits (&bmBounds, Gdiplus::ImageLockModeRead, PixelFormat32bppRGB, &data);
212-
213- Gdiplus::Bitmap tmp{width, height, data.Stride , PixelFormat32bppARGB, (BYTE*)data.Scan0 };
214- Gdiplus::Bitmap clone{width, height, PixelFormat32bppARGB};
215-
216- Gdiplus::Graphics* gr = Gdiplus::Graphics::FromImage (&clone);
217- gr->DrawImage (&tmp, bmBounds);
218-
219- HBITMAP hbitmap{};
220- clone.GetHBITMAP (c, &hbitmap);
221- if (auto source = HBitmapToWriteableBitmap (hbitmap); source != nullptr )
222- {
223- icon.Source (source);
224- item.Icon (icon);
225- }
226- }
227- }
228- flyout.Items ().Append (item);
229- }
230- OutputDebugString (buffer);
231- OutputDebugString (L" \n " );
232- }
233-
154+ FileContextMenu (path).ShowAt (flyout);
234155 }
235156
236157}
@@ -251,12 +172,4 @@ void winrt::FastCopy::implementation::CopyDialog::MenuFlyout_Opening(winrt::Wind
251172 .as <winrt::FastCopy::FileInfoViewModel>();
252173
253174 ShowMenu (fileInfoViewModel.Path (), menu);
254-
255- // std::thread{
256- // [this, path = fileInfoViewModel.Path()]
257- // {
258- // winrt::init_apartment(winrt::apartment_type::single_threaded);
259- // ShowMenu(path, nullptr);
260- // }
261- // }.detach();
262175}
0 commit comments