123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- // QRCodeViewer.cpp : implementation file
- //
- #include "stdafx.h"
- #include "CP_Main.h"
- #include "QRCodeViewer.h"
- #include "MainTableFunctions.h"
- #define TIMER_BUTTON_UP 1
- // QRCodeViewer
- IMPLEMENT_DYNAMIC(QRCodeViewer, CWnd)
- QRCodeViewer::QRCodeViewer()
- {
- m_descBackground = NULL;
- }
- QRCodeViewer::~QRCodeViewer()
- {
- if(m_descBackground != NULL)
- {
- DeleteObject(m_descBackground);
- }
- }
- BEGIN_MESSAGE_MAP(QRCodeViewer, CWnd)
- ON_WM_CREATE()
- ON_WM_PAINT()
- ON_WM_SIZE()
- ON_WM_NCHITTEST()
- ON_WM_NCPAINT()
- ON_WM_NCCALCSIZE()
- ON_WM_NCLBUTTONDOWN()
- ON_WM_NCMOUSEMOVE()
- ON_WM_NCLBUTTONUP()
- ON_WM_ERASEBKGND()
- ON_WM_CTLCOLOR()
- ON_WM_WINDOWPOSCHANGING()
- ON_WM_TIMER()
- ON_MESSAGE(WM_DPICHANGED, OnDpiChanged)
- ON_WM_MOVING()
- ON_WM_ENTERSIZEMOVE()
- END_MESSAGE_MAP()
- BOOL QRCodeViewer::CreateEx(CWnd *pParentWnd, unsigned char* bitmapData, int imageSize, CString desc, int rowHeight, LOGFONT logFont)
- {
- // Get the class name and create the window
- CString szClassName = AfxRegisterWndClass(CS_CLASSDC | CS_SAVEBITS, LoadCursor(NULL, IDC_ARROW));
- m_bitmapData = bitmapData;
- m_imageSize = imageSize;
- m_descRowHeight = rowHeight;
- m_descBackground = CreateSolidBrush(RGB(255, 255, 255));
- m_logFont = logFont;
- m_originalFontHeight = logFont.lfHeight;
- if(CWnd::CreateEx(0, szClassName, _T(""), WS_POPUP, 0, 0, 0, 0, NULL, 0, NULL))
- {
- BOOL r = m_desc.Create(CMainTableFunctions::GetDisplayText(g_Opt.m_nLinesPerRow, desc), WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, 2);
- m_font.CreateFontIndirect(&logFont);
- m_desc.SetFont(&m_font);
- m_DittoWindow.DoCreate(this);
- m_DittoWindow.SetCaptionColors(g_Opt.m_Theme.CaptionLeft(), g_Opt.m_Theme.CaptionRight(), g_Opt.m_Theme.Border());
- m_DittoWindow.SetCaptionOn(this, CGetSetOptions::GetCaptionPos(), true, g_Opt.m_Theme.GetCaptionSize(), g_Opt.m_Theme.GetCaptionFontSize());
- m_DittoWindow.m_bDrawMinimize = false;
- m_DittoWindow.m_bDrawMaximize = true;
- m_DittoWindow.m_bDrawChevron = false;
- m_DittoWindow.m_sendWMClose = false;
- m_qrCodeDrawer.LoadRaw(m_bitmapData, m_imageSize);
- delete[] m_bitmapData;
- CRect parentRect;
- pParentWnd->GetWindowRect(&parentRect);
- CRect rect;
- rect.left = parentRect.left;
- rect.top = parentRect.top;
- rect.right = rect.left + m_DittoWindow.m_borderSize + m_DittoWindow.m_borderSize + m_qrCodeDrawer.ImageWidth() + (CGetSetOptions::GetQRCodeBorderPixels() * 2);
- if (m_DittoWindow.m_captionPosition == CAPTION_LEFT ||
- m_DittoWindow.m_captionPosition == CAPTION_RIGHT)
- {
- rect.right += m_DittoWindow.m_captionBorderWidth;
- }
- rect.bottom = rect.top + m_DittoWindow.m_borderSize + m_DittoWindow.m_borderSize + rowHeight + 5 + m_qrCodeDrawer.ImageHeight() + (CGetSetOptions::GetQRCodeBorderPixels() * 2);
-
- CRect center = CenterRect(rect);
- EnsureWindowVisible(¢er);
- ::MoveWindow(m_hWnd, center.left, center.top, center.Width(), center.Height(), TRUE);
- MoveControls();
- SetFocus();
- }
- else
- {
- delete[] m_bitmapData;
- }
- return TRUE;
- }
- void QRCodeViewer::OnSize(UINT nType, int cx, int cy)
- {
- CWnd::OnSize(nType, cx, cy);
- this->Invalidate();
- MoveControls();
- }
- void QRCodeViewer::MoveControls()
- {
- CRect crRect;
- GetClientRect(crRect);
- int cx = crRect.Width();
- int cy = crRect.Height();
- if(m_desc.m_hWnd != NULL)
- {
- m_desc.MoveWindow(m_DittoWindow.m_dpi.ScaleX(5), cy - m_DittoWindow.m_dpi.ScaleX(m_descRowHeight) - m_DittoWindow.m_dpi.ScaleX(5), cx - m_DittoWindow.m_dpi.ScaleX(10), m_DittoWindow.m_dpi.ScaleX(m_descRowHeight));
- }
- }
- void QRCodeViewer::OnPaint()
- {
- CPaintDC dc(this);
- CRect thisRect;
- GetClientRect(thisRect);
- thisRect.bottom -= m_DittoWindow.m_dpi.ScaleX(m_descRowHeight) - m_DittoWindow.m_dpi.ScaleX(5);
-
- int width = thisRect.Width() - (CGetSetOptions::GetQRCodeBorderPixels() * 2);
- int height = min(width, (thisRect.Height() - (CGetSetOptions::GetQRCodeBorderPixels() * 2)));
- width = min(width, height);
-
- CRect imageRect(0, 0, width, height);
- CRect centerRect = CenterRectFromRect(imageRect, thisRect);
- m_qrCodeDrawer.Draw(&dc, m_DittoWindow.m_dpi, this, centerRect.left, centerRect.top, false, false, width, height);
- }
- BOOL QRCodeViewer::PreTranslateMessage(MSG *pMsg)
- {
- m_DittoWindow.DoPreTranslateMessage(pMsg);
- switch(pMsg->message)
- {
- case WM_KEYDOWN:
- switch(pMsg->wParam)
- {
- case VK_ESCAPE:
- ::SendMessage(m_hWnd, WM_CLOSE, 0, 0);
- return TRUE;
- }
- }
- return CWnd::PreTranslateMessage(pMsg);
- }
-
- void QRCodeViewer::PostNcDestroy()
- {
- CWnd::PostNcDestroy();
- delete this;
- }
- void QRCodeViewer::OnNcPaint()
- {
- m_DittoWindow.DoNcPaint(this);
- }
- void QRCodeViewer::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
- {
- CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
- m_DittoWindow.DoNcCalcSize(bCalcValidRects, lpncsp);
- }
- HITTEST_RET QRCodeViewer::OnNcHitTest(CPoint point)
- {
- UINT Ret = m_DittoWindow.DoNcHitTest(this, point);
- if(Ret == -1)
- return CWnd::OnNcHitTest(point);
- return Ret;
- }
- BOOL QRCodeViewer::OnEraseBkgnd(CDC* pDC)
- {
- CRect rect;
- GetClientRect(&rect);
- CBrush myBrush(RGB(255, 255, 255));
- CBrush *pOld = pDC->SelectObject(&myBrush);
- BOOL bRes = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
- pDC->SelectObject(pOld);
- return TRUE;
- }
- void QRCodeViewer::OnNcLButtonDown(UINT nHitTest, CPoint point)
- {
- int buttonPressed = m_DittoWindow.DoNcLButtonDown(this, nHitTest, point);
- if (buttonPressed != 0)
- {
- SetTimer(TIMER_BUTTON_UP, 100, NULL);
- }
- CWnd::OnNcLButtonDown(nHitTest, point);
- }
- void QRCodeViewer::OnNcLButtonUp(UINT nHitTest, CPoint point)
- {
- long lRet = m_DittoWindow.DoNcLButtonUp(this, nHitTest, point);
- switch(lRet)
- {
- case BUTTON_CLOSE:
- ::PostMessage(m_hWnd, WM_CLOSE, 0, 0);
- break;
- }
- KillTimer(TIMER_BUTTON_UP);
- CWnd::OnNcLButtonUp(nHitTest, point);
- }
- void QRCodeViewer::OnNcMouseMove(UINT nHitTest, CPoint point)
- {
- m_DittoWindow.DoNcMouseMove(this, nHitTest, point);
- CWnd::OnNcMouseMove(nHitTest, point);
- }
- HBRUSH QRCodeViewer::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
- {
- HBRUSH hbr = CWnd::OnCtlColor(pDC, pWnd, nCtlColor);
- if(pWnd->GetDlgCtrlID() == 2)
- {
- pDC->SetBkColor(RGB(255,255,255));
- return m_descBackground;
- }
- // TODO: Return a different brush if the default is not desired
- return hbr;
- }
- void QRCodeViewer::OnWindowPosChanging(WINDOWPOS* lpwndpos)
- {
- CWnd::OnWindowPosChanging(lpwndpos);
- }
- void QRCodeViewer::OnTimer(UINT_PTR nIDEvent)
- {
- switch (nIDEvent)
- {
- case TIMER_BUTTON_UP:
- {
- if ((GetKeyState(VK_LBUTTON) & 0x100) == 0)
- {
- m_DittoWindow.DoNcLButtonUp(this, 0, CPoint(0, 0));
- KillTimer(TIMER_BUTTON_UP);
- }
- break;
- }
- }
- CWnd::OnTimer(nIDEvent);
- }
- LRESULT QRCodeViewer::OnDpiChanged(WPARAM wParam, LPARAM lParam)
- {
- int dpi = HIWORD(wParam);
- m_DittoWindow.OnDpiChanged(this, dpi);
- RECT* const prcNewWindow = (RECT*)lParam;
- SetWindowPos(NULL,
- prcNewWindow->left,
- prcNewWindow->top,
- prcNewWindow->right - prcNewWindow->left,
- prcNewWindow->bottom - prcNewWindow->top,
- SWP_NOZORDER | SWP_NOACTIVATE);
- MoveControls();
- m_logFont.lfHeight = m_DittoWindow.m_dpi.PointsToPixels(m_originalFontHeight);
- m_font.Detach();
- m_font.CreateFontIndirect(&m_logFont);
- m_desc.SetFont(&m_font);
- return TRUE;
- }
- void QRCodeViewer::OnMoving(UINT fwSide, LPRECT pRect)
- {
- CWnd::OnMoving(fwSide, pRect);
- m_snap.OnSnapMoving(m_hWnd, pRect);
- }
- void QRCodeViewer::OnEnterSizeMove()
- {
- m_snap.OnSnapEnterSizeMove(m_hWnd);
- CWnd::OnEnterSizeMove();
- }
|