// CPhotoPubView 绘制 void CPhotoPubView::DrawImage(CDC *pDC,IplImage *pImg) { int wid=0,hi=0; CRect ClipBox; GetClientRect(&ClipBox); if (!pImg) { CBitmap bkg; bkg.LoadBitmap(IDB_BACKGROUND); CBrush brush(&bkg); pDC->FillRect(&ClipBox,&brush); return; } wid=int(pImg->width*m_ratio); hi=int(pImg->height*m_ratio); IplImage *pStub=pImg; IplImage *pTmp=NULL; if (wid!=pImg->width) { pTmp=cvCreateImage(cvSize(wid,hi),IPL_DEPTH_8U,3); cvResize(pImg,pTmp); pStub=pTmp; } CRgn WindowRgn; WindowRgn.CreateRectRgnIndirect(&ClipBox); CRect ImageRect(0,0,wid,hi); int top=max((ClipBox.Height()-hi)/2,0); int left=max((ClipBox.Width()-wid)/2,0); ImageRect.MoveToXY(left,top); CRgn ImageRgn; ImageRgn.CreateRectRgnIndirect(&ImageRect); WindowRgn.CombineRgn(&WindowRgn,&ImageRgn,RGN_DIFF); CBitmap bkg; bkg.LoadBitmap(IDB_BACKGROUND); CBrush brush(&bkg); pDC->FillRgn(&WindowRgn,&brush); memset(m_bmih_buffer, 0, sizeof(*m_bmih_buffer)); m_bmih_buffer->biSize = sizeof(BITMAPINFOHEADER); m_bmih_buffer->biWidth = wid; m_bmih_buffer->biHeight = -hi; m_bmih_buffer->biPlanes = 1; m_bmih_buffer->biBitCount = 24; m_bmih_buffer->biCompression = BI_RGB; SetDIBitsToDevice( pDC->m_hDC, ImageRect.left,ImageRect.top,pStub->width,pStub->height, 0, 0, 0, hi, pStub->imageData, m_bmi_buffer, DIB_RGB_COLORS ); cvReleaseImage(&pTmp); }
void CTabCtrlDoc::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rect = lpDrawItemStruct->rcItem; int nTabIndex = lpDrawItemStruct->itemID; if (nTabIndex < 0) return; BOOL bSelected = (nTabIndex == GetCurSel()); WCHAR label[64]; TC_ITEM tci; tci.mask = TCIF_TEXT|TCIF_IMAGE; tci.pszText = label; tci.cchTextMax = 63; if (!GetItem(nTabIndex, &tci)) return; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (!pDC) return; int nSavedDC = pDC->SaveDC(); // For some bizarre reason the rcItem you get extends above the actual // drawing area. We have to workaround this "feature". rect.top += ::GetSystemMetrics(SM_CYEDGE); pDC->SetBkMode(TRANSPARENT); pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE)); // Draw image CImageList* pImageList = GetImageList(); if (pImageList && tci.iImage >= 0) { rect.left += pDC->GetTextExtent(_T(" ")).cx; // Margin // Get height of image so we IMAGEINFO info; pImageList->GetImageInfo(tci.iImage, &info); CRect ImageRect(info.rcImage); int nYpos = rect.top; pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT); rect.left += ImageRect.Width(); } if (bSelected) { pDC->SetTextColor(m_crSelColour); pDC->SelectObject(&m_SelFont); rect.top -= ::GetSystemMetrics(SM_CYEDGE); pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); } else { pDC->SetTextColor(m_crUnselColour); pDC->SelectObject(&m_UnselFont); pDC->DrawText(label, rect, DT_SINGLELINE|DT_BOTTOM|DT_CENTER); } pDC->RestoreDC(nSavedDC); }
void CXTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rect = lpDrawItemStruct->rcItem; rect.bottom+=2; rect.top += ::GetSystemMetrics(SM_CYEDGE); int nTabIndex = lpDrawItemStruct->itemID; if (nTabIndex < 0) return; BOOL bSelected = (nTabIndex == GetCurSel()); COLORREF crSelected = m_bColorSelected ? m_crSelected : GetSysColor(COLOR_BTNTEXT); COLORREF crNormal = m_bColorNormal ? m_crNormal : GetSysColor(COLOR_BTNTEXT); COLORREF crDisabled = m_bColorDisabled ? m_crDisabled : GetSysColor(COLOR_GRAYTEXT); TCHAR label[64]; TC_ITEM item; item.mask = TCIF_TEXT|TCIF_IMAGE; item.pszText = label; item.cchTextMax = 63; if (!GetItem(nTabIndex, &item)) return; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (!pDC) return; int nSavedDC = pDC->SaveDC(); CRect rectItem; POINT pt; GetItemRect(nTabIndex, &rectItem); GetCursorPos(&pt); ScreenToClient(&pt); if (rectItem.PtInRect(pt)) m_iIndexMouseOver = nTabIndex; pDC->SetBkMode(TRANSPARENT); pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE)); //** Draw the image CImageList* pImageList = GetImageList(); if (pImageList && item.iImage >= 0) { rect.left += pDC->GetTextExtent(_T(" ")).cx; IMAGEINFO info; pImageList->GetImageInfo(item.iImage, &info); CRect ImageRect(info.rcImage); int nYpos = rect.top; pImageList->Draw(pDC, item.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT); rect.left += ImageRect.Width(); } if (!IsTabEnabled(nTabIndex)) { pDC->SetTextColor(crDisabled); rect.top -= ::GetSystemMetrics(SM_CYEDGE); pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); } else { //** selected item ----- if (bSelected) pDC->SetTextColor(crSelected); else //** other item --- { if (m_bColorMouseOver && nTabIndex == m_iIndexMouseOver) { pDC->SetTextColor(m_crMouseOver); } else { pDC->SetTextColor(crNormal); } } rect.top -= ::GetSystemMetrics(SM_CYEDGE); pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); } pDC->RestoreDC(nSavedDC); }
void DTerrainPage::generate( DTerrainPageData* data ) { if (!data) { return; } // validate input data if (data->batchSize > data->pageSize) { return; } bool bRegenerateVB = false; // we need the size to be valid. uint16 finalPageSize = validatePageSize(data->pageSize); uint16 finalBatchSize = validateBatchSize(data->batchSize); DReal finalPageScale = data->pageScale; // if the new vertex settings are different to current one, we // have to re-generate vertext buffer. if (mPageScale != finalPageScale || mPageSize != finalPageSize || mBatchSize != finalBatchSize) { bRegenerateVB = true; } mPageSize = finalPageSize; mBatchSize = finalBatchSize; mPageScale = finalPageScale; // that's a must. assert(mBatchSize >= 2); // reset our quadtree if (mQuadTreeRoot) { delete mQuadTreeRoot; } DTerrainRegion rootRegion; int16 halfPageSize = (mPageSize - 1)/2; rootRegion.xMin = -halfPageSize; rootRegion.zMin = -halfPageSize; rootRegion.xMax = halfPageSize; rootRegion.zMax = halfPageSize; mQuadTreeRoot = new DTerrainQuadTreeNode(this, NULL, rootRegion, mBatchSize); // if the parameter is a null image, use an empty one. bool useEmptyImage = false; DImage2D* scaledHeightMap = NULL; scaledHeightMap = new DImage2D(); float* emptyData = new float[mPageSize*mPageSize]; memset(emptyData, 0, sizeof(float) * mPageSize*mPageSize); DImageDesc imgDesc; imgDesc.width = mPageSize; imgDesc.height = mPageSize; imgDesc.depth = 1; imgDesc.mipMapCount = 1; imgDesc.arraySize = 1; imgDesc.pixelFormat = PF_R32_Float; scaledHeightMap->loadFromData((char*)emptyData, imgDesc); scaledHeightMap->setAccess(IL_Write); scaledHeightMap->setWorkRect(ImageRect(0,0,mPageSize,mPageSize)); delete emptyData; if (data->heightMap != NULL) { data->heightMap->scale(*scaledHeightMap); } // copy data to the height map. DUEL_LOCK_MUTEX(mDataMutex); if (mHeightMap != NULL) { delete mHeightMap; } mHeightMap = new DReal[mPageSize*mPageSize]; if (mMorphDeltaMap != NULL) { delete mMorphDeltaMap; } mMorphDeltaMap = new DReal[mPageSize*mPageSize]; memset(mMorphDeltaMap, 0, sizeof(DReal) * mPageSize * mPageSize); if (mNormalMap != NULL) { delete[] mNormalMap; } mNormalMap = new DVector3[mPageSize*mPageSize]; memset(mNormalMap, 0, sizeof(DVector3) *mPageSize * mPageSize); float* imgSrc = (float*)scaledHeightMap->getChunkPtr(); DReal* heightMapDst = mHeightMap; size_t destRowPitch = scaledHeightMap->getRowPitch(); for (uint32 i = 0; i < mPageSize; ++i) { for (uint32 j = 0; j < mPageSize; ++j) { mHeightMap[i * mPageSize + j] = *(imgSrc + mPageSize * i + j); } } delete scaledHeightMap; if (bRegenerateVB) { generateVertexData(); // now we have vertex data, we need to re-create index data for quadtree nodes. mQuadTreeRoot->generateIndexData(); } requestHeightMapUpdate(rootRegion, false); }
void CTabCtrlEx::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) { if(lpDrawItemStruct->CtlType == ODT_TAB) { CRect rect = lpDrawItemStruct->rcItem; INT nTabIndex = lpDrawItemStruct->itemID; if (nTabIndex < 0) return; TCHAR label[64]; TC_ITEM tci; tci.mask = TCIF_TEXT|TCIF_IMAGE; tci.pszText = label; tci.cchTextMax = 63; GetItem(nTabIndex, &tci ); CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (!pDC) return; int nSavedDC = pDC->SaveDC(); //填充背景色 COLORREF rcBack; if (lpDrawItemStruct->itemState & CDIS_SELECTED ) rcBack = RGB(255, 255,255); else if(lpDrawItemStruct->itemState & (CDIS_DISABLED | CDIS_GRAYED) ) rcBack = RGB(0, 255, 0); else rcBack = GetSysColor(COLOR_BTNFACE); pDC->FillSolidRect(rect, rcBack); rect.top += ::GetSystemMetrics(SM_CYEDGE); pDC->SetBkMode(TRANSPARENT); //绘制图片 CImageList *pImageList = GetImageList(); if (pImageList && tci.iImage >= 0) { rect.left += pDC->GetTextExtent(_T(" ")).cx; // Margin // Get height of image so we IMAGEINFO info; pImageList->GetImageInfo(tci.iImage, &info); CRect ImageRect(info.rcImage); INT nYpos = rect.top; pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT); rect.left += ImageRect.Width(); } //绘制字体 COLORREF txtColor; if (lpDrawItemStruct->itemState & CDIS_SELECTED ) { rect.top -= ::GetSystemMetrics(SM_CYEDGE); txtColor = RGB(0,0,255); } else if(lpDrawItemStruct->itemState & (CDIS_DISABLED | CDIS_GRAYED) ) txtColor = RGB(128, 128, 128); else txtColor = GetSysColor(COLOR_WINDOWTEXT); pDC->SetTextColor(txtColor); int r=rect.right; rect.right-=15; pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); rect.right=r; rect.left=rect.right-17; rect.top+=3; rect.bottom-=6; pDC->DrawFrameControl(&rect,DFCS_CAPTIONCLOSE,DFCS_BUTTONPUSH); pDC->RestoreDC(nSavedDC); } }