// MImageStatic.cpp : implementation file // #include "stdafx.h" #include "..\\resource.h" #include "MImageStatic.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMImageStatic CMImageStatic::CMImageStatic() { ZeroMemory(m_ImageBuf, DEFECTIMAGE_WIDTH * DEFECTIMAGE_HEIGHT + 1); m_bSetImage = FALSE; m_iShowGrid = 0; m_iShowDefectRect = 0; BITMAPINFO *pBitmapInfo = (BITMAPINFO *)m_BitmapInfo; pBitmapInfo->bmiHeader.biBitCount = 8; pBitmapInfo->bmiHeader.biClrUsed = 256; pBitmapInfo->bmiHeader.biClrImportant = 0; pBitmapInfo->bmiHeader.biCompression = 0; pBitmapInfo->bmiHeader.biHeight = -DEFECTIMAGE_HEIGHT; // flip view pBitmapInfo->bmiHeader.biPlanes = 1; pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pBitmapInfo->bmiHeader.biSizeImage = DEFECTIMAGE_HEIGHT*DEFECTIMAGE_WIDTH; pBitmapInfo->bmiHeader.biWidth = DEFECTIMAGE_WIDTH; pBitmapInfo->bmiHeader.biXPelsPerMeter = 0; pBitmapInfo->bmiHeader.biYPelsPerMeter = 0; for(int i=0 ; i<256 ; i++) { pBitmapInfo->bmiColors[i].rgbReserved = 0; pBitmapInfo->bmiColors[i].rgbRed = i; pBitmapInfo->bmiColors[i].rgbGreen = i; pBitmapInfo->bmiColors[i].rgbBlue = i; } } CMImageStatic::~CMImageStatic() { } BEGIN_MESSAGE_MAP(CMImageStatic, CStatic) //{{AFX_MSG_MAP(CMImageStatic) ON_WM_PAINT() ON_WM_RBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMImageStatic message handlers void CMImageStatic::DrawDotCenterLine(HDC hDC) { int i, j; COLORREF clrImage = RGB(200, 0, 0); //miniont for(i = 0; i < DEFECTIMAGE_HEIGHT; i++) { for(j = 0; j < DEFECTIMAGE_WIDTH; j++) { if (m_iShowGrid==1) { if (i == DEFECTIMAGE_HEIGHT / 2) { if(j % 5 == 0) { ::SetPixel(hDC, j, i, clrImage); } else { ; } } else { ; } if (j == DEFECTIMAGE_WIDTH / 2) { if(i % 5 == 0) { ::SetPixel(hDC, j, i, clrImage); } else { ; } } else { ; } } else if (m_iShowGrid==2) { if(i == DEFECTIMAGE_HEIGHT / 2) { if(j % 5 == 0) { ::SetPixel(hDC, j, i, clrImage); } else { ; } } else { ; } if(j == DEFECTIMAGE_WIDTH / 7) { if(i % 5 == 0) ::SetPixel(hDC, j, i, clrImage); else ; } else if(j == 6*DEFECTIMAGE_WIDTH / 7) { if(i % 5 == 0) ::SetPixel(hDC, j, i, clrImage); else ; } else if(j == DEFECTIMAGE_WIDTH / 2) { if(i % 5 == 0) ::SetPixel(hDC, j, i, clrImage); else ; } } } } } void CMImageStatic::OnPaint() { CPaintDC dc(this); // device context for painting HDC hDC = dc.GetSafeHdc(); // TODO: Add your message handler code here if (!m_bSetImage) { CClientDC WinDC(this); CDC MemDC; MemDC.CreateCompatibleDC(&WinDC); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP_DEFECT); CBitmap *pOldBitmap = (CBitmap*)MemDC.SelectObject(&bitmap); WinDC.BitBlt(0, 0, DEFECTIMAGE_WIDTH * 2, DEFECTIMAGE_HEIGHT * 2, &MemDC, 0, 0, SRCCOPY); MemDC.SelectObject(pOldBitmap); return; } else { int nMode; if((nMode = GetBkMode(hDC)) != TRANSPARENT) ::SetBkMode(hDC, TRANSPARENT); HBITMAP hBitmap, hOldBitmap; HDC hMemDC = ::CreateCompatibleDC(hDC); hBitmap = ::CreateCompatibleBitmap(hDC, DEFECTIMAGE_WIDTH, DEFECTIMAGE_HEIGHT); if(NULL == hBitmap) return; hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap); ::StretchDIBits(hMemDC, 0, 0, DEFECTIMAGE_WIDTH, DEFECTIMAGE_HEIGHT, 0, 0, DEFECTIMAGE_WIDTH, DEFECTIMAGE_HEIGHT, m_ImageBuf, (BITMAPINFO *)m_BitmapInfo, DIB_RGB_COLORS, SRCCOPY); DrawDotCenterLine(hMemDC); if(m_iShowDefectRect == 1) { CPen PenRect; PenRect.CreatePen(PS_SOLID, 1, RGB(255,0,0)); DrawRectangle(hMemDC,PenRect,m_rectDefect); PenRect.DeleteObject(); } ::BitBlt(hDC, 0, 0, DEFECTIMAGE_WIDTH, DEFECTIMAGE_HEIGHT, hMemDC, 0, 0, SRCCOPY); ::DeleteObject(::SelectObject(hMemDC,hOldBitmap)); ::DeleteDC(hMemDC); if(GetBkMode(hDC) != nMode) ::SetBkMode(hDC, nMode); } // Do not call CStatic::OnPaint() for painting messages } void CMImageStatic::DrawRectangle(HDC hDC, HPEN hPen, CRect rect) { HPEN hOldPen= NULL; HBRUSH hOldBrush = NULL; if(hPen) hOldPen = (HPEN)::SelectObject(hDC ,hPen); ::MoveToEx(hDC, rect.left, rect.top, NULL); ::LineTo(hDC, rect.right, rect.top); ::LineTo(hDC, rect.right, rect.bottom); ::LineTo(hDC, rect.left, rect.bottom); ::LineTo(hDC, rect.left, rect.top); if(hPen) ::SelectObject(hDC , (HPEN)hOldPen); } void CMImageStatic::OnRButtonDown(UINT nFlags, CPoint point) { NMHDR nmHeader; nmHeader.idFrom = GetDlgCtrlID(); nmHeader.hwndFrom = GetSafeHwnd(); nmHeader.code = NM_DBLCLK; ::SendMessage(GetParent()->GetSafeHwnd(), WM_NOTIFY, (WPARAM)nmHeader.idFrom, (LPARAM)&nmHeader ); } void CMImageStatic::ResetImageStatic() { // 搬窃 捞固瘤 滚欺甫 檬扁拳. ZeroMemory(m_ImageBuf, DEFECTIMAGE_WIDTH * DEFECTIMAGE_HEIGHT + 1); m_bSetImage = FALSE; m_rectDefect = CRect(0,0,0,0); Invalidate(); } void CMImageStatic::ShowRect(CRect rect) { m_rectDefect = rect; } void CMImageStatic::ShowGrid(int iShow) { m_iShowGrid = iShow; Invalidate(); } void CMImageStatic::ShowDefectRect(int iShow) { m_iShowDefectRect = iShow; Invalidate(); }