RECT TextViewMetrics::IntersectWithText( RECT rect, HWND hwnd ) const { RECT text = TextRect( hwnd ); RECT intersection; IntersectRect( &intersection, &rect, &text ); return intersection; }
void LiveTextView::InsertText(const char *inText, int32 inLength, int32 inOffset, const text_run_array *inRuns) { bool submit = false; if (inLength==1) { switch ((int)inText[0]) { case 10: case 13: case 9: /* TAB */ inLength = 0; submit = true; }; } if (((StringWidth(Text()) + StringWidth(inText)) > TextRect().Width() - 2.0) || (inLength>0 && (strchr(inText, 10) || strchr(inText, 13) || strchr(inText, 9)))) { inLength = 0; } BTextView::InsertText(inText, inLength, inOffset, inRuns); Draw(Bounds()); ((LiveTextControl *)Parent())->Invoke(); if (submit) { Invalidate(); Parent()->MakeFocus( false ); } }
void CDepartmentEstimationDialog::DrawText(CPaintDC &dc, CString Text, COLORREF Color, int l, int t, int r, int b) { CRect TextRect(l, t, r, b); dc.SetTextColor(Color); dc.SetBkMode( TRANSPARENT ); dc.DrawText(Text, &TextRect, DT_SINGLELINE | DT_CENTER); }
/*********************************************************** * HardWrap ***********************************************************/ void HWrapTextView::GetHardWrapedText(BString &out) { MakeEditable(false); BTextView *offview = new BTextView(Bounds(),NULL,TextRect(),B_FOLLOW_ALL); offview->SetText(Text()); BFont font; uint32 propa; GetFontAndColor(&font,&propa); out = ""; offview->SetFontAndColor(&font,B_FONT_ALL); BString line; int32 length = offview->TextLength(); float view_width = offview->TextRect().Width(); char c=0; bool inserted; for(int32 i=0;i < length;i++) { c = offview->ByteAt(i); if(c == '\n') { line = ""; continue; } line += c; if(font.StringWidth(line.String())>=view_width) { // Back 1 charactor. i--; line.Truncate(line.Length()-1); // Insert line break. inserted = false; int32 len = line.Length(); for(int32 k = 0;k<len;k++) { if(offview->CanEndLine(i-k)) { offview->Insert(i-k,"\n",1); inserted=true; i = i-k; break; } } // If could not find proper position, add line break to end. if(!inserted) offview->Insert(i,"\n",1); line = ""; } } out = offview->Text(); delete offview; MakeEditable(true); }
void InputTextView::_CheckTextRect() { // update text rect and make sure // the cursor/selection is in view BRect textRect(TextRect()); float width = ceilf(StringWidth(Text()) + 2.0); if (textRect.Width() < width) { textRect.right = textRect.left + width; SetTextRect(textRect); ScrollToSelection(); } }
void ConfirmSaveLoad (STAMP *MsgStamp) { RECT r, clip_r; TEXT t; SetContextFont (StarConFont); GetContextClipRect (&clip_r); t.baseline.x = clip_r.extent.width >> 1; t.baseline.y = (clip_r.extent.height >> 1) + (3 << RESOLUTION_FACTOR); // JMS_GFX t.align = ALIGN_CENTER; t.CharCount = (COUNT)~0; if (MsgStamp) t.pStr = GAME_STRING (SAVEGAME_STRING_BASE + 0); // "Saving . . ." else t.pStr = GAME_STRING (SAVEGAME_STRING_BASE + 1); // "Loading . . ." TextRect (&t, &r, NULL); r.corner.x -= 4 << RESOLUTION_FACTOR; // JMS_GFX r.corner.y -= 4 << RESOLUTION_FACTOR; // JMS_GFX r.extent.width += 8 << RESOLUTION_FACTOR; // JMS_GFX r.extent.height += 8 << RESOLUTION_FACTOR; // JMS_GFX if (MsgStamp) { *MsgStamp = SaveContextFrame (&r); } if (RESOLUTION_FACTOR == 0) { DrawStarConBox (&r, 2, BUILD_COLOR (MAKE_RGB15 (0x10, 0x10, 0x10), 0x19), BUILD_COLOR (MAKE_RGB15 (0x08, 0x08, 0x08), 0x1F), TRUE, BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x0A), 0x08)); SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x14, 0x14, 0x14), 0x0F)); } else { DrawStarConBox (&r, 2, PCMENU_TOP_LEFT_BORDER_COLOR, PCMENU_BOTTOM_RIGHT_BORDER_COLOR, TRUE, PCMENU_BACKGROUND_COLOR); SetContextForeGroundColor (PCMENU_SELECTION_TEXT_COLOR); } font_DrawText (&t); }
int EIconTextButtonProperty::GetHeight( CDC* pDC ) { CRect TextRect(0,0,0,0); CString s = GetTextValue(); if( s.GetLength()==0 ) { s = "Q"; //this is some default text to ensure there is actually height... } pDC->DrawText( s , &TextRect , DT_CALCRECT ); int w = TextRect.Width(); int h = TextRect.Height(); return 3 + h + 3; // return 19; }
void _BTextInput_::AlignTextRect() { // the label font could require the control to be higher than // necessary for the text view, we compensate this by layouting // the text rect to be in the middle, normally this means there // is one pixel spacing on each side BRect textRect(Bounds()); float vInset = max_c(1, floorf((textRect.Height() - LineHeight(0)) / 2.0)); float hInset = 2; float textFontWidth = TextRect().right; if (be_control_look != NULL) { switch (Alignment()) { case B_ALIGN_LEFT: hInset = be_control_look->DefaultLabelSpacing(); break; case B_ALIGN_RIGHT: hInset = textRect.right - textFontWidth; hInset -= be_control_look->DefaultLabelSpacing(); break; case B_ALIGN_CENTER: hInset = (textRect.right - textFontWidth) / 2.0; break; default: break; } } textRect.InsetBy(hInset, vInset); SetTextRect(textRect); }
// What a hack... void BComboBox::TextInput::AlignTextRect() { BRect bounds = Bounds(); BRect textRect = TextRect(); switch (Alignment()) { default: case B_ALIGN_LEFT: textRect.OffsetTo(B_ORIGIN); break; case B_ALIGN_CENTER: textRect.OffsetTo((bounds.Width() - textRect.Width()) / 2, textRect.top); break; case B_ALIGN_RIGHT: textRect.OffsetTo(bounds.Width() - textRect.Width(), textRect.top); break; } SetTextRect(textRect); }
// This function calculates how much of a string can be fitted within // a specific width, up to a newline or terminating \0. // pText is the text to be fitted. pText->CharCount will be set to the // number of characters that fitted. // startNext will be filled with the start of the first word that // doesn't fit in one line, or if an entire line fits, to the character // past the newline, or if the entire string fits, to the end of the // string. // maxWidth is the maximum number of pixels that a line may be wide // ASSUMPTION: there are no words in the text wider than maxWidth // maxChars is the maximum number of characters (not bytes) that are to // be fitted. // TRUE is returned if a complete line fitted // FALSE otherwise BOOLEAN getLineWithinWidth(TEXT *pText, const char **startNext, SIZE maxWidth, COUNT maxChars) { BOOLEAN eol; // The end of the line of text has been reached. BOOLEAN done; // We cannot add any more words. RECT rect; COUNT oldCount; const char *ptr; const char *wordStart; UniChar ch; COUNT charCount; //GetContextClipRect (&rect); eol = FALSE; done = FALSE; oldCount = 1; charCount = 0; ch = '\0'; ptr = pText->pStr; for (;;) { wordStart = ptr; // Scan one word. for (;;) { if (*ptr == '\0') { eol = TRUE; done = TRUE; break; } ch = getCharFromString (&ptr); eol = ch == '\0' || ch == '\n' || ch == '\r'; done = eol || charCount >= maxChars; if (done || ch == ' ') break; charCount++; } oldCount = pText->CharCount; pText->CharCount = charCount; TextRect (pText, &rect, NULL); if (rect.extent.width >= maxWidth) { pText->CharCount = oldCount; *startNext = wordStart; return FALSE; } if (done) { *startNext = ptr; return eol; } charCount++; // For the space in between words. } }
void CBitmapListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if (lpDrawItemStruct->CtlType==ODT_LISTVIEW) { //TCHAR sz[100]; //wsprintf(sz,"%d",(lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top)); //MessageBox(sz); //获取数据 UINT iWidth=0; TCHAR szBuffer[30]; memset(szBuffer,0,sizeof(szBuffer)); CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC); UserItemStruct * pUserItem=(UserItemStruct *)GetItemData(lpDrawItemStruct->itemID); CFont font; font.CreateFont(-12,0,0,0,700,NULL,NULL,NULL,134,3,2,1,2,TEXT("宋体")); CFont *pOldFont = pDC->SelectObject(&font); ///< Modified by zxd 20100709 旧字体保存下来。 //设置颜色 // COLORREF crTextColor,crBackColor; bool bSelect=(lpDrawItemStruct->itemState&ODS_SELECTED)||(lpDrawItemStruct->itemState&ODS_FOCUS); //GetDrawColor(crTextColor,crBackColor,pUserItem,0,bSelect); //pDC->SetBkColor(crBackColor); //pDC->SetTextColor(crTextColor); pDC->SetBkMode(TRANSPARENT); //绘画信息 CSize TextSize; CRect rect1; TCHAR szname[300]; for (int i=0;i<m_ListHeader.GetItemCount();i++) { int iTemp=GetColumnWidth(i); TextSize=pDC->GetTextExtent(szBuffer,lstrlen(szBuffer)); GetItemText(lpDrawItemStruct->itemID,i,szBuffer,sizeof(szBuffer)); CRect TextRect(lpDrawItemStruct->rcItem.left+iWidth,lpDrawItemStruct->rcItem.top,lpDrawItemStruct->rcItem.left+iWidth+iTemp,lpDrawItemStruct->rcItem.bottom); CGameImageHelper help(&m_itembk); help.BitBlt(pDC->GetSafeHdc(),TextRect.left,TextRect.top); //头像 rect1=m_rlog; rect1.OffsetRect(TextRect.left,TextRect.top); CGameImage log; wsprintf(szname,".\\image\\log\\roomlistlog%d.bmp",pUserItem->GameUserInfo.bLogoID); //lstrcpy(szname,".\\image\\log\\log1.bmp"); log.SetLoadInfo(szname,CGameImageLink::m_bAutoLock); CGameImageHelper helper(&log); //AFCStretchImage(pDC,rect1.left,rect1.top,rect1.Width(),rect1.Height(),helper,0,0,log.GetWidth(),log.GetHeight(),log.GetPixel(1,1)); helper.BitBlt(pDC->GetSafeHdc(),rect1.left,rect1.top); helper.CloseGDIHandle(); //名字 rect1=m_rname; rect1.OffsetRect(TextRect.left,TextRect.top); lstrcpy(szname,pUserItem->GameUserInfo.nickName); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); //等级 lstrcpy(szname,m_pGetOrderFun(pUserItem->GameUserInfo.dwPoint,0)); rect1=m_rorder; rect1.OffsetRect(TextRect.left,TextRect.top); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); //金币 lstrcpy(szname,m_sztitle); rect1=m_rcoin; rect1.OffsetRect(TextRect.left,TextRect.top); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); //经验值 wsprintf(szname,"%d",pUserItem->GameUserInfo.dwPoint-GetNormalOrderBasePoint(pUserItem->GameUserInfo.dwPoint)); rect1=m_rcoinc; rect1.OffsetRect(TextRect.left,TextRect.top); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); //赢 wsprintf(szname,"赢 %d",pUserItem->GameUserInfo.uWinCount); rect1=m_rwin; rect1.OffsetRect(TextRect.left,TextRect.top); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); //输 wsprintf(szname,"输 %d",pUserItem->GameUserInfo.uLostCount); rect1=m_rloss; rect1.OffsetRect(TextRect.left,TextRect.top); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); //桌号 if(pUserItem->GameUserInfo.bDeskNO!=255&&m_uComType!=TY_MATCH_GAME) { wsprintf(szname,"%d\n号\n桌",pUserItem->GameUserInfo.bDeskNO+1); rect1=m_rdesk; rect1.OffsetRect(TextRect.left,TextRect.top); DrawText(pDC->GetSafeHdc(),szname,lstrlen(szname),rect1,DT_CENTER|DT_VCENTER); } if(bSelect) PatBlt(pDC->GetSafeHdc(),TextRect.left,TextRect.top,TextRect.Width(),TextRect.Height(),DSTINVERT); /* pDC->DrawText(szBuffer,lstrlen(szBuffer),&TextRect,DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS); if (TextSize.cx<iTemp) { pDC->FillSolidRect(lpDrawItemStruct->rcItem.left+iWidth+TextSize.cx,lpDrawItemStruct->rcItem.top, iTemp-TextSize.cx,lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top,crBackColor); } iWidth+=iTemp;*/ } /// {{Added by zxd 20100709 释放GDI资源 pDC->SelectObject(pOldFont); font.DeleteObject(); /// Added by zxd 20100709 释放GDI资源}} } return; }
// status == -1: draw highlighted player dialog option // status == -2: draw non-highlighted player dialog option // status == -4: use current context, and baseline from pTextIn // status == 1: draw alien speech; subtitle cache is used static COORD add_text (int status, TEXT *pTextIn) { COUNT maxchars, numchars; TEXT locText; TEXT *pText; SIZE leading; const char *pStr; SIZE text_width; int num_lines = 0; static COORD last_baseline; BOOLEAN eol; CONTEXT OldContext = NULL; COUNT computerOn = 0; BatchGraphics (); maxchars = (COUNT)~0; if (status == 1) { if (last_subtitle == pTextIn->pStr) { // draws cached subtitle STAMP s; s.origin.x = 0; s.origin.y = 0; s.frame = TextCacheFrame; DrawStamp (&s); UnbatchGraphics (); return last_baseline; } else { // draw to subtitle cache; prepare first OldContext = SetContext (TextCacheContext); ClearDrawable (); last_subtitle = pTextIn->pStr; } text_width = CommData.AlienTextWidth; SetContextFont (CommData.AlienFont); GetContextFontLeading (&leading); pText = pTextIn; } else if (GetContextFontLeading (&leading), status <= -4) { text_width = (SIZE) (SIS_SCREEN_WIDTH - RES_SCALE(8) - (TEXT_X_OFFS << 2)); // JMS_GFX pText = pTextIn; } else { text_width = (SIZE) (SIS_SCREEN_WIDTH - RES_SCALE(8) - (TEXT_X_OFFS << 2)); // JMS_GFX switch (status) { case -3: // Unknown. Never reached; color matches the background color. SetContextForeGroundColor ( BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x14), 0x01)); break; case -2: // Not highlighted dialog options. SetContextForeGroundColor (COMM_PLAYER_TEXT_NORMAL_COLOR); break; case -1: // Currently highlighted dialog option. SetContextForeGroundColor (COMM_PLAYER_TEXT_HIGHLIGHT_COLOR); break; } maxchars = pTextIn->CharCount; locText = *pTextIn; locText.baseline.x -= RES_SCALE(8) - 4 * RESOLUTION_FACTOR; // JMS_GFX locText.CharCount = (COUNT)~0; locText.pStr = STR_BULLET; font_DrawText (&locText); locText = *pTextIn; pText = &locText; pText->baseline.y -= leading; } numchars = 0; pStr = pText->pStr; if (status > 0 && (CommData.AlienTextValign & (VALIGN_MIDDLE | VALIGN_BOTTOM))) { num_lines = _count_lines(pText); if (CommData.AlienTextValign == VALIGN_BOTTOM) pText->baseline.y -= (leading * num_lines); else if (CommData.AlienTextValign == VALIGN_MIDDLE) pText->baseline.y -= ((leading * num_lines) / 2); if (pText->baseline.y < 0) pText->baseline.y = 0; } do { pText->pStr = pStr; pText->baseline.y += leading; eol = getLineWithinWidth (pText, &pStr, text_width, maxchars); maxchars -= pText->CharCount; if (maxchars != 0) --maxchars; numchars += pText->CharCount; if (status <= 0) { // Player dialog option or (status == -4) other non-alien // text. if (pText->baseline.y < SIS_SCREEN_HEIGHT) font_DrawText (pText); if (status < -4 && pText->baseline.y >= -status - 10) { // Never actually reached. Status is never <-4. ++pStr; break; } } else { // Alien speech if (CommData.AlienConv == ORZ_CONVERSATION) { // BW : special case for the Orz conversations // the character $ is recycled as a marker to // switch from and to computer font const char *ptr; RECT rect; COORD baselinex = pText->baseline.x; COORD width = 0; COUNT remChars = pText->CharCount; // Remaining chars until end of line within width const char *bakptr; COUNT bakChars = remChars; COUNT bakcompOn = computerOn; FONT bakFont = SetContextFont(ComputerFont); SetContextFont(bakFont); ptr = pText->pStr; bakptr = ptr; // We need to manually center the line because // the computer font is larger than the Orzfont // This loop computes the width of the line while (remChars > 0) { while ((*ptr != '$') && remChars > 0) { getCharFromString (&ptr); remChars--; } pText->CharCount -= remChars; TextRect (pText, &rect, NULL); width += rect.extent.width; if (*ptr == '$') { getCharFromString (&ptr); remChars--; computerOn = 1 - computerOn; if (computerOn) SetContextFont (ComputerFont); else SetContextFont (CommData.AlienFont); } pText->CharCount = remChars; pText->pStr = ptr; } // This to simulate a centered line pText->baseline.x = baselinex - (width >> 1); pText->align = ALIGN_LEFT; // Put everything back in place for the // actual display remChars = bakChars; pText->CharCount = bakChars; ptr = bakptr; pText->pStr = bakptr; computerOn = bakcompOn; SetContextFont(bakFont); // This loop is used to look up for $ while (remChars > 0) { while ((*ptr != '$') && remChars > 0) { getCharFromString (&ptr); remChars--; } pText->CharCount -= remChars; TextRect (pText, &rect, NULL); font_DrawTracedText (pText, CommData.AlienTextFColor, CommData.AlienTextBColor); pText->baseline.x += rect.extent.width; if (*ptr == '$') { getCharFromString (&ptr); remChars--; computerOn = 1 - computerOn; if (computerOn) SetContextFont (ComputerFont); else SetContextFont (CommData.AlienFont); } pText->CharCount = remChars; pText->pStr = ptr; } pText->baseline.x = baselinex; pText->align = ALIGN_CENTER; } else { // Normal case : other races than Orz font_DrawTracedText (pText, CommData.AlienTextFColor, CommData.AlienTextBColor); } } } while (!eol && maxchars); pText->pStr = pStr; if (status == 1) { STAMP s; // We were drawing to cache -- flush to screen SetContext (OldContext); s.origin.x = s.origin.y = 0; s.frame = TextCacheFrame; DrawStamp (&s); last_baseline = pText->baseline.y; } UnbatchGraphics (); return (pText->baseline.y); }
void DrawBatch (PPRIMITIVE lpBasePrim, PRIM_LINKS PrimLinks, BATCH_FLAGS BatchFlags) { RECT ValidRect; HOT_SPOT OldHot; if (GraphicsSystemActive () && GetFrameValidRect (&ValidRect, &OldHot)) { COUNT CurIndex; PRIM_LINKS OldLinks; PPRIMITIVE lpPrim; BatchFlags &= BATCH_SINGLE | BATCH_BUILD_PAGE | BATCH_XFORM; BatchFlags |= _get_context_flags () & BATCH_CLIP_GRAPHICS; BatchGraphics (); if (BatchFlags & BATCH_BUILD_PAGE) { ClearBackGround (&ValidRect); } CurIndex = GetPredLink (PrimLinks); if (BatchFlags & BATCH_SINGLE) { if (CurIndex == END_OF_LIST) BatchFlags &= ~BATCH_SINGLE; else { lpBasePrim += CurIndex; OldLinks = GetPrimLinks (lpBasePrim); SetPrimLinks (lpBasePrim, END_OF_LIST, END_OF_LIST); CurIndex = 0; } } for (; CurIndex != END_OF_LIST; CurIndex = GetSuccLink (GetPrimLinks (lpPrim))) { GRAPHICS_PRIM PrimType; PPRIMITIVE lpWorkPrim; RECT ClipRect; TFB_Palette color; lpPrim = &lpBasePrim[CurIndex]; PrimType = GetPrimType (lpPrim); if (!ValidPrimType (PrimType)) continue; lpWorkPrim = lpPrim; switch (PrimType) { case POINT_PRIM: COLORtoPalette (GetPrimColor (lpWorkPrim), &color); TFB_Prim_Point (&lpWorkPrim->Object.Point, &color); break; case STAMP_PRIM: TFB_Prim_Stamp (&lpWorkPrim->Object.Stamp); break; case STAMPFILL_PRIM: COLORtoPalette (GetPrimColor (lpWorkPrim), &color); TFB_Prim_StampFill (&lpWorkPrim->Object.Stamp, &color); break; case LINE_PRIM: COLORtoPalette (GetPrimColor (lpWorkPrim), &color); TFB_Prim_Line (&lpWorkPrim->Object.Line, &color); break; case TEXT_PRIM: if (!TextRect (&lpWorkPrim->Object.Text, &ClipRect, NULL_PTR)) continue; _save_stamp.origin = ClipRect.corner; _text_blt (&ClipRect, lpWorkPrim); break; case RECT_PRIM: COLORtoPalette (GetPrimColor (lpWorkPrim), &color); TFB_Prim_Rect (&lpWorkPrim->Object.Rect, &color); break; case RECTFILL_PRIM: COLORtoPalette (GetPrimColor (lpWorkPrim), &color); TFB_Prim_FillRect (&lpWorkPrim->Object.Rect, &color); break; } } UnbatchGraphics (); _CurFramePtr->HotSpot = OldHot; if (BatchFlags & BATCH_SINGLE) SetPrimLinks (lpBasePrim, GetPredLink (OldLinks), GetSuccLink (OldLinks)); } }
void CLVColumnLabelView::Draw(BRect update_rect) { BRect ViewBounds = Bounds(); //Draw each column label in turn float ColumnBegin = 0.0; float ColumnEnd = -1.0; bool MergeWithLeft = false; int32 NumberOfColumns = fDisplayList->CountItems(); BPoint Start,Stop; for(int32 ColumnDraw = 0; ColumnDraw < NumberOfColumns; ColumnDraw++) { CLVColumn* ThisColumn = (CLVColumn*)fDisplayList->ItemAt(ColumnDraw); if(ThisColumn->IsShown()) { //Figure out where this column is ColumnBegin = ThisColumn->fColumnBegin; ColumnEnd = ThisColumn->fColumnEnd; //Start by figuring out if this column will merge with a shown column to the right bool MergeWithRight = false; if(ThisColumn->fFlags & CLV_MERGE_WITH_RIGHT) { for(int32 ColumnCounter = ColumnDraw+1; ColumnCounter < NumberOfColumns; ColumnCounter++) { CLVColumn* NextColumn = (CLVColumn*)fDisplayList->ItemAt(ColumnCounter); if(NextColumn->IsShown()) { //The next column is shown MergeWithRight = true; break; } else if(!(NextColumn->fFlags & CLV_MERGE_WITH_RIGHT)) //The next column is not shown and doesn't pass on the merge break; } } if(update_rect.Intersects(BRect(ColumnBegin,ViewBounds.top,ColumnEnd, ViewBounds.bottom))) { //Need to draw this column BeginLineArray(4); //Top line Start.Set(ColumnBegin,ViewBounds.top); Stop.Set(ColumnEnd-1.0,ViewBounds.top); if(MergeWithRight && !(ThisColumn == fColumnClicked && fColumnResizing)) Stop.x = ColumnEnd; AddLine(Start,Stop,BeHighlight); //Left line if(!MergeWithLeft) AddLine(BPoint(ColumnBegin,ViewBounds.top+1.0), BPoint(ColumnBegin,ViewBounds.bottom),BeHighlight); //Bottom line Start.Set(ColumnBegin+1.0,ViewBounds.bottom); if(MergeWithLeft) Start.x = ColumnBegin; Stop.Set(ColumnEnd-1.0,ViewBounds.bottom); if(MergeWithRight && !(ThisColumn == fColumnClicked && fColumnResizing)) Stop.x = ColumnEnd; AddLine(Start,Stop,BeShadow); //Right line if(ThisColumn == fColumnClicked && fColumnResizing) AddLine(BPoint(ColumnEnd,ViewBounds.top),BPoint(ColumnEnd,ViewBounds.bottom), BeFocusBlue); else if(!MergeWithRight) AddLine(BPoint(ColumnEnd,ViewBounds.top),BPoint(ColumnEnd,ViewBounds.bottom), BeShadow); EndLineArray(); //Add the label //Limit the clipping region to the interior of the box BRect TextRect(ColumnBegin+1.0,ViewBounds.top+1.0,ColumnEnd-1.0, ViewBounds.bottom-1.0); BRegion TextRegion; TextRegion.Include(TextRect); ConstrainClippingRegion(&TextRegion); bool focus; bool sort_key; if(ThisColumn == fColumnClicked && !fColumnResizing) focus = true; else focus = false; if(fParent->fSortKeyList.HasItem(ThisColumn) && ThisColumn->fSortMode != NoSort) sort_key = true; else sort_key = false; ThisColumn->DrawColumnHeader(this,TextRect,sort_key,focus,fFontAscent); //Restore the clipping region ConstrainClippingRegion(NULL); } //Set MergeWithLeft flag for the next column to the appropriate state MergeWithLeft = MergeWithRight; } } //Add highlight and shadow to the region after the columns if necessary if(ColumnEnd < ViewBounds.right) { ColumnBegin = ColumnEnd+1.0; if(update_rect.Intersects(BRect(ColumnEnd+1.0,ViewBounds.top,ViewBounds.right, ViewBounds.bottom))) { BeginLineArray(3); //Top line AddLine(BPoint(ColumnBegin,ViewBounds.top),BPoint(ViewBounds.right,ViewBounds.top), BeHighlight); //Left line AddLine(BPoint(ColumnBegin,ViewBounds.top+1.0),BPoint(ColumnBegin,ViewBounds.bottom), BeHighlight); //Bottom line Start.Set(ColumnBegin+1.0,ViewBounds.bottom); if(MergeWithLeft) Start.x = ColumnBegin; Stop.Set(ViewBounds.right,ViewBounds.bottom); AddLine(Start,Stop,BeShadow); EndLineArray(); } } //Draw the dragging box if necessary if(fColumnClicked && fColumnDragging) { float DragOutlineLeft = fPreviousMousePos.x-fDragBoxMouseHoldOffset; float GroupBegin = ((CLVDragGroup*)fDragGroups.ItemAt(fDragGroup))->GroupBegin; if(DragOutlineLeft < GroupBegin && fSnapGroupBefore == -1) DragOutlineLeft = GroupBegin; if(DragOutlineLeft > GroupBegin && fSnapGroupAfter == -1) DragOutlineLeft = GroupBegin; float DragOutlineRight = DragOutlineLeft + fDragBoxWidth; BeginLineArray(4); AddLine(BPoint(DragOutlineLeft,ViewBounds.top),BPoint(DragOutlineRight, ViewBounds.top),BeFocusBlue); AddLine(BPoint(DragOutlineLeft,ViewBounds.bottom),BPoint(DragOutlineRight, ViewBounds.bottom),BeFocusBlue); AddLine(BPoint(DragOutlineLeft,ViewBounds.top+1.0),BPoint(DragOutlineLeft, ViewBounds.bottom-1.0),BeFocusBlue); AddLine(BPoint(DragOutlineRight,ViewBounds.top+1.0),BPoint(DragOutlineRight, ViewBounds.bottom-1.0),BeFocusBlue); EndLineArray(); fPrevDragOutlineLeft = DragOutlineLeft; fPrevDragOutlineRight = DragOutlineRight; } }
//绘画函数 void CHappyGoDlgT::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if (lpDrawItemStruct->CtlType==ODT_LISTVIEW) { //获取数据 UINT iWidth=0; TCHAR szBuffer[30]; CSize TextSize; memset(szBuffer,0,sizeof(szBuffer)); CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect; GetClientRect(&rect); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap Screen; Screen.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); memDC.SelectObject(&Screen); CFont *pOldFont = memDC.SelectObject(&m_Font); Screen.DeleteObject(); memDC.SetBkMode(TRANSPARENT); memDC.FillSolidRect(&rect,RGB(255,0,255)); //设置颜色 COLORREF crTextColor,crBackColor; bool bSelect=(lpDrawItemStruct->itemState&ODS_SELECTED);//||(lpDrawItemStruct->itemState&ODS_FOCUS); GetDrawColor(crTextColor,crBackColor,0,bSelect); memDC.SetBkColor(crBackColor); memDC.SetTextColor(crTextColor); //memDC.SelectObject(m_Font); memDC.SetBkMode(TRANSPARENT); // 绘制背景 if(lpDrawItemStruct->itemID % 2 == 0) memDC.FillSolidRect(lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top,RGB(154,169,200)); else memDC.FillSolidRect(lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top,RGB(213,218,238)); //绘画信息 if(bSelect) { memDC.FillSolidRect(lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top,crBackColor); } for (int i=0;i<m_ListHeader.GetItemCount();i++) { int iTemp=GetColumnWidth(i); if(m_processpos == i) { TextSize=pDC->GetTextExtent(szBuffer,lstrlen(szBuffer)); GetItemText(lpDrawItemStruct->itemID,i,szBuffer,sizeof(szBuffer)); CRect TextRect(lpDrawItemStruct->rcItem.left+iWidth,lpDrawItemStruct->rcItem.top,lpDrawItemStruct->rcItem.left+iWidth+iTemp,lpDrawItemStruct->rcItem.bottom); if(!m_probgImage.IsNull() && !m_proImage.IsNull()) { m_probgImage.Draw(memDC, CRect(TextRect.left,TextRect.top,TextRect.left+m_probgImage.GetWidth(),TextRect.top+m_probgImage.GetHeight()), CRect(0,0,m_probgImage.GetWidth(),m_probgImage.GetHeight())); int length = (int)(m_probgImage.GetWidth() * (m_ProgressList[lpDrawItemStruct->itemID] / 100.0f)); int count = length / m_proImage.GetWidth() - 2; for(int i=0;i<count;i++) { m_proImage.Draw(memDC,TextRect.left+i*m_proImage.GetWidth()+1,TextRect.top); } char buff[128]; sprintf(buff,"%d",m_ProgressList[lpDrawItemStruct->itemID]); strcat(buff," %"); memDC.DrawText(buff,lstrlen(buff),TextRect,DT_RIGHT|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS); } iWidth+=iTemp; continue; } else { TextSize=pDC->GetTextExtent(szBuffer,lstrlen(szBuffer)); GetItemText(lpDrawItemStruct->itemID,i,szBuffer,sizeof(szBuffer)); CRect TextRect(lpDrawItemStruct->rcItem.left+iWidth,lpDrawItemStruct->rcItem.top,lpDrawItemStruct->rcItem.left+iWidth+iTemp,lpDrawItemStruct->rcItem.bottom); memDC.DrawText(szBuffer,lstrlen(szBuffer),&TextRect,DT_CENTER|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS); iWidth+=iTemp; } } pDC->TransparentBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, rect.left,rect.top,rect.Width(),rect.Height(),RGB(255,0,255)); memDC.SelectObject(pOldFont); //dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); memDC.DeleteDC(); } return; }
bool TextViewMetrics::IsInText( POINT point, HWND hwnd ) const { RECT text = TextRect( hwnd ); return PtInRect( &text, point ) ? true : false; }
//绘画函数 void CHappyGoDlg::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if (lpDrawItemStruct->CtlType==ODT_LISTVIEW) { //获取数据 UINT iWidth=0; TCHAR szBuffer[30]; memset(szBuffer,0,sizeof(szBuffer)); CDC * pDcItem=CDC::FromHandle(lpDrawItemStruct->hDC); /// 创建内存缓冲DC CBitmap BufBmp; CDC dc; CDC *pDC = &dc; CRect rc; GetClientRect(&rc); BufBmp.CreateCompatibleBitmap(pDcItem, rc.Width(), rc.Height()); dc.CreateCompatibleDC(pDcItem); CBitmap * pOldBmp=dc.SelectObject(&BufBmp); /// 选择字体 CFont *pDefaultFont = pDcItem->GetCurrentFont(); CFont *pOldFont = dc.SelectObject(pDefaultFont); UserItemStruct * pUserItem=(UserItemStruct *)GetItemData(lpDrawItemStruct->itemID); if (NULL == pUserItem) { dc.SelectObject(pOldBmp); BufBmp.DeleteObject(); dc.DeleteDC(); pDcItem->DeleteDC(); return ; } //设置颜色 COLORREF crTextColor,crBackColor; bool bSelect=(lpDrawItemStruct->itemState&ODS_SELECTED);//||(lpDrawItemStruct->itemState&ODS_FOCUS); GetDrawColor(crTextColor,crBackColor,pUserItem,0,bSelect); pDC->SetBkColor(crBackColor); pDC->SetTextColor(crTextColor); pDC->SetBkMode(TRANSPARENT); //绘画信息 CSize TextSize; pDC->FillSolidRect(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top, crBackColor); if((lpDrawItemStruct->itemState&ODS_SELECTED)||(lpDrawItemStruct->itemState&ODS_FOCUS)) {//画虚框 int mode=pDC->SetBkMode(TRANSPARENT); CPen penBlack,*pOldPen; //penBlack.DeleteObject(); if(lpDrawItemStruct->itemState&ODS_SELECTED) { if(penBlack.CreatePen(PS_DOT,1, m_bkColor));// RGB(255,255,255))); pOldPen=pDC->SelectObject(&penBlack); } else { if(penBlack.CreatePen(PS_DOT,1, m_FocusbkColor));// RGB(0,0,0))); pOldPen=pDC->SelectObject(&penBlack); } pDC->SelectStockObject(NULL_BRUSH); pDC->Rectangle(lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.right,lpDrawItemStruct->rcItem.bottom); pDC->SetBkMode(mode); /// {{ Added by zxd 20100709 释放GDI资源 pDC->SelectObject(pOldPen); penBlack.DeleteObject(); /// Added by zxd 20100709 释放GDI资源}} } BOOL bDraw; ///< 是否画用户状态图 HDITEM hdi; TCHAR lpBuffer[256]; hdi.mask = HDI_TEXT; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; MapColumn::iterator ite; ite = m_MapColumn.find("Nickname"); for (int i=0;i<m_ListHeader.GetItemCount();i++) { memset(lpBuffer,0,sizeof(TCHAR)*256); m_ListHeader.GetItem(i,&hdi); ///< 获取ListCtrl的列表名 bDraw = FALSE; if (m_MapColumn.end() != ite) { if (0 ==_stricmp(lpBuffer,ite->second.ColumnName)) ///< 画用户状态图 { CImageList *imgList = GetImageList(LVSIL_SMALL); if(imgList) { POINT pt; int IconID = GetStateImageIndex(pUserItem); pt.x = lpDrawItemStruct->rcItem.left+iWidth; pt.y = lpDrawItemStruct->rcItem.top; imgList->Draw(pDC,IconID,pt,ILD_TRANSPARENT); if (::g_global.bEnableUserType) { pt.x += 27; m_UserTypeList.Draw(pDC,pUserItem->GameUserInfo.userType,pt,ILD_TRANSPARENT); } if (::g_global.bEnableDiamondUserType)//邮游钻石身份标识 add by huangYuanSong 09.07.14 { pt.x += 24; if (pUserItem->GameUserInfo.userInfoEx1 > 0 ) { m_UserDiamondTypeList.Draw(pDC,0,pt,ILD_TRANSPARENT); } } bDraw = TRUE; } } } int iTemp = GetColumnWidth(i); TextSize = pDC->GetTextExtent(szBuffer,lstrlen(szBuffer)); GetItemText(lpDrawItemStruct->itemID,i,szBuffer,sizeof(szBuffer)); CRect TextRect(lpDrawItemStruct->rcItem.left+iWidth+5, lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.left+iWidth+iTemp, lpDrawItemStruct->rcItem.bottom); if (bDraw) { ///< 此次列是用户名称Nickname,名称前画了图,输出文字需右移32 TextRect.left += 32; //wushuqun 2009.6.26 if (::g_global.bEnableUserType) { TextRect.left += 24; } if (::g_global.bEnableDiamondUserType)//邮游钻石身份标识 add by huangYuanSong 09.07.14 { TextRect.left += 16; } } pDC->DrawText(szBuffer,lstrlen(szBuffer),&TextRect,(bDraw?DT_LEFT:DT_CENTER)|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS); iWidth += iTemp; } //绘画屏幕 pDcItem->BitBlt( lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top, &dc, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, SRCCOPY); dc.SelectObject(pOldBmp); dc.SelectObject(pOldFont); BufBmp.DeleteObject(); dc.DeleteDC(); } return; }
void DrawBatch (PRIMITIVE *lpBasePrim, PRIM_LINKS PrimLinks, BATCH_FLAGS BatchFlags) { RECT ValidRect; POINT origin; if (GraphicsSystemActive () && GetContextValidRect (&ValidRect, &origin)) { COUNT CurIndex; PRIMITIVE *lpPrim; DrawMode mode = _get_context_draw_mode (); BatchGraphics (); if (BatchFlags & BATCH_BUILD_PAGE) { ClearBackGround (&ValidRect); } CurIndex = GetPredLink (PrimLinks); for (; CurIndex != END_OF_LIST; CurIndex = GetSuccLink (GetPrimLinks (lpPrim))) { GRAPHICS_PRIM PrimType; PRIMITIVE *lpWorkPrim; RECT ClipRect; Color color; lpPrim = &lpBasePrim[CurIndex]; PrimType = GetPrimType (lpPrim); if (!ValidPrimType (PrimType)) continue; lpWorkPrim = lpPrim; switch (PrimType) { case POINT_PRIM: color = GetPrimColor (lpWorkPrim); TFB_Prim_Point (&lpWorkPrim->Object.Point, color, mode, origin); break; case STAMP_PRIM: TFB_Prim_Stamp (&lpWorkPrim->Object.Stamp, mode, origin); break; case STAMPFILL_PRIM: color = GetPrimColor (lpWorkPrim); TFB_Prim_StampFill (&lpWorkPrim->Object.Stamp, color, mode, origin); break; case LINE_PRIM: color = GetPrimColor (lpWorkPrim); TFB_Prim_Line (&lpWorkPrim->Object.Line, color, mode, origin); break; case TEXT_PRIM: if (!TextRect (&lpWorkPrim->Object.Text, &ClipRect, NULL)) continue; // ClipRect is relative to origin _text_blt (&ClipRect, &lpWorkPrim->Object.Text, origin); break; case RECT_PRIM: color = GetPrimColor (lpWorkPrim); TFB_Prim_Rect (&lpWorkPrim->Object.Rect, color, mode, origin); break; case RECTFILL_PRIM: color = GetPrimColor (lpWorkPrim); TFB_Prim_FillRect (&lpWorkPrim->Object.Rect, color, mode, origin); break; } } UnbatchGraphics (); } }
AboutTextView(BRect rect) : BTextView(rect,NULL,rect.OffsetToCopy(B_ORIGIN),B_FOLLOW_NONE,B_WILL_DRAW) { int32 major = 0,middle = 0,minor = 0,variety = 0,internal = 1; // get version information for app app_info appInfo; if (be_app->GetAppInfo(&appInfo) == B_OK) { BFile file(&appInfo.ref,B_READ_ONLY); if (file.InitCheck() == B_OK) { BAppFileInfo info(&file); if (info.InitCheck() == B_OK) { version_info versionInfo; if (info.GetVersionInfo(&versionInfo,B_APP_VERSION_KIND) == B_OK) { major = versionInfo.major; middle = versionInfo.middle; minor = versionInfo.minor; variety = versionInfo.variety; internal = versionInfo.internal; } } } } // prepare version variety string const char *varietyStrings[] = {"Development","Alpha","Beta","Gamma","Golden master","Final"}; char varietyString[32]; strcpy(varietyString,varietyStrings[variety % 6]); if (variety < 5) sprintf(varietyString + strlen(varietyString),"/%li",internal); char s[512]; sprintf(s, "Mail Daemon Replacement\n\n" "by Dr. Zoidberg Enterprises. All rights reserved.\n\n" "Version %ld.%ld.%ld %s\n\n" "See LICENSE file included in the installation package for more information.\n\n\n\n" "You can contact us at:\n" "%s\n\n" "Please submit bug reports using the %s\n\n" "Project homepage at:\n%s", major,middle,minor,varietyString, kEMail,kBugsitePretty,kWebsite); SetText(s); MakeEditable(false); MakeSelectable(false); SetAlignment(B_ALIGN_CENTER); SetStylable(true); // aethetical changes BFont font; GetFont(&font); font.SetSize(24); SetFontAndColor(0,23,&font,B_FONT_SIZE); // center the view vertically rect = TextRect(); rect.OffsetTo(0,(Bounds().Height() - TextHeight(0,42)) / 2); SetTextRect(rect); // set the link regions int start = strstr(s,kEMail) - s; int finish = start + strlen(kEMail); GetTextRegion(start,finish,&fMail); SetFontAndColor(start,finish,NULL,0,&kLinkColor); start = strstr(s,kBugsitePretty) - s; finish = start + strlen(kBugsitePretty); GetTextRegion(start,finish,&fBugsite); SetFontAndColor(start,finish,NULL,0,&kLinkColor); start = strstr(s,kWebsite) - s; finish = start + strlen(kWebsite); GetTextRegion(start,finish,&fWebsite); SetFontAndColor(start,finish,NULL,0,&kLinkColor); }
void Widget_DrawTextEntry (WIDGET *_self, int x, int y) { WIDGET_TEXTENTRY *self = (WIDGET_TEXTENTRY *)_self; Color oldtext; Color inactive, default_color, selected; FONT oldfont = 0; FRAME oldFontEffect = SetContextFontEffect (NULL); TEXT t; if (cur_font) oldfont = SetContextFont (cur_font); default_color = WIDGET_INACTIVE_SELECTED_COLOR; selected = WIDGET_ACTIVE_COLOR; inactive = WIDGET_INACTIVE_COLOR; BatchGraphics (); t.baseline.x = x + 64 * RESOLUTION_FACTOR; // JMS_GFX t.baseline.y = y; t.align = ALIGN_LEFT; t.CharCount = ~0; t.pStr = self->category; if (widget_focus == _self) { oldtext = SetContextForeGroundColor (selected); } else { oldtext = SetContextForeGroundColor (default_color); } font_DrawText (&t); t.baseline.x -= 64 * RESOLUTION_FACTOR; // JMS_GFX /* Force string termination */ self->value[WIDGET_TEXTENTRY_WIDTH-1] = 0; t.baseline.y = y; t.CharCount = utf8StringCount (self->value); t.pStr = self->value; if (!(self->state & WTE_EDITING)) { // normal or selected state t.baseline.x = 160 << RESOLUTION_FACTOR; // JMS_GFX t.align = ALIGN_CENTER; if (widget_focus == _self) { oldtext = SetContextForeGroundColor (selected); } else { oldtext = SetContextForeGroundColor (inactive); } font_DrawText (&t); } else { // editing state COUNT i; RECT text_r; BYTE char_deltas[WIDGET_TEXTENTRY_WIDTH]; BYTE *pchar_deltas; RECT r; SIZE leading; t.baseline.x = 90 << RESOLUTION_FACTOR; // JMS_GFX t.align = ALIGN_LEFT; // calc background box dimensions // XXX: this may need some tuning, especially if a // different font is used. The font 'leading' values // are not what they should be. #define BOX_VERT_OFFSET 2 GetContextFontLeading (&leading); r.corner.x = t.baseline.x - 1; r.corner.y = t.baseline.y - leading + BOX_VERT_OFFSET; r.extent.width = ScreenWidth - r.corner.x - 10; r.extent.height = leading + 2; TextRect (&t, &text_r, char_deltas); #if 0 // XXX: this should potentially be used in ChangeCallback if ((text_r.extent.width + 2) >= r.extent.width) { // the text does not fit the input box size and so // will not fit when displayed later UnbatchGraphics (); // disallow the change return (FALSE); } #endif oldtext = SetContextForeGroundColor (selected); DrawFilledRectangle (&r); // calculate the cursor position and draw it pchar_deltas = char_deltas; for (i = self->cursor_pos; i > 0; --i) r.corner.x += (SIZE)*pchar_deltas++; if (self->cursor_pos < t.CharCount) /* cursor mid-line */ --r.corner.x; if (self->state & WTE_BLOCKCUR) { // Use block cursor for keyboardless systems if (self->cursor_pos == t.CharCount) { // cursor at end-line -- use insertion point r.extent.width = 1; } else if (self->cursor_pos + 1 == t.CharCount) { // extra pixel for last char margin r.extent.width = (SIZE)*pchar_deltas + 2; } else { // normal mid-line char r.extent.width = (SIZE)*pchar_deltas + 1; } } else { // Insertion point cursor r.extent.width = 1; } // position cursor within input field rect ++r.corner.x; ++r.corner.y; r.extent.height -= 2; SetContextForeGroundColor (WIDGET_CURSOR_COLOR); DrawFilledRectangle (&r); SetContextForeGroundColor (inactive); font_DrawText (&t); } UnbatchGraphics (); SetContextFontEffect (oldFontEffect); if (oldfont) SetContextFont (oldfont); SetContextForeGroundColor (oldtext); }
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; } }