介面特效

來源:互聯網
上載者:User

/*********************************************************************<br />*類名:地區視窗類別<br />*作者:劉斌<br />*時間:20091223<br />*版本:<br />*說明:<br />**********************************************************************/<br />#pragma once<br />#include "afxwin.h"<br />#define ID_MOUSE_CAP_MODE_FIXED_RGN0<br />#define ID_MOUSE_CAP_MODE_VARIABLE_RGN1<br />#define WM_START_RGN_CAPWM_USER+333<br />#define WM_CANCEL_RGN_CAPWM_USER+334<br />class CWndRng :<br />public CWnd<br />{<br />public:<br />CWndRng(void);<br />~CWndRng(void);<br />BOOL Create2();<br />void SetCapInfo(int nCapMode, int nWidth=0, int nHeight=0);<br />void SetNotifyWnd(HWND hWndNotify);<br />protected:<br />void DrawSelect(BOOL bDraw, const CRect rcClip);<br />void SaveBitmapCopy(HDC hDCWnd, HDC hDCComp, int x, int y, int sx, int sy);<br />void RestoreBitmapCopy(HDC hDCWnd, HDC hDCComp, int x, int y, int sx, int sy);<br />void GetPosFromSize(int nWidth, int nHeight, CRect& rcRgn);<br />void GetPosFromCursor(CRect& rcRgn);<br />BOOL IsValidWnd(HWND hWnd);<br />protected:<br />DECLARE_MESSAGE_MAP()<br />afx_msg void OnMouseMove(UINT nFlags, CPoint point);<br />afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<br />afx_msg void OnLButtonUp(UINT nFlags, CPoint point);<br />afx_msg void OnLButtonDown(UINT nFlags, CPoint point);<br />afx_msg void OnRButtonDown(UINT nFlags, CPoint point);<br />afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);<br />private:<br />intm_nMouseCapMode;<br />HBITMAPm_bmpSave;<br />BOOLm_bCapturing;<br />CRectm_rcClip;<br />CPointm_ptOrigin;<br />CRectm_rcOffset;<br />CRectm_rcRgn;<br />CRectm_rcOldClip;<br />CRectm_rcUse;<br />intm_nScreenCX;<br />intm_nScreenCY;<br />CSizem_sizeFixed;<br />HWNDm_hWndNotify;<br />};</p><p>#include "StdAfx.h"<br />#include "WndRng.h"<br />#include "resource.h"<br />#define DINV3<br />CWndRng::CWndRng(void)<br />{<br />m_nMouseCapMode = ID_MOUSE_CAP_MODE_VARIABLE_RGN;<br />m_bmpSave= NULL;<br />m_hWndNotify= NULL;<br />m_bCapturing= FALSE;<br />m_nScreenCX= GetSystemMetrics(SM_CXSCREEN);<br />m_nScreenCY= GetSystemMetrics(SM_CYSCREEN);<br />}<br />CWndRng::~CWndRng(void)<br />{<br />if (m_bmpSave)<br />{<br />DeleteObject(m_bmpSave);<br />m_bmpSave = NULL;<br />}<br />}<br />BOOL CWndRng::Create2()<br />{<br />HICON hIcon= LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));<br />LPCTSTR lpStr= AfxRegisterWndClass(CS_VREDRAW|CS_HREDRAW, (HCURSOR)hIcon);<br />return CreateEx(WS_EX_TOPMOST, lpStr, _T(""), WS_POPUP|WS_VISIBLE, 0, 0, m_nScreenCX, m_nScreenCY, NULL, NULL);<br />}<br />BEGIN_MESSAGE_MAP(CWndRng, CWnd)<br />ON_WM_MOUSEMOVE()<br />ON_WM_CREATE()<br />ON_WM_LBUTTONUP()<br />ON_WM_LBUTTONDOWN()<br />ON_WM_RBUTTONDOWN()<br />ON_WM_KEYDOWN()<br />END_MESSAGE_MAP()<br />void CWndRng::OnMouseMove(UINT nFlags, CPoint point)<br />{<br />// TODO: Add your message handler code here and/or call default<br />if (m_bCapturing == TRUE)<br />{<br />switch (m_nMouseCapMode)<br />{<br />case ID_MOUSE_CAP_MODE_FIXED_RGN:<br />{<br />GetPosFromCursor(m_rcClip);<br />if (m_rcClip != m_rcOldClip)<br />{<br />DrawSelect(FALSE, m_rcOldClip);<br />DrawSelect(TRUE, m_rcClip);<br />}<br />m_rcOldClip = m_rcClip;<br />}<br />break;<br />case ID_MOUSE_CAP_MODE_VARIABLE_RGN:<br />{<br />POINT pt;<br />GetCursorPos(&pt);<br />DrawSelect(FALSE, m_rcClip);<br />m_rcClip.left= m_ptOrigin.x;<br />m_rcClip.top= m_ptOrigin.y;<br />m_rcClip.right= pt.x;<br />m_rcClip.bottom = pt.y;<br />m_rcClip.NormalizeRect();<br />DrawSelect(TRUE, m_rcClip);<br />}<br />break;<br />default:<br />break;<br />}<br />}</p><p>CWnd::OnMouseMove(nFlags, point);<br />}<br />void CWndRng::DrawSelect( BOOL bDraw, const CRect rcClip )<br />{<br />HDC hDCWnd = GetDC()->GetSafeHdc();<br />HDC hDCComp;<br />CRect rcDraw = rcClip;<br />if (!IsRectEmpty(&rcDraw))<br />{<br />HBRUSH hNewBrush = (HBRUSH)CreateHatchBrush(HS_BDIAGONAL, RGB(0,0,100));<br />HBRUSH hOldBrush = (HBRUSH)SelectObject(hDCWnd, hNewBrush);<br />PatBlt(hDCWnd, rcDraw.left, rcDraw.top, rcDraw.Width(), DINV, PATINVERT);<br />PatBlt(hDCWnd, rcDraw.left, rcDraw.bottom-DINV, DINV, -(rcDraw.bottom-rcDraw.top-2*DINV), PATINVERT);<br />PatBlt(hDCWnd, rcDraw.right-DINV, rcDraw.top+DINV, DINV, rcDraw.bottom-rcDraw.top-2*DINV, PATINVERT);<br />PatBlt(hDCWnd, rcDraw.right, rcDraw.bottom-DINV, -(rcDraw.right-rcDraw.left), DINV, PATINVERT);<br />SelectObject(hDCWnd, hOldBrush);<br />DeleteObject(hNewBrush);<br />hDCComp = CreateCompatibleDC(hDCWnd);<br />HFONT hNewFont = (HFONT)GetStockObject(ANSI_VAR_FONT);<br />HFONT hOldFont = (HFONT)SelectObject(hDCWnd, hNewFont);<br />TCHAR szInfo[80] = {0};<br />wsprintf(szInfo, _T("Left : %d Top : %d Width : %d Height : %d"),<br />rcDraw.left, rcDraw.top, rcDraw.Width(), rcDraw.Height());<br />int nLen = _tcslen(szInfo);<br />SIZE sExtent;<br />DWORD dwText = GetTextExtentPoint(hDCWnd, szInfo, nLen, &sExtent);<br />int nDx = sExtent.cx;<br />int nDy = sExtent.cy;<br />int nX= rcDraw.left + 10;<br />int nY= 0;<br />if (rcDraw.top < (nDy+DINV+2))<br />{<br />nY = rcDraw.bottom+DINV+2;<br />}<br />else<br />{<br />nY = rcDraw.top-nDy-DINV-2;<br />}<br />if (bDraw)<br />{<br />SaveBitmapCopy(hDCWnd, hDCComp, nX-4, nY-4, nDx+8, nDy+8);<br />COLORREF colOldText = SetTextColor(hDCWnd, RGB(0,0,0));<br />COLORREF colOldBk = SetBkColor(hDCWnd, RGB(255,255,255));<br />SetBkMode(hDCWnd, TRANSPARENT);<br />RoundRect(hDCWnd, nX-4, nY-4, nX+nDx+4, nY+nDy+4, 10, 10);<br />SetBkMode(hDCWnd, OPAQUE);<br />ExtTextOut(hDCWnd, nX, nY, 0, NULL, szInfo, nLen, NULL);<br />SetBkColor(hDCWnd, colOldBk);<br />SetTextColor(hDCWnd, colOldText);<br />SelectObject(hDCWnd, hOldFont);<br />}<br />else<br />{<br />RestoreBitmapCopy(hDCWnd, hDCComp, nX-4, nY-4, nDx+8, nDy+8);<br />}<br />DeleteDC(hDCComp);<br />}<br />}<br />void CWndRng::SaveBitmapCopy(HDC hDCWnd,HDC hDCComp, int x, int y, int sx, int sy)<br />{<br />if (m_bmpSave)<br />{<br />DeleteObject(m_bmpSave);<br />m_bmpSave = NULL;<br />}<br />m_bmpSave = (HBITMAP)CreateCompatibleBitmap(hDCWnd, sx, sy);<br />HBITMAP hOldBmp = (HBITMAP)SelectObject(hDCComp, m_bmpSave);<br />BitBlt(hDCComp, 0, 0, sx, sy, hDCWnd, x, y, SRCCOPY);<br />SelectObject(hDCComp, hOldBmp);<br />}<br />void CWndRng::RestoreBitmapCopy(HDC hDCWnd,HDC hDCComp, int x, int y, int sx, int sy)<br />{<br />if (m_bmpSave)<br />{<br />HBITMAP hOldBmp = (HBITMAP)SelectObject(hDCComp, m_bmpSave);<br />BitBlt(hDCWnd, x, y, sx, sy, hDCComp, 0, 0, SRCCOPY);<br />SelectObject(hDCComp, hOldBmp);<br />DeleteObject(m_bmpSave);<br />m_bmpSave = NULL;<br />}<br />}<br />int CWndRng::OnCreate(LPCREATESTRUCT lpCreateStruct)<br />{<br />if (CWnd::OnCreate(lpCreateStruct) == -1)<br />return -1;<br />// TODO: Add your specialized creation code here<br />return 0;<br />}<br />void CWndRng::OnLButtonUp(UINT nFlags, CPoint point)<br />{<br />// TODO: Add your message handler code here and/or call default<br />switch (m_nMouseCapMode)<br />{<br />case ID_MOUSE_CAP_MODE_FIXED_RGN:<br />{<br />DrawSelect(FALSE, m_rcOldClip);<br />m_rcOldClip = m_rcClip;<br />}<br />break;<br />case ID_MOUSE_CAP_MODE_VARIABLE_RGN:<br />{<br />m_rcClip.NormalizeRect();<br />m_rcOldClip = m_rcClip;<br />m_bCapturing = FALSE;<br />}<br />break;<br />default:<br />break;<br />}<br />ShowWindow(SW_HIDE);<br />if (IsValidWnd(m_hWndNotify))<br />{<br />::SendMessage(m_hWndNotify, WM_START_RGN_CAP, m_nMouseCapMode, (LPARAM)&m_rcClip);<br />}<br />if (m_rcOldClip.IsRectEmpty() == FALSE)<br />{<br />m_rcOldClip.NormalizeRect();<br />m_rcUse = m_rcOldClip;<br />//to do...<br />}<br />CWnd::OnLButtonUp(nFlags, point);<br />}<br />void CWndRng::OnLButtonDown(UINT nFlags, CPoint point)<br />{<br />// TODO: Add your message handler code here and/or call default<br />switch (m_nMouseCapMode)<br />{<br />case ID_MOUSE_CAP_MODE_FIXED_RGN:<br />break;<br />case ID_MOUSE_CAP_MODE_VARIABLE_RGN:<br />{<br />CPoint pt;<br />GetCursorPos(&pt);<br />m_ptOrigin= pt;<br />m_rcClip.left = m_rcClip.right = pt.x;<br />m_rcClip.top = m_rcClip.bottom = pt.y;<br />m_rcClip.NormalizeRect();<br />DrawSelect(TRUE, m_rcClip);<br />m_bCapturing = TRUE;<br />}<br />break;<br />default:<br />break;<br />}<br />CWnd::OnLButtonDown(nFlags, point);<br />}<br />void CWndRng::OnRButtonDown(UINT nFlags, CPoint point)<br />{<br />// TODO: Add your message handler code here and/or call default<br />if (m_bCapturing == TRUE)<br />{<br />switch (m_nMouseCapMode)<br />{<br />case ID_MOUSE_CAP_MODE_FIXED_RGN:<br />{<br />DrawSelect(FALSE, m_rcOldClip);<br />ShowWindow(SW_HIDE);<br />}<br />break;<br />case ID_MOUSE_CAP_MODE_VARIABLE_RGN:<br />break;<br />default:<br />break;<br />}<br />if (IsValidWnd(m_hWndNotify))<br />{<br />::SendMessage(m_hWndNotify, WM_CANCEL_RGN_CAP, 0, 0);<br />}<br />}<br />CWnd::OnRButtonDown(nFlags, point);<br />}<br />void CWndRng::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)<br />{<br />// TODO: Add your message handler code here and/or call default<br />if (nChar == VK_ESCAPE)<br />{<br />switch (m_nMouseCapMode)<br />{<br />case ID_MOUSE_CAP_MODE_FIXED_RGN:<br />DrawSelect(FALSE, m_rcOldClip);<br />break;<br />case ID_MOUSE_CAP_MODE_VARIABLE_RGN:<br />{<br />m_rcClip.NormalizeRect();<br />m_rcOldClip = m_rcClip;<br />if (m_bCapturing)<br />{<br />m_bCapturing =FALSE;<br />}<br />}<br />break;<br />default:<br />break;<br />}<br />ShowWindow(SW_HIDE);<br />if (IsValidWnd(m_hWndNotify))<br />{<br />::SendMessage(m_hWndNotify, WM_CANCEL_RGN_CAP, 0, 0);<br />}<br />}<br />CWnd::OnKeyDown(nChar, nRepCnt, nFlags);<br />}<br />void CWndRng::SetCapInfo( int nCapMode, int nWidth, int nHeight )<br />{<br />m_nMouseCapMode = nCapMode;<br />switch (nCapMode)<br />{<br />case ID_MOUSE_CAP_MODE_FIXED_RGN:<br />{<br />m_bCapturing = TRUE;<br />GetPosFromSize(nWidth, nHeight, m_rcClip);<br />DrawSelect(TRUE, m_rcClip);<br />m_rcOldClip = m_rcClip;<br />CPoint pt;<br />pt.x = (m_rcClip.left+m_rcClip.right)/2;<br />pt.y = (m_rcClip.top+m_rcClip.bottom)/2;<br />m_rcOffset.left= m_rcClip.left-pt.x;<br />m_rcOffset.top= m_rcClip.top-pt.y;<br />m_rcOffset.right= m_rcClip.right-pt.x;<br />m_rcOffset.bottom= m_rcClip.bottom-pt.y;<br />}<br />break;<br />case ID_MOUSE_CAP_MODE_VARIABLE_RGN:<br />break;<br />default:<br />break;<br />}<br />}<br />void CWndRng::GetPosFromSize( int nWidth, int nHeight, CRect& rcRgn )<br />{<br />ASSERT(nWidth>0 && nHeight>0 && nWidth<m_nScreenCX && nHeight<m_nScreenCY);<br />m_sizeFixed.cx = nWidth;<br />m_sizeFixed.cy = nHeight;<br />CRect rcTmp;<br />CPoint pt;<br />GetCursorPos(&pt);<br />int nXHalf= nWidth/2;<br />int nYHalf= nHeight/2;<br />rcTmp.left= pt.x-nXHalf;<br />rcTmp.right= pt.x+nWidth-nXHalf;<br />rcTmp.bottom= pt.y+nHeight-nYHalf;<br />rcTmp.top= pt.y-nYHalf;<br />TRACE(_T("left = %d, top = %d, width = %d, height = %d/n"),<br />rcTmp.left, rcTmp.top, rcTmp.Width(), rcTmp.Height());<br />if (rcTmp.left < 0)<br />{<br />rcTmp.left= 0;<br />rcTmp.right = nWidth-1;<br />}<br />if (rcTmp.top < 0)<br />{<br />rcTmp.top= 0;<br />rcTmp.bottom= nHeight-1;<br />}<br />if (rcTmp.bottom >= m_nScreenCY)<br />{<br />rcTmp.bottom= m_nScreenCY-1;<br />rcTmp.top= rcTmp.bottom-nHeight;<br />}<br />if (rcTmp.right >= m_nScreenCX-1)<br />{<br />rcTmp.right = m_nScreenCX-1;<br />rcTmp.left= rcTmp.right-nWidth;<br />}<br />rcRgn = rcTmp;<br />}<br />void CWndRng::GetPosFromCursor( CRect& rcRgn )<br />{<br />GetPosFromSize(m_sizeFixed.cx, m_sizeFixed.cy, rcRgn);<br />}<br />BOOL CWndRng::IsValidWnd(HWND hWnd)<br />{<br />return (hWnd && ::IsWindow(hWnd));<br />}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.