// Draw curve. void qxgeditScale::paintEvent ( QPaintEvent *pPaintEvent ) { QPainter painter(this); const int h = height(); const int w = width(); const int h2 = h >> 1; const int x1 = 6 + int((m_iBreak1 * (w - 12)) >> 7); const int x2 = 6 + int((m_iBreak2 * (w - 12)) >> 7); const int x3 = 6 + int((m_iBreak3 * (w - 12)) >> 7); const int x4 = 6 + int((m_iBreak4 * (w - 12)) >> 7); const int y1 = h2 - ((int(m_iOffset1) - 64) * (h - 12) >> 7); const int y2 = h2 - ((int(m_iOffset2) - 64) * (h - 12) >> 7); const int y3 = h2 - ((int(m_iOffset3) - 64) * (h - 12) >> 7); const int y4 = h2 - ((int(m_iOffset4) - 64) * (h - 12) >> 7); m_poly.putPoints(0, 6, 0, y1, x1, y1, x2, y2, x3, y3, x4, y4, w, y4); const QPalette& pal = palette(); const bool bDark = (pal.window().color().value() < 0x7f); const QColor& rgbLite = (bDark ? Qt::darkYellow : Qt::yellow); if (bDark) painter.fillRect(0, 0, w, h, pal.dark().color()); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(bDark ? Qt::gray : Qt::darkGray); const QPen oldpen(painter.pen()); QPen dotpen(oldpen); dotpen.setStyle(Qt::DotLine); painter.setPen(dotpen); painter.drawLine(0, h2, w, h2); painter.setPen(oldpen); painter.drawPolyline(m_poly); painter.setBrush(rgbLite); // pal.midlight().color() painter.drawRect(nodeRect(1)); painter.drawRect(nodeRect(2)); painter.drawRect(nodeRect(3)); painter.drawRect(nodeRect(4)); #ifdef CONFIG_DEBUG_0 painter.drawText(QFrame::rect(), Qt::AlignTop|Qt::AlignHCenter, tr("Break (%1,%2,%3,%4) Offset(%5,%6,%7,%8)") .arg(int(break1())) .arg(int(break2())) .arg(int(break3())) .arg(int(break4())) .arg(int(offset1()) - 64) .arg(int(offset2()) - 64) .arg(int(offset3()) - 64) .arg(int(offset4()) - 64)); #endif painter.setRenderHint(QPainter::Antialiasing, false); painter.end(); QFrame::paintEvent(pPaintEvent); }
void CSpermView::DrawImage(CDC *pDC) { int i,n; CMainFrame* pMainfrm=(CMainFrame*)AfxGetMainWnd(); CMorphaDetectDLG* pWnd=(CMorphaDetectDLG*)((CView3*)pMainfrm->GetView3())->m_pwndMorphaDetDlg; if(pWnd==NULL || pWnd->m_hWnd == NULL) return; vector<SpermRegion>& m_vSpermRegion = pWnd->m_vSpermRegion; int& m_r=pWnd->m_nR; vector<IsSperNormal>& m_vbIsNormal=pWnd->m_vbIsNormal; vector<SperMopyParameter>& m_vSperMopyParameter=pWnd->m_vSperMopyParameter; LPBYTE& m_lpResBmDataSrc=pWnd->m_lpResBmDataSrc; LPBITMAPINFOHEADER& m_lpResBmInfoSrc= pWnd->m_lpResBmInfoSrc; LPBYTE& m_lpResEdgeBmDataSrc=pWnd->m_lpResEdgeBmDataSrc; LPBITMAPINFOHEADER& m_lpResEdgeBmInfoSrc= pWnd->m_lpResEdgeBmInfoSrc; switch(pWnd->m_wndCbxShowOpt.GetCurSel()) { case 2: // 画原图 m_imgMorphaImg.Show(pDC->m_hDC,0,0,m_imgMorphaImg.Width(),m_imgMorphaImg.Height()); break; case 1: // 画填充图 if(m_lpResBmInfoSrc && m_lpResBmDataSrc) { ::StretchDIBits(pDC->GetSafeHdc(), 0,0, m_lpResBmInfoSrc->biWidth, m_lpResBmInfoSrc->biHeight, 0, 0, m_lpResBmInfoSrc->biWidth, m_lpResBmInfoSrc->biHeight, m_lpResBmDataSrc, (LPBITMAPINFO)m_lpResBmInfoSrc, DIB_RGB_COLORS, SRCCOPY); } break; case 0: // 画边缘图 if(m_lpResEdgeBmDataSrc && m_lpResBmInfoSrc) { ::StretchDIBits(pDC->GetSafeHdc(), 0,0,m_lpResBmInfoSrc->biWidth, m_lpResBmInfoSrc->biHeight, 0, 0, m_lpResBmInfoSrc->biWidth, m_lpResBmInfoSrc->biHeight, m_lpResEdgeBmDataSrc, (LPBITMAPINFO)m_lpResBmInfoSrc, DIB_RGB_COLORS, SRCCOPY); } break; } if(pWnd->m_wndChkRectangle.GetCheck()) { // 画边框 CPen myRedPen(PS_SOLID, 1, RGB(255,0,0)); CPen myBluePen(PS_SOLID, 1, RGB(0,0,255)); CPen *myPen, *pOldPen; n = m_vSpermRegion.size(); list<int>& m_lsOperateIndex = pWnd->m_lsOperateIndex; for(i=0; i<n; i++) { if(m_vbIsNormal[i].IsNormalVector[0] == TRUE) myPen = &myBluePen; else myPen = &myRedPen; pOldPen = pDC->SelectObject(myPen); // 选用红画笔 pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 空白画刷 if( find(m_lsOperateIndex.begin(),pWnd->m_itListIndex,i ) != pWnd->m_itListIndex ) continue; CPoint lt = CPoint(m_vSpermRegion[i].SpermCenterPos.y - m_r, m_vSpermRegion[i].SpermCenterPos.x - m_r); CPoint rt = CPoint(m_vSpermRegion[i].SpermCenterPos.y + m_r, m_vSpermRegion[i].SpermCenterPos.x - m_r); CPoint lb = CPoint(m_vSpermRegion[i].SpermCenterPos.y - m_r, m_vSpermRegion[i].SpermCenterPos.x + m_r); CPoint rb = CPoint(m_vSpermRegion[i].SpermCenterPos.y + m_r, m_vSpermRegion[i].SpermCenterPos.x + m_r); CRect rect = CRect(lt, rb); if( m_nPos == i) { pDC->SelectObject(pOldPen); COLORREF color; if(m_vbIsNormal[i].IsNormalVector[0] == TRUE) color = RGB(0,0,255); // 选用蓝画笔 else color = RGB(255,0,0); // 选用红画笔 CPen dotpen(PS_DASHDOT,1,color); pDC->SelectObject(&dotpen); pDC->Rectangle(rect); pDC->SelectObject(myPen); } else { pDC->Rectangle(rect); } } if(n>0) pDC->SelectObject(pOldPen); // 编号 { CPen myPen(PS_SOLID, 2, RGB(255,0,0)); CPen *pOldPen = pDC->SelectObject(&myPen); //选用新画笔 pDC->SetBkMode(TRANSPARENT); CString strNo, cs; n = m_vbIsNormal.size(); for(i=0; i<n; i++) { if( find(m_lsOperateIndex.begin(),pWnd->m_itListIndex,i) != pWnd->m_itListIndex ) continue; pDC->SetTextColor(RGB(0,0,255)); strNo.Format("%d", i+1); pDC->TextOut(m_vSpermRegion[i].SpermCenterPos.y - m_r, m_vSpermRegion[i].SpermCenterPos.x + m_r - 15, strNo); if( m_vbIsNormal[i].IsNormalVector[0] == TRUE ) { pDC->SetTextColor(RGB(0,0,255)); cs = "正常"; } else { pDC->SetTextColor(RGB(255,0,0)); cs = "异常"; } pDC->TextOut(m_vSpermRegion[i].SpermCenterPos.y - m_r + 20, m_vSpermRegion[i].SpermCenterPos.x + m_r - 17, cs); } pDC->SelectObject(pOldPen); } } if(m_nPos != -1) { CString cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_length); pWnd->m_strLength = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_width); pWnd->m_strWidth = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_area); pWnd->m_strArea = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_perimeter); pWnd->m_strPerimeter = cs; cs.Format("%3.2lf", m_vSperMopyParameter[m_nPos].m_ellipticity); pWnd->m_strEllipticity = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_perfor_area); pWnd->m_strPerforArea = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_head_area); pWnd->m_strHeadArea = cs; cs.Format("%.1f", m_vSperMopyParameter[m_nPos].m_head_perfor_area*100); pWnd->m_strHeadPerforArea = cs + "%"; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_tail_length); pWnd->m_strMitsomaLength = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_tail_width); pWnd->m_strMitosomaWidth = cs; cs.Format("%.2lf", m_vSperMopyParameter[m_nPos].m_tail_angle); pWnd->m_strMitosmaDevangle = cs + "度"; cs.Format("%.2f", m_vSperMopyParameter[m_nPos].m_ruga); pWnd->m_strRuga = cs; cs.Format("%.2f", m_vSperMopyParameter[m_nPos].m_extension); pWnd->m_strExtension = cs; cs.Format("%.2f", m_vSperMopyParameter[m_nPos].m_symmetry); pWnd->m_strSymmetry = cs; // 精子编号 cs.Format("第%d号精子 -->> ", m_nPos+1); pWnd->m_strInfo = cs; cs = ( (m_vbIsNormal[m_nPos].IsNormalVector[0] == TRUE ) ? "正常" : "异常"); pWnd->m_strIsNormal = cs; pWnd->UpdateData(FALSE); pWnd->Invalidate(); } }