LRESULT CMainFrame::OnSnapChange(WPARAM wParam, LPARAM lParam) { HVSTATUS status = STATUS_OK; CView *pView = GetActiveView(); //获取当前VIEW视图 CDC *pDC = pView->GetDC(); //得到VIEW的DC // 将原始图像数据进行Bayer转换,转换后为24位。 ConvertBayer2Rgb(m_pImageBuffer,m_pRawBuffer,Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout); //同时将原始数据进行上下翻转 Resize(); //在视图客户区显示图像 StretchDIBits(pDC->GetSafeHdc(), 0, 0, Width/2, //显窗口宽度 Height/2, //显示窗口高度 0, 0, Width/2, //图像宽度 Height/2, //图像高度 DisplayBuffer, //图像缓冲区 m_pBmpInfo, //BMP图像描述信息 DIB_RGB_COLORS, SRCCOPY ); pView->ReleaseDC(pDC); return 1; }
void CMainFrame::OnStopsnap() { // TODO: Add your command handler code here OnSnapexStop(); OnSnapexClose(); CView *pView = GetActiveView(); //获取当前VIEW视图 CDC *pDC = pView->GetDC(); //得到VIEW的DC RECT rect; GetClientRect(&rect); pDC->FillSolidRect(&rect, RGB(255, 255, 255)); pView->ReleaseDC(pDC); }
void CMainFrame::ScanSet() { CView *pView = GetActiveView(); //获取当前VIEW视图 CDC *pDC = pView->GetDC(); //得到VIEW的DC CString cs; cs.Format("%d",100); pDC->TextOut(0,Height/2,cs,cs.GetLength()); pView->ReleaseDC(pDC); /*//MessageBox("已成功输出数据","信息",MB_OK|MB_ICONINFORMATION); char* fileName="E:\\程序\\3D_SCAN\\Data_Out\\data.asc"; CString strtemp; CFile file; CFileException fileException; if(!file.Open(fileName,CFile::modeCreate | CFile::modeWrite, &fileException)) { CString errorInfo; errorInfo.Format("不能打开文件%s,错误:%u\n",fileName,fileException.m_cause); MessageBox(errorInfo,"错误",MB_OK|MB_ICONERROR); return; } int i, j,k; for(k=0;k<100;k++) for(i=0;i<100;i++) for(j=0;j<100;j++) { strtemp.Format("%d,%d,%d\r\n\r\n",i,j,k); file.Write(strtemp,strtemp.GetLength()); } file.Close(); */ }
void CMainFrame::Scan() { CView *pView = GetActiveView(); //获取当前VIEW视图 CDC *pDC = pView->GetDC(); //得到VIEW的DC CString cs; cs.Format("%d",Scan_num+1); pDC->TextOut(0,Height/2,cs,cs.GetLength()); pView->ReleaseDC(pDC); int i,k; unsigned char MAX=0; int MAX_i=0; unsigned char seq[3]; float peak; float distance; float Phi; //float Theta; float Z; float L1,L2,L3,L4; float r; uchar* ptr; HVSTATUS status =STATUS_OK; /********采集单帧图像**********/ unsigned char *ppbuffer[1]; ppbuffer[0]=m_pRawBuffer; status =HVSnapShot(m_hhv,ppbuffer,1); HV_VERIFY(status); /********显示当前帧************/ OnSnapChange(NULL,NULL); //生成支持OPENCV的IPLIMAGE数据结构,并使用相机采集的图像数据初始化// CvSize cvSize; cvSize.width = Width; cvSize.height = Height; IplImage *iplImage = cvCreateImageHeader(cvSize,IPL_DEPTH_8U,3); cvSetData(iplImage,m_pImageBuffer,Width*3); //申请灰度空间,将BGR格式转化为灰度数据 IplImage *iplgray = cvCreateImage(cvGetSize(iplImage),IPL_DEPTH_8U,1); cvCvtColor(iplImage,iplgray,CV_BGR2GRAY); for(k=0;k<Height;k++) { ptr=(uchar*)(iplgray->imageData+k*iplgray->widthStep); for(i=0;i<Width;i++) for(i=0;i<Width;i++) { if( ptr[i]>=MAX) { MAX=ptr[i]; MAX_i=i; } } if(MAX<=50) { Scan_result[Scan_num][k].X=0; Scan_result[Scan_num][k].Y=0; Scan_result[Scan_num][k].Z=0; continue; } if(MAX_i<=1) seq[2]=0; else seq[2]=ptr[MAX_i-1]; seq[1]=ptr[MAX_i]; if(MAX_i>=Width) seq[0]=0; else seq[0]=ptr[MAX_i+1]; //peak=1/2*(log(seq[0])-log(seq[2]))/(log(seq[0])-2*log(seq[1])+log(seq[2]))+Width-MAX_i; peak=(seq[2]-seq[0])/(seq[0]+seq[1]+seq[2])+Width-MAX_i; //peak=(2*ptr[MAX_i-2]+ptr[MAX_i-1]-ptr[MAX_i+1]-2*ptr[MAX_i+2])/(ptr[MAX_i+2]+ptr[MAX_i+1]+ptr[MAX_i]+ptr[MAX_i-1]+ptr[MAX_i-2])+Width-MAX_i; /************************计算某行扫描结果*****************************************/ distance=FS/(PIX_SIZE*peak+ PIX_OFF)+DIST_OFF; if(distance>1800) { Scan_result[Scan_num][k].X=0; Scan_result[Scan_num][k].Y=0; Scan_result[Scan_num][k].Z=0; continue; } //Theta=atan((k-Height/2)*PIX_SIZE/f); Z=(distance-DIST_OFF)*(Height/2-k)*PIX_SIZE/f; L1=sqrt(distance*distance+Z*Z); L3= distance*tan(PI/2- LaserAngle); L2= sqrt(L1*L1+L3*L3); L4= sqrt(L3*L3+distance*distance); r= sqrt( (L3-rotation_r)*(L3-rotation_r)+distance*distance); Phi=Scan_num*Scan_step+PI/2-acos( (rotation_r*rotation_r+r*r-L4*L4)/2.0f/rotation_r/r); Scan_result[Scan_num][k].X=r*cos(Phi); Scan_result[Scan_num][k].Y=r*sin(Phi); Scan_result[Scan_num][k].Z=Z; /****************************************************************************/ } cvReleaseImage(&iplgray); /************如果扫描完成,关闭串口,并输出数据********/ if(Scan_num==Scan_total-1) { MessageBox("扫描完成"); Scan_num=0; OnBtnSend('2'); //OnBtnSend('2'); sio_close(Port); //关闭串口 /*************数据输出**************/ char* fileName=dataout; CString strtemp; CFile file; CFileException fileException; if(!file.Open(fileName,CFile::modeCreate | CFile::modeWrite, &fileException)) { CString errorInfo; errorInfo.Format("不能打开文件%s,错误:%u\n",fileName,fileException.m_cause); MessageBox(errorInfo,"错误",MB_OK|MB_ICONERROR); return; } for(i=0;i<Scan_total;i++) for(k=0;k<Height;k++) { if(Scan_result[i][k].X==0 & Scan_result[i][k].Y==0 & Scan_result[i][k].Z==0) continue; else { strtemp.Format("%.3f, %.3f, %.3f\r\n\r\n",Scan_result[i][k].X,Scan_result[i][k].Y,Scan_result[i][k].Z); file.Write(strtemp,strtemp.GetLength()); } } file.Close(); MessageBox("已成功输出数据","信息",MB_OK|MB_ICONINFORMATION); return; } /**********扫描未完成,发送串口指令***********/ else { OnBtnSend('1'); //OnBtnSend('1'); Scan_num=Scan_num+1; } }
void CMainFrame::updateImageInfo() { const CFlyCapDoc* pDoc = (CFlyCapDoc*)GetActiveDocument(); CView* pView = (CView*)GetActiveView(); if( m_wndStatusBar && pDoc != NULL && pView != NULL ) { char pszText[ 64 ]; if( m_ImageInfoMode == TIMESTAMP ) { // Setup the timestamp information FlyCaptureTimestamp timeStamp = pDoc->m_imageRaw.timeStamp; #if defined (WIN64) __time64_t tmpTime = timeStamp.ulSeconds; char* pszTemp = ::_ctime64( &tmpTime ); #elif defined (WIN32) time_t lTemp = timeStamp.ulSeconds; char* pszTemp = ::ctime( &lTemp ); #else #error ** No time conversion ** #endif if( pszTemp == NULL ) { return; } int iMilliSec = timeStamp.ulMicroSeconds / 1000; sprintf( pszText, "%.19s.%.03d %s (%03u,%04u)\n", pszTemp, iMilliSec, &pszTemp[ 20 ], timeStamp.ulCycleSeconds, timeStamp.ulCycleCount ); } else if( m_ImageInfoMode == CURSOR ) { // Setup the cursor and image information CRect rect; CPoint pt; COLORREF cr; int iWidth = 0; int iHeight = 0; int iSBOffsetX = 0; // the offset of the horizontal scrollbar int iSBOffsetY = 0; // the offset of the vertical scrollbar // get the position of the scroll bars. // used to calculate the co-ordinates of the image. iSBOffsetX = pView->GetScrollPos(SB_HORZ); iSBOffsetY = pView->GetScrollPos(SB_VERT); pDoc->getImageSize( &iWidth, &iHeight ); CDC* pDC = pView->GetDC(); pDC->GetClipBox( &rect ); GetCursorPos( &pt ); pView->ScreenToClient( &pt ); cr = GetPixel( pDC->GetSafeHdc(), pt.x, pt.y ); pView->ReleaseDC( pDC ); // Check that this window is active and // that the cursor is within bounds of the clipping rect if( this == GetActiveWindow() && pt.x >= 0 && pt.x < rect.Width() && pt.y >= 0 && pt.y < rect.Height() ) { sprintf( pszText, "Image(%dx%d) Cursor(%d,%d) RGB(%u,%u,%u)", iWidth, iHeight, pt.x + iSBOffsetX, pt.y + iSBOffsetY, cr & 0xFF, (cr & 0xFF00) >> 8, (cr & 0xFF0000) >> 16 ); }
static void PrintPiecesThread(void* pv) { CFrameWndEx* pFrame = (CFrameWndEx*)pv; CView* pView = pFrame->GetActiveView(); CPrintDialog PD(FALSE, PD_ALLPAGES|PD_USEDEVMODECOPIES|PD_NOPAGENUMS|PD_NOSELECTION, pFrame); if (theApp.DoPrintDialog(&PD) != IDOK) return; if (PD.m_pd.hDC == NULL) return; Project* project = lcGetActiveProject(); ObjArray<lcPiecesUsedEntry> PiecesUsed; project->GetPiecesUsed(PiecesUsed); PiecesUsed.Sort(PiecesUsedSortFunc, NULL); // gather file to print to if print-to-file selected CString strOutput; if (PD.m_pd.Flags & PD_PRINTTOFILE) { CString strDef(MAKEINTRESOURCE(AFX_IDS_PRINTDEFAULTEXT)); CString strPrintDef(MAKEINTRESOURCE(AFX_IDS_PRINTDEFAULT)); CString strFilter(MAKEINTRESOURCE(AFX_IDS_PRINTFILTER)); CString strCaption(MAKEINTRESOURCE(AFX_IDS_PRINTCAPTION)); CFileDialog dlg(FALSE, strDef, strPrintDef,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, strFilter); dlg.m_ofn.lpstrTitle = strCaption; if (dlg.DoModal() != IDOK) return; strOutput = dlg.GetPathName(); } CString DocName; char* Ext = strrchr(project->m_strTitle, '.'); DocName.Format("LeoCAD - %.*s BOM", Ext ? Ext - project->m_strTitle : strlen(project->m_strTitle), project->m_strTitle); DOCINFO docInfo; memset(&docInfo, 0, sizeof(DOCINFO)); docInfo.cbSize = sizeof(DOCINFO); docInfo.lpszDocName = DocName; CString strPortName; int nFormatID; if (strOutput.IsEmpty()) { docInfo.lpszOutput = NULL; strPortName = PD.GetPortName(); nFormatID = AFX_IDS_PRINTONPORT; } else { docInfo.lpszOutput = strOutput; AfxGetFileTitle(strOutput, strPortName.GetBuffer(_MAX_PATH), _MAX_PATH); nFormatID = AFX_IDS_PRINTTOFILE; } SetAbortProc(PD.m_pd.hDC, _AfxAbortProc); pFrame->EnableWindow(FALSE); CPrintingDialog dlgPrintStatus(NULL); CString strTemp; dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_DOCNAME, DocName); dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_PRINTERNAME, PD.GetDeviceName()); AfxFormatString1(strTemp, nFormatID, strPortName); dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_PORTNAME, strTemp); dlgPrintStatus.ShowWindow(SW_SHOW); dlgPrintStatus.UpdateWindow(); if (StartDoc(PD.m_pd.hDC, &docInfo) == SP_ERROR) { pFrame->EnableWindow(TRUE); dlgPrintStatus.DestroyWindow(); AfxMessageBox(AFX_IDP_FAILED_TO_START_PRINT); return; } int ResX = GetDeviceCaps(PD.m_pd.hDC, LOGPIXELSX); int ResY = GetDeviceCaps(PD.m_pd.hDC, LOGPIXELSY); CRect RectDraw(0, 0, GetDeviceCaps(PD.m_pd.hDC, HORZRES), GetDeviceCaps(PD.m_pd.hDC, VERTRES)); DPtoLP(PD.m_pd.hDC, (LPPOINT)(RECT*)&RectDraw, 2); RectDraw.DeflateRect((int)(ResX*(float)theApp.GetProfileInt("Default","Margin Left", 50)/100.0f), (int)(ResY*(float)theApp.GetProfileInt("Default","Margin Top", 50)/100.0f), (int)(ResX*(float)theApp.GetProfileInt("Default","Margin Right", 50)/100.0f), (int)(ResY*(float)theApp.GetProfileInt("Default","Margin Bottom", 50)/100.0f)); CRect HeaderRect = RectDraw; HeaderRect.top -= (int)(ResY*theApp.GetProfileInt("Default", "Margin Top", 50) / 200.0f); HeaderRect.bottom += (int)(ResY*theApp.GetProfileInt("Default", "Margin Bottom", 50) / 200.0f); int RowsPerPage = AfxGetApp()->GetProfileInt("Default", "Catalog Rows", 10); int ColsPerPage = AfxGetApp()->GetProfileInt("Default", "Catalog Columns", 3); int PicHeight = RectDraw.Height() / RowsPerPage; int PicWidth = RectDraw.Width() / ColsPerPage; int TotalRows = (PiecesUsed.GetSize() + ColsPerPage - 1) / ColsPerPage; int TotalPages = (TotalRows + RowsPerPage - 1) / RowsPerPage; int RowHeight = RectDraw.Height() / RowsPerPage; int ColWidth = RectDraw.Width() / ColsPerPage; PD.m_pd.nMinPage = 1; PD.m_pd.nMaxPage = TotalPages + 1; UINT EndPage = PD.m_pd.nToPage; UINT StartPage = PD.m_pd.nFromPage; if (PD.PrintAll()) { EndPage = PD.m_pd.nMaxPage; StartPage = PD.m_pd.nMinPage; } lcClamp(EndPage, PD.m_pd.nMinPage, PD.m_pd.nMaxPage); lcClamp(StartPage, PD.m_pd.nMinPage, PD.m_pd.nMaxPage); int StepPage = (EndPage >= StartPage) ? 1 : -1; VERIFY(strTemp.LoadString(AFX_IDS_PRINTPAGENUM)); // begin page printing loop BOOL bError = FALSE; // Creating Compatible Memory Device Context CDC *pMemDC = new CDC; if (!pMemDC->CreateCompatibleDC(pView->GetDC())) return; BITMAPINFO bi; ZeroMemory(&bi, sizeof(BITMAPINFO)); bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = PicWidth; bi.bmiHeader.biHeight = PicHeight; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biSizeImage = PicWidth * PicHeight * 3; bi.bmiHeader.biXPelsPerMeter = 2925; bi.bmiHeader.biYPelsPerMeter = 2925; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; LPBITMAPINFOHEADER lpbi[1]; HBITMAP hBm, hBmOld; hBm = CreateDIBSection(pView->GetDC()->GetSafeHdc(), &bi, DIB_RGB_COLORS, (void **)&lpbi, NULL, (DWORD)0); if (!hBm) return; hBmOld = (HBITMAP)::SelectObject(pMemDC->GetSafeHdc(), hBm); PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; int pixelformat = ChoosePixelFormat(pMemDC->m_hDC, &pfd); DescribePixelFormat(pMemDC->m_hDC, pixelformat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); SetPixelFormat(pMemDC->m_hDC, pixelformat, &pfd); HGLRC hmemrc = wglCreateContext(pMemDC->GetSafeHdc()); wglMakeCurrent(pMemDC->GetSafeHdc(), hmemrc); GL_DisableVertexBufferObject(); float Aspect = (float)PicWidth/(float)PicHeight; glViewport(0, 0, PicWidth, PicHeight); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(0.5f, 0.1f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(1, 1, 1, 1); LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); lf.lfHeight = -MulDiv(12, ResY, 72); lf.lfWeight = FW_REGULAR; lf.lfCharSet = DEFAULT_CHARSET; lf.lfQuality = PROOF_QUALITY; strcpy (lf.lfFaceName , "Arial"); HFONT HeaderFont = CreateFontIndirect(&lf); HFONT OldFont = (HFONT)SelectObject(PD.m_pd.hDC, HeaderFont); SetBkMode(PD.m_pd.hDC, TRANSPARENT); SetTextColor(PD.m_pd.hDC, 0x000000); SetTextAlign(PD.m_pd.hDC, TA_CENTER|TA_NOUPDATECP); DWORD PrintOptions = AfxGetApp()->GetProfileInt("Settings", "Print", PRINT_NUMBERS | PRINT_BORDER/*|PRINT_NAMES*/); bool DrawNames = 1;//(PrintOptions & PRINT_NAMES) != 0; bool Horizontal = 1;//(PrintOptions & PRINT_HORIZONTAL) != 0; pMemDC->SetTextColor(0x000000); pMemDC->SetBkMode(TRANSPARENT); // lf.lfHeight = -MulDiv(40, GetDeviceCaps(pMemDC->m_hDC, LOGPIXELSY), 72); // lf.lfWeight = FW_BOLD; HFONT CatalogFont = CreateFontIndirect(&lf); lf.lfHeight = -MulDiv(80, GetDeviceCaps(pMemDC->m_hDC, LOGPIXELSY), 72); HFONT CountFont = CreateFontIndirect(&lf); HFONT OldMemFont = (HFONT)SelectObject(pMemDC->m_hDC, CatalogFont); HPEN hpOld = (HPEN)SelectObject(pMemDC->m_hDC, GetStockObject(BLACK_PEN)); for (UINT CurPage = StartPage; CurPage != EndPage; CurPage += StepPage) { TCHAR szBuf[80]; wsprintf(szBuf, strTemp, CurPage); dlgPrintStatus.SetDlgItemText(AFX_IDC_PRINT_PAGENUM, szBuf); if (::StartPage(PD.m_pd.hDC) < 0) { bError = TRUE; break; } // Draw header and footer. SelectObject(PD.m_pd.hDC, HeaderFont); CString Header; UINT Align; FormatHeader(Header, Align, AfxGetApp()->GetProfileString("Default", "Catalog Header", ""), project->m_strTitle, project->m_strAuthor, project->m_strDescription, CurPage, TotalPages); Align |= DT_TOP|DT_SINGLELINE; DrawText(PD.m_pd.hDC, (LPCTSTR)Header, Header.GetLength(), HeaderRect, Align); FormatHeader(Header, Align, AfxGetApp()->GetProfileString("Default", "Catalog Footer", "Page &P"), project->m_strTitle, project->m_strAuthor, project->m_strDescription, CurPage, TotalPages); Align |= DT_BOTTOM|DT_SINGLELINE; DrawText(PD.m_pd.hDC, (LPCTSTR)Header, Header.GetLength(), HeaderRect, Align); int StartPiece = (CurPage - 1) * RowsPerPage * ColsPerPage; int EndPiece = lcMin(StartPiece + RowsPerPage * ColsPerPage, PiecesUsed.GetSize()); for (int CurPiece = StartPiece; CurPiece < EndPiece; CurPiece++) { FillRect(pMemDC->m_hDC, CRect(0, PicHeight, PicWidth, 0), (HBRUSH)GetStockObject(WHITE_BRUSH)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); PieceInfo* pInfo = PiecesUsed[CurPiece].Info; pInfo->ZoomExtents(30.0f, Aspect); pInfo->RenderPiece(PiecesUsed[CurPiece].ColorIndex); glFinish(); // Draw description text at the bottom. CRect TextRect(0, 0, PicWidth, PicHeight); if (DrawNames) { SelectObject(pMemDC->m_hDC, CatalogFont); pMemDC->DrawText(pInfo->m_strDescription, strlen(pInfo->m_strDescription), TextRect, DT_CALCRECT | DT_WORDBREAK); TextRect.OffsetRect(0, PicHeight - TextRect.Height() - 5); pMemDC->DrawText(pInfo->m_strDescription, strlen(pInfo->m_strDescription), TextRect, DT_WORDBREAK); } // Draw count. SelectObject(pMemDC->m_hDC, CountFont); TextRect = CRect(0, 0, PicWidth, TextRect.top); TextRect.DeflateRect(5, 5); char CountStr[16]; sprintf(CountStr, "%dx", PiecesUsed[CurPiece].Count); pMemDC->DrawText(CountStr, strlen(CountStr), TextRect, DT_BOTTOM | DT_LEFT | DT_SINGLELINE); LPBITMAPINFOHEADER lpbi[1]; lpbi[0] = (LPBITMAPINFOHEADER)GlobalLock(MakeDib(hBm, 24)); BITMAPINFO bi; ZeroMemory(&bi, sizeof(BITMAPINFO)); memcpy (&bi.bmiHeader, lpbi[0], sizeof(BITMAPINFOHEADER)); SetStretchBltMode(PD.m_pd.hDC, COLORONCOLOR); int CurRow, CurCol; if (Horizontal) { CurRow = (CurPiece - StartPiece) / ColsPerPage; CurCol = (CurPiece - StartPiece) % ColsPerPage; } else { CurRow = (CurPiece - StartPiece) % RowsPerPage; CurCol = (CurPiece - StartPiece) / RowsPerPage; } int Left = RectDraw.left + ColWidth * CurCol + (ColWidth - PicWidth) / 2; int Top = RectDraw.top + RowHeight * CurRow + (RowHeight - PicHeight) / 2; StretchDIBits(PD.m_pd.hDC, Left, Top, PicWidth, PicHeight, 0, 0, PicWidth, PicHeight, (LPBYTE)lpbi[0] + lpbi[0]->biSize + lpbi[0]->biClrUsed * sizeof(RGBQUAD), &bi, DIB_RGB_COLORS, SRCCOPY); if (lpbi[0]) GlobalFreePtr(lpbi[0]); } if (::EndPage(PD.m_pd.hDC) < 0 || !_AfxAbortProc(PD.m_pd.hDC, 0)) { bError = TRUE; break; } } SelectObject(pMemDC->m_hDC, hpOld); SelectObject(PD.m_pd.hDC, OldFont); DeleteObject(HeaderFont); SelectObject(pMemDC->m_hDC, OldMemFont); DeleteObject(CatalogFont); DeleteObject(CountFont); GL_EnableVertexBufferObject(); wglMakeCurrent(NULL, NULL); wglDeleteContext(hmemrc); SelectObject(pMemDC->GetSafeHdc(), hBmOld); DeleteObject(hBm); delete pMemDC; if (!bError) EndDoc(PD.m_pd.hDC); else AbortDoc(PD.m_pd.hDC); pFrame->EnableWindow(); dlgPrintStatus.DestroyWindow(); if (PD.m_pd.hDC != NULL) { ::DeleteDC(PD.m_pd.hDC); PD.m_pd.hDC = NULL; } }