void CMessageBox::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; CRect drawrect; GetClientRect(&rect); GetClientRect(&drawrect); //create a memory device-context. This is done to help reduce //screen flicker, since we will paint the entire control to the //off screen device context first. CDC memDC; CBitmap bitmap; memDC.CreateCompatibleDC(&dc); bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dc, 0,0, SRCCOPY); memDC.SetBkMode(TRANSPARENT); memDC.SetBkColor(GetSysColor(COLOR_WINDOW)); memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); //OnDrawBackground(); drawrect.DeflateRect(MESSAGEBOX_BORDERMARGINX, MESSAGEBOX_BORDERMARGINY); if (m_hIcon != NULL) { DrawIconEx(memDC.m_hDC, drawrect.left, drawrect.top + ((drawrect.Height() - m_szAllButtons.cy - MESSAGEBOX_TEXTBUTTONMARGIN - m_szIcon.cy) / 2), m_hIcon, m_szIcon.cx, m_szIcon.cy, 0, NULL, DI_NORMAL); drawrect.left += m_szIcon.cx + MESSAGEBOX_ICONMARGIN; } DrawHTML(&memDC, drawrect, m_sMessage, m_LogFont); //Copy the memory device context back into the original DC. dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0,0, SRCCOPY); //Cleanup resources. memDC.SelectObject(pOldBitmap); memDC.DeleteDC(); bitmap.DeleteObject(); }
CSize CMessageBox::GetTextSize(const CString& str) { CRect rect; GetWindowRect(&rect); CDC * pDC = GetDC(); CDC memDC; CBitmap bitmap; memDC.CreateCompatibleDC(pDC); bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); //get the minimum size of the rectangle of the tooltip CSize sz = DrawHTML(&memDC, rect, str, m_LogFont, TRUE); memDC.SelectObject(pOldBitmap); memDC.DeleteDC(); bitmap.DeleteObject(); ReleaseDC(pDC); return sz; }
void CHTMLListCtrl::DrawItem(CDC *pDC, CRect rcItem, HTMLLIST_ITEM *pItem, BOOL bSelected) { CRect rcClipBox; pDC->GetClipBox(&rcClipBox); if(!IsRectVisible(rcClipBox,rcItem)) { return; } COLORREF clrText = RGB(0,0,0); COLORREF clrOld; CRect rcImage(0,0,0,0); if(bSelected) { clrText = m_clrTextSelectedItem; pDC->FillSolidRect(&rcItem,m_clrBkSelectedItem); } else { clrText = m_clrTextCtrlItem; pDC->FillSolidRect(&rcItem,m_clrBkCtrlItem); } if(m_dwExtendedStyles & HTMLLIST_STYLE_GRIDLINES) { pDC->DrawEdge(&rcItem,BDR_SUNKENINNER,BF_LEFT|BF_BOTTOM|BF_FLAT); } CPoint ptCheckBox = rcItem.TopLeft(); if(m_dwExtendedStyles & HTMLLIST_STYLE_CHECKBOX) { ptCheckBox.x += ITEM_PADDING_CHECKBOX_LEFT; ptCheckBox.y += rcItem.Height() / 2 - 8; m_ImageList.Draw(pDC,pItem->bChecked?1:0,ptCheckBox,ILD_TRANSPARENT); ptCheckBox.x += ITEM_CHECKBOX_WIDTH; } //Draw image if an imagelist is attached if(m_dwExtendedStyles & HTMLLIST_STYLE_IMAGES) { if(m_pImageList) { IMAGEINFO imgInfo = {0}; m_pImageList->GetImageInfo(0,&imgInfo); rcImage = imgInfo.rcImage; CPoint pt = ptCheckBox; pt.x += ITEM_IMAGE_PADDING_LEFT; pt.y = rcItem.top; pt.y += rcItem.Height() / 2 - rcImage.Height()/2; m_pImageList->Draw(pDC,pItem->uiImage,pt,ILD_TRANSPARENT); } } if(pItem->nStyle == NORMAL_TEXT) { clrOld = pDC->SetTextColor(clrText); CRect rc = rcItem; if(rcImage.Width()) { //make space for the Image already drawn rc.DeflateRect(rcImage.Width() + ITEM_IMAGE_PADDING_LEFT + ITEM_IMAGE_PADDING_RIGHT,0,0,0); } if(m_dwExtendedStyles & HTMLLIST_STYLE_CHECKBOX) { rc.left += ITEM_PADDING_LEFT + ITEM_CHECKBOX_WIDTH; } else { rc.left += ITEM_PADDING_LEFT; } if(!pItem->bHeightSpecified) rc.top += ITEM_PADDING_TOP; pDC->DrawText(pItem->sItemText,pItem->sItemText.GetLength(),&rc, DT_LEFT|DT_WORDBREAK); } else if(pItem->nStyle == HTML_TEXT) { //Draw HTML clrOld = pDC->SetTextColor(clrText); CRect rc = rcItem; if(rcImage.Width()) { //make space for the Image already drawn rc.DeflateRect(rcImage.Width() + ITEM_IMAGE_PADDING_LEFT + ITEM_IMAGE_PADDING_RIGHT,0,0,0); } if(m_dwExtendedStyles & HTMLLIST_STYLE_CHECKBOX) { rc.left += ITEM_PADDING_LEFT + ITEM_CHECKBOX_WIDTH; } else { rc.left += ITEM_PADDING_LEFT; } if(!pItem->bHeightSpecified) rc.top += ITEM_PADDING_TOP; DrawHTML(pDC->GetSafeHdc(),pItem->sItemText,pItem->sItemText.GetLength(), &rc,DT_LEFT|DT_WORDBREAK); } else if(pItem->nStyle == SINGLE_LINE_TEXT) { clrOld = pDC->SetTextColor(clrText); CRect rc = rcItem; if(rcImage.Width()) { //make space for the Image already drawn rc.DeflateRect(rcImage.Width() + ITEM_IMAGE_PADDING_LEFT + ITEM_IMAGE_PADDING_RIGHT,0,0,0); } if(m_dwExtendedStyles & HTMLLIST_STYLE_CHECKBOX) { rc.left += ITEM_PADDING_LEFT + ITEM_CHECKBOX_WIDTH; } else { rc.left += ITEM_PADDING_LEFT; } if(!pItem->bHeightSpecified) rc.top += ITEM_PADDING_TOP; //See if we can fit the text in one line char szBuffer[_MAX_PATH]; memset(szBuffer,0,_MAX_PATH); _tcscpy(szBuffer,pItem->sItemText); if(PathCompactPath(pDC->GetSafeHdc(),szBuffer,rc.Width())) { pDC->DrawText(szBuffer,_tcslen(szBuffer),&rc, DT_LEFT|DT_SINGLELINE|DT_VCENTER); } else { pDC->DrawText(pItem->sItemText,pItem->sItemText.GetLength(),&rc, DT_LEFT|DT_SINGLELINE|DT_VCENTER); } } pDC->SetTextColor(clrOld); //Draw the focus rect if focused if(m_bHasFocus && (bSelected)) { pDC->DrawFocusRect(&rcItem); } }
int CHTMLListCtrl::CalculateItemHeight(CString sText, int nStyle, UINT uiImage,int nItemWidth) { int nImageWidth = 0; int nPadding = ITEM_PADDING_LEFT; //default space if(m_dwExtendedStyles & HTMLLIST_STYLE_IMAGES) { if(m_pImageList) { if(m_pImageList->GetImageCount()) { IMAGEINFO Info = {0}; if(m_pImageList->GetImageInfo(uiImage,&Info)) { nImageWidth = Info.rcImage.right - Info.rcImage.left; nImageWidth += (ITEM_IMAGE_PADDING_LEFT + ITEM_IMAGE_PADDING_RIGHT); } } } } if(m_dwExtendedStyles & HTMLLIST_STYLE_CHECKBOX) { nPadding += ITEM_PADDING_CHECKBOX_LEFT + ITEM_CHECKBOX_WIDTH ; } if(nStyle == NORMAL_TEXT) { CDC *pDC = GetDC(); CFont *pOldFont = pDC->SelectObject(&m_font); CRect rc; rc.SetRectEmpty(); rc.left = 0; rc.right = nItemWidth - nPadding; rc.right -= nImageWidth; pDC->DrawText(sText,&rc,DT_WORDBREAK|DT_CALCRECT|DT_EXTERNALLEADING ); pDC->SelectObject(pOldFont); ReleaseDC(pDC); return rc.Height() + ITEM_PADDING_BOTTOM + ITEM_PADDING_TOP; } else if(nStyle == HTML_TEXT) { CDC *pDC = GetDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); CFont *pOldFont = memDC.SelectObject(&m_font); int nWidth = 0; nWidth = nItemWidth - nPadding; nWidth -= nImageWidth; CRect rc(0,0,nWidth,m_nWndHeight); int nHeight = DrawHTML(memDC.GetSafeHdc(),sText,sText.GetLength(),&rc,DT_LEFT|DT_CALCRECT|DT_WORDBREAK|DT_EXTERNALLEADING); memDC.SelectObject(pOldFont); ReleaseDC(pDC); return rc.Height() + ITEM_PADDING_BOTTOM + ITEM_PADDING_TOP; } else if(nStyle == SINGLE_LINE_TEXT) { CDC *pDC = GetDC(); CFont *pOldFont = pDC->SelectObject(&m_font); CRect rc; rc.SetRectEmpty(); rc.left = 0; rc.right = nItemWidth - nPadding; rc.right -= nImageWidth; pDC->DrawText(sText,&rc,DT_VCENTER|DT_CALCRECT|DT_SINGLELINE); pDC->SelectObject(pOldFont); ReleaseDC(pDC); return rc.Height() + ITEM_PADDING_BOTTOM + ITEM_PADDING_TOP; } return 0; }
void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); *pResult = 0; // Request item-specific notifications if this is the // beginning of the paint cycle. if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage ) { *pResult = CDRF_NOTIFYITEMDRAW; } else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage ) { LVITEM rItem; int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec ); CDC* pDC = CDC::FromHandle ( pLVCD->nmcd.hdc ); COLORREF crBkgnd; BOOL bListHasFocus; CRect rcItem; bListHasFocus = ( GetSafeHwnd() == ::GetFocus() ); // Get the image index and selected/focused state of the // item being drawn. ZeroMemory ( &rItem, sizeof(LVITEM) ); rItem.mask = LVIF_STATE; rItem.iItem = nItem; rItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; GetItem(&rItem); // Get the rect that bounds the text label. GetItemRect(nItem, rcItem, LVIR_LABEL); rcItem.left -= DUMMY_COL_WIDTH; COLORREF OldColor = -1; int nOldBKMode = -1; CString csText; LPTSTR lpszText = csText.GetBufferSetLength(g_Opt.m_bDescTextSize); GetItemText(nItem, 0, lpszText, g_Opt.m_bDescTextSize); csText.ReleaseBuffer(); // extract symbols CString strSymbols; int nSymEnd = csText.Find('|'); if (nSymEnd >= 0) { strSymbols = csText.Left(nSymEnd); csText = csText.Mid(nSymEnd + 1); } // Draw the background of the list item. Colors are selected // according to the item's state. if(rItem.state & LVIS_SELECTED) { if(bListHasFocus) { crBkgnd = g_Opt.m_Theme.ListBoxSelectedBG(); OldColor = pDC->SetTextColor(g_Opt.m_Theme.ListBoxSelectedText()); } else { crBkgnd = g_Opt.m_Theme.ListBoxSelectedNoFocusBG(); OldColor = pDC->SetTextColor(g_Opt.m_Theme.ListBoxSelectedNoFocusText()); } } else { //Shade alternating Rows if((nItem % 2) == 0) { crBkgnd = g_Opt.m_Theme.ListBoxOddRowsBG(); OldColor = pDC->SetTextColor(g_Opt.m_Theme.ListBoxOddRowsText()); } else { crBkgnd = g_Opt.m_Theme.ListBoxEvenRowsBG(); OldColor = pDC->SetTextColor(g_Opt.m_Theme.ListBoxEvenRowsText()); } } pDC->FillSolidRect(rcItem, crBkgnd); nOldBKMode = pDC->SetBkMode(TRANSPARENT); CRect rcText = rcItem; rcText.left += ROW_LEFT_BORDER; rcText.top++; if (m_showIfClipWasPasted && strSymbols.GetLength() > 0 && strSymbols.Find(_T("<pasted>")) >= 0) //clip was pasted from ditto { CRect pastedRect(rcItem); pastedRect.left++; pastedRect.right = rcItem.left + theApp.m_metrics.ScaleX(3); pDC->FillSolidRect(pastedRect, g_Opt.m_Theme.ClipPastedColor()); rcText.left += theApp.m_metrics.ScaleX(4); } // set firstTenNum to the first ten number (1-10) corresponding to // the current nItem. // -1 means that nItem is not in the FirstTen block. int firstTenNum = GetFirstTenNum(nItem); if( m_bShowTextForFirstTenHotKeys && firstTenNum > 0 ) { rcText.left += theApp.m_metrics.ScaleX(12); } bool drawInGroupIcon = true; // if we are inside a group, don't display the "in group" flag if( theApp.m_GroupID > 0 ) { int nFlag = strSymbols.Find(_T("<ingroup>")); if (nFlag >= 0) drawInGroupIcon = false; } DrawBitMap(nItem, rcText, pDC, csText); // draw the symbol box if( strSymbols.GetLength() > 0 ) { if(strSymbols.Find(_T("<group>")) >= 0) //group { m_groupFolder.Draw(pDC, this, rcText.left, rcText.top, false, false); rcText.left += m_groupFolder.ImageWidth() + theApp.m_metrics.ScaleX(2); } if (strSymbols.Find(_T("<noautodelete>")) >= 0 && strSymbols.Find(_T("<group>")) < 0 && strSymbols.Find(_T("<sticky>")) < 0) //don't auto delete { m_dontDeleteImage.Draw(pDC, this, rcText.left, rcText.top, false, false); rcText.left += m_dontDeleteImage.ImageWidth() + theApp.m_metrics.ScaleX(2); } if (strSymbols.Find(_T("<shortcut>")) >= 0) // has shortcut { m_shortCutImage.Draw(pDC, this, rcText.left, rcText.top, false, false); rcText.left += m_shortCutImage.ImageWidth() + theApp.m_metrics.ScaleX(2); } if (drawInGroupIcon && strSymbols.Find(_T("<ingroup>")) >= 0) // in group { m_inFolderImage.Draw(pDC, this, rcText.left, rcText.top, false, false); rcText.left += m_inFolderImage.ImageWidth() + theApp.m_metrics.ScaleX(2); } if (strSymbols.Find(_T("<qpastetext>")) >= 0) // has quick paste text { } if (strSymbols.Find(_T("<sticky>")) >= 0) //sticky clip { m_stickyImage.Draw(pDC, this, rcText.left, rcText.top, false, false); rcText.left += m_stickyImage.ImageWidth() + theApp.m_metrics.ScaleX(2); } } if(DrawRtfText(nItem, rcText, pDC) == FALSE) { if (m_searchText.GetLength() > 0 && FindNoCaseAndInsert(csText, m_searchText, _T("<font color='#ff0000'>"), _T("</font>")) > 0) { DrawHTML(pDC->m_hDC, csText, csText.GetLength(), rcText, DT_VCENTER | DT_EXPANDTABS | DT_NOPREFIX); } else { pDC->DrawText(csText, rcText, DT_VCENTER | DT_EXPANDTABS | DT_NOPREFIX); } } // Draw a focus rect around the item if necessary. if(bListHasFocus && (rItem.state & LVIS_FOCUSED)) pDC->DrawFocusRect(rcItem); if( m_bShowTextForFirstTenHotKeys && firstTenNum > 0 ) { CString cs; if( firstTenNum == 10 ) cs = "0"; else cs.Format(_T("%d"), firstTenNum); CRect crClient; GetWindowRect(crClient); ScreenToClient(crClient); CRect crHotKey = rcItem; int extraFromClipWasPaste = 0; if (m_showIfClipWasPasted) extraFromClipWasPaste = 3; crHotKey.right = crHotKey.left + theApp.m_metrics.ScaleX(11); crHotKey.left += theApp.m_metrics.ScaleX(1 + extraFromClipWasPaste); crHotKey.top += theApp.m_metrics.ScaleX(1 + extraFromClipWasPaste); HFONT hOldFont = (HFONT)pDC->SelectObject(m_SmallFont); pDC->DrawText(cs, crHotKey, DT_BOTTOM); pDC->MoveTo(CPoint(rcItem.left + theApp.m_metrics.ScaleX(8 + extraFromClipWasPaste), rcItem.top)); pDC->LineTo(CPoint(rcItem.left + theApp.m_metrics.ScaleX(8 + extraFromClipWasPaste), rcItem.bottom)); pDC->SelectObject(hOldFont); } // restore the previous values if(OldColor > -1) pDC->SetTextColor(OldColor); if(nOldBKMode > -1) pDC->SetBkMode(nOldBKMode); *pResult = CDRF_SKIPDEFAULT; // We've painted everything. } }