From 9deb180cbce9fed3d8471168da2037c34586841a Mon Sep 17 00:00:00 2001 From: zoeda <2063629468@qq.com> Date: Mon, 30 Oct 2023 14:39:56 +0800 Subject: [PATCH] Galaxy --- src/README.md | 106 ++ src/Release/Screenshot.exe | Bin 0 -> 221184 bytes src/Screenshot.sln | 20 + src/Screenshot/CatchScreenDlg.cpp | 679 +++++++++++++ src/Screenshot/CatchScreenDlg.h | 90 ++ src/Screenshot/MyEdit.cpp | 120 +++ src/Screenshot/MyEdit.h | 51 + src/Screenshot/MyToolBar.cpp | 148 +++ src/Screenshot/MyToolBar.h | 24 + src/Screenshot/MyTracker.cpp | 839 ++++++++++++++++ src/Screenshot/MyTracker.h | 102 ++ src/Screenshot/PopUpMenu.cpp | 1466 ++++++++++++++++++++++++++++ src/Screenshot/PopUpMenu.h | 117 +++ src/Screenshot/ReadMe.txt | 73 ++ src/Screenshot/Screenshot.aps | Bin 0 -> 202600 bytes src/Screenshot/Screenshot.cpp | 174 ++++ src/Screenshot/Screenshot.h | 38 + src/Screenshot/Screenshot.rc | 217 ++++ src/Screenshot/Screenshot.vcproj | 368 +++++++ src/Screenshot/Screenshot.vcxproj | 169 ++++ src/Screenshot/ScreenshotDlg.cpp | 116 +++ src/Screenshot/ScreenshotDlg.h | 31 + src/Screenshot/res/Arrow.png | Bin 0 -> 142 bytes src/Screenshot/res/Arrow2.png | Bin 0 -> 172 bytes src/Screenshot/res/Brush.PNG | Bin 0 -> 307 bytes src/Screenshot/res/Circle.png | Bin 0 -> 260 bytes src/Screenshot/res/Exit.png | Bin 0 -> 142 bytes src/Screenshot/res/Finish.png | Bin 0 -> 146 bytes src/Screenshot/res/Mosaic.png | Bin 0 -> 153 bytes src/Screenshot/res/Rectangle.png | Bin 0 -> 129 bytes src/Screenshot/res/Save.png | Bin 0 -> 171 bytes src/Screenshot/res/Screenshot.ico | Bin 0 -> 21630 bytes src/Screenshot/res/Screenshot.rc2 | 13 + src/Screenshot/res/Text.png | Bin 0 -> 276 bytes src/Screenshot/res/Undo.png | Bin 0 -> 195 bytes src/Screenshot/res/arrow_m.cur | Bin 0 -> 766 bytes src/Screenshot/res/brackground.bmp | Bin 0 -> 154934 bytes src/Screenshot/resource.h | 33 + src/Screenshot/stdafx.cpp | 7 + src/Screenshot/stdafx.h | 57 ++ src/Screenshot/targetver.h | 26 + src/snatshot.png | Bin 0 -> 48691 bytes 42 files changed, 5084 insertions(+) create mode 100644 src/README.md create mode 100644 src/Release/Screenshot.exe create mode 100644 src/Screenshot.sln create mode 100644 src/Screenshot/CatchScreenDlg.cpp create mode 100644 src/Screenshot/CatchScreenDlg.h create mode 100644 src/Screenshot/MyEdit.cpp create mode 100644 src/Screenshot/MyEdit.h create mode 100644 src/Screenshot/MyToolBar.cpp create mode 100644 src/Screenshot/MyToolBar.h create mode 100644 src/Screenshot/MyTracker.cpp create mode 100644 src/Screenshot/MyTracker.h create mode 100644 src/Screenshot/PopUpMenu.cpp create mode 100644 src/Screenshot/PopUpMenu.h create mode 100644 src/Screenshot/ReadMe.txt create mode 100644 src/Screenshot/Screenshot.aps create mode 100644 src/Screenshot/Screenshot.cpp create mode 100644 src/Screenshot/Screenshot.h create mode 100644 src/Screenshot/Screenshot.rc create mode 100644 src/Screenshot/Screenshot.vcproj create mode 100644 src/Screenshot/Screenshot.vcxproj create mode 100644 src/Screenshot/ScreenshotDlg.cpp create mode 100644 src/Screenshot/ScreenshotDlg.h create mode 100644 src/Screenshot/res/Arrow.png create mode 100644 src/Screenshot/res/Arrow2.png create mode 100644 src/Screenshot/res/Brush.PNG create mode 100644 src/Screenshot/res/Circle.png create mode 100644 src/Screenshot/res/Exit.png create mode 100644 src/Screenshot/res/Finish.png create mode 100644 src/Screenshot/res/Mosaic.png create mode 100644 src/Screenshot/res/Rectangle.png create mode 100644 src/Screenshot/res/Save.png create mode 100644 src/Screenshot/res/Screenshot.ico create mode 100644 src/Screenshot/res/Screenshot.rc2 create mode 100644 src/Screenshot/res/Text.png create mode 100644 src/Screenshot/res/Undo.png create mode 100644 src/Screenshot/res/arrow_m.cur create mode 100644 src/Screenshot/res/brackground.bmp create mode 100644 src/Screenshot/resource.h create mode 100644 src/Screenshot/stdafx.cpp create mode 100644 src/Screenshot/stdafx.h create mode 100644 src/Screenshot/targetver.h create mode 100644 src/snatshot.png diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..8430625 --- /dev/null +++ b/src/README.md @@ -0,0 +1,106 @@ + +##### 说明 + +硬盘上的一份截图代码,作者是[sudami](https://bbs.pediy.com/thread-54302.htm)。 + +提取了里面的3个类CatchScreenDlg、MyTracker.h,MyEdit,自己在实现下。 + +双缓冲,完美无闪烁。 + +##### 截图 + +![snatshot.png](snatshot.png) + + +##### 说明 + +1、重写了MyEdit的绘制,避免闪烁。 + +2、修改CCatchScreenDlg中部分逻辑,避免闪烁 + +3、增加ToolBar控件,仿QQ截图界面。按钮实际功能未开发。 + +4、实现截图飞选中区域暗色处理 + + +##### ToolBar控件消息处理 + +```c++ +BOOL CCatchScreenDlg::OnCommand(WPARAM wParam, LPARAM lParam) +{ + bool bHandle = true; + HWND hWnd = m_toolBar.GetHWND(); + if(lParam == (LPARAM)m_toolBar.GetHWND()) + { + int wmId = LOWORD(wParam); + switch(wmId) + { + case MyToolBar_ID: + AfxMessageBox(_T("矩形")); + break; + case MyToolBar_ID+1: + AfxMessageBox(_T("圆形")); + break; + case MyToolBar_ID +2: + AfxMessageBox(_T("画笔")); + break; + case MyToolBar_ID +3: + AfxMessageBox(_T("马赛克")); + break; + case MyToolBar_ID +4: + AfxMessageBox(_T("文字")); + break; + case MyToolBar_ID +5: + AfxMessageBox(_T("撤销")); + break; + case MyToolBar_ID +6: + CopyScreenToBitmap(m_rectTracker.m_rect, TRUE); + PostQuitMessage(0); + break; + case MyToolBar_ID +7: + PostQuitMessage(0); + break; + case MyToolBar_ID +8: + CopyScreenToBitmap(m_rectTracker.m_rect, TRUE); + PostQuitMessage(0); + break; + default: + bHandle = false; + break; + } + ::SetFocus(hWnd); + } + if (bHandle == false) + { + return CDialog::OnCommand(wParam,lParam); + } +} +``` + + +##### 神奇的非选中区域暗色处理算法 + +```c++ + Gdiplus::Graphics graphics(dcCompatible); + + HRGN hgn1 = CreateRectRgn(m_rectTracker.m_rect.left,m_rectTracker.m_rect.top, + m_rectTracker.m_rect.right,m_rectTracker.m_rect.bottom); + Region region1(hgn1); + + HRGN hgn2 = CreateRectRgn(rect.left,rect.top, + rect.right,rect.bottom); + Region region2(hgn2); + + region2.Exclude(®ion1); + + SolidBrush solidBrush(Color(100, 128, 128, 128)); + graphics.FillRegion(&solidBrush,®ion2); + + DeleteObject(hgn1); + DeleteObject(hgn2); +``` + + + + + diff --git a/src/Release/Screenshot.exe b/src/Release/Screenshot.exe new file mode 100644 index 0000000000000000000000000000000000000000..771fb856c0d2d2583ab473363f70403410987180 GIT binary patch literal 221184 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 literal 0 HcmV?d00001 diff --git a/src/Screenshot.sln b/src/Screenshot.sln new file mode 100644 index 0000000..732cc79 --- /dev/null +++ b/src/Screenshot.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Screenshot", "Screenshot\Screenshot.vcproj", "{24E39ACB-AB81-485D-8D36-749B3F5EC1E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Debug|Win32.Build.0 = Debug|Win32 + {24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Release|Win32.ActiveCfg = Release|Win32 + {24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/Screenshot/CatchScreenDlg.cpp b/src/Screenshot/CatchScreenDlg.cpp new file mode 100644 index 0000000..729bc5e --- /dev/null +++ b/src/Screenshot/CatchScreenDlg.cpp @@ -0,0 +1,679 @@ +/****************************************************************************** +* FileName : CatchScreenDlg.cpp +* Author : Unknown +* Mender : sudami +* Time : 2007/09/09 +* +* Comment : +* +******************************************************************************/ + +#include "stdafx.h" +#include "Screenshot.h" +#include "CatchScreenDlg.h" + +#include +using namespace Gdiplus; + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +// CCatchScreenDlg dialog + +CCatchScreenDlg::CCatchScreenDlg(CWnd* pParent /*=NULL*/) +: CDialog(CCatchScreenDlg::IDD, pParent) +{ + m_bLBtnDown = FALSE; + //ʼƤ,resizeMiddle + m_rectTracker.m_nStyle = CMyTracker::resizeMiddle | CMyTracker::solidLine; + m_rectTracker.m_rect.SetRect(-1, -2, -3, -4); + //þɫ + m_rectTracker.SetRectColor(RGB(10, 100, 130)); + + m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1); + + m_bDraw = FALSE; + m_bFirstDraw = FALSE; + m_bQuit = FALSE; + m_bNeedShowMsg = FALSE; + m_startPt = 0; + + //ȡĻֱ + m_xScreen = GetSystemMetrics(SM_CXSCREEN); + m_yScreen = GetSystemMetrics(SM_CYSCREEN); + + //ȡĻλͼ + CRect rect(0, 0, m_xScreen, m_yScreen); + m_hBitmap = CopyScreenToBitmap(&rect); + m_pBitmap = CBitmap::FromHandle(m_hBitmap); + + //ʼˢ´ m_rgn + m_rgn.CreateRectRgn(0, 0, 50, 50); +} + +void CCatchScreenDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT1, m_tipEdit); +} + +BEGIN_MESSAGE_MAP(CCatchScreenDlg, CDialog) + ON_WM_PAINT() + ON_WM_MOUSEMOVE() + ON_WM_LBUTTONDOWN() + ON_WM_LBUTTONUP() + ON_WM_LBUTTONDBLCLK() + ON_WM_ERASEBKGND() + ON_WM_SETCURSOR() + ON_WM_RBUTTONUP() + ON_WM_CTLCOLOR() + ON_WM_RBUTTONDOWN() +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CCatchScreenDlg message handlers + +BOOL CCatchScreenDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + //ѶԻóȫ㴰 + SetWindowPos(&wndTopMost, 0, 0, m_xScreen, m_yScreen, SWP_SHOWWINDOW); + + //ƶʾ + CRect rect; + m_tipEdit.GetWindowRect(&rect); + m_tipEdit.MoveWindow(10, 10, rect.Width(), rect.Height()); + + + m_toolBar.CreateToolBar(m_hWnd); + m_toolBar.RemoveChildStyle(); + ::MoveWindow(m_toolBar.GetHWND(),300,300,230,30,FALSE); + + + UpdateTipString(); + SetEidtWndText(); + + ((CScreenshotApp *)AfxGetApp())->m_hwndDlg = AfxGetMainWnd()->GetSafeHwnd(); + return TRUE; +} + +void CCatchScreenDlg::OnPaint() +{ + // С״̬ + if (IsIconic()) + { + CPaintDC dc(this); + + SendMessage(WM_ICONERASEBKGND, (WPARAM)dc.GetSafeHdc(), 0); + + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + } + else // ʾ + { + CPaintDC dc(this); + + CDC dcCompatible; + + dcCompatible.CreateCompatibleDC(&dc); + RECT rect; + ::GetClientRect(m_hWnd, &rect); + HBITMAP hBitmap = ::CreateCompatibleBitmap(dc.m_hDC,rect.right-rect.left,rect.bottom-rect.top); + ::SelectObject(dcCompatible.m_hDC,hBitmap); + + HBRUSH s_hBitmapBrush = CreatePatternBrush(m_hBitmap); + ::FillRect(dcCompatible.m_hDC,&rect,s_hBitmapBrush); + + //ʾȡδСϢ + if (m_bNeedShowMsg && m_bFirstDraw) + { + CRect rect = m_rectTracker.m_rect; + DrawMessage(rect, &dcCompatible); + } + + //Ƥ + if (m_bFirstDraw) + { + m_rectTracker.Draw(&dcCompatible); + } + Gdiplus::Graphics graphics(dcCompatible); + + HRGN hgn1 = CreateRectRgn(m_rectTracker.m_rect.left,m_rectTracker.m_rect.top, + m_rectTracker.m_rect.right,m_rectTracker.m_rect.bottom); + Region region1(hgn1); + + HRGN hgn2 = CreateRectRgn(rect.left,rect.top, + rect.right,rect.bottom); + Region region2(hgn2); + + region2.Exclude(®ion1); + + SolidBrush solidBrush(Color(100, 128, 128, 128)); + graphics.FillRegion(&solidBrush,®ion2); + + DeleteObject(hgn1); + DeleteObject(hgn2); + + dc.BitBlt(0,0,rect.right, rect.bottom,&dcCompatible,0,0,SRCCOPY); + DeleteObject(hBitmap); + DeleteObject(s_hBitmapBrush); + + //CDialog::OnPaint(); + } +} + +void CCatchScreenDlg::OnCancel() +{ + if (m_bFirstDraw) + { + //ȡѻα + m_bFirstDraw = FALSE; + m_bDraw = FALSE; + m_rectTracker.m_rect.SetRect(-1, -1, -1, -1); + InvalidateRgnWindow(); + } + else + { + CDialog::OnCancel(); + } +} + +void CCatchScreenDlg::OnMouseMove(UINT nFlags, CPoint point) +{ + if(m_bLBtnDown) + m_toolBar.HideToolBar(); + else + m_toolBar.ShowToolBar(); + if (m_bDraw) + { + //̬δС,ˢ» + m_rectTracker.m_rect.SetRect(m_startPt.x + 4, m_startPt.y + 4, point.x, point.y); + InvalidateRgnWindow(); + } + + //ֲСλʱ,ղMouseMoveϢ + CRect rect; + m_tipEdit.GetWindowRect(&rect); + if (rect.PtInRect(point)) + m_tipEdit.SendMessage(WM_MOUSEMOVE); + + UpdateMousePointRGBString(); + SetEidtWndText(); + + CDialog::OnMouseMove(nFlags, point); +} + +void CCatchScreenDlg::OnLButtonDown(UINT nFlags, CPoint point) +{ + m_bLBtnDown = TRUE; + int nHitTest; + nHitTest = m_rectTracker.HitTest(point); + //жϻλ + if (nHitTest < 0) + { + if (!m_bFirstDraw) + { + //һλ + m_startPt = point; + m_bDraw = TRUE; + m_bFirstDraw = TRUE; + //õ갴ʱСľδС + m_rectTracker.m_rect.SetRect(point.x, point.y, point.x + 4, point.y + 4); + + //֤굱ʱʾϢ + if (m_bFirstDraw) + m_bNeedShowMsg = TRUE; + UpdateTipString(); + SetEidtWndText(); + InvalidateRgnWindow(); + } + } + else + { + //֤굱ʱʾϢ + m_bNeedShowMsg = TRUE; + if (m_bFirstDraw) + { + //Сʱ,TrackԶδС,Щڼ,ϢCRectTrackerڲ + m_rectTracker.Track(this, point, TRUE); + InvalidateRgnWindow(); + } + } + + CDialog::OnLButtonDown(nFlags, point); +} + +void CCatchScreenDlg::OnLButtonUp(UINT nFlags, CPoint point) +{ + m_bLBtnDown = FALSE; + m_bNeedShowMsg = FALSE; + m_bDraw = FALSE; + UpdateTipString(); + SetEidtWndText(); + m_toolBar.SetShowPlace(m_rectTracker.m_rect.right,m_rectTracker.m_rect.bottom); + + InvalidateRgnWindow(); + CDialog::OnLButtonUp(nFlags, point); +} + +void CCatchScreenDlg::OnLButtonDblClk(UINT nFlags, CPoint point) +{ + int nHitTest; + nHitTest = m_rectTracker.HitTest(point); + + //Ǿڲ˫ + if (nHitTest == 8) + { + //λͼճ,bSave ΪTRUE, + CopyScreenToBitmap(m_rectTracker.m_rect, TRUE); + PostQuitMessage(0); + } + + CDialog::OnLButtonDblClk(nFlags, point); +} + +void CCatchScreenDlg::OnRButtonDown(UINT nFlags, CPoint point) +{ + m_toolBar.HideToolBar(); + //InvalidateRgnWindow(); + CDialog::OnRButtonDown(nFlags, point); +} + +void CCatchScreenDlg::OnRButtonUp(UINT nFlags, CPoint point) +{ + m_bLBtnDown = FALSE; + if (m_bFirstDraw) + { + //Ѿȡȡ + m_bFirstDraw = FALSE; + //δС + m_rectTracker.m_rect.SetRect(-1, -1, -1, -1); + UpdateTipString(); + SetEidtWndText(); + InvalidateRgnWindow(); + } + else + { + //رճ + PostQuitMessage(0); + } + + CDialog::OnRButtonUp(nFlags, point); +} + +HBRUSH CCatchScreenDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) +{ + HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); + + //òʾıɫ + if (pWnd->GetDlgCtrlID() == IDC_EDIT1) + { + pDC->SetTextColor(RGB(247,76,128)); + } + + return hbr; +} + +BOOL CCatchScreenDlg::OnEraseBkgnd(CDC* pDC) +{ + return FALSE; + //ȫԻ򱳾 + BITMAP bmp; + m_pBitmap->GetBitmap(&bmp); + + CDC dcCompatible; + dcCompatible.CreateCompatibleDC(pDC); + + dcCompatible.SelectObject(m_pBitmap); + + CRect rect; + GetClientRect(&rect); + pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY); + return TRUE; +} + +BOOL CCatchScreenDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) +{ + //øıȡδСʱ + if (pWnd == this &&m_rectTracker.SetCursor(this, nHitTest) + && !m_bDraw &&m_bFirstDraw) //˴жϱȡʱʼΪɫ + { + return TRUE; + } + + //òɫ + SetCursor(m_hCursor); + return TRUE; +} + +// Ļ, ԴԴCSDN +// lpRect ѡ +HBITMAP CCatchScreenDlg::CopyScreenToBitmap(LPRECT lpRect, BOOL bSave) + +{ + HDC hScrDC, hMemDC; + // Ļڴ豸 + HBITMAP hBitmap, hOldBitmap; + // λͼ + int nX, nY, nX2, nY2; + // ѡ + int nWidth, nHeight; + + // ȷѡΪվ + if (IsRectEmpty(lpRect)) + return NULL; + //ΪĻ豸 + hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); + + //ΪĻ豸ݵڴ豸 + hMemDC = CreateCompatibleDC(hScrDC); + // ѡ + nX = lpRect->left; + nY = lpRect->top; + nX2 = lpRect->right; + nY2 = lpRect->bottom; + + //ȷѡǿɼ + if (nX < 0) + nX = 0; + if (nY < 0) + nY = 0; + if (nX2 > m_xScreen) + nX2 = m_xScreen; + if (nY2 > m_yScreen) + nY2 = m_yScreen; + nWidth = nX2 - nX; + nHeight = nY2 - nY; + // һĻ豸ݵλͼ + hBitmap = CreateCompatibleBitmap + (hScrDC, nWidth, nHeight); + // λͼѡڴ豸 + hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); + // Ļ豸ڴ豸 + if (bSave) + { + //DC,bSaveΪʱѿʼȫλͼ,ȡδС + CDC dcCompatible; + dcCompatible.CreateCompatibleDC(CDC::FromHandle(hMemDC)); + dcCompatible.SelectObject(m_pBitmap); + + BitBlt(hMemDC, 0, 0, nWidth, nHeight, + dcCompatible, nX, nY, SRCCOPY); + } + else + { + BitBlt(hMemDC, 0, 0, nWidth, nHeight, + hScrDC, nX, nY, SRCCOPY); + } + + hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); + //õĻλͼľ + // + DeleteDC(hScrDC); + DeleteDC(hMemDC); + + if (bSave) + { + if (OpenClipboard()) + { + //ռ + EmptyClipboard(); + //Ļճ, + //hBitmap ΪղŵĻλͼ + SetClipboardData(CF_BITMAP, hBitmap); + //رռ + CloseClipboard(); + } + } + // λͼ + return hBitmap; +} + +// ʾʾϢ +void CCatchScreenDlg::UpdateTipString() +{ + CString strTemp; + if (!m_bDraw && !m_bFirstDraw) + { + strTemp = _T("\r\n\r\nѡȡ\r\n\r\nESCҼ˳"); + } + else + if (m_bDraw && m_bFirstDraw) + { + strTemp = _T("\r\n\r\nɿȷȡΧ\r\n\r\nESC˳"); + } + else if (!m_bDraw && m_bFirstDraw) + { + CString sudami(_T("\r\n\r\n˫\r\n\r\nҼѡ")); + strTemp = _T("\r\n\r\nھαԵС"); + + strTemp += sudami; + } + m_strEditTip = strTemp; +} + +// ʾȡϢ +void CCatchScreenDlg::DrawMessage(CRect &inRect, CDC * pDC) +{ + //ȡδСϢ + const int space = 3; + + //ɫС + CPoint pt; + CPen pen(PS_SOLID, 1, RGB(47, 79, 79)); + CPen *pOldPen; + pOldPen = pDC->SelectObject(&pen); + + //pDC->SetTextColor(RGB(147,147,147)); + CFont font; + CFont * pOldFont; + font.CreatePointFont(90, _T("")); + pOldFont = pDC->SelectObject(&font); + + //õȺ͸߶ + GetCursorPos(&pt); + int OldBkMode; + OldBkMode = pDC->SetBkMode(TRANSPARENT); + + TEXTMETRIC tm; + int charHeight; + CSize size; + int lineLength; + pDC->GetTextMetrics(&tm); + charHeight = tm.tmHeight + tm.tmExternalLeading; + size = pDC->GetTextExtent(_T("λ "), _tcslen(_T("λ "))); + lineLength = size.cx; + + //ʼ, Ա֤д + CRect rect(pt.x + space, pt.y - charHeight * 6 - space, pt.x + lineLength + space, pt.y - space); + + //ʱ + CRect rectTemp; + //εԵʱʹС + if ((pt.x + rect.Width()) >= m_xScreen) + { + //Ϸʾ¾ + rectTemp = rect; + rectTemp.left = rect.left - rect.Width() - space * 2; + rectTemp.right = rect.right - rect.Width() - space * 2;; + rect = rectTemp; + } + + if ((pt.y - rect.Height()) <= 0) + { + //ҷʾ¾ + rectTemp = rect; + rectTemp.top = rect.top + rect.Height() + space * 2;; + rectTemp.bottom = rect.bottom + rect.Height() + space * 2;; + rect = rectTemp; + } + + //ջˢ + CBrush * pOldBrush; + pOldBrush = pDC->SelectObject(CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH))); + + pDC->Rectangle(rect); + rect.top += 2; + //ھʾ + CRect outRect(rect.left, rect.top, rect.left + lineLength, rect.top + charHeight); + CString string(_T("λ")); + pDC->DrawText(string, outRect, DT_CENTER); + + outRect.SetRect(rect.left, rect.top + charHeight, rect.left + lineLength, charHeight + rect.top + charHeight); + string.Format(_T("(%d,%d)"), inRect.left, inRect.top); + pDC->DrawText(string, outRect, DT_CENTER); + + + outRect.SetRect(rect.left, rect.top + charHeight * 2, rect.left + lineLength, charHeight + rect.top + charHeight * 2); + string = _T("δС"); + pDC->DrawText(string, outRect, DT_CENTER); + + outRect.SetRect(rect.left, rect.top + charHeight * 3, rect.left + lineLength, charHeight + rect.top + charHeight * 3); + string.Format(_T("(%d,%d)"), inRect.Width(), inRect.Height()); + pDC->DrawText(string, outRect, DT_CENTER); + + outRect.SetRect(rect.left, rect.top + charHeight * 4, rect.left + lineLength, charHeight + rect.top + charHeight * 4); + string = _T(""); + pDC->DrawText(string, outRect, DT_CENTER); + + outRect.SetRect(rect.left, rect.top + charHeight * 5, rect.left + lineLength, charHeight + rect.top + charHeight * 5); + string.Format(_T("(%d,%d)"), pt.x, pt.y); + pDC->DrawText(string, outRect, DT_CENTER); + + pDC->SetBkMode(OldBkMode); + pDC->SelectObject(pOldFont); + pDC->SelectObject(pOldBrush); + pDC->SelectObject(pOldPen); +} + +// ˢ¾ֲ +void CCatchScreenDlg::InvalidateRgnWindow() +{ + //ȡȫԻ򴰿ڴС + CRect rect1; + GetWindowRect(rect1); + + //ȡ༭򴰿ڴС + CRect rect2; + m_tipEdit.GetWindowRect(rect2); + + CRgn rgn1, rgn2; + rgn1.CreateRectRgnIndirect(rect1); + rgn2.CreateRectRgnIndirect(rect2); + + //ȡ,dz˱༭򴰿ڲ + //m_rgn.CombineRgn(&rgn1, &rgn2, RGN_DIFF); + + // ToolBarˢ + CRect rect3; + ::GetWindowRect(m_toolBar.GetHWND(),&rect3); + CRgn rgn3; + rgn3.CreateRectRgnIndirect(rect3); + + CRgn rgnTemp; + rgnTemp.CreateRectRgn(0, 0, 50, 50); + rgnTemp.CombineRgn(&rgn1, &rgn2, RGN_DIFF); + m_rgn.CombineRgn(&rgnTemp, &rgn3, RGN_DIFF); + + InvalidateRgn(&m_rgn); +} + +void CCatchScreenDlg::UpdateMousePointRGBString() +{ + static CString strOld(""); + + CPoint pt; + GetCursorPos(&pt); + + COLORREF color; + CClientDC dc(this); + color = dc.GetPixel(pt); + BYTE rValue, gValue, bValue; + rValue = GetRValue(color); + gValue = GetGValue(color); + bValue = GetGValue(color); + + //ʽŷַ + CString string; + string.Format(_T("\r\n\r\nǰRGB(%d,%d,%d)"), rValue, gValue, bValue); + + //ǰɫûˢRGBֵ,ⴰи˸ + if (strOld != string) + { + m_strRgb = string; + } + strOld = string; +} + +void CCatchScreenDlg::SetEidtWndText() +{ + m_tipEdit.SetWindowText(this->GetEditText()); +} + +CString CCatchScreenDlg::GetEditText() +{ + CString str; + str.Append(m_strRgb); + str.Append(m_strEditTip); + return str; +} + +BOOL CCatchScreenDlg::OnCommand(WPARAM wParam, LPARAM lParam) +{ + bool bHandle = true; + HWND hWnd = m_toolBar.GetHWND(); + if(lParam == (LPARAM)m_toolBar.GetHWND()) + { + int wmId = LOWORD(wParam); + switch(wmId) + { + case MyToolBar_ID: + AfxMessageBox(_T("")); + break; + case MyToolBar_ID+1: + AfxMessageBox(_T("Բ")); + break; + case MyToolBar_ID +2: + AfxMessageBox(_T("")); + break; + case MyToolBar_ID +3: + AfxMessageBox(_T("")); + break; + case MyToolBar_ID +4: + AfxMessageBox(_T("")); + break; + case MyToolBar_ID +5: + AfxMessageBox(_T("")); + break; + case MyToolBar_ID +6: + CopyScreenToBitmap(m_rectTracker.m_rect, TRUE); + PostQuitMessage(0); + break; + case MyToolBar_ID +7: + PostQuitMessage(0); + break; + case MyToolBar_ID +8: + CopyScreenToBitmap(m_rectTracker.m_rect, TRUE); + PostQuitMessage(0); + break; + default: + bHandle = false; + break; + } + ::SetFocus(hWnd); + } + if (bHandle == false) + { + return CDialog::OnCommand(wParam,lParam); + } +} + +////////////////////////////////// END OF FILE /////////////////////////////////////// \ No newline at end of file diff --git a/src/Screenshot/CatchScreenDlg.h b/src/Screenshot/CatchScreenDlg.h new file mode 100644 index 0000000..25c31d2 --- /dev/null +++ b/src/Screenshot/CatchScreenDlg.h @@ -0,0 +1,90 @@ +#if !defined(AFX_CATCHSCREENDLG_H__536FDBC8_7DB2_4BEF_8943_70DBE8AD845F__INCLUDED_) +#define AFX_CATCHSCREENDLG_H__536FDBC8_7DB2_4BEF_8943_70DBE8AD845F__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +//-------------------------------------------------------------------------- +#include "Resource.h" +#include "MyEdit.h" + +#ifndef MYTRACKER_ +#include "MyTracker.h" +#endif + +#include "MyToolBar.h" +//-------------------------------------------------------------------------- + +///////////////////////////////////////////////////////////////////////////// +// +class CCatchScreenDlg : public CDialog +{ +public: + + CCatchScreenDlg(CWnd* pParent = NULL); + + enum { IDD = IDD_DIALOGFORIMG }; + CMyEdit m_tipEdit; + CMyToolBar m_toolBar; + +public: + + int m_xScreen; + int m_yScreen; + + + BOOL m_bLBtnDown; + + BOOL m_bNeedShowMsg; // ʾȡδСϢ + BOOL m_bDraw; // ǷΪȡ״̬ + BOOL m_bFirstDraw; // ǷΪ״νȡ + BOOL m_bQuit; // ǷΪ˳ + CPoint m_startPt; // ȡϽλ + + CMyTracker m_rectTracker; // Ƥ + CBrush m_brush; + HCURSOR m_hCursor; // + CBitmap* m_pBitmap; // Editؼıλͼ + HBITMAP m_hBitmap; + + CRgn m_rgn; // + +public: + HBITMAP CopyScreenToBitmap(LPRECT lpRect,BOOL bSave=FALSE); /* 浽λͼ */ + void UpdateTipString(); //ʾʾϢ + void DrawMessage(CRect &inRect,CDC * pDC); //ʾȡϢ + void InvalidateRgnWindow(); //ػ + void UpdateMousePointRGBString(); + + CString m_strRgb; + CString m_strEditTip; + + void SetEidtWndText(); + CString GetEditText(); + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL OnInitDialog(); + virtual void OnCancel(); + + afx_msg void OnPaint(); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); + afx_msg void OnRButtonDown(UINT nFlags, CPoint point); + afx_msg void OnRButtonUp(UINT nFlags, CPoint point); + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); + afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); + + + DECLARE_MESSAGE_MAP() + + virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); +}; + +/////////////////////////////////////////////////////////////////////////////////////////// + +#endif diff --git a/src/Screenshot/MyEdit.cpp b/src/Screenshot/MyEdit.cpp new file mode 100644 index 0000000..8a2d5dc --- /dev/null +++ b/src/Screenshot/MyEdit.cpp @@ -0,0 +1,120 @@ +/****************************************************************************** +* FileName : MyEdit.CPP +* Author : Unknown +* Mender : sudami +* Time : 2007/09/09 +* +* Comment : +*-------------------------------------------------------- +* ͼеһؼװ. +* ؼ͸,ʾǰͼһЩʾϢ +*-------------------------------------------------------- +******************************************************************************/ + +#include "stdafx.h" +#include "MyEdit.h" +#include "resource.h" + +/////////////////////////////////////////////////////////////////////////////// +// 캯 +// +CMyEdit::CMyEdit() +{ + m_bMove=TRUE; +} + +CMyEdit::~CMyEdit() +{ + +} + +BEGIN_MESSAGE_MAP(CMyEdit, CEdit) + /* 2СϢ */ + ON_WM_CREATE() + ON_WM_PAINT() + ON_WM_SETFOCUS() + /* 3Ϣ */ + ON_WM_MOUSEMOVE() + ON_WM_ERASEBKGND() +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// +int CMyEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (CEdit::OnCreate(lpCreateStruct) == -1) + return -1; + return 0; +} + + +void CMyEdit::OnPaint() +{ + CPaintDC dc(this); + + CDC dcCompatible; + dcCompatible.CreateCompatibleDC(&dc); + + dcCompatible.SetBkMode(TRANSPARENT); + CBitmap bitmap; + bitmap.LoadBitmap(IDB_BITMAP_BK); + dcCompatible.SelectObject(&bitmap); + + RECT rt = {5,5,0,0}; + RECT rtClient = {0}; + GetClientRect(&rtClient); + rt.right = rtClient.right; + rt.bottom = rtClient.bottom; + + CString str; + GetWindowText(str); + CFont font; + CFont * pOldFont; + font.CreatePointFont(90, _T("")); + pOldFont = dcCompatible.SelectObject(&font); + dcCompatible.DrawText(str,&rt,DT_LEFT); + dcCompatible.SelectObject(pOldFont); + + CRect rect; + GetClientRect(&rect); + dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); +} + +///////////////////////////////////////////////////////////////////////////// +// <Ӧ WM_MOUSEMOVE Ϣ> +// QQĽͼЧ,ֻҪŲÿؼ,ͱ任λ +// +void CMyEdit::OnMouseMove(UINT nFlags, CPoint point) +{ + CEdit::OnMouseMove(nFlags, point); + CRect rect; + GetWindowRect(&rect); + int xScreen = GetSystemMetrics(SM_CXSCREEN); + if(m_bMove) + { + //ƶϽ + MoveWindow(10,10,rect.Width(),rect.Height()); + m_bMove=FALSE; + } + else + { + //ƶϽ + MoveWindow(xScreen-180,10,rect.Width(),rect.Height()); + m_bMove=TRUE; + } +} + +///////////////////////////////////////////////////////////////////////////// +// +void CMyEdit::OnSetFocus(CWnd* pOldWnd) +{ + CEdit::OnSetFocus(pOldWnd); + + // عʾ + this->HideCaret(); +} + +BOOL CMyEdit::OnEraseBkgnd(CDC* pDC) +{ + return TRUE; +} diff --git a/src/Screenshot/MyEdit.h b/src/Screenshot/MyEdit.h new file mode 100644 index 0000000..0245040 --- /dev/null +++ b/src/Screenshot/MyEdit.h @@ -0,0 +1,51 @@ +/***************************************************************************** +* FileName : MyEdit.h +* Author : Unknown +* Mender : sudami +* Time : 2007/09/09 +* +* Comment : +*-------------------------------------------------------- +* ͼеһؼװ. +* ؼ͸,ʾǰͼһЩʾϢ +*-------------------------------------------------------- +******************************************************************************/ + +#if !defined(AFX_MYEDIT_H__A34EEA6D_E8FC_4D15_B03C_BAA42FDF6FCB__INCLUDED_) +#define AFX_MYEDIT_H__A34EEA6D_E8FC_4D15_B03C_BAA42FDF6FCB__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +//----------------------------------------------------------------------------- + +#include + +//----------------------------------------------------------------------------- + +class CMyEdit : public CEdit +{ +public: + CMyEdit(); + virtual ~CMyEdit(); + + BOOL m_bMove; // "˫" + +protected: + + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnSetFocus(CWnd* pOldWnd); + + afx_msg void OnPaint(); + + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + + afx_msg BOOL OnEraseBkgnd(CDC* pDC); + + DECLARE_MESSAGE_MAP() +}; + +////////////////////////////////////////////////////////////////////////////////// + +#endif \ No newline at end of file diff --git a/src/Screenshot/MyToolBar.cpp b/src/Screenshot/MyToolBar.cpp new file mode 100644 index 0000000..46b026b --- /dev/null +++ b/src/Screenshot/MyToolBar.cpp @@ -0,0 +1,148 @@ +#include "StdAfx.h" +#include "MyToolBar.h" +#include +#include "resource.h" + + + +BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Gdiplus::Bitmap * & pImg) +{ + HINSTANCE hInst = AfxGetResourceHandle(); + HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type + if (!hRsrc) + return FALSE; + // load resource into memory + DWORD len = SizeofResource(hInst, hRsrc); + BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc); + if (!lpRsrc) + return FALSE; + // Allocate global memory on which to create stream + HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len); + BYTE* pmem = (BYTE*)GlobalLock(m_hMem); + memcpy(pmem,lpRsrc,len); + IStream* pstm; + CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); + // load from stream + pImg=Gdiplus::Bitmap::FromStream(pstm); + // free/release stuff + GlobalUnlock(m_hMem); + pstm->Release(); + FreeResource(lpRsrc); + return TRUE; +} + +CMyToolBar::CMyToolBar() +{ + m_hImageList = NULL; + m_hWnd_toolbar = 0; + m_hWndParent = 0; +} + +CMyToolBar::~CMyToolBar(void) +{ + ImageList_Destroy(m_hImageList); +} + +BOOL CMyToolBar::CreateToolBar(HWND hWndParent) +{ + if (m_hImageList) + return FALSE; + m_hWndParent = hWndParent; + + m_hImageList= ImageList_Create(18,18,ILC_COLOR32,1,1); + Gdiplus::Bitmap * pImage = NULL; + for(int i=0;i< 9;i++) + { + ImageFromIDResource(IDB_RECTANGLE + i,_T("PNG"),pImage); + HBITMAP pHbitmap=0;; + if(pImage) + { + pImage->GetHBITMAP(Gdiplus::Color(0xff,0xff,0xff,0xff),&pHbitmap); + ImageList_Add(m_hImageList,pHbitmap,NULL); + delete pImage; + pImage = NULL; + } + } + + m_hWnd_toolbar = ::CreateWindowEx(0,TOOLBARCLASSNAME,0,WS_CHILD | WS_VISIBLE|WS_BORDER , + 0,0,0,0,hWndParent,NULL,GetModuleHandle(NULL),NULL); + + if (m_hWnd_toolbar == NULL) + return FALSE; + ::SendMessage(m_hWnd_toolbar,TB_SETIMAGELIST, 0, (LPARAM) m_hImageList); + ::SendMessage(m_hWnd_toolbar,TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + + + ::SendMessage(m_hWnd_toolbar, + (UINT) TB_SETBITMAPSIZE,(WPARAM) 0,//not used, must be zero + (LPARAM) MAKELONG (18, 18)// = (LPARAM) MAKELONG (dxBitmap, dyBitmap) + ); + + //TCHAR tooltips[16][30]={_T("AAAA"),_T("BBBB"),_T("CCCC"),_T("DDDD")}; + for(int i = 0; i < 9; i++) + { + TBBUTTON tbbutton; + // + int wrapnow = 0; + //if (i % 2 == 1) + // wrapnow = TBSTATE_WRAP; + + ZeroMemory(&tbbutton, sizeof(TBBUTTON)); + //tbbutton.iString = (INT_PTR) tooltips[i]; + tbbutton.fsStyle = TBSTYLE_CHECKGROUP; // ѡ + tbbutton.fsState = TBSTATE_ENABLED | wrapnow; + tbbutton.idCommand = MyToolBar_ID + i; // ؼid + tbbutton.iBitmap = i; + + ::SendMessage(m_hWnd_toolbar,TB_ADDBUTTONS, 1, (LPARAM) &tbbutton); + } + ::SendMessage(m_hWnd_toolbar, TB_AUTOSIZE, 0, 0); + return TRUE; +} + +HWND CMyToolBar::GetHWND() +{ + return m_hWnd_toolbar; +} + +void CMyToolBar::AddChildStyle() +{ + DWORD dwStyle = GetWindowLong(m_hWnd_toolbar, GWL_STYLE); + dwStyle &= WS_CHILD; + SetWindowLong(m_hWnd_toolbar,GWL_STYLE,dwStyle); +} + +void CMyToolBar::RemoveChildStyle() +{ + + DWORD dwStyle = GetWindowLong(m_hWnd_toolbar, GWL_STYLE); + dwStyle &= ~WS_CHILD; + SetWindowLong(m_hWnd_toolbar,GWL_STYLE,dwStyle); +} + +void CMyToolBar::ShowToolBar() +{ + ::ShowWindow(m_hWnd_toolbar,SW_SHOW); +} + +void CMyToolBar::HideToolBar() +{ + ::ShowWindow(m_hWnd_toolbar,SW_HIDE); +} + +void CMyToolBar::SetAtCurMousePlase() +{ + RECT rtWin = {0}; + ::GetWindowRect(m_hWnd_toolbar,&rtWin); + POINT pt = {0}; + ::GetCursorPos(&pt); + this->SetShowPlace(pt.x,pt.y); +} + +void CMyToolBar::SetShowPlace(int nCurPointX,int nCurPointY) +{ + + RECT rtWin = {0}; + ::GetWindowRect(m_hWnd_toolbar,&rtWin); + ::SetWindowPos(m_hWnd_toolbar,HWND_TOP,nCurPointX - (rtWin.right-rtWin.left),nCurPointY + 2,0,0,SWP_NOSIZE|SWP_SHOWWINDOW); +} \ No newline at end of file diff --git a/src/Screenshot/MyToolBar.h b/src/Screenshot/MyToolBar.h new file mode 100644 index 0000000..645e34e --- /dev/null +++ b/src/Screenshot/MyToolBar.h @@ -0,0 +1,24 @@ +#pragma once + + +#define MyToolBar_ID 600 + +class CMyToolBar +{ +public: + CMyToolBar(); + ~CMyToolBar(void); + + BOOL CreateToolBar(HWND hWndParent); + void AddChildStyle(); + void RemoveChildStyle(); + void ShowToolBar(); + void HideToolBar(); + void SetAtCurMousePlase(); + void SetShowPlace(int nCurPointX,int nCurPointY); + HWND GetHWND(); +private: + HIMAGELIST m_hImageList; + HWND m_hWndParent; + HWND m_hWnd_toolbar; +}; diff --git a/src/Screenshot/MyTracker.cpp b/src/Screenshot/MyTracker.cpp new file mode 100644 index 0000000..5b043ae --- /dev/null +++ b/src/Screenshot/MyTracker.cpp @@ -0,0 +1,839 @@ +// This is a part of the Microsoft Foundation Classes C++ library. +// Copyright (C) 1992-1998 Microsoft Corporation +// All rights reserved. +// +// This source code is only intended as a supplement to the +// Microsoft Foundation Classes Reference and related +// electronic documentation provided with the library. +// See these sources for detailed information regarding the +// Microsoft Foundation Classes product. + +#include "stdafx.h" +#include "MyTracker.h" +#include "Resource.h" +#include "CatchScreenDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// CMyTracker global state + +// various GDI objects we need to draw +AFX_STATIC_DATA HCURSOR _afxCursors[10] = { 0,}; +AFX_STATIC_DATA HBRUSH _afxHatchBrush = 0; +AFX_STATIC_DATA HPEN _afxBlackDottedPen = 0; +AFX_STATIC_DATA HPEN _afxBlackSolidPen = 0; +AFX_STATIC_DATA int _afxHandleSize = 0; + +void AFX_CDECL AfxTrackerTerm() +{ + AfxDeleteObject((HGDIOBJ*)&_afxHatchBrush); + AfxDeleteObject((HGDIOBJ*)&_afxBlackDottedPen); +} +char _afxTrackerTerm = (char)atexit(&AfxTrackerTerm); + +// the struct below is used to determine the qualities of a particular handle +struct AFX_HANDLEINFO +{ + size_t nOffsetX; // offset within RECT for X coordinate + size_t nOffsetY; // offset within RECT for Y coordinate + int nCenterX; // adjust X by Width()/2 * this number + int nCenterY; // adjust Y by Height()/2 * this number + int nHandleX; // adjust X by handle size * this number + int nHandleY; // adjust Y by handle size * this number + int nInvertX; // handle converts to this when X inverted + int nInvertY; // handle converts to this when Y inverted +}; + +// this array describes all 8 handles (clock-wise) +AFX_STATIC_DATA const AFX_HANDLEINFO _afxHandleInfo[] = +{ + // corner handles (top-left, top-right, bottom-right, bottom-left + { offsetof(RECT, left), offsetof(RECT, top), 0, 0, 0, 0, 1, 3 }, + { offsetof(RECT, right), offsetof(RECT, top), 0, 0, -1, 0, 0, 2 }, + { offsetof(RECT, right), offsetof(RECT, bottom), 0, 0, -1, -1, 3, 1 }, + { offsetof(RECT, left), offsetof(RECT, bottom), 0, 0, 0, -1, 2, 0 }, + + // side handles (top, right, bottom, left) + { offsetof(RECT, left), offsetof(RECT, top), 1, 0, 0, 0, 4, 6 }, + { offsetof(RECT, right), offsetof(RECT, top), 0, 1, -1, 0, 7, 5 }, + { offsetof(RECT, left), offsetof(RECT, bottom), 1, 0, 0, -1, 6, 4 }, + { offsetof(RECT, left), offsetof(RECT, top), 0, 1, 0, 0, 5, 7 } +}; + +// the struct below gives us information on the layout of a RECT struct and +// the relationship between its members +struct AFX_RECTINFO +{ + size_t nOffsetAcross; // offset of opposite point (ie. left->right) + int nSignAcross; // sign relative to that point (ie. add/subtract) +}; + +// this array is indexed by the offset of the RECT member / sizeof(int) +AFX_STATIC_DATA const AFX_RECTINFO _afxRectInfo[] = +{ + { offsetof(RECT, right), +1 }, + { offsetof(RECT, bottom), +1 }, + { offsetof(RECT, left), -1 }, + { offsetof(RECT, top), -1 }, +}; + +///////////////////////////////////////////////////////////////////////////// +// CMyTracker intitialization + +CMyTracker::CMyTracker(LPCRECT lpSrcRect, UINT nStyle) +{ + ASSERT(AfxIsValidAddress(lpSrcRect, sizeof(RECT), FALSE)); + + Construct(); + m_rect.CopyRect(lpSrcRect); + m_nStyle = nStyle; +} + +CMyTracker::CMyTracker() +{ + Construct(); +} + +void CMyTracker::Construct() +{ + // do one-time initialization if necessary + //******************************************************** + m_rectColor=RGB(0,0,0); + //******************************************************** + AfxLockGlobals(CRIT_RECTTRACKER); + static BOOL bInitialized; + if (!bInitialized) + { + // sanity checks for assumptions we make in the code + ASSERT(sizeof(((RECT*)NULL)->left) == sizeof(int)); + ASSERT(offsetof(RECT, top) > offsetof(RECT, left)); + ASSERT(offsetof(RECT, right) > offsetof(RECT, top)); + ASSERT(offsetof(RECT, bottom) > offsetof(RECT, right)); + + if (_afxHatchBrush == NULL) + { + // create the hatch pattern + bitmap + WORD hatchPattern[8]; + WORD wPattern = 0x1111; + for (int i = 0; i < 4; i++) + { + hatchPattern[i] = wPattern; + hatchPattern[i+4] = wPattern; + wPattern <<= 1; + } + HBITMAP hatchBitmap = CreateBitmap(8, 8, 1, 1, &hatchPattern); + if (hatchBitmap == NULL) + { + AfxUnlockGlobals(CRIT_RECTTRACKER); + AfxThrowResourceException(); + } + + // create black hatched brush + _afxHatchBrush = CreatePatternBrush(hatchBitmap); + DeleteObject(hatchBitmap); + if (_afxHatchBrush == NULL) + { + AfxUnlockGlobals(CRIT_RECTTRACKER); + AfxThrowResourceException(); + } + } + //CreatePen for DottedLine and SolidLine + CreatePen(); + + // Note: all track cursors must live in same module + HINSTANCE hInst = AfxFindResourceHandle( + MAKEINTRESOURCE(AFX_IDC_TRACK4WAY), RT_GROUP_CURSOR); + + // initialize the cursor array + _afxCursors[0] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_TRACKNWSE)); + _afxCursors[1] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_TRACKNESW)); + _afxCursors[2] = _afxCursors[0]; + _afxCursors[3] = _afxCursors[1]; + _afxCursors[4] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_TRACKNS)); + _afxCursors[5] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_TRACKWE)); + _afxCursors[6] = _afxCursors[4]; + _afxCursors[7] = _afxCursors[5]; + _afxCursors[8] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_TRACK4WAY)); + _afxCursors[9] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_MOVE4WAY)); + + // get default handle size from Windows profile setting + static const TCHAR szWindows[] = _T("windows"); + static const TCHAR szInplaceBorderWidth[] = + _T("oleinplaceborderwidth"); + _afxHandleSize = GetProfileInt(szWindows, szInplaceBorderWidth, 4); + bInitialized = TRUE; + } + AfxUnlockGlobals(CRIT_RECTTRACKER); + + m_nStyle = 0; + m_nHandleSize = _afxHandleSize; + m_sizeMin.cy = m_sizeMin.cx = m_nHandleSize*2; + + m_rectLast.SetRectEmpty(); + m_sizeLast.cx = m_sizeLast.cy = 0; + m_bErase = FALSE; + m_bFinalErase = FALSE; +} + +CMyTracker::~CMyTracker() +{ +} + +///////////////////////////////////////////////////////////////////////////// +// CMyTracker operations + +void CMyTracker::Draw(CDC* pDC) const +{ + // set initial DC state + VERIFY(pDC->SaveDC() != 0); + pDC->SetMapMode(MM_TEXT); + pDC->SetViewportOrg(0, 0); + pDC->SetWindowOrg(0, 0); + + // get normalized rectangle + CRect rect = m_rect; + rect.NormalizeRect(); + + CPen* pOldPen = NULL; + CBrush* pOldBrush = NULL; + CGdiObject* pTemp; + int nOldROP; + + // draw lines + if ((m_nStyle & (dottedLine|solidLine)) != 0) + { + if (m_nStyle & dottedLine) + { + //ı䵱ǰɫ + pOldPen = pDC->SelectObject(CPen::FromHandle(_afxBlackDottedPen)); + } + else + { + //ı䵱ǰɫ + //pOldPen = (CPen*)pDC->SelectStockObject(BLACK_PEN); //BLACK_PEN + pOldPen = pDC->SelectObject(CPen::FromHandle(_afxBlackSolidPen)); + } + + pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); + nOldROP = pDC->SetROP2(R2_COPYPEN); + rect.InflateRect(+1, +1); // borders are one pixel outside + pDC->Rectangle(rect.left, rect.top, rect.right, rect.bottom); + pDC->SetROP2(nOldROP); + } + + // if hatchBrush is going to be used, need to unrealize it + if ((m_nStyle & (hatchInside|hatchedBorder)) != 0) + UnrealizeObject(_afxHatchBrush); + + // hatch inside + if ((m_nStyle & hatchInside) != 0) + { + pTemp = pDC->SelectStockObject(NULL_PEN); + if (pOldPen == NULL) + pOldPen = (CPen*)pTemp; + pTemp = pDC->SelectObject(CBrush::FromHandle(_afxHatchBrush)); + if (pOldBrush == NULL) + pOldBrush = (CBrush*)pTemp; + pDC->SetBkMode(TRANSPARENT); + nOldROP = pDC->SetROP2(R2_MASKNOTPEN); + pDC->Rectangle(rect.left+1, rect.top+1, rect.right, rect.bottom); + pDC->SetROP2(nOldROP); + } + + // draw hatched border + if ((m_nStyle & hatchedBorder) != 0) + { + pTemp = pDC->SelectObject(CBrush::FromHandle(_afxHatchBrush)); + if (pOldBrush == NULL) + pOldBrush = (CBrush*)pTemp; + pDC->SetBkMode(OPAQUE); + CRect rectTrue; + GetTrueRect(&rectTrue); + pDC->PatBlt(rectTrue.left, rectTrue.top, rectTrue.Width(), + rect.top-rectTrue.top, 0x000F0001 /* Pn */); + pDC->PatBlt(rectTrue.left, rect.bottom, + rectTrue.Width(), rectTrue.bottom-rect.bottom, 0x000F0001 /* Pn */); + pDC->PatBlt(rectTrue.left, rect.top, rect.left-rectTrue.left, + rect.Height(), 0x000F0001 /* Pn */); + pDC->PatBlt(rect.right, rect.top, rectTrue.right-rect.right, + rect.Height(), 0x000F0001 /* Pn */); + } + + // draw resize handles + if ((m_nStyle & (resizeInside|resizeOutside)) != 0) + { + UINT mask = GetHandleMask(); + for (int i = 0; i < 8; ++i) + { + if (mask & (1<FillSolidRect(rect, m_rectColor); + } + } + } + + // cleanup pDC state + if (pOldPen != NULL) + pDC->SelectObject(pOldPen); + if (pOldBrush != NULL) + pDC->SelectObject(pOldBrush); + VERIFY(pDC->RestoreDC(-1)); +} + +BOOL CMyTracker::SetCursor(CWnd* pWnd, UINT nHitTest) const +{ + // trackers should only be in client area + if (nHitTest != HTCLIENT) + return FALSE; + + // convert cursor position to client co-ordinates + CPoint point; + GetCursorPos(&point); + pWnd->ScreenToClient(&point); + + // do hittest and normalize hit + int nHandle = HitTestHandles(point); + if (nHandle < 0) + return FALSE; + + // need to normalize the hittest such that we get proper cursors + nHandle = NormalizeHit(nHandle); + + // handle special case of hitting area between handles + // (logically the same -- handled as a move -- but different cursor) + if (nHandle == hitMiddle && !m_rect.PtInRect(point)) + { + // only for trackers with hatchedBorder (ie. in-place resizing) + if (m_nStyle & hatchedBorder) + nHandle = (TrackerHit)9; + } + + //ASSERT(nHandle < _countof(_afxCursors)); + ::SetCursor(_afxCursors[nHandle]); + return TRUE; +} + +int CMyTracker::HitTest(CPoint point) const +{ + TrackerHit hitResult = hitNothing; + + CRect rectTrue; + GetTrueRect(&rectTrue); + ASSERT(rectTrue.left <= rectTrue.right); + ASSERT(rectTrue.top <= rectTrue.bottom); + if (rectTrue.PtInRect(point)) + { + if ((m_nStyle & (resizeInside|resizeOutside)) != 0) + hitResult = (TrackerHit)HitTestHandles(point); + else + hitResult = hitMiddle; + } + return hitResult; +} + +int CMyTracker::NormalizeHit(int nHandle) const +{ + ASSERT(nHandle <= 8 && nHandle >= -1); + if (nHandle == hitMiddle || nHandle == hitNothing) + return nHandle; + const AFX_HANDLEINFO* pHandleInfo = &_afxHandleInfo[nHandle]; + if (m_rect.Width() < 0) + { + nHandle = (TrackerHit)pHandleInfo->nInvertX; + pHandleInfo = &_afxHandleInfo[nHandle]; + } + if (m_rect.Height() < 0) + nHandle = (TrackerHit)pHandleInfo->nInvertY; + return nHandle; +} + +BOOL CMyTracker::Track(CWnd* pWnd, CPoint point, BOOL bAllowInvert, + CWnd* pWndClipTo) +{ + // perform hit testing on the handles + int nHandle = HitTestHandles(point); + if (nHandle < 0) + { + // didn't hit a handle, so just return FALSE + return FALSE; + } + + // otherwise, call helper function to do the tracking + m_bAllowInvert = bAllowInvert; + return TrackHandle(nHandle, pWnd, point, pWndClipTo); +} + +BOOL CMyTracker::TrackRubberBand(CWnd* pWnd, CPoint point, BOOL bAllowInvert) +{ + // simply call helper function to track from bottom right handle + m_bAllowInvert = bAllowInvert; + m_rect.SetRect(point.x, point.y, point.x, point.y); + return TrackHandle(hitBottomRight, pWnd, point, NULL); +} + +void CMyTracker::DrawTrackerRect( + LPCRECT lpRect, CWnd* pWndClipTo, CDC* pDC, CWnd* pWnd) +{ + // first, normalize the rectangle for drawing + + /*CRect rect = *lpRect; + rect.NormalizeRect(); + + // convert to client coordinates + if (pWndClipTo != NULL) + { + pWnd->ClientToScreen(&rect); + pWndClipTo->ScreenToClient(&rect); + } + + CSize size(0, 0); + if (!m_bFinalErase) + { + // otherwise, size depends on the style + if (m_nStyle & hatchedBorder) + { + size.cx = size.cy = max(1, GetHandleSize(rect)-1); + rect.InflateRect(size); + } + else + { + size.cx = CX_BORDER; + size.cy = CY_BORDER; + } + } + + // and draw it + if (m_bFinalErase || !m_bErase) + { + pDC->DrawDragRect(rect, size, m_rectLast, m_sizeLast); + } + + // remember last rectangles + m_rectLast = rect; + m_sizeLast = size; +*/ + //˺ǻСλʱ + //ڱҪ,ҪʹĻעʾȥ! + ((CCatchScreenDlg *)pWnd)->InvalidateRgnWindow(); + +} + +void CMyTracker::AdjustRect(int nHandle, LPRECT) +{ + if (nHandle == hitMiddle) + return; + + // convert the handle into locations within m_rect + int *px, *py; + GetModifyPointers(nHandle, &px, &py, NULL, NULL); + + // enforce minimum width + int nNewWidth = m_rect.Width(); + int nAbsWidth = m_bAllowInvert ? abs(nNewWidth) : nNewWidth; + if (px != NULL && nAbsWidth < m_sizeMin.cx) + { + nNewWidth = nAbsWidth != 0 ? nNewWidth / nAbsWidth : 1; + //ASSERT((int*)px - (int*)&m_rect < _countof(_afxRectInfo)); + const AFX_RECTINFO* pRectInfo = &_afxRectInfo[(int*)px - (int*)&m_rect]; + *px = *(int*)((BYTE*)&m_rect + pRectInfo->nOffsetAcross) + + nNewWidth * m_sizeMin.cx * -pRectInfo->nSignAcross; + } + + // enforce minimum height + int nNewHeight = m_rect.Height(); + int nAbsHeight = m_bAllowInvert ? abs(nNewHeight) : nNewHeight; + if (py != NULL && nAbsHeight < m_sizeMin.cy) + { + nNewHeight = nAbsHeight != 0 ? nNewHeight / nAbsHeight : 1; + //ASSERT((int*)py - (int*)&m_rect < _countof(_afxRectInfo)); + const AFX_RECTINFO* pRectInfo = &_afxRectInfo[(int*)py - (int*)&m_rect]; + *py = *(int*)((BYTE*)&m_rect + pRectInfo->nOffsetAcross) + + nNewHeight * m_sizeMin.cy * -pRectInfo->nSignAcross; + } +} + +void CMyTracker::GetTrueRect(LPRECT lpTrueRect) const +{ + ASSERT(AfxIsValidAddress(lpTrueRect, sizeof(RECT))); + + CRect rect = m_rect; + rect.NormalizeRect(); + int nInflateBy = 0; + if ((m_nStyle & (resizeOutside|hatchedBorder)) != 0) + nInflateBy += GetHandleSize() - 1; + if ((m_nStyle & (solidLine|dottedLine)) != 0) + ++nInflateBy; + rect.InflateRect(nInflateBy, nInflateBy); + *lpTrueRect = rect; +} + +void CMyTracker::OnChangedRect(const CRect& /*rectOld*/) +{ + // no default implementation, useful for derived classes +} + +///////////////////////////////////////////////////////////////////////////// +// CMyTracker implementation helpers + +void CMyTracker::GetHandleRect(int nHandle, CRect* pHandleRect) const +{ + ASSERT(nHandle < 8); + + // get normalized rectangle of the tracker + CRect rectT = m_rect; + rectT.NormalizeRect(); + if ((m_nStyle & (solidLine|dottedLine)) != 0) + rectT.InflateRect(+1, +1); + + // since the rectangle itself was normalized, we also have to invert the + // resize handles. + nHandle = NormalizeHit(nHandle); + + // handle case of resize handles outside the tracker + int size = GetHandleSize(); + + if(m_nStyle & resizeOutside) + { + if(1000000 & m_nStyle) + { + rectT.InflateRect(size-size/2-1, size-size/2-1); + } + else + { + rectT.InflateRect(size-1, size-1); + } + } + + // calculate position of the resize handle + int nWidth = rectT.Width(); + int nHeight = rectT.Height(); + CRect rect; + const AFX_HANDLEINFO* pHandleInfo = &_afxHandleInfo[nHandle]; + rect.left = *(int*)((BYTE*)&rectT + pHandleInfo->nOffsetX); + rect.top = *(int*)((BYTE*)&rectT + pHandleInfo->nOffsetY); + rect.left += size * pHandleInfo->nHandleX; + rect.top += size * pHandleInfo->nHandleY; + rect.left += pHandleInfo->nCenterX * (nWidth - size) / 2; + rect.top += pHandleInfo->nCenterY * (nHeight - size) / 2; + rect.right = rect.left + size; + rect.bottom = rect.top + size; + + *pHandleRect = rect; +} + +int CMyTracker::GetHandleSize(LPCRECT lpRect) const +{ + if (lpRect == NULL) + lpRect = &m_rect; + + int size = m_nHandleSize; + if (!(m_nStyle & resizeOutside)) + { + // make sure size is small enough for the size of the rect + int sizeMax = min(abs(lpRect->right - lpRect->left), + abs(lpRect->bottom - lpRect->top)); + if (size * 2 > sizeMax) + size = sizeMax / 2; + } + + return size; +} + +int CMyTracker::HitTestHandles(CPoint point) const +{ + CRect rect; + UINT mask = GetHandleMask(); + + // see if hit anywhere inside the tracker + GetTrueRect(&rect); + if (!rect.PtInRect(point)) + return hitNothing; // totally missed + + // see if we hit a handle + for (int i = 0; i < 8; ++i) + { + if (mask & (1<= 0); + ASSERT(nHandle <= 8); // handle 8 is inside the rect + + // don't handle if capture already set + if (::GetCapture() != NULL) + return FALSE; + + AfxLockTempMaps(); // protect maps while looping + + ASSERT(!m_bFinalErase); + + // save original width & height in pixels + int nWidth = m_rect.Width(); + int nHeight = m_rect.Height(); + + // set capture to the window which received this message + pWnd->SetCapture(); + ASSERT(pWnd == CWnd::GetCapture()); + pWnd->UpdateWindow(); + if (pWndClipTo != NULL) + pWndClipTo->UpdateWindow(); + CRect rectSave = m_rect; + + // find out what x/y coords we are supposed to modify + int *px, *py; + int xDiff, yDiff; + GetModifyPointers(nHandle, &px, &py, &xDiff, &yDiff); + xDiff = point.x - xDiff; + yDiff = point.y - yDiff; + + // get DC for drawing + CDC* pDrawDC; + if (pWndClipTo != NULL) + { + // clip to arbitrary window by using adjusted Window DC + pDrawDC = pWndClipTo->GetDCEx(NULL, DCX_CACHE); + } + else + { + // otherwise, just use normal DC + pDrawDC = pWnd->GetDC(); + } + ASSERT_VALID(pDrawDC); + + CRect rectOld; + BOOL bMoved = FALSE; + + // get messages until capture lost or cancelled/accepted + for (;;) + { + MSG msg; + VERIFY(::GetMessage(&msg, NULL, 0, 0)); + + if (CWnd::GetCapture() != pWnd) + break; + + //ӵ,Ϣ͸ + DispatchMessage(&msg); + + switch (msg.message) + { + // handle movement/accept messages + case WM_LBUTTONUP: + case WM_MOUSEMOVE: + rectOld = m_rect; + // handle resize cases (and part of move) + if (px != NULL) + *px = (int)(short)LOWORD(msg.lParam) - xDiff; + if (py != NULL) + *py = (int)(short)HIWORD(msg.lParam) - yDiff; + + // handle move case + if (nHandle == hitMiddle) + { + m_rect.right = m_rect.left + nWidth; + m_rect.bottom = m_rect.top + nHeight; + } + // allow caller to adjust the rectangle if necessary + AdjustRect(nHandle, &m_rect); + + // only redraw and callback if the rect actually changed! + m_bFinalErase = (msg.message == WM_LBUTTONUP); + if (!rectOld.EqualRect(&m_rect) || m_bFinalErase) + { + if (bMoved) + { + m_bErase = TRUE; + DrawTrackerRect(&rectOld, pWndClipTo, pDrawDC, pWnd); + } + OnChangedRect(rectOld); + if (msg.message != WM_LBUTTONUP) + { + bMoved = TRUE; + } + } + if (m_bFinalErase) + goto ExitLoop; + + if (!rectOld.EqualRect(&m_rect)) + { + m_bErase = FALSE; + DrawTrackerRect(&m_rect, pWndClipTo, pDrawDC, pWnd); + } + break; + + // handle cancel messages + case WM_KEYDOWN: + if (msg.wParam != VK_ESCAPE) + break; + case WM_RBUTTONDOWN: + if (bMoved) + { + m_bErase = m_bFinalErase = TRUE; + //DrawTrackerRect(&m_rect, pWndClipTo, pDrawDC, pWnd); + } + m_rect = rectSave; + goto ExitLoop; + + // just dispatch rest of the messages + default: + DispatchMessage(&msg); + break; + } + + + } + +ExitLoop: + if (pWndClipTo != NULL) + pWndClipTo->ReleaseDC(pDrawDC); + else + pWnd->ReleaseDC(pDrawDC); + ReleaseCapture(); + + AfxUnlockTempMaps(FALSE); + + // restore rect in case bMoved is still FALSE + if (!bMoved) + m_rect = rectSave; + m_bFinalErase = FALSE; + m_bErase = FALSE; + + // return TRUE only if rect has changed + return !rectSave.EqualRect(&m_rect); +} + +void CMyTracker::GetModifyPointers( + int nHandle, int** ppx, int** ppy, int* px, int* py) +{ + ASSERT(nHandle >= 0); + ASSERT(nHandle <= 8); + + if (nHandle == hitMiddle) + nHandle = hitTopLeft; // same as hitting top-left + + *ppx = NULL; + *ppy = NULL; + + // fill in the part of the rect that this handle modifies + // (Note: handles that map to themselves along a given axis when that + // axis is inverted don't modify the value on that axis) + + const AFX_HANDLEINFO* pHandleInfo = &_afxHandleInfo[nHandle]; + if (pHandleInfo->nInvertX != nHandle) + { + *ppx = (int*)((BYTE*)&m_rect + pHandleInfo->nOffsetX); + if (px != NULL) + *px = **ppx; + } + else + { + // middle handle on X axis + if (px != NULL) + *px = m_rect.left + abs(m_rect.Width()) / 2; + } + if (pHandleInfo->nInvertY != nHandle) + { + *ppy = (int*)((BYTE*)&m_rect + pHandleInfo->nOffsetY); + if (py != NULL) + *py = **ppy; + } + else + { + // middle handle on Y axis + if (py != NULL) + *py = m_rect.top + abs(m_rect.Height()) / 2; + } +} + +UINT CMyTracker::GetHandleMask() const +{ + UINT mask = 0x0F; // always have 4 corner handles + int size = m_nHandleSize*3; + if (abs(m_rect.Width()) - size > 4) + mask |= 0x50; + if (abs(m_rect.Height()) - size > 4) + mask |= 0xA0; + return mask; +} + + +////////////////////ӵĺ///////////////////////////////////////////////////////////// + +void CMyTracker::SetRectColor(COLORREF rectColor) +{ + m_rectColor=rectColor; + CreatePen(); + +} + +void CMyTracker::CreatePen() +{ + //if (_afxBlackDottedPen == NULL) + { + // create black dotted pen + _afxBlackDottedPen = ::CreatePen(PS_DOT, 0, m_rectColor); + if (_afxBlackDottedPen == NULL) + { + AfxUnlockGlobals(CRIT_RECTTRACKER); + AfxThrowResourceException(); + } + } + //if (_afxBlackSolidPen == NULL) + { + // create black dotted pen + _afxBlackSolidPen = ::CreatePen(PS_SOLID, 0, m_rectColor); + if (_afxBlackSolidPen == NULL) + { + AfxUnlockGlobals(CRIT_RECTTRACKER); + AfxThrowResourceException(); + } + } +} + +void CMyTracker::SetResizeCursor(UINT nID_N_S,UINT nID_W_E,UINT nID_NW_SE,UINT nID_NE_SW,UINT nIDMiddle) +{ +////////////////////////////////////////////////////////////////////////////////// +// N +// NW -----------|------------NE +// | | +// | | +// W | | E +// | Middle | +// | | +// | | +// SW-----------|------------SE +// S +//////////////////////////////////////////////////////////////////////////////////// + + _afxCursors[0] = AfxGetApp()->LoadCursor(nID_NW_SE); //nw + _afxCursors[1] = AfxGetApp()->LoadCursor(nID_NE_SW); //ne + _afxCursors[2] = _afxCursors[0]; //se + _afxCursors[3] = _afxCursors[1]; //sw + _afxCursors[4] = AfxGetApp()->LoadCursor(nID_N_S); //n + _afxCursors[5] = AfxGetApp()->LoadCursor(nID_W_E); //w + _afxCursors[6] = _afxCursors[4]; //s + _afxCursors[7] = _afxCursors[5]; //e + _afxCursors[8] = AfxGetApp()->LoadCursor(nIDMiddle); //m + // _afxCursors[9] = ::LoadCursor(hInst, MAKEINTRESOURCE(AFX_IDC_MOVE4WAY)); +} diff --git a/src/Screenshot/MyTracker.h b/src/Screenshot/MyTracker.h new file mode 100644 index 0000000..f1c4d61 --- /dev/null +++ b/src/Screenshot/MyTracker.h @@ -0,0 +1,102 @@ + +///////////////////////////////////////////////////////////////////////////// +// CMyTracker - simple rectangular tracking rectangle w/resize handles + +///////////////////////////////////////////////////////////////////////// +// Copy from MFC CRectTracker class +// Add Some member function +// Modify some place +//////////////////////////////////////////////////////////////////////// + +#define MYTRACKER_ + +#define CX_BORDER 1 +#define CY_BORDER 1 + +#define CRIT_RECTTRACKER 5 +void AFXAPI AfxLockGlobals(int nLockType); +void AFXAPI AfxUnlockGlobals(int nLockType); +void AFXAPI AfxDeleteObject(HGDIOBJ* pObject); + +class CMyTracker +{ +public: +// Constructors + CMyTracker(); + CMyTracker(LPCRECT lpSrcRect, UINT nStyle); + +// Style Flags + enum StyleFlags + { + solidLine = 1, dottedLine = 2, hatchedBorder = 4, + resizeInside = 8, resizeOutside = 16, hatchInside = 32, + resizeMiddle =80 //м + }; + +// Hit-Test codes + enum TrackerHit + { + hitNothing = -1, + hitTopLeft = 0, hitTopRight = 1, hitBottomRight = 2, hitBottomLeft = 3, + hitTop = 4, hitRight = 5, hitBottom = 6, hitLeft = 7, hitMiddle = 8 + }; + +// Attributes + UINT m_nStyle; // current state + CRect m_rect; // current position (always in pixels) + CSize m_sizeMin; // minimum X and Y size during track operation + int m_nHandleSize; // size of resize handles (default from WIN.INI) + +// Operations + void Draw(CDC* pDC) const; + void GetTrueRect(LPRECT lpTrueRect) const; + BOOL SetCursor(CWnd* pWnd, UINT nHitTest) const; + BOOL Track(CWnd* pWnd, CPoint point, BOOL bAllowInvert =TRUE, + CWnd* pWndClipTo = NULL); + BOOL TrackRubberBand(CWnd* pWnd, CPoint point, BOOL bAllowInvert = TRUE); + int HitTest(CPoint point) const; + int NormalizeHit(int nHandle) const; + +// Overridables + virtual void DrawTrackerRect(LPCRECT lpRect, CWnd* pWndClipTo, + CDC* pDC, CWnd* pWnd); + virtual void AdjustRect(int nHandle, LPRECT lpRect); + virtual void OnChangedRect(const CRect& rectOld); + virtual UINT GetHandleMask() const; + +// Implementation +public: + virtual ~CMyTracker(); + +public: + //*********************************************************** + //õ + void SetResizeCursor(UINT nID_N_S,UINT nID_W_E,UINT nID_NW_SE, + UINT nID_NE_SW,UINT nIDMiddle); + //ˢ,ڲ + void CreatePen(); + //þɫ + void SetRectColor(COLORREF rectColor); + + //************************************************************** + + //************************************************************** + //ǰɫ + COLORREF m_rectColor; + //************************************************************** + BOOL m_bAllowInvert; // flag passed to Track or TrackRubberBand + CRect m_rectLast; + CSize m_sizeLast; + BOOL m_bErase; // TRUE if DrawTrackerRect is called for erasing + BOOL m_bFinalErase; // TRUE if DragTrackerRect called for final erase + + // implementation helpers + int HitTestHandles(CPoint point) const; + void GetHandleRect(int nHandle, CRect* pHandleRect) const; + void GetModifyPointers(int nHandle, int**ppx, int**ppy, int* px, int*py); + virtual int GetHandleSize(LPCRECT lpRect = NULL) const; + BOOL TrackHandle(int nHandle, CWnd* pWnd, CPoint point, CWnd* pWndClipTo); + void Construct(); +}; + +//////////////////////////////////////// END OF FILE ///////////////////////////////////////////////////////// diff --git a/src/Screenshot/PopUpMenu.cpp b/src/Screenshot/PopUpMenu.cpp new file mode 100644 index 0000000..35e9b65 --- /dev/null +++ b/src/Screenshot/PopUpMenu.cpp @@ -0,0 +1,1466 @@ +/* +Copyright (C) 2004 Jacquelin POTIER +Dynamic aspect ratio code Copyright (C) 2004 Jacquelin POTIER + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +//----------------------------------------------------------------------------- +// Object: class helper for popupmenu control +//----------------------------------------------------------------------------- +#include "stdafx.h" +#include "popupmenu.h" +#define CPopUpMenu_ICON_SIZE_INCREMENT 2 // icon size increment used for shadow +#define CPopUpMenu_ICON_SHADOW_POSITION_DELTA 2 +#define CPopUpMenu_TRANSPARENCY_INCREASE 130 + +//----------------------------------------------------------------------------- +// Name: CPopUpMenu +// Object: Constructor. +// Parameters : +// in : +// out : +// return : +//----------------------------------------------------------------------------- +CPopUpMenu::CPopUpMenu() +{ + this->CommonConstructor(); + this->ParentPopUpMenu=NULL; +} +CPopUpMenu::CPopUpMenu(CPopUpMenu* ParentPopUpMenu) +{ + this->CommonConstructor(); + this->ParentPopUpMenu=ParentPopUpMenu; +} +//#include +//#pragma comment (lib,"uxtheme.lib") +void CPopUpMenu::CommonConstructor() +{ + this->bThemingEnabledForVistaOrNewer = FALSE; + if ( ((LOBYTE(LOWORD(::GetVersion())))>=6) ) // if vista or newer os + { + // dynamic loading to avoid static linking + HMODULE hmod = ::GetModuleHandle(_T("uxtheme.dll")); + if (!hmod) + hmod = ::LoadLibrary(_T("uxtheme.dll")); + if( hmod ) + { + FARPROC pfIsThemeActive = ::GetProcAddress(hmod,"IsThemeActive"); + this->bThemingEnabledForVistaOrNewer = pfIsThemeActive(); + } + + } + this->bAllowIconsEffects=TRUE; + this->MenuSelectCallback=NULL; + this->MenuSelectUserParam=NULL; + this->MouseRightButtonUpCallback=NULL; + this->MouseRightButtonUpUserParam=NULL; + + this->hPopUpMenu=::CreatePopupMenu(); + this->CurrentMenuId=0; + MENUINFO mnfo; + mnfo.cbSize = sizeof(mnfo); + mnfo.fMask = MIM_STYLE | MIM_MENUDATA; + mnfo.dwStyle = MNS_CHECKORBMP; //| MNS_AUTODISMISS can make menu to disappear when used on toolbar + mnfo.dwMenuData = (ULONG_PTR)this; + ::SetMenuInfo(this->hPopUpMenu, &mnfo); +} + +//----------------------------------------------------------------------------- +// Name: ~CPopUpMenu +// Object: Destructor. SUBMENU OBJECT ARE NOT DELETED +// Parameters : +// in : +// out : +// return : +//----------------------------------------------------------------------------- +CPopUpMenu::~CPopUpMenu() +{ + std::vector::iterator Iterator; + for (Iterator = this->ListLoadedBitmapToFree.begin(); Iterator!=this->ListLoadedBitmapToFree.end(); Iterator++) + { + ::DeleteObject(*Iterator); + } + ::DestroyMenu(this->hPopUpMenu); +} + +//----------------------------------------------------------------------------- +// Name: GetControlHandle +// Object: return the handle to the control +// Parameters : +// in : +// out : +// return : HWND handle to the control +//----------------------------------------------------------------------------- +HMENU CPopUpMenu::GetControlHandle() +{ + return this->hPopUpMenu; +} + +//----------------------------------------------------------------------------- +// Name: GetParentPopUpMenu +// Object: return pointer to the parent menu or NULL if no parent menu +// Parameters : +// in : +// out : +// return : pointer to the parent menu or NULL if no parent menu +//----------------------------------------------------------------------------- +CPopUpMenu* CPopUpMenu::GetParentPopUpMenu() +{ + return this->ParentPopUpMenu; +} + +//----------------------------------------------------------------------------- +// Name: GetNextMenuId +// Object: get next unique menu Id for all Menu and SubMenu +// Parameters : +// in : +// out : +// return : next unique menu Id for all Menu and SubMenu +//----------------------------------------------------------------------------- +UINT CPopUpMenu::GetNextMenuId() +{ + if (this->ParentPopUpMenu) + return this->ParentPopUpMenu->GetNextMenuId(); + else + { + // this assume we'll never return a 0 menuId + // (as 0 is returned by TrackPopupMenuEx if no item is selected) + this->CurrentMenuId++; + return this->CurrentMenuId; + } +} + +//----------------------------------------------------------------------------- +// Name: GetNextMenuId +// Object: get max used unique menu Id for all Menu and SubMenu +// Parameters : +// in : +// out : +// return : max used unique menu Id for all Menu and SubMenu +//----------------------------------------------------------------------------- +UINT CPopUpMenu::GetMaxMenuId() +{ + if (this->ParentPopUpMenu) + return this->ParentPopUpMenu->GetMaxMenuId(); + else + { + return this->CurrentMenuId; + } +} + +//----------------------------------------------------------------------------- +// Name: GetSubMenu +// Object: get sub menu associated menu id +// Parameters : +// in : UINT MenuID : menu id +// out : +// return : CPopUpMenu object pointer on success, NULL if no sub menu associated (or on error) +//----------------------------------------------------------------------------- +CPopUpMenu* CPopUpMenu::GetSubMenu(UINT MenuID) +{ + MENUITEMINFO mii={0}; + mii.cbSize=sizeof(MENUITEMINFO); + mii.fMask=MIIM_SUBMENU | MIIM_DATA; + if (!::GetMenuItemInfo(this->hPopUpMenu,MenuID,FALSE,&mii)) + return NULL; + if (!mii.hSubMenu) + return NULL; + + MENUINFO mi={0}; + mi.cbSize = sizeof(MENUINFO); + mi.fMask = MIM_MENUDATA; + if (!::GetMenuInfo(mii.hSubMenu,&mi)) + return NULL; + return (CPopUpMenu*)mi.dwMenuData; +} + +//----------------------------------------------------------------------------- +// Name: SetIcon +// Object: set menu item icon (loads default icon size) +// Parameters : +// in : UINT MenuID : menu id +// int IdIcon : resource icon id +// HINSTANCE hInstance : module handle containing icon id +// out : +// return : TRUE on success +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::SetIcon(UINT MenuID,int IdIcon,HINSTANCE hInstance) +{ + return this->SetIcon(MenuID,IdIcon,hInstance,0,0); +} + +//----------------------------------------------------------------------------- +// Name: SetIcon +// Object: set menu item icon +// Parameters : +// in : UINT MenuID : menu id +// int IdIcon : resource icon id +// int Width : icon width +// int Height : icon height +// HINSTANCE hInstance : module handle containing icon id +// out : +// return : TRUE on success +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::SetIcon(UINT MenuID,int IdIcon,HINSTANCE hInstance,int Width,int Height) +{ + return this->SetIcon(MenuID,(HICON)::LoadImage(hInstance, MAKEINTRESOURCE(IdIcon),IMAGE_ICON,Width,Height,LR_SHARED)); +} + +//----------------------------------------------------------------------------- +// Name: SetIcon +// Object: set menu item icon +// Parameters : +// in : UINT MenuID : menu id +// HICON hIcon : icon handle +// out : +// return : TRUE on success +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::SetIcon(UINT MenuID,HICON hIcon) +{ + MENUITEMINFO mii={0}; + mii.cbSize=sizeof(MENUITEMINFO); + if (!hIcon) + return FALSE; + + this->SetMenuItemBitmapInfo(&mii,hIcon); + + return ::SetMenuItemInfo(this->hPopUpMenu,MenuID,FALSE,&mii); +} + +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name) +{ + return this->Add(Name,NULL,this->GetItemCount()); +} + +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// UINT Index : 0 based menu index +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name,UINT Index) +{ + return this->Add(Name,NULL,Index); +} + +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// HICON hIcon : icon handle +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name,HICON hIcon) +{ + return this->Add(Name,hIcon,this->GetItemCount()); +} + +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// int IdIcon : icon id +// HINSTANCE hInstance : hinstance containing icon id +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name,int IdIcon,HINSTANCE hInstance) +{ + // load icon + HICON hIcon=(HICON)::LoadImage(hInstance, MAKEINTRESOURCE(IdIcon),IMAGE_ICON,0,0,LR_SHARED); + return this->Add(Name,hIcon,this->GetItemCount()); +} + +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// int IdIcon : icon id +// HINSTANCE hInstance : hinstance containing icon id +// UINT Index : 0 based menu index +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name,int IdIcon,HINSTANCE hInstance,UINT Index) +{ + return this->Add(Name,IdIcon,hInstance,0,0,Index); +} +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// int IdIcon : icon id +// HINSTANCE hInstance : hinstance containing icon id +// int Width : icon width +// int Height : icon height +// UINT Index : 0 based menu index +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name,int IdIcon,HINSTANCE hInstance,int Width,int Height,UINT Index) +{ + // load icon + HICON hIcon=(HICON)::LoadImage(hInstance, MAKEINTRESOURCE(IdIcon),IMAGE_ICON,Width,Height,LR_SHARED); + return this->Add(Name,hIcon,Index); +} + +//----------------------------------------------------------------------------- +// Name: Add +// Object: +// Parameters : +// in : TCHAR* Name : name of menu +// HICON hIcon : icon handle +// UINT Index : 0 based menu index +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Add(TCHAR* Name,HICON hIcon,UINT Index) +{ + UINT MenuId=this->GetNextMenuId(); + + MENUITEMINFO mii={0}; + mii.cbSize=sizeof(MENUITEMINFO); + mii.fMask = MIIM_FTYPE|MIIM_STRING|MIIM_ID; + mii.fType = MFT_STRING; + mii.dwTypeData=Name; + mii.wID=MenuId; + + this->SetMenuItemBitmapInfo(&mii,hIcon); + + // insert menu + if (!::InsertMenuItem(this->hPopUpMenu, + Index, + TRUE, + &mii + ) + ) + return 0; + + return MenuId; +} + +//----------------------------------------------------------------------------- +// Name: ReplaceMenuId +// Object: change menu id. +// WARNING NO CHECK IS DONE IF NEW ID IS ALREADY EXISTING : if it's the case +// you will run into trouble for the multiple id access +// +// Parameters : +// in : UINT OldMenuID : old menu id +// UINT NewMenuID : new menu id +// out : +// return : TRUE on success +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::ReplaceMenuId(UINT OldMenuID,UINT NewMenuID) +{ + MENUITEMINFO mii={0}; + mii.cbSize=sizeof(MENUITEMINFO); + mii.fMask=MIIM_ID; + mii.wID=NewMenuID; + return ::SetMenuItemInfo(this->hPopUpMenu,OldMenuID,FALSE,&mii); +} + +//----------------------------------------------------------------------------- +// Name: SetCheckedState +// Object: +// Parameters : +// in : UINT MenuID : menu id +// BOOL bChecked : new checked state +// out : +// return : +//----------------------------------------------------------------------------- +void CPopUpMenu::SetCheckedState(UINT MenuID,BOOL bChecked) +{ + UINT uCheck; + if(bChecked) + uCheck=MF_CHECKED; + else + uCheck=MF_UNCHECKED; + ::CheckMenuItem(this->hPopUpMenu,MenuID,MF_BYCOMMAND|uCheck); +} + +//----------------------------------------------------------------------------- +// Name: IsChecked +// Object: +// Parameters : +// in : UINT MenuID : menu id +// out : +// return : TRUE if menu item is checked +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::IsChecked(UINT MenuID) +{ + if (MF_CHECKED & ::GetMenuState(this->hPopUpMenu,MenuID,MF_BYCOMMAND)) + return TRUE; + else + return FALSE; +} + +//----------------------------------------------------------------------------- +// Name: SetEnabledState +// Object: +// Parameters : +// in : UINT MenuID : menu id +// BOOL bEnabled : new enabled state +// out : +// return : +//----------------------------------------------------------------------------- +void CPopUpMenu::SetEnabledState(UINT MenuID,BOOL bEnabled) +{ + UINT uEnable; + if(bEnabled) + uEnable=MF_ENABLED; + else + uEnable=MF_GRAYED; + ::EnableMenuItem(this->hPopUpMenu,MenuID,MF_BYCOMMAND|uEnable); +} + +//----------------------------------------------------------------------------- +// Name: IsEnabled +// Object: +// Parameters : +// in : UINT MenuID : menu id +// out : +// return : +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::IsEnabled(UINT MenuID) +{ + UINT uEnable=::GetMenuState(this->hPopUpMenu,MenuID,MF_BYCOMMAND); + if (uEnable==(UINT)-1) + return FALSE; + + return !(uEnable & (MF_DISABLED|MF_GRAYED)); +} + + +//----------------------------------------------------------------------------- +// Name: Remove +// Object: +// Parameters : +// in : UINT MenuID +// out : +// return : +//----------------------------------------------------------------------------- +void CPopUpMenu::Remove(UINT MenuID) +{ + ::RemoveMenu(this->hPopUpMenu,MenuID,MF_BYCOMMAND); +} + +//----------------------------------------------------------------------------- +// Name: AddSeparator +// Object: +// Parameters : +// in : +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSeparator() +{ + UINT MenuId=this->GetNextMenuId(); + if(!::AppendMenu( this->hPopUpMenu,MF_SEPARATOR,MenuId,_T(""))) + return 0; + return MenuId; +} + +//----------------------------------------------------------------------------- +// Name: AddSeparator +// Object: +// Parameters : +// in : UINT Index : menu index +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSeparator(UINT Index) +{ + UINT MenuId=this->GetNextMenuId(); + if (!::InsertMenu( this->hPopUpMenu,Index, MF_SEPARATOR|MF_BYPOSITION,MenuId,_T(""))) + return 0; + return MenuId; +} + +//----------------------------------------------------------------------------- +// Name: AddSubMenu +// Object: +// Parameters : +// in : TCHAR* SubMenuName : Name of submenu +// CPopUpMenu* SubMenu : pointer to an initialized CPopUpMenu +// UINT Index : SubMenu 0 based index in the current menu +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu) +{ + return this->AddSubMenu(SubMenuName,SubMenu,(UINT)-1); +} + +//----------------------------------------------------------------------------- +// Name: AddSubMenu +// Object: +// Parameters : +// in : TCHAR* SubMenuName : Name of submenu +// CPopUpMenu* SubMenu : pointer to an initialized CPopUpMenu +// UINT Index : SubMenu 0 based index in the current menu +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,UINT Index) +{ + return this->AddSubMenu(SubMenuName,SubMenu,0,Index); +} + +//----------------------------------------------------------------------------- +// Name: AddSubMenu +// Object: add submenu with icon +// Parameters : +// in : TCHAR* SubMenuName : Name of submenu +// CPopUpMenu* SubMenu : pointer to an initialized CPopUpMenu +// int IdIcon : icon id +// HINSTANCE hInstance : instance containing icon id +// UINT Index : SubMenu 0 based index in the current menu +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,int IdIcon,HINSTANCE hInstance) +{ + return this->AddSubMenu(SubMenuName,SubMenu,IdIcon,hInstance,(UINT)-1); +} + +//----------------------------------------------------------------------------- +// Name: AddSubMenu +// Object: add submenu with icon +// Parameters : +// in : TCHAR* SubMenuName : Name of submenu +// CPopUpMenu* SubMenu : pointer to an initialized CPopUpMenu +// int IdIcon : icon id +// HINSTANCE hInstance : instance containing icon id +// UINT Index : SubMenu 0 based index in the current menu +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,int IdIcon,HINSTANCE hInstance,UINT Index) +{ + HICON hIcon=(HICON)::LoadImage(hInstance, MAKEINTRESOURCE(IdIcon),IMAGE_ICON,0,0,LR_SHARED); + return this->AddSubMenu(SubMenuName,SubMenu,hIcon,Index); +} + +//----------------------------------------------------------------------------- +// Name: AddSubMenu +// Object: add submenu with icon +// Parameters : +// in : TCHAR* SubMenuName : Name of submenu +// CPopUpMenu* SubMenu : pointer to an initialized CPopUpMenu +// HICON hIcon : submenu icon handle +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,HICON hIcon) +{ + return this->AddSubMenu(SubMenuName,SubMenu,hIcon,(UINT)-1); +} + +//----------------------------------------------------------------------------- +// Name: AddSubMenu +// Object: add submenu with icon +// Parameters : +// in : TCHAR* SubMenuName : Name of submenu +// CPopUpMenu* SubMenu : pointer to an initialized CPopUpMenu +// HICON hIcon : submenu icon handle +// UINT Index : SubMenu 0 based index in the current menu +// out : +// return : Id of item menu (used to remove it),0 if failed +//----------------------------------------------------------------------------- +UINT CPopUpMenu::AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,HICON hIcon,UINT Index) +{ + MENUITEMINFO MenuItem={0}; + UINT MenuId=this->GetNextMenuId(); + + MenuItem.cbSize=sizeof(MENUITEMINFO); + MenuItem.fMask=MIIM_SUBMENU|MIIM_STRING|MIIM_ID; + MenuItem.hSubMenu=SubMenu->GetControlHandle(); + MenuItem.fType=MFT_STRING; + MenuItem.cch=(UINT)_tcslen(SubMenuName); + MenuItem.dwTypeData=SubMenuName; + MenuItem.wID=MenuId; + + this->SetMenuItemBitmapInfo(&MenuItem,hIcon); + + if(!::InsertMenuItem(this->hPopUpMenu,Index,TRUE,&MenuItem)) + return 0; + return MenuId; +} + +void CPopUpMenu::SetMenuItemBitmapInfo(MENUITEMINFO* pMenuItem,HICON hIcon) +{ + if (hIcon) + { + // on vista or newer os, if theming is enabled selected icon is not color-inverted, + // so there's no need to draw icon by ourselves, let system do it + if (this->bThemingEnabledForVistaOrNewer) + { + SIZE IconSize; + ICONINFO IconInfo; + if (::GetIconInfo(hIcon,&IconInfo)) + { + IconSize.cx = IconInfo.xHotspot*2; + IconSize.cy = IconInfo.yHotspot*2; + + // free icon infos + ::DeleteObject(IconInfo.hbmColor); + ::DeleteObject(IconInfo.hbmMask); + } + else + { + IconSize.cx = ::GetSystemMetrics(SM_CXICON); + IconSize.cy = ::GetSystemMetrics(SM_CYICON); + } + + + BITMAPV5HEADER bi; + void *lpBits; + + ZeroMemory(&bi,sizeof(BITMAPV5HEADER)); + bi.bV5Size = sizeof(BITMAPV5HEADER); + bi.bV5Width = IconSize.cx; + bi.bV5Height = IconSize.cy; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + // The following mask specification specifies a supported 32 BPP + // alpha format for Windows XP. + bi.bV5RedMask = 0x00FF0000; + bi.bV5GreenMask = 0x0000FF00; + bi.bV5BlueMask = 0x000000FF; + bi.bV5AlphaMask = 0xFF000000; + + HDC hdcScreen = ::GetDC(NULL); + HDC hMemDC = ::CreateCompatibleDC(hdcScreen); + HBITMAP hBitmap = ::CreateDIBSection(hdcScreen, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, (DWORD)0); + // HBITMAP hBitmap = ::CreateCompatibleBitmap(hMemDC, IconSize.cx, IconSize.cy); + HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap); + HBRUSH hBackgroundBrush = ::CreateSolidBrush(::GetSysColor(COLOR_MENU)); + //::DrawIcon(hMemDC, 0, 0, hIcon); + ::DrawIconEx(hMemDC,0,0,hIcon,IconSize.cx,IconSize.cy,0, + /*0*/ hBackgroundBrush, /* some icons needs a background color*/ + DI_NORMAL /*| DI_NOMIRROR*/ ); + + ::SelectObject(hMemDC, hOldBitmap); + ::DeleteObject(hBackgroundBrush); + ::DeleteDC(hMemDC); + ::ReleaseDC(NULL,hdcScreen); + + pMenuItem->fMask|=MIIM_BITMAP; + pMenuItem->hbmpItem = hBitmap; + ListLoadedBitmapToFree.push_back(hBitmap); +// to do : MenuItem.hbmpItem with must be deleted + } + else + { + // before vista icon of selected item in menu was inverted by default. + // to avoid this we have to manually draw icon by oursleves inside callback + + // set item data for WM_MEASUREITEM and WM_DRAWITEM messages + pMenuItem->fMask|=MIIM_DATA; + pMenuItem->dwItemData=(ULONG_PTR)hIcon; + + // set owner drawn for icon drawing + pMenuItem->fMask|=MIIM_BITMAP; + pMenuItem->hbmpItem = HBMMENU_CALLBACK; + + //// for full owner drawn type use + //pMenuItem->fType|= MFT_OWNERDRAW; + } + } +} + +//----------------------------------------------------------------------------- +// Name: GetItemCount +// Object: +// Parameters : +// in : +// out : +// return : number of item in the menu +//----------------------------------------------------------------------------- +int CPopUpMenu::GetItemCount() +{ + return ::GetMenuItemCount(this->hPopUpMenu); +} + +//----------------------------------------------------------------------------- +// Name: GetText +// Object: +// Parameters : +// in : UINT MenuID : menu ID +// int pszTextMaxSize : pszText max size in TCHAR. If 0, GetItemCount returns the +// number of required TCHAR +// out : TCHAR* pszText : Pointer to the buffer that receives the null-terminated string +// return : If the function succeeds, the return value specifies the number of characters copied to the buffer, +// not including the terminating null character +// If the function fails, the return value is zero +//----------------------------------------------------------------------------- +int CPopUpMenu::GetText(UINT MenuID,OUT TCHAR* pszText,IN int pszTextMaxSize) +{ + return ::GetMenuString(this->hPopUpMenu,MenuID,pszText,pszTextMaxSize,MF_BYCOMMAND); +} + +//----------------------------------------------------------------------------- +// Name: SetText +// Object: +// Parameters : +// in : UINT MenuID : menu ID +// TCHAR* pszText : Pointer to the input buffer +// out : +// return : TRUE on success, FALSE on error +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::SetText(UINT MenuID,TCHAR* pszText) +{ + MENUITEMINFO MenuItemInfo={0}; + MenuItemInfo.cbSize=sizeof(MENUITEMINFO); + MenuItemInfo.fMask=MIIM_STRING; + MenuItemInfo.fType=MFT_STRING; + MenuItemInfo.cch=(UINT)_tcslen(pszText); + MenuItemInfo.dwTypeData=pszText; + + return ::SetMenuItemInfo(this->hPopUpMenu,MenuID,FALSE,&MenuItemInfo); +} + +//----------------------------------------------------------------------------- +// Name: GetID +// Object: retrieve menu ID from menu index +// Parameters : +// in : UINT Menu index : index +// out : +// return : -1 if not found, else menu id +//----------------------------------------------------------------------------- +int CPopUpMenu::GetID(UINT MenuIndex) +{ + MENUITEMINFO MenuItemInfo={0}; + MenuItemInfo.cbSize=sizeof(MENUITEMINFO); + MenuItemInfo.fMask=MIIM_ID; + if (!::GetMenuItemInfo(this->hPopUpMenu,MenuIndex,TRUE,&MenuItemInfo)) + return -1; + return (int)MenuItemInfo.wID; + // return GetMenuItemID(this->hPopUpMenu,MenuIndex); +} + +//----------------------------------------------------------------------------- +// Name: GetIndex +// Object: retrieve menu index from menu ID +// Parameters : +// in : UINT MenuId : menu id +// out : +// return : -1 if not found, else menu index +//----------------------------------------------------------------------------- +int CPopUpMenu::GetIndex(UINT MenuId) +{ + int Cnt; + for (Cnt=0;CntGetItemCount();Cnt++) + { + if ((UINT)this->GetID(Cnt)==MenuId) + { + return Cnt; + } + } + return -1; +} + +//----------------------------------------------------------------------------- +// Name: Show +// Object: +// Parameters : +// in : int x : Horizontal location of the shortcut menu, in screen coordinates +// int y : Vertical location of the shortcut menu, in screen coordinates +// HWND hOwner : owner control handle +// out : +// return : 0 if no item selected, item id else +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Show(int x,int y, HWND hOwner) +{ + return this->Show(x,y,hOwner,FALSE); +} +//----------------------------------------------------------------------------- +// Name: Show +// Object: +// Parameters : +// in : int x : Horizontal location of the shortcut menu, in screen coordinates +// int y : Vertical location of the shortcut menu, in screen coordinates +// HWND hOwner : owner control handle +// BOOL PositionRelativeToOwner : TRUE if position is relative to owner +// FALSE for an absolute position +// out : +// return : 0 if no item selected, item id else +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Show(int x,int y, HWND hOwner,BOOL PositionRelativeToOwner) +{ + return this->Show(x,y,hOwner,PositionRelativeToOwner,FALSE); +} + +//----------------------------------------------------------------------------- +// Name: Show +// Object: +// Parameters : +// in : int x : Horizontal location of the shortcut menu, in screen coordinates +// int y : Vertical location of the shortcut menu, in screen coordinates +// HWND hOwner : owner control handle +// BOOL PositionRelativeToOwner : TRUE if position is relative to owner +// FALSE for an absolute position +// BOOL ShowUpper : TRUE to show menu upper y point +// out : +// return : 0 if no item selected, item id else +//----------------------------------------------------------------------------- +UINT CPopUpMenu::Show(int x,int y, HWND hOwner,BOOL PositionRelativeToOwner,BOOL ShowUpper) +{ + if (PositionRelativeToOwner) + { + RECT Rect; + ::GetWindowRect(hOwner,&Rect); + x+=Rect.left; + y+=Rect.top; + } + // menu flag must be without TPM_RIGHTBUTTON flag to get WM_MENURBUTTONUP messages + UINT fuFlags=TPM_LEFTALIGN|TPM_RETURNCMD; + if (ShowUpper) + { + fuFlags|=TPM_BOTTOMALIGN; + } + else + { + fuFlags|=TPM_TOPALIGN; + } + + UINT TrackPopupMenuRet; + HWND hWnd=hOwner; + + + + // install a subclassing wndproc + UINT_PTR uIdSubclass=0; + DWORD_PTR dwRefData=(DWORD_PTR)this; + ::SetWindowSubclass(hWnd,CPopUpMenu::SubClassWndProc,uIdSubclass,dwRefData); + + ::SetForegroundWindow(hWnd); // in case of use with notify icons + TrackPopupMenuRet=(UINT)::TrackPopupMenuEx(this->hPopUpMenu,fuFlags,x,y,hOwner,NULL); + + if (TrackPopupMenuRet==0) + { + if (::GetLastError()==ERROR_POPUP_ALREADY_ACTIVE) + TrackPopupMenuRet=(UINT)::TrackPopupMenuEx(this->hPopUpMenu,fuFlags|TPM_RECURSE,x,y,hOwner,NULL); + } + + // remove subclassing wndproc + ::RemoveWindowSubclass(hWnd,CPopUpMenu::SubClassWndProc,uIdSubclass); + + + // MSDN : + //However, when the current window is the foreground window, + //the second time this menu is displayed, it displays and then immediately disappears. + //To correct this, you must force a task switch to the application that called + //TrackPopupMenu at some time in the near future. + //This is done by posting a benign message to the window or thread + ::PostMessage(hWnd, WM_NULL, 0, 0); + + return TrackPopupMenuRet; +} + +//----------------------------------------------------------------------------- +// Name: OnMeasureItem +// Object: return needed pRect size to display picture (full item menu for MFT_OWNERDRAW) +// Parameters : +// in : HWND hwnd : hwnd +// inout : LPMEASUREITEMSTRUCT lpmis : pointer measured item struct +// out : +// return : TRUE if message has been proceed +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::OnMeasureItem(HWND hwnd, LPMEASUREITEMSTRUCT lpmis) +{ + UNREFERENCED_PARAMETER(hwnd); + + // assume type is a menu + if (lpmis->CtlType!=ODT_MENU) + return FALSE; + + // assume to have item associated data + if (!lpmis->itemData) + return FALSE; + + // extract icon infos from item data + ICONINFO IconInfo; + if (!::GetIconInfo((HICON)lpmis->itemData, &IconInfo)) + return FALSE; + + // get bitmap from icon + BITMAP Bitmap; + ::GetObject(IconInfo.hbmColor, sizeof(Bitmap), &Bitmap); + + // free icon infos + ::DeleteObject(IconInfo.hbmColor); + ::DeleteObject(IconInfo.hbmMask); + + // use bitmap size infos + lpmis->itemWidth = Bitmap.bmWidth; + lpmis->itemHeight = Bitmap.bmHeight; + + if (this->bAllowIconsEffects) + { + lpmis->itemWidth+= CPopUpMenu_ICON_SIZE_INCREMENT; + lpmis->itemHeight+= CPopUpMenu_ICON_SIZE_INCREMENT; + } + + return TRUE; +} + + + +HICON CreateGrayscaleIcon(HICON hIcon) +{ + HICON hGrayIcon = NULL; + HDC hdc = NULL, hMemDC1 = NULL, hMemDC2 = NULL; + HBITMAP hOldBmp1 = NULL, hOldBmp2 = NULL; + ICONINFO csII, csGrayII; + BOOL bRetValue = FALSE; + + bRetValue = ::GetIconInfo(hIcon, &csII); + if (bRetValue == FALSE) + return NULL; + + hdc = ::GetDC(NULL); + if (!hdc) + return NULL; + + hMemDC1 = ::CreateCompatibleDC(hdc); + if (!hMemDC1) + { + ::ReleaseDC(NULL, hdc); + return NULL; + } + + hMemDC2 = ::CreateCompatibleDC(hdc); + if (!hMemDC2) + { + ::DeleteDC(hMemDC1); + ::ReleaseDC(NULL, hdc); + return NULL; + } + + + BITMAPV5HEADER bi; + DWORD Width; + DWORD Height; + void *lpBits; + + Width = csII.xHotspot*2; // width of Icon + Height = csII.yHotspot*2; // height of Icon + + ZeroMemory(&bi,sizeof(BITMAPV5HEADER)); + bi.bV5Size = sizeof(BITMAPV5HEADER); + bi.bV5Width = Width; + bi.bV5Height = Height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + // The following mask specification specifies a supported 32 BPP + // alpha format for Windows XP. + bi.bV5RedMask = 0x00FF0000; + bi.bV5GreenMask = 0x0000FF00; + bi.bV5BlueMask = 0x000000FF; + bi.bV5AlphaMask = 0xFF000000; + + // Create the DIB section with an alpha channel. + csGrayII.hbmColor = ::CreateDIBSection(hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, (DWORD)0); + + if (csGrayII.hbmColor) + { + hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, csII.hbmColor); + hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, csGrayII.hbmColor); + + ::BitBlt(hMemDC2, 0, 0, Width, Height, hMemDC1, 0, 0, SRCCOPY); + + DWORD dwLoopY = 0, dwLoopX = 0; + COLORREF crPixel = 0; + BYTE byNewPixel = 0; + DWORD *lpdwPixel; + lpdwPixel = (DWORD *)lpBits; + + for (dwLoopY = 0; dwLoopY < Height; dwLoopY++) + { + for (dwLoopX = 0; dwLoopX < Width; dwLoopX++) + { + crPixel = (*lpdwPixel) & 0x00FFFFFF; + + if (crPixel) + byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114)); + else + byNewPixel = 0; + + // Clear the color bits + *lpdwPixel &= 0xFF000000; + // Set the new alpha bits + *lpdwPixel |= RGB(byNewPixel, byNewPixel, byNewPixel) ; + + lpdwPixel++; + } // for + } // for + + ::SelectObject(hMemDC1, hOldBmp1); + ::SelectObject(hMemDC2, hOldBmp2); + + csGrayII.hbmMask = csII.hbmMask; + + csGrayII.fIcon = TRUE; + hGrayIcon = ::CreateIconIndirect(&csGrayII); + ::DeleteObject(csGrayII.hbmColor); + } // if + + ::DeleteObject(csII.hbmColor); + ::DeleteObject(csII.hbmMask); + ::DeleteDC(hMemDC1); + ::DeleteDC(hMemDC2); + ::ReleaseDC(NULL, hdc); + + return hGrayIcon; +} // End of CreateGrayscaleIcon + + +HICON CreateAlphaIcon(HICON hIcon,int AlphaChange,HBRUSH BackgroundBrush) +{ + HDC hMemDC; + DWORD Width, Height; + BITMAPV5HEADER bi; + HBITMAP hBitmap, hOldBitmap; + void *lpBits; + DWORD x,y; + HICON hNewIcon = NULL; + + ICONINFO OriginalIconInfos; + if(!::GetIconInfo(hIcon,&OriginalIconInfos)) + return NULL; + + ICONINFO ii; + ii.fIcon = TRUE; // Change fIcon to TRUE to create an alpha icon + ii.xHotspot = 0; + ii.yHotspot = 0; + + if (!AlphaChange) + { + ii.hbmMask = OriginalIconInfos.hbmMask; + ii.hbmColor = OriginalIconInfos.hbmColor; + + // Create the alpha cursor with the alpha DIB section. + hNewIcon = ::CreateIconIndirect(&ii); + + ::DeleteObject(OriginalIconInfos.hbmColor); + ::DeleteObject(OriginalIconInfos.hbmMask); + + return hNewIcon; + } + + Width = OriginalIconInfos.xHotspot*2; // width of Icon + Height = OriginalIconInfos.yHotspot*2; // height of Icon + + ZeroMemory(&bi,sizeof(BITMAPV5HEADER)); + bi.bV5Size = sizeof(BITMAPV5HEADER); + bi.bV5Width = Width; + bi.bV5Height = Height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_BITFIELDS; + // The following mask specification specifies a supported 32 BPP + // alpha format for Windows XP. + bi.bV5RedMask = 0x00FF0000; + bi.bV5GreenMask = 0x0000FF00; + bi.bV5BlueMask = 0x000000FF; + bi.bV5AlphaMask = 0xFF000000; + + HDC hdc; + hdc = ::GetDC(NULL); + + // Create the DIB section with an alpha channel. + hBitmap = ::CreateDIBSection(hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&lpBits, NULL, (DWORD)0); + hMemDC = ::CreateCompatibleDC(hdc); + + // select bitmap + hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap); + + // Draw something on the DIB section. + ::DrawIconEx(hMemDC,0,0,hIcon,Width,Height,0, + /*0*/ BackgroundBrush, /* some icons needs a background color*/ + DI_NORMAL); + + // Create an empty mask bitmap. + HBITMAP hMonoBitmap = ::CreateBitmap(Width,Height,1,1,NULL); + + DWORD *lpdwPixel; + lpdwPixel = (DWORD *)lpBits; + + BYTE bAlpha; + for (x=0;x> 24); + + if (AlphaChange<0) + { + if (!bAlpha) + bAlpha = 0xFF; + // increase transparency + bAlpha = (BYTE)__max(bAlpha+AlphaChange,1); // 0 : no transparency + } + else + { + // reduce transparency only for not fully transparent bytes + if (bAlpha) + { + bAlpha = (BYTE)__min(bAlpha+AlphaChange,0xff); + } + } + + // Clear the alpha bits + *lpdwPixel &= 0x00FFFFFF; + // Set the new alpha bits + *lpdwPixel |= ( bAlpha <<24) ; + + lpdwPixel++; + } + } + + ii.hbmMask = hMonoBitmap; + ii.hbmColor = hBitmap; + + // Create the alpha cursor with the alpha DIB section. + hNewIcon = ::CreateIconIndirect(&ii); + + ::SelectObject(hMemDC, hOldBitmap); + ::DeleteDC(hMemDC); + + ::DeleteObject(hBitmap); + ::DeleteObject(hMonoBitmap); + + ::DeleteObject(OriginalIconInfos.hbmColor); + ::DeleteObject(OriginalIconInfos.hbmMask); + + ::ReleaseDC(NULL,hdc); + + return hNewIcon; +} + +//----------------------------------------------------------------------------- +// Name: CreateAlphaOrGreyscaleIcon +// Object: This function creates an alpha modified or a greyscale icon starting from a given icon. +// The resulting icon will have the same size of the original one. +// Notice the return icon handle must be free by calling ::DeleteObject +// Parameters : +// in : HWND hwnd : hwnd +// int Alpha [-255;255] negative value to increase alpha transparency +// BOOL bGreyscale TRUE to convert to greyscale +// out : +// return : NULL on error hIcon on success +//----------------------------------------------------------------------------- +HICON CreateAlphaOrGreyscaleIcon(HICON hIcon,BOOL bGreyIcon,int AlphaChange,HBRUSH BackgroundBrush) +{ + HICON hGreyIcon = hIcon; + HICON hNewIcon; + + if (bGreyIcon) + hGreyIcon = CreateGrayscaleIcon(hIcon); + + hNewIcon = CreateAlphaIcon(hGreyIcon,AlphaChange,BackgroundBrush); + + if (bGreyIcon) + ::DestroyIcon(hGreyIcon); + + return hNewIcon; +} + + +//----------------------------------------------------------------------------- +// Name: OnDrawItem +// Object: do picture rendering (full item rendering if MFT_OWNERDRAW) +// Parameters : +// in : HWND hwnd : hwnd +// LPDRAWITEMSTRUCT lpdis : pointer display item info struct +// out : +// return : TRUE if message has been proceed +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::OnDrawItem(HWND hwnd, LPDRAWITEMSTRUCT lpdis) +{ + UNREFERENCED_PARAMETER(hwnd); + + // assume type is a menu + if (lpdis->CtlType!=ODT_MENU) + return FALSE; + + // assume handle match our menu or sub menu + if (this->hPopUpMenu!=(HMENU)lpdis->hwndItem) + { + if (!this->IsSubMenu(this->hPopUpMenu,(HMENU)lpdis->hwndItem)) + return FALSE; + } + + // assume to have item associated data + if (!lpdis->itemData) + return FALSE; + + ICONINFO IconInfo; + // extract icon infos from item data + if (!::GetIconInfo((HICON)lpdis->itemData, &IconInfo)) + return FALSE; + + UINT Width = IconInfo.xHotspot*2; + UINT Height = IconInfo.yHotspot*2; + + // free icon infos + ::DeleteObject(IconInfo.hbmColor); + ::DeleteObject(IconInfo.hbmMask); + + //// render bitmap + //::DrawIconEx(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,(HICON) lpdis->itemData, Bitmap.bmWidth, Bitmap.bmHeight, 0, NULL, DI_NORMAL); + + BOOL bSelected = ( (lpdis->itemState & ODS_SELECTED) == ODS_SELECTED); + BOOL bDisabled = ( (lpdis->itemState & ODS_DISABLED) == ODS_DISABLED); + BOOL bChecked = ( (lpdis->itemState & ODS_CHECKED) == ODS_CHECKED); + //HBITMAP hBmp = LoadBitmap (NULL, MAKEINTRESOURCE(OBM_CHECK)); + // bChecked is always FALSE, else we have to play with MFT_OWNERDRAW + + HBRUSH CurrentBrush = NULL; + UINT Delta=0; + + if (this->bAllowIconsEffects) + Delta =( (bSelected && !bDisabled) ? (CPopUpMenu_ICON_SIZE_INCREMENT-CPopUpMenu_ICON_SHADOW_POSITION_DELTA)/2 : CPopUpMenu_ICON_SIZE_INCREMENT/2 ); + + // if item is disabled, draw only grey scale icon + if ( bDisabled ) + { + HICON hGreyIcon=CreateGrayscaleIcon((HICON) lpdis->itemData); + ::DrawIconEx(lpdis->hDC, lpdis->rcItem.left+Delta, lpdis->rcItem.top+Delta,hGreyIcon, Width, Height, 0, NULL, DI_NORMAL); + ::DestroyIcon(hGreyIcon); + return TRUE; + } + + if (this->bAllowIconsEffects) + { + // if item is checked, draw rectangle around icon + if (bChecked) + { + // get system colors + COLORREF CheckedColor; + COLORREF MenuHilightColor = ::GetSysColor(COLOR_MENUHILIGHT); + COLORREF MenuColor = ::GetSysColor(COLOR_MENU); + + // get luminosity difference + int LuminosityDelta = // grey highlighted menu color - grey menu color + (int)((GetRValue(MenuHilightColor) * 0.299) + (GetGValue(MenuHilightColor) * 0.587) + (GetBValue(MenuHilightColor) * 0.114)) + - (int)((GetRValue(MenuColor) * 0.299) + (GetGValue(MenuColor) * 0.587) + (GetBValue(MenuColor) * 0.114)); + LuminosityDelta/=2; + + // forge checked color + CheckedColor = RGB( + __max( __min( GetRValue(MenuHilightColor) - LuminosityDelta , 255 ) , 0 ), + __max( __min( GetGValue(MenuHilightColor) - LuminosityDelta , 255 ) , 0 ), + __max( __min( GetBValue(MenuHilightColor) - LuminosityDelta , 255 ) , 0 ) + ); + + // create pen and select it + HPEN hPen = ::CreatePen(PS_SOLID, 1, (bSelected ? ::GetSysColor(COLOR_MENU) : ::GetSysColor(COLOR_MENUHILIGHT))); + HPEN OldPen= (HPEN)::SelectObject(lpdis->hDC,hPen); + // create brush and select it + CurrentBrush = ::CreateSolidBrush(CheckedColor); + HBRUSH OldBrush = (HBRUSH)::SelectObject(lpdis->hDC,CurrentBrush); + + // draw rectangle around icon with selected pen and brush + ::Rectangle(lpdis->hDC, lpdis->rcItem.left,lpdis->rcItem.top,lpdis->rcItem.right,lpdis->rcItem.bottom); + + // select original brush and pen + ::SelectObject(lpdis->hDC,OldBrush); + ::SelectObject(lpdis->hDC,OldPen); + } + else + { + if ( bSelected ) + CurrentBrush = ::CreateSolidBrush(::GetSysColor(COLOR_MENUHILIGHT)); + else + CurrentBrush = ::CreateSolidBrush(::GetSysColor(COLOR_MENU)); + } + + if ( bSelected ) + { + UINT DeltaShadow=(CPopUpMenu_ICON_SIZE_INCREMENT+CPopUpMenu_ICON_SHADOW_POSITION_DELTA)/2; + HICON hAlphaIcon=CreateAlphaOrGreyscaleIcon((HICON) lpdis->itemData,TRUE,-CPopUpMenu_TRANSPARENCY_INCREASE,CurrentBrush); + ::DrawIconEx(lpdis->hDC, lpdis->rcItem.left+DeltaShadow, lpdis->rcItem.top+DeltaShadow,hAlphaIcon, Width, Height, 0, NULL, DI_NORMAL); + ::DestroyIcon(hAlphaIcon); + } + } + + // render bitmap + // ::DrawState(lpdis->hDC, (HBRUSH)NULL, NULL,(LPARAM)(HICON)lpdis->itemData, 0, lpdis->rcItem.left+Delta, lpdis->rcItem.top+Delta, Bitmap.bmWidth, Bitmap.bmHeight, DSS_NORMAL | DST_ICON); + ::DrawIconEx(lpdis->hDC, lpdis->rcItem.left+Delta, lpdis->rcItem.top+Delta,(HICON) lpdis->itemData, Width, Height, 0, NULL, DI_NORMAL); + + if (CurrentBrush) + ::DeleteObject(CurrentBrush); + + return TRUE; +} + +//----------------------------------------------------------------------------- +// Name: IsSubMenu +// Object: check if hSubMenu is a submenu of hMenu +// Parameters : +// in : HMENU hMenu : a menu handle +// HMENU hSubMenu : sub menu handle to check +// out : +// return : TRUE hMenu is a submenu of current menu +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::IsSubMenu(HMENU hMenu,HMENU hSubMenu) +{ + int NbItems=::GetMenuItemCount(hMenu); + + MENUITEMINFO mii; + mii.cbSize=sizeof(MENUITEMINFO); + mii.fMask=MIIM_SUBMENU; + for (int Cnt=0;CntIsSubMenu(mii.hSubMenu,hSubMenu)) + return TRUE; + + } + + return FALSE; +} + +//----------------------------------------------------------------------------- +// Name: SetMouseRightButtonUpCallback +// Object: set callback for WM_MENURBUTTONUP message +// Parameters : +// in : +// out : +// return : TRUE on success +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::SetMouseRightButtonUpCallback(pfMessageCallback Callback,PVOID UserParam) +{ + // check callback validity + if (::IsBadCodePtr((FARPROC)Callback)) + return FALSE; + + this->MouseRightButtonUpCallback=Callback; + this->MouseRightButtonUpUserParam=UserParam; + + return TRUE; +} + +//----------------------------------------------------------------------------- +// Name: SetMenuSelectCallback +// Object: set callback for WM_MENUSELECT message +// Parameters : +// in : +// out : +// return : TRUE on success +//----------------------------------------------------------------------------- +BOOL CPopUpMenu::SetMenuSelectCallback(pfMessageCallback Callback,PVOID UserParam) +{ + // check callback validity + if (::IsBadCodePtr((FARPROC)Callback)) + return FALSE; + + this->MenuSelectCallback=Callback; + this->MenuSelectUserParam=UserParam; + + return TRUE; +} + +//----------------------------------------------------------------------------- +// Name: OnMouseRightButtonUp +// Object: called on WM_MENURBUTTONUP message, call callback if any +// Parameters : +// in : +// out : +// return : +//----------------------------------------------------------------------------- +void CPopUpMenu::OnMouseRightButtonUp(WPARAM wParam, LPARAM lParam) +{ + if (this->MouseRightButtonUpCallback) + this->MouseRightButtonUpCallback(wParam,lParam,this->MouseRightButtonUpUserParam); +} + +//----------------------------------------------------------------------------- +// Name: OnMenuSelect +// Object: called on WM_MENUSELECT message, call callback if any +// Parameters : +// in : +// out : +// return : +//----------------------------------------------------------------------------- +void CPopUpMenu::OnMenuSelect(WPARAM wParam, LPARAM lParam) +{ + if (this->MenuSelectCallback) + this->MenuSelectCallback(wParam,lParam,this->MenuSelectUserParam); +} + +//----------------------------------------------------------------------------- +// Name: SubClassWndProc +// Object: subclassing window proc +// Parameters : +// in : WndProc param +// out : +// return : +//----------------------------------------------------------------------------- +LRESULT CALLBACK CPopUpMenu::SubClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,UINT_PTR uIdSubclass,DWORD_PTR dwRefData) +{ + UNREFERENCED_PARAMETER(uIdSubclass); + CPopUpMenu* pPopUpMenu=(CPopUpMenu*)dwRefData; + if (!pPopUpMenu) + return ::DefSubclassProc(hWnd,uMsg,wParam,lParam); + + switch (uMsg) + { + case WM_MEASUREITEM: + return pPopUpMenu->OnMeasureItem(hWnd, (LPMEASUREITEMSTRUCT) lParam); + + case WM_DRAWITEM: + return pPopUpMenu->OnDrawItem(hWnd, (LPDRAWITEMSTRUCT) lParam); + + case WM_MENURBUTTONUP: + // FIXME : WM_MENURBUTTONUP is not send for sub menus when they are expanded + pPopUpMenu->OnMouseRightButtonUp(wParam,lParam); + break; + case WM_MENUSELECT: + pPopUpMenu->OnMenuSelect(wParam,lParam); + break; + } + + return ::DefSubclassProc(hWnd,uMsg,wParam,lParam); +} \ No newline at end of file diff --git a/src/Screenshot/PopUpMenu.h b/src/Screenshot/PopUpMenu.h new file mode 100644 index 0000000..767190f --- /dev/null +++ b/src/Screenshot/PopUpMenu.h @@ -0,0 +1,117 @@ +/* +Copyright (C) 2004 Jacquelin POTIER +Dynamic aspect ratio code Copyright (C) 2004 Jacquelin POTIER + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +//----------------------------------------------------------------------------- +// Object: class helper for popupmenu control +//----------------------------------------------------------------------------- + +#pragma once +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 // for xp os +#endif +#include +#pragma warning (push) +#pragma warning(disable : 4005)// for '_stprintf' : macro redefinition in tchar.h +#include +#pragma warning (pop) +#include + +#include +#pragma comment (lib,"comctl32.lib") + +class CPopUpMenu +{ +public: + typedef void (*pfMessageCallback)(WPARAM wParam, LPARAM lParam,PVOID UserParam); + CPopUpMenu(); + CPopUpMenu(CPopUpMenu* ParentPopUpMenu); + ~CPopUpMenu(); + + HMENU GetControlHandle(); + CPopUpMenu* GetParentPopUpMenu(); + + UINT Add(TCHAR* Name); + UINT Add(TCHAR* Name,UINT Index); + UINT Add(TCHAR* Name,HICON hIcon); + UINT Add(TCHAR* Name,HICON hIcon,UINT Index); + UINT Add(TCHAR* Name,int IdIcon,HINSTANCE hInstance); + UINT Add(TCHAR* Name,int IdIcon,HINSTANCE hInstance,UINT Index); + UINT Add(TCHAR* Name,int IdIcon,HINSTANCE hInstance,int Width,int Height,UINT Index); + + UINT AddSeparator(); + UINT AddSeparator(UINT Index); + + UINT AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,UINT Index); + UINT AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu); + UINT AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,int IdIcon,HINSTANCE hInstance,UINT Index); + UINT AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,int IdIcon,HINSTANCE hInstance); + UINT AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,HICON hIcon,UINT Index); + UINT AddSubMenu(TCHAR* SubMenuName,CPopUpMenu* SubMenu,HICON hIcon); + + void SetCheckedState(UINT MenuID,BOOL bChecked); + BOOL IsChecked(UINT MenuID); + void SetEnabledState(UINT MenuID,BOOL bEnabled); + BOOL IsEnabled(UINT MenuID); + BOOL SetText(UINT MenuID,TCHAR* pszText); + BOOL SetIcon(UINT MenuID,int IdIcon,HINSTANCE hInstance); + BOOL SetIcon(UINT MenuID,int IdIcon,HINSTANCE hInstance,int Width,int Height); + BOOL SetIcon(UINT MenuID,HICON hIcon); + int GetText(UINT MenuID,TCHAR* pszText,int pszTextMaxSize); + CPopUpMenu* GetSubMenu(UINT MenuID); + + void Remove(UINT MenuID); + + int GetItemCount(); + int GetID(UINT MenuIndex); + int GetIndex(UINT MenuId); + + UINT Show(int x,int y, HWND hOwner); + UINT Show(int x,int y, HWND hOwner,BOOL PositionRelativeToOwner); + UINT Show(int x,int y, HWND hOwner,BOOL PositionRelativeToOwner,BOOL ShowUpper); + + UINT GetNextMenuId(); + UINT GetMaxMenuId(); + BOOL ReplaceMenuId(UINT OldMenuID,UINT NewMenuID); + + BOOL SetMouseRightButtonUpCallback(pfMessageCallback Callback,PVOID UserParam); + BOOL SetMenuSelectCallback(pfMessageCallback Callback,PVOID UserParam); + + BOOL bAllowIconsEffects; +private: + CPopUpMenu* ParentPopUpMenu; + HMENU hPopUpMenu; + int CurrentMenuId; + BOOL bThemingEnabledForVistaOrNewer; + std::vector ListLoadedBitmapToFree; + + pfMessageCallback MouseRightButtonUpCallback; + PVOID MouseRightButtonUpUserParam; + pfMessageCallback MenuSelectCallback; + PVOID MenuSelectUserParam; + + void CommonConstructor(); + void SetMenuItemBitmapInfo(MENUITEMINFO* pMenuItem,HICON hIcon); + BOOL IsSubMenu(HMENU hMenu,HMENU hSubMenu); + BOOL OnMeasureItem(HWND hwnd, LPMEASUREITEMSTRUCT lpmis); + BOOL OnDrawItem(HWND hwnd, LPDRAWITEMSTRUCT lpdis); + void OnMouseRightButtonUp(WPARAM wParam, LPARAM lParam); + void OnMenuSelect(WPARAM wParam, LPARAM lParam); + void FreeItemMemory(UINT MenuID); + void FreeItemBitmap(UINT MenuID); + static LRESULT CALLBACK SubClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,UINT_PTR uIdSubclass,DWORD_PTR dwRefData); +}; diff --git a/src/Screenshot/ReadMe.txt b/src/Screenshot/ReadMe.txt new file mode 100644 index 0000000..f9da258 --- /dev/null +++ b/src/Screenshot/ReadMe.txt @@ -0,0 +1,73 @@ +================================================================================ +MICROSOFT : Screenshot Ŀ +=============================================================================== + +ӦóΪ Screenshot Ӧó򡣴Ӧó򲻽ʾ Microsoft Ļʹ÷ΪдӦó㡣 + +ļҪ Screenshot Ӧóÿļݡ + +Screenshot.vcproj +ʹӦóɵ VC++ ĿĿļ +ɸļ Visual C++ İ汾ϢԼйʹӦóѡƽ̨úĿܵϢ + +Screenshot.h +ӦóҪͷļĿضͷļ( Resource.h) CScreenshotApp Ӧóࡣ + +Screenshot.cpp +ǰӦó CScreenshotApp ҪӦóԴļ + +Screenshot.rc +dzʹõ Microsoft Windows Դб RES Ŀ¼д洢ͼꡢλͼ͹ꡣļֱ Microsoft Visual C++ нб༭ĿԴλ 2052 С + +res\Screenshot.ico +ӦóͼͼļͼҪԴļ Screenshot.rc С + +res\Screenshot.rc2 +ļ Microsoft Visual C++ нб༭ԴӦýԴ༭༭ԴڴļС + + +///////////////////////////////////////////////////////////////////////////// + +Ӧó򵼴һԻ: + +ScreenshotDlg.hScreenshotDlg.cpp - Ի +Щļ CScreenshotDlg ࡣඨӦóԻΪöԻģλ Screenshot.rc Уļ Microsoft Visual C++ нб༭ + + +///////////////////////////////////////////////////////////////////////////// + +: + +ActiveX ؼ +Ӧóʹ ActiveX ؼ֧֡ + +ӡӡԤ֧ +Ӧóͨ MFC CView еijԱڴӡӡúʹӡԤĴ롣 + +///////////////////////////////////////////////////////////////////////////// + +׼ļ: + +StdAfx.hStdAfx.cpp +ЩļΪ Screenshot.pch Ԥͷ (PCH) ļΪ StdAfx.obj Ԥļ + +Resource.h +DZ׼ͷļµԴ ID +Microsoft Visual C++ ȡ´ļ + +Screenshot.manifest + Ӧó嵥ļ Windows XP Ӧó + ض汾г򼯵ԡسʹô + Ϣӳ򼯻ʵij򼯻 + Ӧó˽ϢӦó嵥Ϊ·ַΪ + Ӧóִļװͬļеⲿ .manifest ļ + ҲԴʽڸÿִļС +///////////////////////////////////////////////////////////////////////////// + +ע: + +ӦóʹáTODO:ָʾӦӻԶԴ벿֡ + +Ӧóڹ DLL ʹ MFCҪ·Щ MFC DLLӦóõϵͳĵǰòͬҪ·ӦıػԴ MFC90XXX.DLLйĸϢμ MSDN ĵй Redistributing Visual C++ applications (· Visual C++ Ӧó)½ڡ + +///////////////////////////////////////////////////////////////////////////// diff --git a/src/Screenshot/Screenshot.aps b/src/Screenshot/Screenshot.aps new file mode 100644 index 0000000000000000000000000000000000000000..59ef8ced34aa42e8f8e6139c4925fd6876ee55e0 GIT binary patch literal 202600 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 I?Ofsc|L~}a?f?J) literal 0 HcmV?d00001 diff --git a/src/Screenshot/Screenshot.cpp b/src/Screenshot/Screenshot.cpp new file mode 100644 index 0000000..e7b1caf --- /dev/null +++ b/src/Screenshot/Screenshot.cpp @@ -0,0 +1,174 @@ +// Screenshot.cpp : ӦóΪ +// + +#include "stdafx.h" +#include "Screenshot.h" +#include "ScreenshotDlg.h" +#include "CatchScreenDlg.h" +#include + + +using namespace Gdiplus; +#pragma comment(lib,"GdiPlus.lib") + + + + + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +#define SHIFTED 0x8000 + + +// CScreenshotApp + +BEGIN_MESSAGE_MAP(CScreenshotApp, CWinApp) + ON_COMMAND(ID_HELP, &CWinApp::OnHelp) +END_MESSAGE_MAP() + + +// CScreenshotApp + +CScreenshotApp::CScreenshotApp() +{ + // TODO: ڴ˴ӹ룬 + // Ҫijʼ InitInstance + +} + + +// Ψһһ CScreenshotApp + +CScreenshotApp theApp; + + +// CScreenshotApp ʼ + +BOOL CScreenshotApp::InitInstance() +{ + // һ Windows XP ϵӦó嵥ָҪ + // ʹ ComCtl32.dll 汾 6 ߰汾ÿӻʽ + //Ҫ InitCommonControlsEx()򣬽޷ڡ + INITCOMMONCONTROLSEX InitCtrls; + InitCtrls.dwSize = sizeof(InitCtrls); + // ΪҪӦóʹõ + // ؼࡣ + InitCtrls.dwICC = ICC_WIN95_CLASSES; + InitCommonControlsEx(&InitCtrls); + + CWinApp::InitInstance(); + + GdiplusStartupInput input; + GdiplusStartup(&m_gdiplusToken,&input,NULL); + + AfxEnableControlContainer(); + + // ׼ʼ + // δʹЩܲϣС + // տִļĴСӦƳ + // Ҫضʼ + // ڴ洢õע + // TODO: Ӧʵ޸ĸַ + // ޸Ϊ˾֯ + SetRegistryKey(_T("ӦóɵıӦó")); + + CScreenshotDlg dlg; + m_pMainWnd = &dlg; + INT_PTR nResponse = dlg.DoModal(); + if (nResponse == IDOK) + { + // TODO: ڴ˷ôʱ + // ȷرնԻĴ + } + else if (nResponse == IDCANCEL) + { + // TODO: ڴ˷ôʱ + // ȡرնԻĴ + } + + // ڶԻѹرգԽ FALSE Ա˳Ӧó + // ӦóϢá + return FALSE; +} + +BOOL CScreenshotApp::ProcessMessageFilter(int code, LPMSG lpMsg) +{ + if(m_hwndDlg != NULL) + { + // ϢǴӶԻ򷢳Ļӿؼ,ͽд + if((lpMsg->hwnd == m_hwndDlg) || ::IsChild(m_hwndDlg, lpMsg->hwnd)) + { + // ϢWM_KEYDOWN,÷λ + if(lpMsg->message == WM_KEYDOWN) + { + CRect rect(0,0,0,0); + CCatchScreenDlg * pDlg=(CCatchScreenDlg *)AfxGetMainWnd(); + + rect = pDlg->m_rectTracker.m_rect; + + if(pDlg->m_bFirstDraw) + { + //ShiftС + BOOL bIsShiftDown = FALSE; + + if (GetKeyState(VK_SHIFT) & SHIFTED) + bIsShiftDown = TRUE; + + //////////////////////////////////////////////////// + + switch(lpMsg->wParam) + { + case VK_UP: + + //Shift,ֻһ + if(!bIsShiftDown) + rect.top-=1; + + rect.bottom-=1; + pDlg->m_rectTracker.m_rect = rect; + pDlg->InvalidateRgnWindow(); + break; + + case VK_DOWN: + rect.top+=1; + if(!bIsShiftDown) + rect.bottom+=1; + + pDlg->m_rectTracker.m_rect=rect; + pDlg->InvalidateRgnWindow(); + break; + + case VK_LEFT: + if(!bIsShiftDown) + rect.left-=1; + rect.right-=1; + + pDlg->m_rectTracker.m_rect=rect; + pDlg->InvalidateRgnWindow(); + break; + + case VK_RIGHT: + rect.left+=1; + if(!bIsShiftDown) + rect.right+=1; + + pDlg->m_rectTracker.m_rect=rect; + pDlg->InvalidateRgnWindow(); + break; + } + } + } + + } + } + + return CWinApp::ProcessMessageFilter(code, lpMsg); +} +int CScreenshotApp::ExitInstance() +{ + GdiplusShutdown(m_gdiplusToken); + + return CWinApp::ExitInstance(); +} diff --git a/src/Screenshot/Screenshot.h b/src/Screenshot/Screenshot.h new file mode 100644 index 0000000..5a0dfb6 --- /dev/null +++ b/src/Screenshot/Screenshot.h @@ -0,0 +1,38 @@ +// Screenshot.h : PROJECT_NAME Ӧóͷļ +// + +#pragma once + +#ifndef __AFXWIN_H__ + #error "ڰļ֮ǰstdafx.h PCH ļ" +#endif + +#include "resource.h" // + +// CScreenshotApp: +// йشʵ֣ Screenshot.cpp +// + +class CScreenshotApp : public CWinApp +{ +public: + CScreenshotApp(); + +// д + public: + virtual BOOL InitInstance(); + + + HWND m_hwndDlg; + virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg); + +// ʵ + + DECLARE_MESSAGE_MAP() +private: + ULONG_PTR m_gdiplusToken; +public: + virtual int ExitInstance(); +}; + +extern CScreenshotApp theApp; \ No newline at end of file diff --git a/src/Screenshot/Screenshot.rc b/src/Screenshot/Screenshot.rc new file mode 100644 index 0000000..888cd37 --- /dev/null +++ b/src/Screenshot/Screenshot.rc @@ -0,0 +1,217 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#ifndef APSTUDIO_INVOKED +#include "targetver.h" +#endif +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Chinese (P.R.C.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) +#ifdef _WIN32 +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +#pragma code_page(936) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#ifndef APSTUDIO_INVOKED\r\n" + "#include ""targetver.h""\r\n" + "#endif\r\n" + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n" + "LANGUAGE 4, 2\r\n" + "#pragma code_page(936)\r\n" + "#include ""res\\Screenshot.rc2"" // Microsoft Visual C++ ༭Դ\r\n" + "#include ""l.CHS\\afxres.rc"" // ׼\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\Screenshot.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_SCREENSHOT_DIALOG DIALOGEX 0, 0, 181, 59 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Screenshot" +FONT 9, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "ͼ",IDC_BTN_START,65,22,50,14 +END + +IDD_DIALOGFORIMG DIALOGEX 0, 0, 169, 140 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP +EXSTYLE WS_EX_TRANSPARENT +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT1,14,20,137,93,ES_MULTILINE | ES_READONLY | NOT WS_BORDER +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080403a8" + BEGIN + VALUE "CompanyName", "TODO: <˾>" + VALUE "FileDescription", "TODO: <ļ˵>" + VALUE "FileVersion", "1.0.0.1" + VALUE "InternalName", "Screenshot.exe" + VALUE "LegalCopyright", "TODO: (C) <˾>Ȩ" + VALUE "OriginalFilename", "Screenshot.exe" + VALUE "ProductName", "TODO: <Ʒ>" + VALUE "ProductVersion", "1.0.0.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x804, 936 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_SCREENSHOT_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 174 + TOPMARGIN, 7 + BOTTOMMARGIN, 52 + END + + IDD_DIALOGFORIMG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 162 + TOPMARGIN, 7 + BOTTOMMARGIN, 133 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_BITMAP_BK BITMAP "res\\brackground.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// PNG +// + +IDB_ARROW PNG "res\\Arrow.png" +IDB_RECTANGLE PNG "res\\Rectangle.png" +IDB_CIRCLE PNG "res\\Circle.png" +IDB_BRUSH PNG "res\\Brush.PNG" +IDB_MOSAIC PNG "res\\Mosaic.png" +IDB_TEXT PNG "res\\Text.png" +IDB_UNDO PNG "res\\Undo.png" +IDB_SAVE PNG "res\\Save.png" +IDB_EXIT PNG "res\\Exit.png" +IDB_FINISH PNG "res\\Finish.png" + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_CURSOR1 CURSOR "res\\arrow_m.cur" +#endif // Chinese (P.R.C.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) +LANGUAGE 4, 2 +#pragma code_page(936) +#include "res\Screenshot.rc2" // Microsoft Visual C++ ༭Դ +#include "l.CHS\afxres.rc" // ׼ +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/Screenshot/Screenshot.vcproj b/src/Screenshot/Screenshot.vcproj new file mode 100644 index 0000000..35207b4 --- /dev/null +++ b/src/Screenshot/Screenshot.vcproj @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Screenshot/Screenshot.vcxproj b/src/Screenshot/Screenshot.vcxproj new file mode 100644 index 0000000..1e2906e --- /dev/null +++ b/src/Screenshot/Screenshot.vcxproj @@ -0,0 +1,169 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {24E39ACB-AB81-485D-8D36-749B3F5EC1E8} + Screenshot + MFCProj + + + + Application + v120_xp + Dynamic + Unicode + true + + + Application + v120_xp + Dynamic + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27924.0 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + + + + _DEBUG;%(PreprocessorDefinitions) + false + true + + + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0804 + $(IntDir);%(AdditionalIncludeDirectories) + + + true + Windows + MachineX86 + + + + + NDEBUG;%(PreprocessorDefinitions) + false + true + + + MaxSpeed + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + false + MultiThreadedDLL + true + Use + Level3 + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0804 + $(IntDir);%(AdditionalIncludeDirectories) + + + true + Windows + true + true + MachineX86 + + + + + + + + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Screenshot/ScreenshotDlg.cpp b/src/Screenshot/ScreenshotDlg.cpp new file mode 100644 index 0000000..9f9b47a --- /dev/null +++ b/src/Screenshot/ScreenshotDlg.cpp @@ -0,0 +1,116 @@ +// ScreenshotDlg.cpp : ʵļ +// + +#include "stdafx.h" +#include "Screenshot.h" +#include "ScreenshotDlg.h" + +#include "CatchScreenDlg.h" + + +#ifdef _DEBUG +//#define new DEBUG_NEW +#endif + + +// CScreenshotDlg Ի + + +CScreenshotDlg::CScreenshotDlg(CWnd* pParent /*=NULL*/) + : CDialog(CScreenshotDlg::IDD, pParent) +{ + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); +} + +void CScreenshotDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CScreenshotDlg, CDialog) + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + //}}AFX_MSG_MAP + ON_BN_CLICKED(IDC_BTN_START, &CScreenshotDlg::OnBnClickedBtnStart) + ON_WM_CTLCOLOR() + ON_WM_MOUSEMOVE() +END_MESSAGE_MAP() + + +// CScreenshotDlg Ϣ + +BOOL CScreenshotDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // ô˶ԻͼꡣӦóڲǶԻʱܽԶ + // ִд˲ + SetIcon(m_hIcon, TRUE); // ôͼ + SetIcon(m_hIcon, FALSE); // Сͼ + + // TODO: ڴӶijʼ + + // ʹ + ::SetWindowPos(GetSafeHwnd(), HWND_TOPMOST, 150, 150, 0, 0, + SWP_NOMOVE|SWP_NOSIZE|SWP_NOREDRAW); + + return TRUE; // ǽõؼ򷵻 TRUE +} + +// ԻСťҪĴ +// Ƹͼꡣʹĵ/ͼģ͵ MFC Ӧó +// ⽫ɿԶɡ + +void CScreenshotDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // ڻƵ豸 + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // ʹͼڹо + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // ͼ + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialog::OnPaint(); + } +} + +//û϶Сʱϵͳô˺ȡù +//ʾ +HCURSOR CScreenshotDlg::OnQueryDragIcon() +{ + return static_cast(m_hIcon); +} + +//---------------------------------------------------------------------- +// ̺߳,ͼ +// +UINT SccreenShot_Thread (LPVOID lpParam) +{ + HWND hWndMain = (HWND) lpParam; + CCatchScreenDlg dlg; + dlg.DoModal(); + + ::ShowWindow(hWndMain,SW_SHOW); + return 0; +} + +void CScreenshotDlg::OnBnClickedBtnStart() +{ + ::ShowWindow (m_hWnd, SW_HIDE); + //ʹñڳǰ + ::AfxBeginThread (SccreenShot_Thread, (LPVOID)GetSafeHwnd()); + //::ShowWindow (GetSafeHwnd(), SW_SHOW); +} + diff --git a/src/Screenshot/ScreenshotDlg.h b/src/Screenshot/ScreenshotDlg.h new file mode 100644 index 0000000..eeafc8f --- /dev/null +++ b/src/Screenshot/ScreenshotDlg.h @@ -0,0 +1,31 @@ +// ScreenshotDlg.h : ͷļ +// + +#pragma once + +// CScreenshotDlg Ի +class CScreenshotDlg : public CDialog +{ +// +public: + CScreenshotDlg(CWnd* pParent = NULL); // ׼캯 + +// Ի + enum { IDD = IDD_SCREENSHOT_DIALOG }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + + +// ʵ +protected: + HICON m_hIcon; + + // ɵϢӳ亯 + virtual BOOL OnInitDialog(); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedBtnStart(); +}; diff --git a/src/Screenshot/res/Arrow.png b/src/Screenshot/res/Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..de10c4fec3624f66f125edb9f70eaebaf9a127df GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh@3?y?HWJG`zTYyi9t50U3{G+(9;_^859JLUg$U)d6%VW@tpv^1&eof&Hlmd$g{_&hL!lvI6;>1s;*b3=DjSL74G){)!Z!prfaYV~B-+vcyA&`diKacNm0leq@-fsK7H- zjh9ESd4nX=p@7Us3}(G5(k*8NBouBb)U*lky73<5U6FJ`fq{pI!Sh7l%!+{X`+QaGJY=BRQE0DgmFdT>ym)QZy6fg;4 zL&V{-KtYH&8VM1H%R-ETs9~D%Y97!6*^(f?V1{E^2aRp)p1%7mc2D6~ZFUXYx*!dY zOCs{CRToA*TU0L(RG8uE;uum9H}|xs&|w80mq13gnFo`fEiCFZa& z_-9@VDhen%vwG6He$Vb3`i5&;;vVgts_`pr$=;uzUn*`4*<^6zcHb&KhBo!9mN`H9 sW7a*6K32<6vAL6dU*)U~&tJIf=a;Z)@~}-R1lq~q>FVdQ&MBb@0AJ^UU;qFB literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/Circle.png b/src/Screenshot/res/Circle.png new file mode 100644 index 0000000000000000000000000000000000000000..65c875e9b35fb7abff9f4f2369e90e91d6aec23c GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaG}Yk*IPE0Atlb%aRt`PaX1fBrxJ z`2Ebimx~Wx-Foic;Tuoyz5YBUHjW)=5PwOKUogWfEpCs)@;~k_I#qD*eqqow+Z8~m zcuyC{kczme=TCAq81S$JWJm4J`u^|#a;ZQs1-X(wexbB!@)NIRz*iR7% literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/Finish.png b/src/Screenshot/res/Finish.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2d5bdd4ec2347f982709b2dcb53ab80350aef9 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh@3?y?HWJG`zTYyi9t50TO#(LM!8};@8MHowh z{DK)Ap4~_Ta;!XE978JNLQicJY)}wjIGD=Avyl0g!mm?y3rxH>vN$^*GkkQ(Hk$SL rlRYbfU-u|Xu6W7+_1};CTnya*-?M+0Qhj+IXbOX;tDnm{r-UW|-Hb1+ literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/Mosaic.png b/src/Screenshot/res/Mosaic.png new file mode 100644 index 0000000000000000000000000000000000000000..439f937f4fdde543711f54d06c4862d48e6d1f33 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh-3?!F4n4ALQ1o(uw`eYU^-gg;-mL0nB|Ns9E zt@wLDS>}=;zhH*LN7`1n{Q`20JzX3_D&ppz+s()zAaeA=_GZsNY6ZRy-{M(&Uzskk tN0Y2Q2WQFT)|oIcd?(`BjzD5Rj}l;UMEmHgQu&X%Q~loCIEF5IMx6F literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/Rectangle.png b/src/Screenshot/res/Rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd4a8339b312835904b85cdf5952ee4ca823c08 GIT binary patch literal 129 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 V7_3;)FxY%t!w{8u!r68W{|isv(C`2N literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/Screenshot.rc2 b/src/Screenshot/res/Screenshot.rc2 new file mode 100644 index 0000000..bff2e74 --- /dev/null +++ b/src/Screenshot/res/Screenshot.rc2 @@ -0,0 +1,13 @@ +// +// Screenshot.RC2 - Microsoft Visual C++ ֱӱ༭Դ +// + +#ifdef APSTUDIO_INVOKED +#error ļ Microsoft Visual C++ ༭ +#endif //APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// ڴ˴ֶ༭Դ... + +///////////////////////////////////////////////////////////////////////////// diff --git a/src/Screenshot/res/Text.png b/src/Screenshot/res/Text.png new file mode 100644 index 0000000000000000000000000000000000000000..d84bb132cab7d8b1993fc0d82c68a6ffcf32d10d GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaG}Q-Dv1E0ETo_J9)f{)E|9pedpy zL4LsuuNxk)$mQ{Wk34$O(|VKE!ig3ui&R>gnt%#&JY5_^D&lHS-R5IbGby}Y9G>WbZ_g6q7~%tQ0s++TS!SS|d1N4U(3t>ESQpQ=E6 O89ZJ6T-G@yGywqh7;xhN literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/Undo.png b/src/Screenshot/res/Undo.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7684c176c02a07e59adaeb0d91152dd148e1e2 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh-3?!F4n4AKnfhssl zg8YIR*zY*c*_!#I;Y$De6F@<4PZ!6Kin!2TL#_q~9v0C+kMzu!lWWe{KJi$0^S;(a zPK&D>CY<@QTschb%qf+vf9J}%`JFtvY{kX>x1Ar&?>zRX&1XXMpzjTjGg!e_n5ZQbIM9z za%`V>V|$6zQ=!R3%n$nPNzam|KudEd=%=d5ZdXl6QrF)TBTI!4m{Sn1uVPFq;7P4C z{6}5R`7IrD(tEpI<IkC|#1I-cvjjep>8wX|M-c#Lre+ou@U5XQitbERPJ19|w(W~>*$ N_7!ZPg&mxrTVL5VsB8cL literal 0 HcmV?d00001 diff --git a/src/Screenshot/res/brackground.bmp b/src/Screenshot/res/brackground.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2f297f06667fb1a11b6595063ccccfed3373c78f GIT binary patch literal 154934 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 cdS~`MuiNLV80Oqm_zsBn+a literal 0 HcmV?d00001 diff --git a/src/Screenshot/resource.h b/src/Screenshot/resource.h new file mode 100644 index 0000000..8410a85 --- /dev/null +++ b/src/Screenshot/resource.h @@ -0,0 +1,33 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Screenshot.rc +// +#define IDD_SCREENSHOT_DIALOG 102 +#define IDR_MAINFRAME 128 +#define IDD_DIALOGFORIMG 129 +#define IDB_BITMAP_BK 131 +#define IDB_ARROW 132 +#define IDC_CURSOR1 136 +#define IDB_RECTANGLE 137 +#define IDB_CIRCLE 138 +#define IDB_BRUSH 139 +#define IDB_MOSAIC 140 +#define IDB_TEXT 141 +#define IDB_UNDO 142 +#define IDB_SAVE 143 +#define IDB_EXIT 144 +#define IDB_PNG2 145 +#define IDB_FINISH 145 +#define IDC_BTN_START 1000 +#define IDC_EDIT1 1001 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 146 +#define _APS_NEXT_COMMAND_VALUE 32772 +#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/Screenshot/stdafx.cpp b/src/Screenshot/stdafx.cpp new file mode 100644 index 0000000..63e7f24 --- /dev/null +++ b/src/Screenshot/stdafx.cpp @@ -0,0 +1,7 @@ +// stdafx.cpp : ֻ׼ļԴļ +// Screenshot.pch ΪԤͷ +// stdafx.obj ԤϢ + +#include "stdafx.h" + + diff --git a/src/Screenshot/stdafx.h b/src/Screenshot/stdafx.h new file mode 100644 index 0000000..4d4711a --- /dev/null +++ b/src/Screenshot/stdafx.h @@ -0,0 +1,57 @@ +// stdafx.h : ׼ϵͳļİļ +// Ǿʹõĵ +// ضĿİļ + +#pragma once + +#ifndef _SECURE_ATL +#define _SECURE_ATL 1 +#endif + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Windows ͷųʹõ +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // ijЩ CString 캯ʽ + +// ر MFC ijЩɷĺԵľϢ +#define _AFX_ALL_WARNINGS + +#include // MFC ͱ׼ +#include // MFC չ + + +#include // MFC Զ + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC Internet Explorer 4 ؼ֧ +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC Windows ؼ֧ +#endif // _AFX_NO_AFXCMN_SUPPORT + + + + + + + + + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_IA64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif + + diff --git a/src/Screenshot/targetver.h b/src/Screenshot/targetver.h new file mode 100644 index 0000000..93f0450 --- /dev/null +++ b/src/Screenshot/targetver.h @@ -0,0 +1,26 @@ + +#pragma once + +// º궨Ҫƽ̨Ҫƽ̨ +// ǾӦó蹦ܵ WindowsInternet Explorer ȲƷ +// 汾ָͨ汾Ͱ汾ƽ̨пõĹܣ +// + +// ҪԵָ汾ƽ̨޸ж塣 +// йزͬƽ̨ӦֵϢο MSDN +#ifndef WINVER // ָҪƽ̨ Windows Vista +#define WINVER 0x0600 // ֵΪӦֵ Windows 汾 +#endif + +#ifndef _WIN32_WINNT // ָҪƽ̨ Windows Vista +#define _WIN32_WINNT 0x0600 // ֵΪӦֵ Windows 汾 +#endif + +#ifndef _WIN32_WINDOWS // ָҪƽ̨ Windows 98 +#define _WIN32_WINDOWS 0x0410 // ֵΪʵֵ Windows Me ߰汾 +#endif + +#ifndef _WIN32_IE // ָҪƽ̨ Internet Explorer 7.0 +#define _WIN32_IE 0x0700 // ֵΪӦֵ IE 汾 +#endif + diff --git a/src/snatshot.png b/src/snatshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c294714ee67cc9b543b5aa939d0d9597f0256ce4 GIT binary patch literal 48691 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 z zQ8INkGt-|X!_pY3nh{zi5o z9Go2S^Z)b$2=)lP?-3B};e5o^Ww4J5BOGcFzHqXL8qoVdS^C=|c#h#WjmlDJJUX1@ z8l1JNMS-JK+#rj6G@E@arO-g!^w38BP**;kslWBHsr9j=BN4xZb`BW)QH4lffY?}+ zRBw~QXp_WXmCWSp`?^Mvu?Xv+q&>k;3Anq#xF`H=Fx4*$k-Z2VDZ$)zjqqkM>}OG| zBD*W!L|UWR9aLC8E3tf5rhe8US-^xKM_?cd!)7jr&gP1<NJD~lMV`+!(frdg>}QZDYtxLUan0)E)! zd}~S{ivC%wv>L*6{ktQn)UKCX=3qHDzF{V(>U^^Lbdv4M49l0PEkAGKpXoqt{uGbi zPqsEBY4qm}q}=aL6PQ>g&*p~C;)k-ghpbfRbde?yYbo?MDL&lg`EX3A9z?Doy}wm5 z%>vSeD{{Oi%0iqkXwH*Hw}@ON3e=4wdyH@7;YalgE)hK_3jZD(f1sqBST7h-75|6- zA;aRTnNp)LQnzP7p@YXnw_yUY$PxolJ7xt4;_Vh|ZAC>BM>%W>IozHAnG`h5F;w=h zB;t+VCu)VoZ~-T4fQhpJB-PT{c}x6dt5g{J`oQH5F-HSTF;V0arX|+VDbUg>?Ntx5 zmuwO>+DIRX*fi4pWwZ{s!++nZUDqwt(k#@_%-7b=SJy7q?atrq&eQ&C?z&62eLXj& z(<);e__Xrqa>3F4m7}|!ue)BT``I3(yPB`aMxzmYoNP6Ea*j4bER-glLshjen@6Bb zMF?>iZglzF^8&lTY`eZdm~jZs?sChWUvi6`k68Z#{48Ssp*?;rHsgyJ!uMamugXP# zTY|c4rZR`!N_Q|Oc<^$enqXgHufgi7u{%? zYd>xOwSEg|^}9A(mmP;e{qtTWnXNbKc#?(Ml0I9}uL{`Y6r*Z$3U4hw%$Ywj>e zn%*jQCD4&U`(x>i)^%CSATiDMlamPKhIW%^!D)y_gw3zHYR55FTNS%uoga16DfK(Qf_cK?8% z8_jYa!*Yhsu2$&?Nbw^)eHov_Bz)D{g6HUb^hrCF(T2$AK!#KPj->w0TSzwq2?g&< zqSyuzx)p%ovKB!Nzd%x1tPT>YiIgn8d+cH)CY#9;Li}-Lx&&FGIEej-P0|DD&|{dq zIqoT`ZpXezf_SYzB3yx|b`0UfzxIW{;0uJ;k#xw)AlyuiN)URQ$^IgM^9>ummRSuT z1&0|_2Ta*QcLn(EsbGacbfw8S-pv8AnK-&w05OdeBb67X-YK%cqYegD&9f+V5vdAK z>wU*GOLur$vR?qvsJr9ThWREYX@aVR$Eu6$O?22PeryG9Nj46+^nWS z)ZCZBK%-sUh7Z+$1~oz`k!F2;13$=j$5JkHm`rpSPLWG2A?V09eJ4jw?g&g)kRtcv zld0YR60LsOCx>4CU{ZXLJFZ=z7mlPWMKY7_RRCs;j3WA4+epO-!&3%U*^3#$yXSn* zhv>$gz~GG$tNsK)()8DI4TaKl#Yj#3MY}JZ?XO+>E9TUTXjRL^Rn5vRe1-35{K zRzLBj;r1G5Yk>b6dWManwE##Z^c)v2`nW$BirC4=#-CG#`DgIMUC z$928B$EoG}i?Y#Em;Rog+gew}-IKt9;EWXdD?jVc2x_RfG~filR{`GZ_kn#e4>vJ4 zgZg~VZ(9=M_xWg_)tot(<6~|6wwv1Ww*2;JWopG`=|uZNV6u6CX!7?p*2Mj7Vdnfy zWkdxjrUwuw^G5N<^36g|L^>aU{?<$H& zHlR{>x`f#ZAB6ri1&0)cxaeT# z3!ps-q<|O`C(LVm^G_b;pHxuJw%qB*E>aQbP~a-u7UcMm#>49NyErrY_Fu3jcl$V2 zBusCuk?5weUXaeW%+T1(GJ+I^S!S6K<3M&Ais)79Yct|95yJL<<{=G;u9Wv5wYYBl z`}+*Th&;znf$cbv-AW~JWst2Z(c=ucKb-?XiNGSsT%1Q&!JGkcswD77Tl-HKzddf_ zxZ1yRAXJ_1T4ST4G(=r<7KpzU;hOD)g2$}_r@HOUBC+Y6-3dFJw{Sx)iZOMqR^C1F zVl84^s+fPg{xC69d;HzB2~uPJjoNO8sL@&OCGdzyTmZ>rhD`9RuiMqo&=nyvwbuHT z4qKxNkY`EcGSSazmdO34dJIw-Qv}q2p(pvcE2fi?uDz#^uQ!jci;sPK!*hGX*WpvC zI0m^Y_FWRqJ!vbCfuunbhl!c&eFJ-sSe^*S9Pl7>ycPHrxL%ZHeK>Cw;;~gWpaCi( z^Jp6$7wR{M@W31^q=m{XV%?tsIS;h(loxtZo7Mhvkq~s(GLk%5%+BT^NJ!7@`WdIPm$AfzSV;uz92W z-Ny<&+uL+$4-kpCb4chnK!$t$&*2*cOP`h)~O;8qv7;X3%vh~LRq!0!QhM5F$2vdvM(G(w!g z<}BUV?1lHZ^+9ffj73GTtzP1)`zzG;F6=~L5m>2-I7^i35RV(Tj)W-(REER+#(D&! zGxg4z?qg~27QFck*~vrjJe$~+!gt&;T^EO|ZT0kRkiVUp8zsJ22Wq!{d)?#T8;XnIX~aATf118n z7Kp6&!5sVaWvOz^VGA`z=P2-;z4X0_qJwbmD!&v{Z+U>tED+aS2-bw&e}0+~rnNfX z$^?vmU_h5^jfH|~sdtG^U>zHL=Nx6MM|p_qOpd#dbi7_~ICHWK*fP+erDN?J27xlo zem!*hZS+q)&KCfxs?emkA0C{U=_i5yQr9p54RmS=#UNK|19z@1o4YwO6bL9e(DP_I#=W3VeRn8c;FO6v+(3 zJD3@hO|`I-5H4miPtfz_lAuFuECqMy{&ITzB6bZD4x)Z6!Iz~xWw~q?nN~uGV%ZV7 zHS5egF9Wwez=o{064ChIli9!Dq##TG1^P-)04^{WqKJ)}{(^O13Mb{Eo^H5hia|OH zeb4`X$dPJRmhW2!MuFqk(iF;4o(WiUy$$ZL+{EOEnD6B3WE}N(1&7DV(3|AxzJLDl z`=1`i6!7C^49^%vI1}3*uY+$)NiE_h7R~Jp3m*gM-#!jC9Zxqtc;FkQ8n&V$CKg9P zi*nzzlc1?y5qRYyKAJeZJWm7U?JA{Ey&SxOnL<&G(ri1xWXqwd}-)zy9c)gjHLpmHXH2b`FZiuITc4{*4<0M-v-9-Cs3BsrZ!;nXnpVgTNO z!IL*p*uDeDu)~ofz!prKtqX&T{-cIw+fF#<7%je7tTY~j#G%cF8X8cLbD*mH#oC|( z^ngso40jl2mIHj(-K-KNsEn``_A4BMDHos=2g(D-sPa`&IIElH<`SANfUz%@z|?+* zFp3*){+YBK5qx@7_t+zt%$Wy8J~8H;IHnw27Ke4ub)1N#;}ftHK#mFD>k9oBh>fkT zy?j;Rgorhls+OsvC7%)*W zNt0f7zq@-s@3h{l(Z8SE?_jl({UESNqKvV5N(AqXrtO6rLlJA-bDP$Xy0&Fz$PD^$ zao6L@1rs%BapiAx<%r^2^_W}hhqM8E=(yIBs?7ko+$(;}WYnPt5V(K0R7;r0K z-z}Fp3cLYE?~{luGST>Wi$HUrve{y`$Zp(X&N1Fh-gSf_`gA%wg`>tuqk`|{{aB3H z58&@R4Ui&AoL)eSsh$tPb-L**6XDkD;3{xCPLc)w4i4ui40DcL1K_&pJtPjd^${k8 z=-4oVNHbxtjyOd6_h|jTKgBb|Qqi@SO3Oa7VC47cKy0FLmd)XhSWn#($1pzl_X1?5?4U5nilqkV<{XfYx3$Q4^I4uF-0QX8@*$~H{$A4?U zY==#ZjoGUyq9%GuvgT$*@+5L8mZN(NeM z*>>3&u=eRtSpKE9pPS5Qyu#MUl7i6#R=)dBi}#kA3V%>B$?|GF=`;HV^zIS^3KFh{ z<3=O-DWHS97lowO4wN9jhuswa*V04OSlhJ z&2RU8-3OR@Vp+Ok5=${*sAnNk+g1FsnAk}Ed}gEqgr$AqcTqul#P78?4=krWhJQB1P3o(xME^-gwsN#g-dtYUy{7JU zZl8%HS7tn&ZzwEC2lz}|yuinU_*Lou!j7Qn#IlX?g+*Gkr)zki8f4El8e#n21bK=f z%Iz@1eEwjT01-=1H1k|SVlNicWbYkuYLGF14=-f~HX&ZgJO1hc=ExdK=6*P-25rr* zGx?Eq?@?ll4^b~+>wYlNXm^j;pGM3eN3N|Q&P3pJ5x_GjalIiilDb znY$6IE_NL=bcTqm$Fe z_(Ba6OeHiSn+h!A9Sd2QPc~o6SlCjzv zZs37n_udkDLNBk}qiS6yoS?vYz~P ziVbKZoqXPo!{&eHZiuDO4{~1>^Zfl7=;gG$uQ|hD)2~Ft9aa}!m_SX$q?V1+nD&gN zx?2KYl@@S8%{p;bfU?=e@ds1a^^Lyc<6H2G#uxYlTgOgr{!e^4Tc+&+I>=~#&wca) z-@bSx#3~FA959Bo2}V~cIy{x? z6-sjG1pV&fpZ$s>%P%WevpvL3}kXAZz0P#5!O#9(fpW}pfn`@&s@D~C}BSU z>_|D>yIoWVZF{F7d++Gee7tkn2lF7Uzr2M-(Bh@6JN^>3z021EX#qs41Cj3UrVyX) zG{L39yOq>GSmoDzTTp-GB9tcRG^a^uSSUD5eYaCjX)0%_mNz;p<{Ix(6G^hTI>_)v9X#da^|4i3n+H8f^JJMu z@g^^u4PpoaqK=}w)BE-dPclU^D)8e#968-{LL#lMstXTDooc($mfqWXN+Xg+b|)i#V6O&_G>IPLc0xG>U$*eRqxVHiNZB+hK}%`AwlAIG@dci zSPD-V3_7|gZ!d43{v>ip>4_fY=!L?0+$hccioInOj#QSfJUj6cZV4}Z3(z}KwEJ>v zW48)L^hA&u9$i38!T16Zy@W&_6KDOV!9ZUp&&Xc&6cz5lBXrr{yqFyAFVVSp`0er4 zk`JQ9JC*y0utAcQ^OOH$6)Maex&$dX^H$uEohjf;0tqjWBn{XQgDxjM3hi@XXrBiE z;tnszNNr)%Gp%nCPK8LJRH-rbRsxxkHly&i(^^~>1+UzV>~}{}9@>0?pJ#g*($u%9 z-U_kA`zQ-zX03$N*SB*KJVoncs7-NkdlAfDiZ#(4sa$&Kw`6AaTJR9noha)U0=*6r z#wQ!d3}H#h%MvJw9QD*F=`sa?tZ;x-0l3v1>liRMg*xYhU?#1}Tj{;K9)&v1JvaP8 zpP0eGYenhN22111AeA>q+y=yR`*{pTwxzJ1n}?7_x%Dw1*g`pc>RB$8;~&y`Tcn9v zcOc%Z%-O1Z`Q7qR2YZ_Kr0DZY6xALAVPKbS;qIeEENbFry^~ueoqun@hH)fh> zk*ajqCR(B_zEuBST~^RlTY%13W<8NQJDsTGMAOkZrDBF8-}0^U-L4C3Zt%OALp~{d zo`eSgdYaFl&i9;KJ9s*n3ARWoKaMN(r%gJ!1mACZwU8Y3q#{&DN5Bq$!*jQY5&gc< z|BViSujRwKvR|Zd?OlZuDo;5n);Mz82L}*Y;+j4E^8fQUON;DX$28H>IO4O=rH`>Z$6sZB$u(Ln6}=Dou%ca7v%J zeVezoClQ=-@hQNL0E%)7q>9G_i@F&cPmU(~@v9z-^9jWMY}AAuRmh~^qf8yAMl&S5rqkJ;IX-` zN|x_(?8*PtOb~_#Hz+c4*7&p5;9@ZO>0zpA(&CPk<|Yx2DAl6O;WVb&00~O+(@;ai zf;ANW)^tqHZZ_*cPIEGu<<`r~)d{m<)ME$GU1I-o@0)q_rk-wbk3^9el(I*hQub6N zU~(_g>Q?$MySDVfTd>eC>JMbwlVUCSQwr^vQ%E~y2t{CPanf3!@Uxq+>~AS6Pc+{A z+dF$nE)X(DV#-u~j)&juq?oB_44_lDUN-OAcnzC9OBCKW!>+3NaJpc5MZX>22&*75 z{=i)uCJm4b^AgHmDDu5clI!l{rX_F9dS?U zLP)+AxG>SD{O%TATI=i^^pkf$((^cp?2l+e18?h)A-*9Ww)wgh%;c;(qae+D!5?UpW$yDmae3~s%Bf~+ERYJU zELSL}WLQ_@2Z+A;(Q-zTD{?mG8YT3Z6B)%7fNGdin*1p24E2O=_bm!eUG+R{_@kC= zq#qVi)z{1aWr=zEax;TgElgqT1wjFbie{`KkO2^5b5CJLQcETgZoOOMW>LajISW9K z&_l}><0#g1xFJI?ey(K^uFSM}zK(9b9ygxue_aPSe@#6fj}NG}!(bySj3kIIy@Ivu zW)8X9)MoxE)`5CAQC~s02o^yYz~?_RwVCz(d(2(c(44IL+&kL9Edh>Zwj2hTkYz6> z%5IGd!6i~mzerE1gEOa-&29W{Q+p{D?yZlngnZlVUjfDm(>R1pk{_R>JBiKIw_Ki% zf$t01Lel5Ad5w=q$?Wo%H#O@!xwF#zv7SEyO2J{1t0akxfRPTsjsTzpFx*B&e@G4e zc;Iy{Mk5QXD;CSx++%2w%6oD#wMBL7U0gaGZMGJL7Jy?kz|`W7Tn06gJ0{rhC$La( zO<^w8Je1bk4JVRl+HF*|HIXt=pVi17;oZt+x{Il+YCb#uSx+U zL(j955txDAiXRL^-ZPgn6Ba=&rB&N`Rc%mY=blQBUI6geMLd>Cyoal+j6auBYF#5u zY>5~FJv;`w+FJJQcMD}vkwazR^|6FNawa@6TJ>HLlw7=vPJPk}W>gh!nGzC<`P-7! zrAVjnJaGHD8(5?TcXqW5X(c^g#r5??^%_H){3{H!a`J|TiAca zlL5Zt67Eox?p>Up=1~LKV@)*~#TSbY&AQjTxxc~52IN1S5vI!Vs(R#QGbyt^#A?)g%d+Q{n?3alEWkN!-b|~ST+AWT$o#r#0JImzb=m6ClH^v zmlu%jS+BGt`>^ju5D)kg`BX5pI9Q7p*m2nWul7Zz?+ZEjMRV_?r1R_IBvM9Yi@(0H z-A%U$EF47hPtG#c{0tF64(p!h>jCffpkCdSboja$u;QX6VVuwW!QKRr3XCzl|OAbutD& zMEjzdWoz^4G2rEnQ7?d>v*B%Y6h8GO$)Y=|LyN$kOQ$@2WBivhu~L`Ha1UNX{4MyP z8ZiB6EG>hyI`oEg0PF84NvcGjXYOE`i}7|vBXyC^&kgok$yqq+wrl;wHwi(7w-o;L z0?*gG09ktQs09u-7NxI#qQ7b4kBQ(76&+GMSQoCTpy>y=AHdGK+@C(m`~@0@QA#K| z8Jk}@yKbE`-q=6id-@LuQ}_`P*~ z^Lf^Ql#05lfSE3gVk0o#>j_DYBF=+u8uDDB!C9!eJbe|iCSGv)s4ilnibNB151zx{iB-nf}T zFbbYY_P+?CW<68IJtG@<+`#2*PONpnS>a@6O@$g-cb5xTna!HwjVnZX)RM@Pz z%rg};I&Mb~90|*>q%j~gnn|P(^)?l&YT~22S%8?UJyR^wW@$qfNQ|-hF(uj)hhukB zqzv>2{U@&ID2KX2=J)}r^P9zb}qx@`uI*@?JkK4*SmflCO(x*eQ z$EwWxZpt(;;010N)WN3$dF?x3eZ_wL;(0L+diasx=73lqtz73Jdk657ib`lz0@KE` zx#fe|9u60UJ$2UWSr1O>T-dc$K5~~o^ju5^knFeW45PB&fXtK7NWu;PA+K?H+M8y8 zUGswK#0E=hzTN@ex^He)bozRG9rvZ5AHh#olql2Qmz@emT2sF)>FA1t=yLW649Z88 zVj60U_6tuBEoZ+M6m_{46%S+$4Zy+&-nvAn ztlWZ^KYzY+Ih#+Uav>L|1PH-ca~Jui_RFe~3kEtShIS^yIroAUNQ4w@1{2<)OaUd_ zKG0P2u^>$cXG@@A^TA6r(X6kV*l@b!k`5d-s}po8jlXC%1^gsCd#!IF<7#ftN#^PX zEtY9hrug04ecj->|3TVBC4F_MH8#Z0Sg^;@ce0r4mI&>1^#Js4LtBVsRbWR15#!~& z_&M*z*>ttue;syrv=g>4np7JF-8zys{C2Q9eoD9t?Z2z(9`*+4;*KG2ZXlHwv@&X$ zWtKEHDt-C7vOaCLlA*Jd$6C7T-(>%?fox5~w0Dp`tQ!47)YXklf&lS(BjwQ|RE!fb z?shI>l*_kiaYzPeW}WYZpo*x`D6x#UnW(4Y_XfFTiF2vZyU?8%+`uwAYa#PXHWCLK zl;8dmL-#u8Ux<9RG}8_M@Z^vj&f`c}Jr&Zac^W~s40(O-pT2oO(daD4-kj>6!#maf z4Zrmdy6%$YexBpB9E)-6X|I1Sz3U6$LUSU0AVb3z8QezQ?Sj6;Oe+Sp(ijMsFO0|N zNjXE+ke!_bVvs)Cl917&+%GIo#=|f!aO{}zmZcQEP*T00)6esSsC1wC`_oq(W->zt zFb7L921{|&X8=?vBY}e(+||t6wWn#X>6-X-l?pKW|NQ8$%_Z3fCLF*10nKt|Ektv1 zv40h7ViBS+nf5|Cbf$)GUt2Um{kQ|`hs|;pNTnEFU@9r^^k)E~Z~8-SQcr#+af;7C zNq)-())HxLVWZ&fr_ds)&_bOBx+nFmw_h=D;IL@mw=ZBc{6^(!)acg=3&5salc)^L zH)*i8HJV|}b`f>&ejBD>9>=TGSNLbMchb{DhUy$s44%&O72)0b0{f-Shz()Qr)arz>tgjQ&gv4qTjF})S!c0!=X2Ken+;%L80ELxmQb&jn zKa-Y}p?|6G&?^99x)1h60g_+kndR(9%x1yJP)PySS-25qSN+-ffpVxx3TU|3l= zWD9U!&CvE`VuZNuPkFgVmIbigv{D~eE5Tj<)3?Lrh})UM4jPfmnde)5fR`}T;tBdh zvft6~uZ4=P>Pp}g*~IZ4<=~Af_H8{ZzOxLC(G|+Us4vb+WwcJ$3Q>J)=_6)%YO}fn zLY*hRrpbDVr}bq9Q+#Fi1V!v)+m)Q<&JBF!$5`?HX_~g>;b$C^8D!I0__CBRPs=6V$$&Ya+b*xpzo-xE1sfg42m@PFNuWMKL7v*?rRf zU&&XKzh22z+~)oSsfJS*+#?q7$g6vN&gGop=^ad<%`x7*gMQa@qm;7pA{cP0QIV>GH^kNd+D+y5Yudylpews2BB^XCCJe)o5qo=FS zefmfcc1asy>UH~7Qs3(>CzB_-dMr7COD&*n_xk7YfotQ%N{`E*2C5cmY{caX2Ekn| z96Lc&DANYiqy~7FSLBQ0NvEiFGQs-23&il5lneeuq-$ksdvTy?n{!s%npclLSD*s5 z&3wxYwDpT&Y%5Y~vv#=7&$~I~8*Zt!ZjISMrqMvt+ucDQ^mShU+pD14grM7+r=w*a z$)s0iWyG+29DBL;5GAjov99Z)y7IXbg7FKWT_Iqe=><)ey1xSOk--`2tM&Z-IqNcE zkH+!fM@1Qyw57D)p>~;Ojk2t@k=l*-^`l{V;3 z{4`kFd+FT2BmXh>my)eDZ5ZZ-5UghpT8UV6@=WMmE=8KC;vptO5U2gMu$3aS_%#K2 zllu-eiZ*G*aq8ki6Uq2FDU(6`b5ZtzrNk97NqvQ`>|p(iOvV;K@KB7a{DlFtSM_hi)g*!*11@# zl-m`$LI(ZNXL~PtK7q6}Z{`FsyOFRJp3xX};mF%_O6_fZp=Mc)?Yy$Jtg-{$oG}ej zEIa<~@SbY+aI-f8K@^K zctsArO1>c3aVqnBAu%>P^O+YH(_|+7MZ;^tgsc`<9V6SYp{7^zJJ^nWX+TCIslQA} ztB&RODf2qOoekyhJ&Ys^gxlAr&8Uc&33%8F^$f*1Rnu&Fxm|^sV^AqZrA3NZ_ocut zSjNPq#!JsM@%?>|kgYhKU6B`{#0J&V9j;_R7S@bGZ6{)EM_KE;RKDBYblClN(JCmH zLvcgj0#&r5Z}Ms_pHy0zA1%`wM+BwzA@lfhRQw=yzbQ9qtz zS_aj+gkexffR7sLCTHi%>%j`n^VJ2y2b690JK)X>Pr1@vB`7yi>X6!`MpLERP#IT7 z@uwcapTh3cZ=UfrTlWi&GQXaL7^D*}e;i!)d^sk*R zy>ad}3?v+WWp^-VcLLK?=1FytwHk1s1B9Ac3QF9;uiS!R3+wE2OO#B2niccntNV@7;n6eq$P$i^UoTiM5M=m+A0O*-s019zeI5Q~z?<`H5y!fI8^MKd z-ASXw$w33{mH^moh0=QjvIA`O{Fp9S7CKZW4&I#l0Daw81RiZc4a_EliP{U%El-LU z{;p&zD^xJEh+wfsA1%qrmom)MA=Ubn`Nyums8P$>%H<}^IZ9TMr#dgb#(<^aI1&@; ze}Gn>U!H{R&OG3?`QD&mL|Oke)eQ1rnDkaqV`$#*%jUwK>t8XSO(29bc=!FIzL#;C z&pEJBh|i^&m)zZ1h>y?Et<>rcjJ1bD|0(cX0nG=+i+wHW#pC`kgmtvd>K&m#XJ%FT=D5VFcY!xdihWGQOnaKa_eJ1N9!Z=R+0gg zZl2F|k%ss~O<<-E`K=>u#Ut`9%GyrvDHg^i3pH+2AYLoPPN3_m$gN+w&B%gHIKFN3 z;l<-6*5^)R!;>?oNCSZY;X&=c96pzMv%X3e2EB{PnFc<0+^ZS}@WYwD(Ka@TQ4s;5 z5ze*nvzfOY#1PN>6%3ZV@Jaw$$HU-;zwl5=bzE2_}i#-7)q$PsL11zW`h}qd(C0>+L#x|AtjhK zCnZ;+sLIAsAkSW)$X@!1Fo`v^SitL!ptO%$%cedpY&4OG^n;KJ2Y^; z@HRH3D5a4#7snwtqGCQz^XO_2T6!0o=zzzRtDCROWFrFWd%y@tpE9}mz1P?8kDWHoaR+QI9qX#f_$mo1dlF@O^4dIRBEFn7dA%R zgCB4lToL}>{pdmbaz%DQ39{7X(7~_rxmm^=74beOui358>90P8Cn@ZI4YT|jR+t5; z_;XR>;BM;BkjE<6!zvieI(N@{yJRjQZqKXZ%iD{aX%#-o-My2#alv+mGJV@|9w{Uy9iZ*k zD@MZjGrDnNP zD;$fAFD6edXN<38a4n}GqV?p)_e%U902jm5syopI#$)JM~-NsBs6t#z7Sz6HB*M{0Y!259t2-_n){=MAx|&-n@a z)`}h-{dM)~bew5zM}?(QewL5!rDqdO znbud*@%{E7u@@m}(;HoDthpeVEggK7-dR550`rlL!j^90a*cT1)DvFUqX;{4xJbtk z9*91xTrf`5$w@558yuz{9F`m$23nc7)l`)=SB-j9tzfd(y@y5J9sk~24&Q56HNMF{ z8?US|pPH>QJJjR9w*9$`z0njLv{(leb&{KW;{R3u`5j2*uf6iXQisO?c~%zuBfLiV z&ZX|+z?QnE?p(l;-noUOE^YjZxBjXuO4aauLtf`=XbKJ1>j0-xl!7u8vniCq14GJ; z1>6`k<1U8N=s#9*zXU84{?@!R|A|y)a{G?q_MNUMX)-Q;rn{D2-Ww|oE#Zk0@+?5} zWMMKARsClH#KH+%oO;$`ihffH$DI73Rr*Qy!D=-ez>Wj~UBW$mJH-yDmD1`SZn|;9 zLE4IN|IcK|B_GC7Hp@6H+T0{>G>EEwLw2DjJ-cnBIS=dIZE90ez3zt2$jUGH3|2|XB z8TQ4ud5Xh&>FZT-9>p;QKij$&54F0_VV!wCwY;G0se3f?I-q2z=3HNZOGrIX>e@Vj zMb7a5e1C?;Nqm!DPmh5Gh&@ALrH<<*PXebM?=tuhZy{BZ!YKQN;j+sZkDSqqcZ~h~ z&uZgW`OJFHoLkeGxvo!I`z7M4%lD%LI+RRJVrs7NhVvdbm4(*SiARmlo~YO|?>A+4 zn)*);DpNOcENvV`w?1FHdqZlY2nNI>>wL)U?rsb3Hj471N`H!lg2H{tt#0+x*2=!( z_{!ZLn|2xilMKu9y}&G)HSa+=BvOoO*_bsw*G2dTq+*veX2(hs?Huhvlo|Q8j8BQ}v6G$cK zB{81}|7Dh(qZqH(3hm6b)uz^EXt`eAY{XO^b8o~+2=fZtm|F8tB#Tuj++ zUrDO?)#=l8zWu>oz7E^s<;kRS-S1+!lGYO`b0kjkQ{Z+#e=lWKE^?UJnkMJ3 zaVK1&au2S5I}u>pMCI0qWz0W996L8cuA(way=m4u2=WVk9SisK&k{Cw2tsP27_BH3 zY~0^Sw=p(ZDQB4899%D%r!|G?H7NvNr;*P&x&9S47FqAX<7~p97cp0d#7nxo($irM zB1<-4|J$~no`ki4@t~z|=UX7bxY6w;wSaY3!m;TflDTkB*4cW<&`~uPF>1nT!gn}4 zhWVIA-vZxr&${}aIXd1RrEUsg^u{ycxux;0u+Sf}@bZgZzV-6xbPB9SRq4LTbreZ0 z^bU@eau;if(Uh`~wCYN}))Z1RloeA}ej;FP`lwF)G2WGI$mTj6h^xY+Tm=zBcD51`MxKik<-W92&vR^hFAKX_edL=f`en`4dAdCCvgFl zyMP?^6)+>}r;8_Jmzxh3Ct;S&9EEqS8#eEdj%o36J7pz`+c$uWGN>@4+Z*D9?BhLJ z_8mqUKB|HP%NpHMB)!(bHaCp7<=_IeG#cU)+P8eL0tp&*KeQj1bX6>d%h6w#e@+m* zXtshWM$*{W|ZF*-1j979R?Bkz%{#iBzY^`=^9yY~ij<5^@&tY>^2a|5i7y)ooO>k}Z|TF7YcB106a20-c#@nH z{}THsFhV4im@nga_UCK^XMZ_ouBWl(Xpb{iNpZ3(3;o>F`uXT5fYZO~J%Q zXDJt)X)gd^y+jhmLmI*OO;Ikl4J7N*Q?qJoL_;>!WKRB4dRjz1h4L)Rj~1dv_2Z8O z{%4@xCn>8>UQVBMjmP@$vu5YBex_s*5b?=4Ay=f;mkS1esuHYqwX%MiuD@S}9MwXO zTsxR;(5dyC0v;7DW+iXxdeTFNn_{(nelA|;s4YcJ%u{}x5sw`|+Xx@|z>O2Qq@@>c z-I-BbDykJMnw;**C4Bw6PW7|wx8=CSTTPWtW4Ws+#_5>Ms9c`Uc71;*WgLf_u&kTH z$eO~?NHB=6^>2Hx<3pp-+kfDHbGhM7GFOX+_7a03rZ2!_VWNi52bf@7HL9rGD|bm0 z#}vVred}t5CtuYKBhSlB@OT%%+b#3Kf@;tzzxT{Op3qEuiCI>LMktWPvF=X+; z7^fO&`0g)d|J=Jv(O3AjV7z>zhJ{c3Q9ZiF#>!c=_pFiab4_ZFCEsLbd{*Cl7E@xQ zQs9OQX$})9(-mnHcR5>3O+32PaIi5Eh0vF$v5G=8t&SoJ^s;-PU)oJv2c?f+##0pt zfOmECfp3v=%6Y}%D}e1rrV4*dGKAhalpcBpWf!cz_uvI^P>fyKIV@u}U~6|bJxADA zdWzvw(PWGbcND^&U#US!@UvK85WreHp%6w9#IfchHEv<0S$Q7@T1?YCGyk5=caf7lSxz=uOg5U2nX955tfU=$9Xm-B zYrK-N(8e}{mv%6lqM!y%BM=U#B!7p(XNpI|EV9TQHS+TU5alS92lMx!RC|MM91j z1@EOSCo;X83aP9$SZL{0{8;6l+C?5jYBI0>J;qstS` zg+7cPTho?YCZ{)XUp7rHxaA{Qr3N1~tAqn97w)YW9+jfcD))7(umUpzY0u|5Sf6v{ zNr|sG`Bri4P+{^gV^iac3qTDuFc+W~1ijhS|WnoUs^s6Mv$iFQTP|G#wfXb|LuiB$9Mbc&e z^RFqi{cj}o|1r26|SMZiP7%3p(Q1L-9{P|48zHzNL#cflG4bBY_d) zWAp)KC>-+=nVvKtHU!5Rua@p}Ek3s_pS9dJLoEY=0+qA1-2NH-MMx--=;2@)^k9nTEd7{6y%7dqyiH_U$(ZiJG~JfIPw;lxtG;np}q4KXD=7kHuSx8@sD_Mu4>(cb?>@!rNY=}lt$H* zO3K&A`5Dw#Hz9^-N&*xw3ORlR?d8j848MWJC8S&m5H8)SLj@XP$mt&N0jv3sgx@iW zho3|-65HrjIm_5(u`Eg#MfuDIaNyU&-7G*g1f?iC`WMWXyDvK7h#n6~{5{HcIgo>* zToXg~Octh3iJw&sgzE#BQPGKr3%e0;s+#6ADfiT)>2GUn{m>J4w7C-;Clu@|Z~Y+6 zNb*%wgt*A_?fV-EYvF*%UlFGP1o*9#OY(x_@(S<}K2&m@tCJ||YVMj$KN3Lw2^}W@ zwDo&UtO8hGJ~O{%x^Q~J;z)G`6{rB(Q>;b-hxUNW^iYmx8pddMKt57P-U*|-+G;zY zM-t!+pwiE$@(0ISp3{a#Dtf+3aO&M`>~s}b^3wDpz9`_y7CS>2Bg8Tq=k zwjh_O*aN5^1f~Je@w3)}4P;^i;`EsTynwPkcCyV-TcW;NRnn|k|4Qq_ZlqBGKYs9P zFNVL`r#R@F$YD#SS7&UJ{GZ$ACN`4rwv@HPNhY%Xo0K`@yy*BC3;39DjOO-jRF z`=-`;vNk;9NK2Hui_6KwZCl%I>+0$4%C)`UQ;a{HvTgZ!L#j7NW@Jfb#5qWrZbTusk9lF>)eH&myZ$w3+|XQ3j&|8xadNxDApPHTPkYQ3%X!=}tX!K(F> z@stR@R|ny60C65vw6+rgbA~W|Kf=&9iq#6BB)X-j8BAJqRgGw{2LkLwl_FF2+L1mB z{=VMjEGGNI+^5Gy3^slSlN$iP^Ai6uDxH6_lhp~o>2+Q9jb(cr8jTBnNS^mK(4FyS z6t%B0z%D~k+&YG@5ayDhyXa|;h=RL=46+tTpL-UdDf~>+R3xa;`mdvxnCw$X@p08w zB_&aQApgGNVi{{<9_|<;jsH0J#xzUbKmL z`4i@6E#%$+=TeC_fK!p5w{5)+;htV-GqQk|2t~B;Dh}nAfzNX03Fh{kHr0FLw}u=9 zZ{4sr9qX{HM=GlLsAQpym_K?j{I?~n0oA75-Hq;YA`)C8hOfQ>50GitR)-{lh6|Rk z^{|~iu&5&p7gNlBZ_8iCFPlz~#u_grTP-A*KO6ZxM`7Mm`YfH<|GJ3D_M;?fpb*{g zsD?!AZ*x%0>v2`5rkVw=Vyh#6#6mam=TQL>U+QB0EP8w}0_9+R=LEd!0reE1K?Z!k zyMf0zhCti(8c-Rv1R_tM50GNjn^3Zm69koFyuy4TZ{ekJo}SY$8Qejz=E6ZYE}5+h|+DCk9I#AzL|;cT8voQw)T8J zhKBPbCGLElfHw0VZa;S!3Chae7 zxIF4#`)OxY_ER;2MolupfSdto@j-XLj}KnE24p^E16l8PvN;8a|7z&S`3h|Z^&Dm3 znDi}QkNWzcA?U`Q>ccjmj2!06!)@zEC4F6M_k5;|IKRdZB*=vZIRe0QlG9Q!{uP)? zw*vwI$S*eg$X07Ww^7^cxqA}9hc*VwjadIrMaD$=NFK z9{j!-_wgDKGUn?r8)pZ#??FxzRX0<>;|86N|;XxAd)KkgL)p2S^jOvOf$KQjD1`|NrQ zml;OQ{_t@TbTF`af#T23&*|GpA{dxP+2`m008OgRK9T3IKqSK9$?T>_|49Av>!{H< zEF;O$-_;@7^NtxlLiuuH8iH#?CUy^zT3g^UV1MuvguA+%)T6wVR-!_S?y&_gxXZ90KKwd3gMz7K#M!s)_cY=DlA5j5-Ra8N)(Kbye zKxR_>EnXj@S6kW^0bw~0GD`OQ#6DmEG}n(T8Px0wcpewfCHM~tJkF#VI(!1llJ=ee z0p&c=v`)~O7pvl3Aa)ck6Fbl6P8~xBVuJ~5<)$AiAb{aFLy=W{O;U@rfTVxu;(c1D z^M8ZLcL>acsuKeHFS7K27~1D0CTAze`^MZ58%_K_z-8vqL;g?2{9gz-acTVzGIiYAK>v3|DIo=O|B#Wt z4gLZEkXS{42vA=b`iu*z^$-FTba`Pd(%d3z zZv@_}8$!M^01!RT$lt1Gs|h}J2!pjf4z>*q4dH@6X)S&}Yl-e!7cU2w5wjzqS5-Q=~LIeGfflH}=BT~t?!B=WZ%jIHn>Ymdc<(B_%?ss(uLA5n*0QP-tGUU|3RS;htyQRj zs@~|)m0b=|l;%%PS|oGEGgKXAz#oMg@}s|2<6u5%A+#-{epq?j_&}-mY<7q131#s| z>q~k{KRb&KeId7zke#GV^c1P6NP#7&_g7hHO!BtZs`SUJwcxE}lw@1pMa`D{1xLw@ zkJoSZ7v^F*^!9G`2Y!zoX%2j|t=cMECp9WCe#)MLNBZ_V(_3RL0mf5W9uwb1KYOoL zhW#{MX01PBEc>y-vd4x3K7hX5hTZXj8) z$`3R}ZVFtA1)kx*cD0F4lZqQW%sWxzjbg*q$`?*^ujV5P&L#ttWTK8(3loQ43bD?o zhTby9X4&u~c93_wobi2FKdz*KK=+@3|7^P*v^fZ$zP%mnk(1j%li@f4*TseO+k0^S zOjc-&$+@$ed+)k_ymGh|HRAv&GrYUO+?p=55q~)MZn50LY|t2ff~#NS zjOtd#p4=@u{Z-Pa9@CCaKT-r zx(7eIzs#O${VOPCU?*h@7A|=Vf_V0~>iZ;ZD6Nt7U!FgQ(zRjsKgXYMJ$Ou6vc@0t zEw)nYi&ydWt2iAB0*aY7`-(j-QH$_!3^K4raqicE85x%QS^L1NpbU=_Ew2}vFR8>e zmO+1z-(F?H2OlrDfS2~86kQ2sRAP!3OKQz)6z;GU+sHJ9Qx=+xBelub2^!RsS!Zuc zUnTN-7S3mjNPO~p83UMl7TeWY=pEeT}rP z^ryJ&kpW=IE*t_##wGGOa~k$r-lP&g>4w1EGR^>83BS(vfJ6O=+4)K@h97Ryn%-n4 z_W6yi=|d!x^XqFlb+T)Ln=%!-KWrN;&k|cOL-Y^bnf=lg@;W~zh4@g1odY^}LoLvs45Yh^L6>jIU44_Mo6I0yI?aTXE)AOa|s2UF!=MY$ip)U2X- zYrcwLJpfqKlfu3qYmpwXT>=c+X?E4oCkEHoEF!q*0j~%2XmBLc1F|iFU4sBH`3?w- z9^tei-(Hu5qa9ud-##Eh1PDOH&{T9a=f8A|xIzpU0C0+^8j5)OPpl*OC$5kpb48Nb;b%V01e&$9eKY zT}rLUJW8zsPyclQzz?lB>ClH)sBI^EV?gPk$sqE1Yx{D=Hsa~!v(G-x`pdp4s_9rfUjZss!G}Iz)Ielc@Ml9W$wKQD<-Tu7Tvw4sb|fv%N1 z4{XKD#7XA;E&xKSqc48eop;BUq&UBo;7Md>$$g|jqb(9LGixq3$>n~_wUvp6{UtvH zRj{#eR~=j{opj1_YlSwT@w%Ks!cy#ej%nfjUda8A{xc)xjTVHF)txK?i&C20PFgQU zgca6-mIQ^~u^A>GUYN~`_HqdgQ^4O1j#RJ24HhA`G=|^L9l5(hZ`z1fnp(ttxgJ$N zQ8O8fz_`y(iaA7>&H!3>YF3AZ>n|l6ViO{*{+=LGhYt!v9XQBCiQE&?K@wh`f#(UR zm1yYSLNcc*Q<)y-=*@3TV1bCpd8rlW3$MaHaHt|gcm}V=-ke1&%Dba_cW7JAVCDCRgZ zDq=EvGJLm~s32tTnB|r0cL+>kU}VmTR8Z%r?=4~=)hC@Ha)B(?*+&)Q1Lx+0}yhNiOKwi&mx1OZ!j-F8GXpy%fhLA;HaMs4F&Bu(V zy{itt|Flc7eu%)hG-Sk|`RQzKujiZUq2^tC7$`C1tRkdhEzG!+fX?K8f}XjiH$cRl zVYGO+oNCB@6j?OY>be?XzuP4`hU!k{A)*ojRYux<7`Vb2{n#4!TfiYIMs_qRzf9$} z$N8wr;i%csr@B>}x|;*#_s)7*-gq-8CMT^}KMs&+iFVe2;Z15=`5^}6&)Fhd26yrx z1h0N+7J&CC#6^5xBpMz4s8)~mQEAVBl-bMZ?Tx9%w9kigr|Uo>)EYa*K2_3}mx{Kd zU6nyP;)s5sDiU!!Uex*uzD;b23bFas335*3u6YX2+yGW`s^}6)An|4{oo)l=CeD0E zKP6w<`L#KH^2uBkDZ`RY%w=2j_CI7q{s7?A%WltXZF2Dr{a5s`kX zmiCdOeqa%C!(%b{2J?V=?iPC%4~Tv~$~gK-&XMBszWzZ!)zaIna?Lzx-*;Vpe(Oy* zNlgm-fU5LCb)|cMM@c5acxZ}56xM*~l@u4Ljh*QMu;ksRIpxv8W}W7X5E zBslu^d7yF9>@$atzR4!HB4}Z>iUE<$VRUB|*X-QRl04$X@4MSCDnmd+C3Nu?lcF3y z`Da=bn(Xm6O#+Iy6WStQ&K4C%t*UARs-}s|*+z#_o-e*`Q6M(&!*kmCIivO=^cei3 zIB|GB)y4$AWqumx%v?JBvnA=Mho@3C!}JaVA+2fJ;Zqgw$*>g!M(QjSr+3!NUm}>wT+7*XF3iL~e37){u~d1vK|@j+%?DiYR4-p2t}Vy zouaqg9hfI2{M@bNP&LckZ(Itl!`$|RsCV%2OJ3J1=R4I}zNq$P0ozRf8J0kL!*917 zh-eSe`IR07CU0Wt;q3{NP(Rn)B8ZC+cc2rQ$aL@XIj;y)kBZO`n@)ll_8C!9kenf@ z=Hq0)Dm5~hl?W9T4^upe_%W+6DB4C?^0Zh?Rjb#`Vw93fg$SiI7QhxfI*xf_4Ib(} zY9n8!TyZ}w);oYGpj23W{J=t>)i7w?{;F=QV?>vLD#+kxH_v-DW=|CNS43q4+)4?44a%p+vHgc^9WH(v&XfoG zc%l+WqKJvm^dbPsX_Zx=)c{DhLHU}95qsX_J1W}upV&g=wH<0Yf1?h!f&$oQ#zb)t z`M}8H^Z!sM6uA^lz@;Xj)K5}Nm;E6KQ%9yhYf=!RjBpsDqSZ4FX39GMQ7jaB9|E;{ z`!81iP6@{;wnUgBf@G2AKuAL2XjDZ4l)jH=HC8jr-Zy&x;o)eBOXwNw#oR)x#22R@ z$hvo{0Yw^R9sjK>8|@Os6%kv#s7$#y-Wn`M{vTbk(GY%6Obd>$qZI?flRy~Xe|X-I zq5(m*Xp~-1qnF4Se-Oz7%E~YQq|bm#^;j003vwN zYv(#$*sZlSr*DOE*lva%5B@1hHt&QAz0w~MH8Go%{A*k(S~G%|+)kG18K^ckJ}+I> z^|m(Me?M7vdb~)wS`pgtEs1zI&tV`q%Z}%{8t<=;_pHd0iQ@nDakQwx^%qw&{B}#R4y>%Z(+yAR&lk^4v2YWo zvFBU8Y1Wm?=1X5!8(NC2!y%(blxOmUw%zM#^F8X(#-}TTve`*LmyU#@?Q*z{?1oyE!$Z>(E0g|wp6ys8Xb=GYEQS5f2#!qa09Jz@ z>6gb9I3n-z%yMV<{N#r6y{)3PClYP(({PzSc)EFdSh;Q4+c`Y5ZEfO{#>n6r!vn#8?%BqBj&=FL)WE-E3>D3_7x!0Vj2`SNKd~juu z^+89XHe?kjo8<{h; z?-CF_T7L6HqI#=EnqcK~BI;zTc0@PX5eBtj7goAIom5 zUtt6UG!}b>CmJ7>AtybCOoP*wEtg3pagd(00|Spk?Lxre=p9FExsu*E5d;rmQ1$-| z>e}UVqtNBm9HT9f=y}c4P*WM@W3Qc!uhn3y*wjS{?c=UfK9@fK(>A|vLn(fzWCVl2 zGuyWfoxAqMT>k*nTIJLBfc8b&ImLum^Wx&qR0~~Yx~A!OsHMYIzzlsU{)of5zqK)9 zt6w^bZ`r1f-c2jB-)wGP>bCk6@P)!VyB2sZmo7&0EEg;Td>nG3FMaXTF}&^JF#>|l!kFs#A1`>fXwp+3*OD_dX8Zl0$X z$6N_R;yjXzw0a0_Qw;K4fuB7|7|_pRjM_lIJ^|W9`RNE`zy{Ni2v@} zC>?k1d`DU2M=n(pe_te{^hHN0%JFy$)^`Ue3yhyaj#C#m+7jGk^f$U+n&8e@)EfHo`Z$8truJ))u#YrRiF zl`KOs-u>=Bt-fTgNBb@K@zHsZgp}=>Z;!AJ<&bvN)!iyy>4*N08H32%pfJ)q4K`1e zT6G>u3TQDexW4E2Uv;?e%i}xBZskRd^SG>u=c7`jM|0S@)wl=;aQCPGA42~UY(2OOXrI~XSLcN4_K3m{J*9= zDMwY~zHIx|=bKpNDi1hsGENCo9ncc+{?1Z9jr$ETxDXuvdya7zYofjTOY_~`y9^mb z!aiIXjZK2w*mxaPCAa4ZFO*NYM|^PW`sxe=`#EC*Q36_F@&O!L@K3Xqh{r$+ zwpgOqy_pk(zSR3zg`x#f1`lKiv<4ml>ui_q!{zo2?;=Ap$;*SElDhPs-6p^oC3YF~ z6u6FXjfF5qN=WURpEu6Df$y)UsTv|~VQ^5e_cs0UVo8d|)uZ_OuECV`uuGUQGttF_ z0oU;5RC&wPy{v|e_DfN35$4Iyoppt-64R2)oLleo>X|&^jXgdHZmb6}wWfc>I+F4o z_h$)X%IvE`7vzfK+AGT0`lg1j9ld}5eu^eztH8$^L+#DFsi>uLgGh`GwM+DiyI>5R zji#8)PqxkZL5gz1Q675HX8;b-9ZCeGjZxTNY!53Ze`|CSL)(lT-HwHS;UB zkkd`S??pc3UVpp|+AZL-E5?KQZ%(}KR1*Clu>AGvolV6m)k#4eUY$LVQOD#SG~Z8= zb?5$=BUx^GMC8knw1!KT-Yl8xgq3o4TrB)hdFn-!qMAPwGI@cwc=gy|3Q+<%wy`1_IeZ}-X%wFc%Y4%L*_ngbh#gdBW2T)>34L7%m zlgq65Bg@JLKdAE^?@crp$`zSnu0PsR&oQEK-jTM>kuN^aF?)GlXdaU8axY^SaknJZ zyfc`klNmNlqY%uxAS*ibp}ZimAq~!CQL{u_P~mpvz5Mn^>g$0f_UClN-meCzPO5gj zzhKo7Ra(L)`yt=CSZg#`Y3vz$Lv!X~L7krEn~{hPc@5jAcSqTK&7O>Pbv`VdZju3DQ3zCrIg;kM+~?aW7zR-JEySWbA;}chl;6D zx;M1+a^R{RW;Au~8;!#F7S#|64P3riM1EVD81`9-c)+g)JEj&P)1gW0+Ps{2PW2X{ zJ0T(YAiFWPY4G}A&A2!{sCmqKi(OciD*Z}n?CN{&UKm65$)r)()RpsB6w>&@>H%|( zCGjBCbCvUA#rG(CG9GSy+%k0?SFIS>$DULF?0XM0nr2_ktr7r}w1pjeN$36AcUp=) zemnQdZTOg>;}y{kIyT0xM*hI8&Uf&<`$w^8{9A_G1o`H`@ltz0_h$F88T%zqHg;Q) zM`)PvIUR^Gj#1Ju%#19P1UTcS9WfPK)lM6uMFGN>$D+6*IIKX#W_E8IbkACFdUY^E zMd%ov3K9|^6~STK?Y=3YZ1d++pbQ)!d^#un#OQwGgZ`%IkPPrL(h2m55lsC-KSl)m zH!x`tG89JO5Iq@60Is-g*YKK7o*a3c6R(DQK2r;ks@@GAE3tCh>*PNsx!dx=Q;@L$ zYNXi1I}2{!7q+XI`0m`%IU}SDXIYXvC}FODg)Eh=pxWHBLrqt$J>N+3Su-6~vl505=T?PWzhuZbae%L2It& zd)|eH#s!{;W#Ql-Q9q*P7Lqb#e}!zkU{-v-6w#&>diPbdf_6;3@b`?gpNF@z3f<2n zRZCE;$>ImCKj`Gj&6u10>Gi(0?u5$T4WX#NN#!|7&A@)^WArVC`}Aww%&uG|&|_ZW zIq)`mVHYHVHxO1xzgXkHlxwh{{m5Y`Ft|iT_oDqmObWRm>LheDAv{{54-mGk8l$PH z&S##%%`Y1K&*|--p4@3;33fosrhbdT5nT(AdA%pluHoiTA^*EF(^(A{i864u3kkF5 zEYcz<$uoD0A9WgHw#Pjo-cxkmdABb~F?DZ@Jq_COd#O{B=er)&Lw~I}VaYBENH{gS zUfWf~Bgq*lx64#PvzB1n90cfyunw}g0KS*>x$T`**cXC@tBv5`5DM^B`(7Q^_RBRKrua zx@pn(DW-p5(cy)g%VZNo%m>Nzc?aFQ>OHeZ<=NH@^#(^sOkO>wD`@+G6`}yRU%F zXTk{G%c0{1Y=kgm=x>7Xd=6uD3&A{IEXU!l^k#fYL;Ed}steJI*#z{lxw4D3rVC}3 zl$`cy`w*+52E&?8n^${wz#7hZM0H6mDBD@~Rj*PLq|)KD^L~=IHmj~1_zqL>@|Thw zkd;sZD|a~I%B{nD(Hn}sPu0h6s-+0qi%_{#f0h3oJUDfIq#vap1IPS!Yn6kvy~b(1 z^G=V<`4b&1mp&Q#^h2iTg(viW6J+raw3v=gc-dAM9NJg!DOxHiv-G2c>sQH_ig64! zmSdv)FP0n3ptND{LR7Uteh3Efy1Ag0jot?x@^Sp^fADgnk#-sYL{^dTRzb{TTR~2k zu54&(Z;}8mg5>_=SQ4WziS<(nh#qA@g9c6J0|-yOLvWWD7ZB4wa7d@ ztBVN93;D_3nXP($rs9a6cazN5wx8qGQ|SNFIx;ddqUP&V{NB9yL*ScLTPkX3>;n@E z3!ld(^^1aV-Gf5zrSrba7%+I@&N+{r7o#fz{ZxqCQ<#2kC<{7XMq~2;GsE}Hn2N6n9|T)@*IxrifDacw#%*E zZ5fa{9(hc=weY-V^`vUQ?lWpT_S+9BSB+T>oG(%M5pE3+3{`^W7RW`vr9QhF{|Q}& zaw?BD`Eb4_-i<=1hWbk4PWH*PSNlL)pk(3V4RFi^9oJ(W7+KdFIah!J znFwAkleRqJMN=vmHazE9e&}Sm@U(h&)x7~C7DhHK=|e~MMS4LC&6aYQ5OuAggwMy( zkp@P_C#DB4OR~{oU#3NsWm>qgdc62zV&S21&AUISLDX8SGnMvE&?Lo-Jg{eGvvfSR7gX60`PCYtrdEN2U60>b68)8K|<#`jsuuggD@!mvv? zo@|45Tt0QYJ(#RKASNV$$zR~cYw%m0e2mrgE|nk}RDG|7)GTn(?~_3z;9#&NG}D5dqTm7iul^42?sgZTB$Ur*AGM?!_EZPAr@R^a1;S+R+6e=plG9Oe| z2>sZOWolYxhR%39Yq`jE=vsk+mYBhF0Qq9WMd_zVON z4Q$qDhZZx$_^tItm&Bj3(9>ULi4hBQ{TJ$BnI+(NfM^2vCE#}~G{#;6U6yk(IM_%J z&%F3UfB~P?=Wqh09ToTlN+b>jsl6$}VZ*Xif5zIZg1!JEpZ?7q)}!U5D4t-oCZQ#w zR4iSEW&|RtvSv7AC_0|73zA9%)W83q5z(qR_)Qaa95~`i{@MuS35S@g#3k=nEKu|b zc;-CZ33!M3UCXi5F~t1P7>nPxw_9+=%S&YUZ_CHioO( z#Y^M=S&{U78+7RO_2LE?%bEcp9q2=jAo9QhXEtzG7zQKr1x4%E^R>WgJNJ4EMP#Yh0s!>(BEC-h6$LE)3}FSKhf@_M6(glrN_m}mVx96);& zvZlJ$GTEegr83EKKlF1TaBwH_!|wc*4l(DI!WwfmVtQMxfGra^AhtKbvXsI?k}aS3 zDY3YyJCr^7kXZcvn;)_-n1>uGFRMi;v$}ve0Q!alQ~i~4$qgYRx)Nueb8Z^4taSYr zD8Hhlwz&)Yr&p@(j{stfO68)rw>QX+Ob&geGINIaS6M?vaT@S3F{i{uZYUJW*w{GG z+bj$Emp)aKgaehy9iZV|&H>ky{*~$e?uM=;w@$o&|K^0p{Q%{G2^L}poT561eghCt z-`JR$TE!oD7FT4*1M0;I%`L&nCCAXB!Bc$ z6`YuuxXy*{U%7{m>^kc-e9U@||5+sG_nK|_(9jSib7yC#oEd*LA`W<8o$T)39>BH$ z`Zx{FP{$d53ySKLxQ6~oQ&Lj$Jy-|$QBVL%v|KLFPukkrY?iu$(p9SM=h`7H4^#j< z?6c&K@FEH{`Nsxh*vdJOr7Y-Mgt|=VpGU!u_1;`gq2~N6E6?YD{Afr@`qJ-BNSN}9 z>0U#uj8}kgk#fWsWY#P)A)|2SW|3#RsrECC3z;2<;%FtnNU%zWLQYE#Lg+~)fth^# z$R7myuo@c{Mn&heYdzfixrTrw08#x?bs7bFmiNEbubK`}QVD1jS6oU;N>-M?6w=<_ z9wpXb=1H28WKd{lOY%)qlOWMoSN|#Xk-wR~vpbyYw?EG87R{ThPa^-U6C+4-jT#Pz zQ&Z=TZBY9DDkvzZt`_3w=Ra2!vwdNnF{x`u`cVxk(DCi%6_+Z(%jYSLkF#Fp6v%oT zkY3wM`CeZ;ePd=>mo9>1OE-KBV(aLM9>$lDl=PN%I0CgEkrL}5=mBTcefukRpC<+b*}&;Np#+*)g%80-2)hQgt#lQcbmx^qX^3TVm6$-Q~A z+q>;$sKvs%bW7023GGac<_E=>(q;vxPl@KjBEy1j!(ZvaK6}SY;#ZI$-VHKF32g14 zFCNWYXEJ)D;VA1bx_1O}^he&qHD~Dl@!@?M)cD8uj>6Q{n$GAwr}Szrg)F*NVL;yl z?H0i6M)>=OhxQ*omJ}BL6m}E3RD5px;-{YV4;jz_=;lqX@H08XjIw5PzKD*dhl%m^ zJqGJMV<(S5Y~Z>RewE7;B8wFx>uYNCpR2ybYd7b9x(z0lt$}?NZ!z?amCa*&=BawC z#lFi4F)d6gw&n12H_huu?t1^dDk7f&+($bl(ak4b(+#s257qwhr*N~>)% znWmJ&EHhcne;3iQlUiOw2Z3%vbki#aADP>|IlX`P%~u0emq&M=4{T2F6vx#=9x!Cm z2l{KaoZ&S@OkIH6H^KP@XJrVa?IZ9U_B<3Bih&aF6OzNIZ{4~@OG`faaCl^7q^Cz- zS(%c8?!hh~pJi^_XRA7~nct$*y<^k8qtksNGZF7N2(7Z&dZRLd5J`|P0PEATHjCY_ zf0|ezrfbLCk2#NJ5!lk`!jbYK}z=hmqY*YLrdbv)R>9=W?9fPe69hrB1L7T1 z)vhncELZHhX27x@gXS%qro7iTreBBP+yB%(0rF61XY|rHxby`6CNHNQNXxp{Wmr??Ck8An3#Hd8z8gZ(82<2OD9Sy z&KHF=7`4_m{_TD7l>#adz>upicBtH7)}98X&iaYFFU5p0E%_bYDd;%g;w~!r945{} zIkd)}eOde3$Lt}#8|K~Kcm+BqY@9ohsr{rP!fqRD_3hFK!So`&vF+@DY& z-JAtiRaG@W0PC`_;MhUW^|H*v8LM8S9g%iT)^AZ7$FjVf=SCB=?e zKvpcTg5n2tO-xdYl#)rPBtJI7&7T~8O4hcm!JP0xenR zl+D@dYwFLcWwpN5li^mV^DI|4mGL1e*drn`J;3+SYhDxr^;}BRy#oAq&>~#yp1to*P5ipXw+r6ih6^7UtZr!~Q`5(>>w{ybO}Vw>EmU zL(|7Tq2ztHOQv6B7=-_Di%P6nalUTS+Qq^CM8PPRB(nTK?NJbLkfx=vx@89n0a6D- zt!=c@5*S!!1ElNcQ=9WAOJITTSz6nmuf>+K3ZB{08iqn)T>BD!S=(Q-xQ2p1_Pvf6 zR0;|Tiwx07%CcDH4o@Q@07M2iwkcOP^LZB_DbA7#iTJVlp#>FeS}#v*de9*`mfE1fMu<~3OALn_g z917CEHqQmr=Ri%;ZO4>a%>gwZuTuYNfv0$d?wyW$dakv{vl z;m7%#PQwd|pirKie8!dV05)-8s~lDTT8H|3V9by{JUPS8UmiAmx;IzET+#oF!*OHA z1@BZy@6gPN)S%>$^xNpquBJVjv%@cg`%lzO+x{jlfp+s?zNk)fKBqk(Y4?IEu04B~ zZlj&%=X#(y;2xaY6MQ$`KvJ94%Yk>xUsSx)bB`|IMsc%Z_$$S5z5MQ~*J@)EYh(ya zn*+${(d6r>5Ndm##KLlBOE+8lw~0aDNC@C$5jsPL_TQ)rS6)?FPlx1swal?l=bIHO zdBVre+G-P>nf1@oB+lforqRV*Yzz9zjzeWH7t4{> z*3YBN3f**5GqQD?vl}FA6gsj!b*yY29YL?zeH@BG?eEl4(*27ovjyW)Q>7MxjUy-P9_icFCpH%M<+;=wt_}~&YN_wo3?PbM3$=BAo(e`du2(vNeS(J zoQI%{LCv%^OWtSRM7I1lD|gl3DXYmzh#l{Id6(5|l0tRRyk3BFuyfr6PMpU`2qab4Y@nP< zYaE&xq@DQ|(DCu<*>7o#%dDrXy$Em zu&?R0sw`fIW^F-on&|MKF(GP$>072xcV39Os%Zq+G+6ReHB=wY2F<;fUP)Vtp!vmt zA61oiZ*#<`{^ie?a?;%| zM0~H18?GA%4;)yv=2QGRepLX;TZxcnP3x5m@MzZIdZKw6>iA!pj1-K^s(AH#**>kK zu>TS?I(W~hfyLTxDrg6tG!6jIjh7SfCG`11sX8V5xm8FI5&|(xqQ!bhlWvrL_QwF zEtOc|r}p=%vGKaF6t%gUMj&)YH)4L;2fQkiWSK|`>fkerlM7)9t|#BEd$lBfZ&93i@!}5i9@X`o#$O@( z72ajtl(y0}R@SQL9-`GXy17%v z@YnxkVHnySbhePaR9soVrn(Zq@_Y{uY7B}9362hnabo7JxX)C<74k;Rb@67%V2Q2m zfq?(|N75a>=@XoHmrl?hxk_rs$amQu-1om0A3d1<-NDsTe=kPpJ_vLx4O$jJYluW&kuW= zLLIrIeAshu@dMf zal+NVy)cylMGb3#l_XzG~w<0#&sduF`RhY0`IyJ8o7ZHa9Cp2G1@t;rFa? zr>&-!jHE4h86qLAPDG^=JCA)PNf|3fA3-gddN|r1*`xoaXjn|J5Jrci^XPaHWb6=@`>5hlZn>y>_ca|{K78JU& z11PKeQz)nG54BaJAGGuLtV?YEEfU%a8EyyH1^y|3$6{mf+))H(>;i0~Lq(Qevp)xE zScr}CKEnl&5nxMjY9X2p5cX?T_$c%=SoqtPI_wpvxI4F2P74O(HiGJL@BNN`la4C+;5eYD zO6wjwB8~bVtQ1`|1BTS=IezzV99XIZ!M1lqaFTkB?es$xv(P|d^%ufY#y~Xd^`Zq2 zN%0Fhl_0P{2Tb9Z;L{Cw?1zAt<6V=R%&%C3CD0DNVft-tLlhX3~{dCj)S#U=Q0c*9W z*9rOanrg$qttuFHNmxj598N|-Cyd~>%ok8QrT<*C4a$RhF=6;-i~Y+xMJ=mb>XxYw zH^FC8NldX9J|Z=OAb=zO>n0b$dQ_c!RK62WHOG4LCu?*t{|AP3Mj>qr6>+6B0OsgF zz1l|T>N_WtxCJ)O(59K0*B+5{?HGKvaYVX@D7$7E{fM=AD~NnRj`KFM%o6iO&98V5 zzHKk<^|kXY@g@FWEeRcfyle{4s??{WE`G`i5luYU2EAFYm+4H;h4&cJtmg-u?xSe} z2y$t;=K3KGqg;0n0UY5rlhvFR?5}HyKzko{OG6LOurl|6c6|N+18f~oAe~DO z@~wWze984)IFc8X2>QG3_GK^?ryS|E0Mcu(ze+R}$!(*Vc0kIwg?Q)DIMq4C1Y4|u z+Eo8@t`$IEym(3S&F`_Fzn|6@s6333sit<5SuuQ~4FBWv_7`95zqZsmBhXG^=wu3L zQH0S(jZK3KJi8;604Fbn{`h|^F8zq)o1E(UL&`Hu`PDhd?f+|d8COo8lB4BWSz13f zwI%Ib<{Yo+Z^!p#EW}d!+nd#yP*xMT|Z8<_n8$8^*-ABKB~^Un<-I21`7uU zk)kN6|a!z}l-8T<6Iai#r zI^aqRPnyOVx!hoZnoo3Pg^pBr(Fnx@(8@3OdP<3F)=`XqI4Dft1Oo^b2Pe~_BTt;5 z`F)&t9Lf-DIq_YrM=&V;%%uFX)vv2+od5NWVU9=u>gDe_oBnbB;U2Q16uHh z&M;fJz%g6}Govsa9sOx(^DJrmEPe&=5+Y(B;qym`3!Jk*rTGU^6qDj!u@l)2rXC%4|w4iO4kF)|L_#h0U8K8J|GzR5lnZ|8F_dFc(UhDJ{SS)(nL^C zaF4vs5wu6aEq?!O00?l&VQU@IZ;=s@eCLs;kQH8WFAYZ4!0`A$CJd5qc94hIJ4z7a*v7}F7?uf7(&ov zdJHxA-_!Nsx^&b-b&!U)#DMTDW%gd6C`2z%%RxU>FE2qkaE!83R#poQzHCUBoD*?~uH zea>IQ2`+y{%LOpWe}a%7@Sc}Uad0>z9qfsw>FifrFEE+OMkv12 zCWv4cC=HOLI6lKYNw5NrGz+XzV2`v}up$n@2J@H$3gfm5-1WH|oS@VF?2WmXF)hq0 zLg1(COiR$+UvJ;qe1lH!;Q}R(K)eYsal??|9rRtoUy`#xO=f;T^6#%9Q31D}DM#EK zQglXb?x24Kg6iBzI`2%wVDMbW`px>`??Jo;j|-qnypCEJ&78Gf8jB^fp(<#@kFcq| zExIp%k1)W~O2Zh*F%F<62+r;GY@k_{5v1k>$H*Y7x^Q6xVz6)#Wj9Byu%RX5<`_R+ zBW<9*C|yr5E*St)0BG~3%>7T9>6r<_*$$4N5MYo~z%GG7U&D-%fl9%=>%i$aP+a@R zN6f;vZ+*%P&Rp3+!-D{)1!8to&{1=#U}H8DCY=HrR?`sE#JFlqYGZKuc1Pq#9i}G8 zaG;}b27w8W`mG2iC7?tRp8Ey9-L7*POdm5!MVrsA21&mGJg&hG+yqgVvzSmup~oS~ z6Pv9jN5?;$Z2RPBTiNwuDcAtt6WRuubX?;|>30CCGOZ~8d{_-ebQAda4`|_a7zTwN zz=oncwGJR9u%RN-;E|a~;r4_`zE`z^yg@eE;xnL4ATXy>J@*wV&Y#)$K@A274{&p# z`}_NWch@H>K3Z|`=&R-9+Y4ev5D1kgL_3%_L+`iayX3qX zW&a3ytEEi|Xovd}7@!D}0^Q0=19<}v;^bZSN9^i?GgrOd!(3z6njxx$jD>X&eV|kU zH0CwNx5@`AJ2)gv)Ekb1dJ$KoL%nJ=d(OPj4DdK^__QcLz?K5FqfS3LRw8~<)qzJ# zpw7D^MXkb`z2&ZIJucoz<`&Vu(gB0n(WR|!7mL|hD`8{!dFRhSOXA^AKC-c7p<+0c z>tL3t3zvjTZW!i$eFQetJ z6XC+ia^c%F6mLdrP7j|6-;NfZo11`SAHArWK!zVXOZ{fk_U%Ji#E3?6kVdwPm<2hwn6r(F#|dy;V!oB9T1`fCcTpwPrOxl zuGN$fr-9ZTLTbQ~0UhPXr)xPm+z~lY%>~h+xP5eYj?3%bCAia>sFfLGfs|)AmEc3` zi%}yn93j_&{@AW|0Mxf~X>$Zcs8-^#_d&i;0oN!pHpVn|A1+YD@vebMhai62!0m5e zLa+gATqpOi0mFd+oKc`A%nyos_Uvfw60~_JoJX8`jevlk;20$Uh$|4j{pkCNBc|C| zQ83PRI!x#uQXZVO7UugM{c4I=Ow&^Myzy#ka^$MeF8V#ft$$-cCp1}RFtu+;ZZO&Q z;_WZ4Hwl>v(l{0p%0A>W&!1brILA5U<+C@}i(315{)vRShmpLtZqy<=GFhozhER@{ zg6U1VT;$;~+_{X8Z-*|q%vt!9XoSC+#mZ}GZt15}Wz3{FOe#ls+)CXLj)e8yJa{@! zj_ISlJSgI-1l|`FT(oUyL$;w$PN$P*6_jWm>;!LWHOO?KmG6HOh2a5q%zpVwu4t4&J``%saULR#%)`-1z+K0K zagAQs1Kcf$?d0x`xDQ|9@Ll$pe9lTeHO8l@O_2Gmg$J9^8)Ah%>+#?ZvY0+VBrqpr zj@4za+oj5%C53T-Vbw6d+fo6*N9;E!w*R_ByzKxzre^%rF`GEkIn#(- ze#i$y>VOGWJr2uX1L;HNabMtthW^fY4Srv|pE5Pco}rqL!^wH*@YW|+;{vo|^*S3X zf@^f}=>p<8fk_+~s?Fsyd+2Mha03_-#|+P{taO%4(u9?M_b^PY7piqy;XNo4&Y8SA zJgbr9SH>OcuUG>s9;mf)Qm0AFUu@VcID*D*tL8E=UYK4SL2tCfg(dF?O9g@Dzh<9i z2ScejoG$2Zr}a@?YZFF80Uc9TQ3=DYVu77UH2w@fOs34L2XRu;$7WgnxNl(D*}XcL zEJ;PkEj)Xk?_$&uL-motat_>=?7rGfq3M*XK2(l5{7Cd;0nA&e6GuxZp9}T#1!Tvi zzgGtVp`q)apqT(y==Ea_`~Z+sw2zAA|X%Niw_oUO=Q{ET-Ky0G~Q z*idT66vr<3a|ii-9sv2dzq5^w9%GOnI`HWxAFj9ny~Y915)cMr-w1&VyPn4h024hM zpBbCF_?+(KyF}&!w55jF;VjQ86UGJ7Xa2@JVMeEr-semHp>=(sTHmt^cFY=g4Mv6= zKU|KEL0~9=pb!w_KtJSD?exXjQCgtNd4Ghq?BgE98t@plJy0G^T!|q9bb*zR-2ob? z6cD>3vb7ScNK_SS80R1llmy1%zzAL?;WrwhC)rg0OmB4^ygzp^l%?U0#3-@ut4D&B z0E{gC5R`Ls4F?!^6}Z|9SVTW$mQ@fdDj@Pk3vPgwb6#o!@XFsSMB-Fo!;VwBK*2o_ z762~|%m&wPT%6*v|ti#)sIS1PIw`7;~{sRrlbQGsB`zRz)iSo`i}}0suQx@-F)e$b z$?E_xdwktYw56BL*)2zdgx20CjZB4~Ee-rn9jJMU|z zwmy_~7#65!S(=#%A2tiCt;6e;gr(6*Wcw+O;TJeSv^XxS?y~U57f2Z5}r$y}K z#Gw^J?v3k!WF*^0A(S(ea(*A}@6(%@Jnj3?@$O@k#ODr3I9Q52ur=4ni7+t5mhgTv zT5)wbW6tkCG_0fuF@1z zXrnHz6E*}3CR~)fu8mec#SdHpCzB&|74Rh7+Tcj{f76nJ=N=5z_V&Im7|9$o?T!_m z8X9`ZW<9^02P-dc#s8F-hBW6U>tyDO*!w{~;s>mi}Y$v$-Vl1-T=UzGonLzc2EThG{-)8YCEuyp`D zbu{HxQ&n}LA4)-l_fP3&!Mhds3BAUQWMsItE4JVK`~r!VZ3T+dCw~9_2-FL1Zf-s{ z>aw-73!-oiT;P-eDt&=zgBF}X8nl7-#4=Fg(+k&t<~i#p;Y8O+Nlkeo+rv0@%57I> z8-4HLE_DGngRZP7Km0qx`}8ZDA`Y_X31o{hblj3Z4LxYe8}R}tY)t77B1s)I4Urj~ znwkQh{HWc7nCc-L@!!2Z6q7|GkfwxE{G?)uz4G_P*rs<-KVPN*Wsy;xi0+M|1Oz4f|)& zFDoWqKG(gOcR$QU@sd}qP(4dKhd%-p%;?)_Ui7U;*uDEf55yS;s4EEhmW}K2mu>yD2&aSXDNhlGX(UJt5xHh$ z_VoQ}MO0_K_@(sSD$gRvK2PMKvoJre~zMW25peg|ne*^3iv1&P7mGXlF`QsK7Z) zUHvURAaYP@G*L%qXI>LXgPD;oJTg*-`8(nD51&w>s-dNyTK0k3rHQS{`J=iFspgTER@huh*UQTOpdC*7)7PiJ5uqQ*dKqE*dzqQ;wCT=F~G|fZ2 z&*0Cs+fn@cp4x+mqfg(Qde7BGr&Tpd(|Cva;BFVHVq^%%s_JVbfmt{8CA}KQ^4~{4 zlo8Em5;Q_~HF{N^_x~PG<9FjcL_E$c;!Sx4#wxP>3%q%Ma2W|%rYNQ~Srce`*lP-N zix=8o#dMRVmO(_%+*Y2B)1x-BwymP(pi|r5{LAbFwA|n699uXfD_Y%{c@bpzx#6^G zA>KT5-Lwm6=!_d~>=4~~Z3r(U{_}(cq81CrR|Me{QqGz3hj=)y-@TVgEjLeW=#Q>9 zN6(R7vxZuX*Jg~1uzYN}M*z=K)-V-jJQ4^o*pUvJ)haEwx?&pl e@z4#}c1si3UfrEz