wxObject *MaxTreeCtrlXmlHandler::DoCreateResource() { XRC_MAKE_INSTANCE(tree, MaxTreeCtrl) tree->Create(m_parentAsWindow, GetID(), GetPosition(), GetSize(), GetStyle(wxT("style"), wxTR_DEFAULT_STYLE), wxDefaultValidator, GetName()); tree->MaxBind(_wx_wxtreectrl_wxTreeCtrl__xrcNew(tree)); wxImageList *imagelist = GetImageList(); if ( imagelist ) tree->AssignImageList(imagelist); SetupWindow(tree); return tree; }
bool wxNotebook::SetPageImage(size_t n, int imageId) { wxCHECK_MSG(n < GetPageCount(), false, "invalid notebook index"); if (imageId >= 0) { wxCHECK_MSG(HasImageList(), false, "invalid notebook imagelist"); const wxBitmap* bitmap = GetImageList()->GetBitmapPtr(imageId); if (bitmap == NULL) return false; // set the new image: m_qtTabWidget->setTabIcon( n, QIcon( *bitmap->GetHandle() )); } else { // remove the image using and empty qt icon: m_qtTabWidget->setTabIcon( n, QIcon() ); } m_images[n] = imageId; return true; }
CImageList* CCustomTabCtrl::CreateDragImage(int i) { TCITEM item; char text[100]; item.mask = TCIF_IMAGE | TCIF_TEXT; item.pszText = text; item.cchTextMax = 100; GetItem(i, &item); // Prepare to Paint CImageList* img = new CImageList; HDC hdc =::GetDC(m_hWnd); HDC memdc = CreateCompatibleDC(hdc); HGDIOBJ holdf = SelectObject(memdc, GetFont()->m_hObject); // Begin Paint CRect rc; rc.top = rc.left = 0; int l = strlen(item.pszText); DrawText(memdc, item.pszText, l, rc, DT_LEFT | DT_SINGLELINE | DT_CALCRECT); HBITMAP bmp = CreateCompatibleBitmap(hdc, rc.right + 20, rc.bottom); img->Create(rc.right + 20, rc.bottom, ILC_COLOR32 | ILC_MASK, 1, 0); HGDIOBJ holdobj = SelectObject(memdc, bmp); // 清空背景 SetBkColor(memdc, 0xc0c0c0); ExtTextOut(memdc, 0, 0, ETO_OPAQUE, rc, NULL, 0, NULL); ImageList_Draw(GetImageList()->m_hImageList, item.iImage, memdc, 0, (rc.bottom - 16) / 2, ILD_TRANSPARENT); //輸出文字 SetTextColor(memdc, GetSysColor(COLOR_WINDOWTEXT)); rc.OffsetRect(20, 0); DrawText(memdc, item.pszText, l, rc, DT_SINGLELINE); // End Paint ::ReleaseDC(m_hWnd, hdc); SelectObject(memdc, holdobj); SelectObject(memdc, holdf); ImageList_AddMasked(img->m_hImageList, bmp, 0xc0c0c0); DeleteObject(bmp); DeleteDC(memdc); return img; }
int CFeedIcoItemListCtrl::AddImg2List(CxImage* img) { int nRet = -1; if (img) { CImageList* mImgList = GetImageList(LVSIL_NORMAL); CDC* hdc = this->GetDC(); HBITMAP m_bitmap = img->MakeBitmap(hdc->m_hDC); nRet = mImgList->Add(CBitmap::FromHandle(m_bitmap),CLR_NONE); if (hdc) ReleaseDC(hdc); if (m_bitmap) DeleteObject(m_bitmap); } return nRet; }
BOOL EXWaitingTreeCtrl::GetItemImageRect(HTREEITEM hItem, LPRECT pRect) { if (GetImageList(TVSIL_NORMAL) == NULL) return FALSE; // no images CRect rc; // get item rect if (!GetItemRect(hItem, &rc, TRUE)) return FALSE; int cx = GetSystemMetrics(SM_CXSMICON); int cy = GetSystemMetrics(SM_CYSMICON); // move onto the icon space int margin = (rc.Height()-cy)/2; rc.OffsetRect(-cx-3 , margin); rc.right = rc.left + cx; // make it square rc.bottom = rc.top + cy; // make it square *pRect = rc; return TRUE; }
bool wxNotebook::InsertPage(size_t n, wxWindow *page, const wxString& text, bool bSelect, int imageId) { // disable firing qt signals until wx structures are filled m_qtTabWidget->blockSignals(true); if (imageId != -1) { if (HasImageList()) { const wxBitmap* bitmap = GetImageList()->GetBitmapPtr(imageId); m_qtTabWidget->insertTab( n, page->GetHandle(), QIcon( *bitmap->GetHandle() ), wxQtConvertString( text )); } else { wxFAIL_MSG("invalid notebook imagelist"); } } else { m_qtTabWidget->insertTab( n, page->GetHandle(), wxQtConvertString( text )); } m_pages.Insert(page, n); m_images.insert(m_images.begin() + n, imageId); // reenable firing qt signals as internal wx initialization was completed m_qtTabWidget->blockSignals(false); if (bSelect && GetPageCount() > 1) { SetSelection( n ); } return true; }
void wxListbook::SetImageList(wxImageList *imageList) { #ifdef CAN_USE_REPORT_VIEW wxListView * const list = GetListView(); // If imageList presence has changed, we update the list control view if ( (imageList != NULL) != (GetImageList() != NULL) ) { // Preserve the selection which is lost when changing the mode const int oldSel = GetSelection(); // Update the style to use icon view for images, report view otherwise long style = wxLC_SINGLE_SEL; if ( imageList ) { style |= GetListCtrlIconViewFlags(); } else // no image list { style |= GetListCtrlReportViewFlags(); } list->SetWindowStyleFlag(style); if ( !imageList ) list->InsertColumn(0, wxT("Pages")); // Restore selection if ( oldSel != wxNOT_FOUND ) SetSelection(oldSel); } list->SetImageList(imageList, wxIMAGE_LIST_NORMAL); #endif // CAN_USE_REPORT_VIEW wxBookCtrlBase::SetImageList(imageList); }
/////////////////////////////////////////////////////////////////////////////// // DrawImage int CXHeaderCtrl::DrawImage(CDC* pDC, CRect rect, LPHDITEM lphdi, BOOL bRight) { CImageList* pImageList = GetImageList(); int iWidth = 0; if (lphdi->iImage != XHEADERCTRL_NO_IMAGE) { if (pImageList) { if (rect.Width() > 0) { POINT point; point.y = rect.CenterPoint().y - (m_sizeImage.cy >> 1); if (bRight) point.x = rect.right - m_sizeImage.cx; else point.x = rect.left; SIZE size; size.cx = rect.Width()<m_sizeImage.cx ? rect.Width():m_sizeImage.cx; size.cy = m_sizeImage.cy; // save image list background color COLORREF rgb = pImageList->GetBkColor(); // set image list background color to same as header control pImageList->SetBkColor(pDC->GetBkColor()); pImageList->DrawIndirect(pDC, lphdi->iImage, point, size, CPoint(0, 0)); pImageList->SetBkColor(rgb); iWidth = m_sizeImage.cx; } } }
void CMuleNotebook::OnMouseMotion(wxMouseEvent &event) { if (GetImageList() == NULL) { // This Mulenotebook has no images on tabs, so nothing to do. event.Skip(); return; } long flags = 0; int tab = HitTest(wxPoint(event.m_x,event.m_y),&flags); // Clear the highlight for all tabs. for (int i=0;i<(int)GetPageCount();++i) { SetPageImage(i, 0); } if ((tab != -1) && (flags == wxNB_HITTEST_ONICON)) { // Mouse is over a 'x' SetPageImage(tab, 1); } else { // Is not a 'x'. Send this event up. event.Skip(); } }
BOOL CMetadataTree::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); CMetaTreeCtrl *pCtrl=(CMetaTreeCtrl *)&GetTreeCtrl(); pCtrl->SetImageList(GetImageList(),TVSIL_NORMAL); DWORD dwStyle2; dwStyle2 = WS_VISIBLE | WS_CHILD | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS; SetWindowLong(pCtrl->m_hWnd,GWL_STYLE ,dwStyle2); if(GetParentFrame()) if(GetParentFrame()->GetParent()) { CRect Rect; GetParentFrame()->GetParent()->GetClientRect(Rect); GetParentFrame()->MoveWindow(0,0,300,Rect.bottom); } InsertSystemElements(); return TRUE; }
void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDraw) {try{ int cCols = GetHeaderCtrl ()->GetItemCount (); CDC *dc = CDC::FromHandle (lpDraw->hDC); int xStart = lpDraw->rcItem.left; CImageList *pImages = GetImageList (LVSIL_SMALL); BOOL bNeedBorder = FALSE; CHeaderCtrl* pHdr = GetHeaderCtrl (); for (int i = 0; i < cCols; i++) { LVITEM item; TCHAR szItem [10000]; int colWidth = GetColumnWidth (pHdr->OrderToIndex (i)); xStart += 5; colWidth -= 5; item.iItem = lpDraw->itemID; item.iSubItem = i; item.pszText = szItem; item.cchTextMax = sizeof (szItem); item.mask = LVIF_IMAGE | LVIF_TEXT; GetItem (&item); if (i == 0) { item.state = GetItemState (lpDraw->itemID, LVIS_SELECTED|LVIS_FOCUSED); COLORREF clrBg = m_vInfo [lpDraw->itemID].clrBg; COLORREF clrText = m_vInfo [lpDraw->itemID].clrText; if (item.state & LVIS_FOCUSED) bNeedBorder = TRUE; if (item.state & LVIS_SELECTED) { clrBg = GetSysColor (COLOR_HIGHLIGHT); clrText = GetSysColor (COLOR_HIGHLIGHTTEXT); if (bNeedBorder == FALSE) { if (GetSelectionMark () == (int)lpDraw->itemID) bNeedBorder = TRUE; } } CBrush br; CPen pen; CBrush *oldBr; CPen *oldPen; if (RGBIsEqual (clrBg, clrText)) clrText = (~clrText) & 0x00FFFFFF; dc->SetTextColor (clrText); br.CreateSolidBrush (clrBg); pen.CreatePen (PS_SOLID, 1, clrBg); oldBr = dc->SelectObject (&br); oldPen = dc->SelectObject (&pen); dc->Rectangle (&lpDraw->rcItem); if (m_bGrid) { CPen pen1 (PS_SOLID, 1, m_clrGrid); dc->SelectObject (&pen1); dc->MoveTo (lpDraw->rcItem.left, lpDraw->rcItem.bottom-1); dc->LineTo (lpDraw->rcItem.right, lpDraw->rcItem.bottom-1); dc->SelectObject (oldPen); } dc->SelectObject (oldBr); dc->SelectObject (oldPen); if (pImages) { CPoint pt; pt.x = xStart; pt.y = lpDraw->rcItem.top; if (m_pSelImages && (item.state & LVIS_SELECTED)) m_pSelImages->Draw (dc, item.iImage, pt, ILD_TRANSPARENT); else pImages->Draw (dc, item.iImage, pt, ILD_TRANSPARENT); IMAGEINFO inf; pImages->GetImageInfo (item.iImage, &inf); xStart += inf.rcImage.right - inf.rcImage.left + 5; colWidth -= inf.rcImage.right - inf.rcImage.left + 5; } } if (*item.pszText) { int needX = GetStringWidth (item.pszText); BOOL bDrawText = TRUE; RECT rcText = lpDraw->rcItem; rcText.left = xStart; rcText.right = xStart + colWidth - 5; if (needX > colWidth-5) { RECT rc = rcText; int dx = GetStringWidth ("..."); if (dx <= colWidth-5) { rc.left = rc.right - dx; dc->DrawText ("...", &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER); rcText.right = rc.left - 5; } else bDrawText = FALSE; } if (bDrawText) dc->DrawText (szItem, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX); } xStart += colWidth; if (m_bGrid) { CPen pen (PS_SOLID, 1, m_clrGrid); CPen *oldPen = dc->SelectObject (&pen); dc->MoveTo (xStart-1, lpDraw->rcItem.top); dc->LineTo (xStart-1, lpDraw->rcItem.bottom); dc->SelectObject (oldPen); } } if (bNeedBorder) { dc->SetTextColor (m_vInfo [lpDraw->itemID].clrText); RECT rc = lpDraw->rcItem; rc.bottom--; rc.right--; dc->DrawFocusRect (&rc); } }catch (...){} }
wxObject *wxChoicebookXmlHandler::DoCreateResource() { if (m_class == wxT("choicebookpage")) { wxXmlNode *n = GetParamNode(wxT("object")); if ( !n ) n = GetParamNode(wxT("object_ref")); if (n) { bool old_ins = m_isInside; m_isInside = false; wxObject *item = CreateResFromNode(n, m_choicebook, NULL); m_isInside = old_ins; wxWindow *wnd = wxDynamicCast(item, wxWindow); if (wnd) { m_choicebook->AddPage(wnd, GetText(wxT("label")), GetBool(wxT("selected"))); if ( HasParam(wxT("bitmap")) ) { wxBitmap bmp = GetBitmap(wxT("bitmap"), wxART_OTHER); wxImageList *imgList = m_choicebook->GetImageList(); if ( imgList == NULL ) { imgList = new wxImageList( bmp.GetWidth(), bmp.GetHeight() ); m_choicebook->AssignImageList( imgList ); } int imgIndex = imgList->Add(bmp); m_choicebook->SetPageImage(m_choicebook->GetPageCount()-1, imgIndex ); } else if ( HasParam(wxT("image")) ) { if ( m_choicebook->GetImageList() ) { m_choicebook->SetPageImage(m_choicebook->GetPageCount()-1, GetLong(wxT("image")) ); } else // image without image list? { ReportError(n, "image can only be used in conjunction " "with imagelist"); } } } else { ReportError(n, "choicebookpage child must be a window"); } return wnd; } else { ReportError("choicebookpage must have a window child"); return NULL; } } else { XRC_MAKE_INSTANCE(nb, wxChoicebook) nb->Create(m_parentAsWindow, GetID(), GetPosition(), GetSize(), GetStyle(wxT("style")), GetName()); wxImageList *imagelist = GetImageList(); if ( imagelist ) nb->AssignImageList(imagelist); wxChoicebook *old_par = m_choicebook; m_choicebook = nb; bool old_ins = m_isInside; m_isInside = true; CreateChildren(m_choicebook, true/*only this handler*/); m_isInside = old_ins; m_choicebook = old_par; return nb; } }
BOOL CReportCtrl::StartEdit(int nItem, int nSubItem) { // Get the grid width and height if(!m_bAllowEdit || !_IsValidIndex(nItem) || nSubItem < 0 || nSubItem >= GetColumnCount()) { return(FALSE); } if(m_ptEditting.x == nItem && m_ptEditting.y == nSubItem) { return(TRUE); } EndEdit(TRUE); m_ptEditting.x = nItem; m_ptEditting.y = nSubItem; SetAllItemStates(RC_ITEM_SELECTED, RC_ITEM_UNSELECTED); // unselect all SetItemStates(m_ptEditting.x, RC_ITEM_SELECTED | RC_ITEM_FOCUSED); // determine editbox font and alignment const DWORD FMT = _GetHeaderTextFormat(nSubItem); if(FMT != m_dwPrevEditFmt) { m_dwPrevEditFmt = FMT; // Funny thing: // Changing CEdit style among ES_LEFT, ES_CENTER, ES_RIGHT at runtime works // sometimes and fails other times. It just cannot guarantee to be succeed. // So I decided to destroy and recreate the CEdit every time when the text // format changes. if(m_pWndEdit->GetSafeHwnd() != NULL) { m_pWndEdit->DestroyWindow(); } if(!m_pWndEdit->Create(ES_AUTOHSCROLL | ES_NOHIDESEL | WS_CHILD | WS_BORDER | FMT, CRect(0, 0, 1, 1), this, 0)) { return(FALSE); } } else { if(m_pWndEdit->GetSafeHwnd() == NULL && !m_pWndEdit->Create(ES_AUTOHSCROLL | ES_NOHIDESEL | WS_CHILD | WS_BORDER | FMT, CRect(0, 0, 1, 1), this, 0)) { return(FALSE); } } m_pWndEdit->SetFont(GetFont()); CRect rcEdit; ListView_GetSubItemRect(GetSafeHwnd(), m_ptEditting.x, m_ptEditting.y, LVIR_LABEL, &rcEdit); if(m_ptEditting.y > 0 && GetImageList() != NULL && GetItemImage(m_ptEditting.x, m_ptEditting.y) >= 0) { rcEdit.DeflateRect(16, 0, 0, 0); } // Move the editbox to that grid, obtain text from the grid, display the // editbox, and, finally, highlights all text in the editbox and set the // windows focus to the editbox. m_pWndEdit->MoveWindow(&rcEdit); m_pWndEdit->SetWindowText(GetItemText(m_ptEditting.x, m_ptEditting.y)); m_pWndEdit->ShowWindow(SW_SHOW); m_pWndEdit->SetSel(0, -1); m_pWndEdit->SetFocus(); return(TRUE); }
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { nCurAppRunMode=afxAppRunMode; if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; CExtCmdManager::g_bDisableCmdIfNoHandler=0; UINT nMainToolBarID=IDR_MAINFRAME; if(nCurAppRunMode==CONFIG_MODE) { SetTitle("2—: онфигуратор"); nMainToolBarID=IDR_CONFIGTOOLBAR; } csProfileName=GetTitle()+"N05"; #ifdef _DEBUG csProfileName+="D"; #endif CWinApp * pApp = ::AfxGetApp(); g_CmdManager->ProfileSetup( csProfileName, GetSafeHwnd() ); //ћеню /* m_wndMenuBar.SetMdiWindowPopupName( _T("Window") ); if( !m_wndMenuBar.Create("√лавное меню", this, IDC_MAIN_MENU)) { TRACE0( _T( "Failed to create menubar\n" ) ); return -1; } */ if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } pStatusBar=&m_wndStatusBar; //√лавна¤ панель if( !m_ToolMain.Create( _T("ќбща¤ панель инструментов"), this, IDR_MAIN_TOOLBAR ) || !m_ToolMain.LoadToolBar(nMainToolBarID) ) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } //ѕанель инструментов модул¤ if( !m_ToolModule.Create( _T("ѕанель инструментов модул¤"), this, IDR_MODULE ) || !m_ToolModule.LoadToolBar(IDR_MODULE) ) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } //ѕанель инструментов формы if(nCurAppRunMode==CONFIG_MODE) { if( !m_ToolEdit.Create( _T("ѕанель инструментов формы"), this, IDR_EDITBAR ) || !m_ToolEdit.LoadToolBar(IDR_EDITBAR) ) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } } //—оздаем контейнер окна сообщений if( !m_ParentMessageBar.Create( _T("ќкно сообщений"), this, ID_VIEWMESSAGEWINDOW ) ) { TRACE0("Failed to create m_ParentMessageBar\n"); return -1; // fail to create } //—оздаем само окно сообщений if( !m_MessageBar.Create( WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL |ES_MULTILINE|ES_LEFT|ES_WANTRETURN, CRect(0,0,0,0), &m_ParentMessageBar, m_ParentMessageBar.GetDlgCtrlID() ) ) { TRACE0("Failed to create m_MessageBar\n"); return -1; // fail to create } m_MessageBar.Init(); if(nCurAppRunMode==CONFIG_MODE) { //—оздаем контейнер отладочного окна if( !m_ParentDebugMessageBar.Create( _T("ќкно отладки"), this, ID_VIEWDEBUGMESSAGEWINDOW ) ) { TRACE0("Failed to create m_ParentDebugMessageBar\n"); return -1; // fail to create } if( !m_DebugMessageBar.Create( WS_VISIBLE|WS_CHILD|LVS_SHAREIMAGELISTS, CRect(0,50,50,200), &m_ParentDebugMessageBar, m_ParentDebugMessageBar.GetDlgCtrlID() ) ) { TRACE0("Failed to create m_DebugMessageBar\n"); return -1; // fail to create } m_DebugMessageBar.Init(); pDebugMessageBar=&m_DebugMessageBar; //—оздаем контейнер окна стека вызова if( !m_ParentStackBar.Create( _T("—тек вызова"), this, ID_VIEW_STACK ) ) { TRACE0("Failed to create m_ParentStackBar\n"); return -1; // fail to create } if( !m_StackBar.Create( WS_VISIBLE|WS_CHILD|LVS_SHAREIMAGELISTS, CRect(0,0,50,200), &m_ParentStackBar, m_ParentStackBar.GetDlgCtrlID() ) ) { TRACE0("Failed to create m_StackBar\n"); return -1; // fail to create } m_StackBar.Init(); pDebugStackBar=&m_StackBar; //—оздаем контейнер окна свойств if( !m_ParentPropertyBar.Create( _T("ќкно свойств"), this, ID_PROPERTYBAR ) ) { TRACE0("Failed to create m_ParentPropertyBar\n"); return -1; // fail to create } //—оздаем окно свойств if( !m_PropertyBar.Create( CRect(0,0,50,50), &m_ParentPropertyBar, IDC_OI, 0x50010000 ) ) { TRACE0("Failed to create m_PropertyBar\n"); return -1; // fail to create } m_PropertyBar.SetBorderStyle(CObjectInspector::bsSingle); m_PropertyBar.SetImageList(GetImageList()); } if( !m_ComboHelpSearch.Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, CRect( 0, 0, 200, 480 ), &m_ToolMain, ID_HELP_SEARCH_COMBO) || !m_ToolMain.SetButtonCtrl( m_ToolMain.CommandToIndex( m_ComboHelpSearch.GetDlgCtrlID()) , &m_ComboHelpSearch) ) { TRACE0( "Failed to create help search combobox\n" ); return -1; } m_ComboHelpSearch.SetItemHeight( -1, 16 ); m_ComboHelpSearch.SetFont( &g_PaintManager->m_FontNormal ); g_CmdManager->CmdGetPtr(csProfileName,m_ComboHelpSearch.GetDlgCtrlID())-> m_sMenuText = _T( "Search help system" ); m_wndDocSelector.Create(NULL, "ѕанель окон", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | CBRS_TOP, CRect(0,0,0,0), this, IDS_DOC_SELECTOR); m_wndDocSelector.SetBarStyle( CBRS_ALIGN_BOTTOM); //m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_ToolMain.EnableDocking(CBRS_ALIGN_ANY); m_ToolModule.EnableDocking(CBRS_ALIGN_ANY); if(nCurAppRunMode==CONFIG_MODE) m_ToolEdit.EnableDocking(CBRS_ALIGN_ANY); m_ParentMessageBar.EnableDocking(CBRS_ALIGN_ANY); if(nCurAppRunMode==CONFIG_MODE) { m_ParentDebugMessageBar.EnableDocking(CBRS_ALIGN_ANY); m_ParentStackBar.EnableDocking(CBRS_ALIGN_ANY); m_ParentPropertyBar.EnableDocking(CBRS_ALIGN_ANY); } if( !CExtControlBar::FrameEnableDocking(this) ) { ASSERT( FALSE ); return -1; } //DockControlBar(&m_wndMenuBar,AFX_IDW_DOCKBAR_TOP); DockControlBar(&m_ToolMain); DockControlBar(&m_ToolModule,AFX_IDW_DOCKBAR_BOTTOM); if(nCurAppRunMode==CONFIG_MODE) DockControlBar(&m_ToolEdit,AFX_IDW_DOCKBAR_BOTTOM); RecalcLayout(); m_ParentMessageBar.SetInitDesiredSizeHorizontal( CSize(80,80) ); m_ParentMessageBar.DockControlBar(AFX_IDW_DOCKBAR_BOTTOM,1,this,false); if(nCurAppRunMode==CONFIG_MODE) { m_ParentDebugMessageBar.SetInitDesiredSizeHorizontal( CSize(80,80) ); m_ParentDebugMessageBar.DockControlBar(AFX_IDW_DOCKBAR_BOTTOM,2,this,false); m_ParentStackBar.SetInitDesiredSizeHorizontal( CSize(80,80) ); m_ParentStackBar.DockControlBar(AFX_IDW_DOCKBAR_RIGHT,1,this,false); m_ParentPropertyBar.SetInitDesiredSizeVertical( CSize(180,80) ); m_ParentPropertyBar.DockControlBar(AFX_IDW_DOCKBAR_RIGHT,1,this,false); // m_ParentPropertyBar.SetInitDesiredSizeHorizontal( CSize(180,80) ); // m_ParentPropertyBar.SetInitDesiredSizeFloating( CSize(380,380) ); // m_ParentPropertyBar.FloatControlBar(); // m_ParentPropertyBar.AutoHideModeGet(); } /* g_CmdManager->SetBasicCommands( csProfileName, g_statBasicCommands); */ RecalcLayout(); CExtControlBar::ProfileBarStateLoad( this, pApp->m_pszRegistryKey, csProfileName, "Save", &m_dataFrameWP ); //¬осстанавливаем стиль CString csStyle=AfxGetApp()->GetProfileString(csProfileName, "Style"); //if(csStyle!="XP") // OnViewLikeOffice2k(); OnViewLikeOffice2k(); //передача ошибок в окно сообщений конфигуратора //if(nCurAppRunMode==CONFIG_MODE) //или отладка MyDDE.Create(MAKEINTRESOURCE(IDD_MYDATAEXCHANGE_DIALOG),this); CheckWindow(m_ToolMain); CheckWindow(m_ToolModule); if(nCurAppRunMode==CONFIG_MODE) { CheckWindow(m_ToolEdit); CheckWindow(m_ParentDebugMessageBar); CheckWindow(m_ParentStackBar); CheckWindow(m_ParentPropertyBar); } CheckWindow(m_ParentMessageBar); //************************** // Install the tab view here //VERIFY(m_MDIClient.SubclassMDIClient(this)); // m_ToolMain.InsertButton(); return 0; }
void CCtrlTreeOpts::OnDestroy() { ImageList_Destroy(GetImageList(TVSIL_NORMAL)); }
wxObject *wxTreebookXmlHandler::DoCreateResource() { if (m_class == wxT("wxTreebook")) { XRC_MAKE_INSTANCE(tbk, wxTreebook) tbk->Create(m_parentAsWindow, GetID(), GetPosition(), GetSize(), GetStyle(wxT("style")), GetName()); wxImageList *imagelist = GetImageList(); if ( imagelist ) tbk->AssignImageList(imagelist); wxTreebook * old_par = m_tbk; m_tbk = tbk; bool old_ins = m_isInside; m_isInside = true; wxArrayTbkPageIndexes old_treeContext = m_treeContext; m_treeContext.Clear(); CreateChildren(m_tbk, true/*only this handler*/); wxXmlNode *node = GetParamNode("object"); int pageIndex = 0; for (unsigned int i = 0; i < m_tbk->GetPageCount(); i++) { if ( m_tbk->GetPage(i) ) { wxXmlNode *child = node->GetChildren(); while (child) { if (child->GetName() == "expanded" && child->GetNodeContent() == "1") m_tbk->ExpandNode(pageIndex, true); child = child->GetNext(); } pageIndex++; } } m_treeContext = old_treeContext; m_isInside = old_ins; m_tbk = old_par; return tbk; } // else ( m_class == wxT("treebookpage") ) wxXmlNode *n = GetParamNode(wxT("object")); wxWindow *wnd = NULL; if ( !n ) n = GetParamNode(wxT("object_ref")); if (n) { bool old_ins = m_isInside; m_isInside = false; wxObject *item = CreateResFromNode(n, m_tbk, NULL); m_isInside = old_ins; wnd = wxDynamicCast(item, wxWindow); if (wnd == NULL && item != NULL) { ReportError(n, "treebookpage child must be a window"); } } size_t depth = GetLong( wxT("depth") ); if( depth <= m_treeContext.GetCount() ) { // first prepare the icon int imgIndex = wxNOT_FOUND; if ( HasParam(wxT("bitmap")) ) { wxBitmap bmp = GetBitmap(wxT("bitmap"), wxART_OTHER); wxImageList *imgList = m_tbk->GetImageList(); if ( imgList == NULL ) { imgList = new wxImageList( bmp.GetWidth(), bmp.GetHeight() ); m_tbk->AssignImageList( imgList ); } imgIndex = imgList->Add(bmp); } else if ( HasParam(wxT("image")) ) { if ( m_tbk->GetImageList() ) { imgIndex = GetLong(wxT("image")); } else // image without image list? { ReportError(n, "image can only be used in conjunction " "with imagelist"); } } // then add the page to the corresponding parent if( depth < m_treeContext.GetCount() ) m_treeContext.RemoveAt(depth, m_treeContext.GetCount() - depth ); if( depth == 0) { m_tbk->AddPage(wnd, GetText(wxT("label")), GetBool(wxT("selected")), imgIndex); } else { m_tbk->InsertSubPage(m_treeContext.Item(depth - 1), wnd, GetText(wxT("label")), GetBool(wxT("selected")), imgIndex); } m_treeContext.Add( m_tbk->GetPageCount() - 1); } else { ReportParamError("depth", "invalid depth"); } return wnd; }
bool wxNotebook::SetPageImage( size_t page, int image ) { /* HvdH 28-12-98: now it works, but it's a bit of a kludge */ wxGtkNotebookPage* nb_page = GetNotebookPage(page); if (!nb_page) return FALSE; /* Optimization posibility: return immediately if image unchanged. * Not enabled because it may break existing (stupid) code that * manipulates the imagelist to cycle images */ /* if (image == nb_page->m_image) return true; */ /* For different cases: 1) no image -> no image 2) image -> no image 3) no image -> image 4) image -> image */ if (image == -1 && nb_page->m_image == -1) return true; /* Case 1): Nothing to do. */ GtkWidget *pixmapwid = NULL; if (nb_page->m_image != -1) { /* Case 2) or 4). There is already an image in the gtkhbox. Let's find it */ GList *child = gtk_container_children(GTK_CONTAINER(nb_page->m_box)); while (child) { if (GTK_IS_PIXMAP(child->data)) { pixmapwid = GTK_WIDGET(child->data); break; } child = child->next; } /* We should have the pixmap widget now */ wxASSERT(pixmapwid != NULL); if (image == -1) { /* If there's no new widget, just remove the old from the box */ gtk_container_remove(GTK_CONTAINER(nb_page->m_box), pixmapwid); nb_page->m_image = -1; return true; /* Case 2) */ } } /* Only cases 3) and 4) left */ wxASSERT( HasImageList() ); /* Just in case */ /* Construct the new pixmap */ const wxBitmap *bmp = GetImageList()->GetBitmapPtr(image); GdkPixmap *pixmap = bmp->GetPixmap(); GdkBitmap *mask = NULL; if ( bmp->GetMask() ) { mask = bmp->GetMask()->GetBitmap(); } if (pixmapwid == NULL) { /* Case 3) No old pixmap. Create a new one and prepend it to the hbox */ pixmapwid = gtk_pixmap_new (pixmap, mask ); /* CHECKME: Are these pack flags okay? */ gtk_box_pack_start(GTK_BOX(nb_page->m_box), pixmapwid, FALSE, FALSE, m_padding); gtk_widget_show(pixmapwid); } else { /* Case 4) Simply replace the pixmap */ gtk_pixmap_set(GTK_PIXMAP(pixmapwid), pixmap, mask); } nb_page->m_image = image; return true; }
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); }
bool wxNotebook::InsertPage( size_t position, wxNotebookPage* win, const wxString& text, bool select, int imageId ) { wxCHECK_MSG( m_widget != NULL, false, wxT("invalid notebook") ); wxCHECK_MSG( win->GetParent() == this, false, wxT("Can't add a page whose parent is not the notebook!") ); wxCHECK_MSG( position <= GetPageCount(), false, wxT("invalid page index in wxNotebookPage::InsertPage()") ); // Hack Alert! (Part II): See above in wxNotebook::AddChildGTK // why this has to be done. gtk_widget_unparent(win->m_widget); if (m_themeEnabled) win->SetThemeEnabled(true); GtkNotebook *notebook = GTK_NOTEBOOK(m_widget); wxGtkNotebookPage* pageData = new wxGtkNotebookPage; m_pages.Insert(win, position); m_pagesData.Insert(position, pageData); // set the label image and text // this must be done before adding the page, as GetPageText // and GetPageImage will otherwise return wrong values in // the page-changed event that results from inserting the // first page. pageData->m_imageIndex = imageId; pageData->m_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1); gtk_container_set_border_width(GTK_CONTAINER(pageData->m_box), 2); pageData->m_image = NULL; if (imageId != -1) { if (HasImageList()) { const wxBitmap* bitmap = GetImageList()->GetBitmapPtr(imageId); pageData->m_image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf()); gtk_box_pack_start(GTK_BOX(pageData->m_box), pageData->m_image, false, false, m_padding); } else { wxFAIL_MSG("invalid notebook imagelist"); } } /* set the label text */ pageData->m_label = gtk_label_new(wxGTK_CONV(wxStripMenuCodes(text))); gtk_box_pack_end(GTK_BOX(pageData->m_box), pageData->m_label, false, false, m_padding); gtk_widget_show_all(pageData->m_box); gtk_notebook_insert_page(notebook, win->m_widget, pageData->m_box, position); /* apply current style */ #ifdef __WXGTK3__ GTKApplyStyle(pageData->m_label, NULL); #else GtkRcStyle *style = GTKCreateWidgetStyle(); if ( style ) { gtk_widget_modify_style(pageData->m_label, style); g_object_unref(style); } #endif if (select && GetPageCount() > 1) { SetSelection( position ); } InvalidateBestSize(); return true; }
void CCustomTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpds) { CDC dc; dc.Attach(lpds->hDC); DWORD style = GetStyle(); TCITEM item; char text[100]; item.mask = TCIF_IMAGE | TCIF_TEXT; item.pszText = text; item.cchTextMax = 100; GetItem(lpds->itemID, &item); CConn* con = (CConn*)lpds->itemData; COLORREF bkcolor, textcolor; dc.SetBkMode(TRANSPARENT); //設定文字和背景顏色 #ifdef _COMBO_ //收到熱訊,或者網頁下載完畢,反白提示! if (item.iImage == 5 && !(lpds->itemState & ODS_SELECTED)) #else if (item.iImage == 5 && !(lpds->itemState & ODS_SELECTED)) //收到熱訊,反白提示! #endif { textcolor = GetSysColor(COLOR_HIGHLIGHTTEXT); bkcolor = GetSysColor(COLOR_HIGHLIGHT); } else { bkcolor = GetSysColor(COLOR_BTNFACE); if (lpds->itemState & ODS_SELECTED) textcolor = AppConfig.active_tab_textcolor; else textcolor = GetSysColor(COLOR_WINDOWTEXT); } //--------------------------------------------------------------- int icox, icoy; // 填充背景 if (style&TCS_BUTTONS) //是Button形式的 { // 重要,查閱CDC相關文件, CDC::GetHalftoneBrush() // 不需要DeleteObject,因為整個程式共用一個brush // 此為MFC內部提供,事實上還是建立Bitmap然後CreatePatternBrush if (lpds->itemState & ODS_SELECTED) { CBrush *cbsh = CDC::GetHalftoneBrush(); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ dc.SetTextColor(GetSysColor(COLOR_3DHILIGHT)); dc.SetBkColor(GetSysColor(COLOR_BTNFACE)); FillRect(dc.m_hDC, &lpds->rcItem, (HBRUSH)cbsh->m_hObject); OffsetRect(&lpds->rcItem, 2, 2); } else dc.FillSolidRect(&lpds->rcItem, bkcolor); InflateRect(&lpds->rcItem, -2, -2); icoy = lpds->rcItem.top - 2; icox = lpds->rcItem.left + 4; } else //Tab 形式 { if (_afxComCtlVersion >= MAKELONG(0, 6)) //Win XP IE 6.0 { icox = lpds->rcItem.left, icoy = lpds->rcItem.top + 2; InflateRect(&lpds->rcItem, -1, -2); lpds->rcItem.top++; if (lpds->itemState & ODS_SELECTED) { icox += 4; lpds->rcItem.left += 2; lpds->rcItem.top++; } dc.FillSolidRect(&lpds->rcItem, bkcolor); } else //以下除了xp+ CMCTL32 6.0以外全部適用 { dc.FillSolidRect(&lpds->rcItem, bkcolor); InflateRect(&lpds->rcItem, -2, -2); if (style & TCS_BOTTOM) icoy = lpds->rcItem.top - 2; else { icoy = lpds->rcItem.top; lpds->rcItem.top += 2; } icox = lpds->rcItem.left; if (lpds->itemState & ODS_SELECTED) icox += 4; } } //畫出 icon GetImageList()->Draw(&dc, item.iImage, CPoint(icox, icoy), ILD_TRANSPARENT); //輸出文字 dc.SetTextColor(textcolor); lpds->rcItem.left = icox + 16 + 4; //#if defined(_COMBO_) // lpds->rcItem.right-=3; //#endif dc.DrawText(text, strlen(text), &lpds->rcItem, DT_SINGLELINE | DT_END_ELLIPSIS); dc.Detach(); }
BOOL CValueToolBar::AddButton(CValue &rez,CValue**p) { Create(); int nImage=p[0]->GetNumber(); CMyMenuItem element=GetElementFromValues(p); if(nImage<0) { m_pToolBar->InsertButton(); return TRUE; } UINT nID=0; //ищем кнопки с той же картинкой if(nImage) for(int i=0;i<m_pToolBar->GetButtonsCount();i++) { CExtBarButton * pButton=m_pToolBar->GetButton( i ); UINT nStyle; if(pButton) { m_pToolBar->GetButtonInfo(i,nID,nStyle); if(nID>0 && nID<MENU_FINISH_ID) if(pButton->m_nData==nImage) { if(!m_pToolBar->RemoveButton(i)) Error("ќшибка удалени¤ элемента"); break; } } nID=0; } //прив¤зка к событи¤м (также как в объекте ћеню) if(nID==0) nID=GetUniqueMenuID(); AssignToMenuID(element,nID); CExtCmdItem item; item.m_nCmdID=nID; item.m_sToolbarText=p[3]->GetString(); item.m_sTipTool=p[4]->GetString(); item.m_sTipStatus=p[5]->GetString(); CImageList *pImageList=GetImageList(); if(!pImageList) return 1; HICON hIcon = pImageList->ExtractIcon( nImage ); if(!hIcon) Error("Ќе обнаружена картинка с заданным номером"); g_CmdManager->CmdSetup(csProfileName,item,1); g_CmdManager->CmdSetIcon(csProfileName,item.m_nCmdID,hIcon); BOOL bRes=m_pToolBar->InsertButton(-1,item.m_nCmdID,1,nImage); return TRUE; };
bool wxNotebook::InsertPage( size_t position, wxNotebookPage* win, const wxString& text, bool select, int imageId ) { wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid notebook") ); wxCHECK_MSG( win->GetParent() == this, FALSE, wxT("Can't add a page whose parent is not the notebook!") ); wxCHECK_MSG( position <= GetPageCount(), FALSE, wxT("invalid page index in wxNotebookPage::InsertPage()") ); // Hack Alert! (Part II): See above in wxInsertChildInNotebook callback // why this has to be done. NOTE: using gtk_widget_unparent here does not // work as it seems to undo too much and will cause errors in the // gtk_notebook_insert_page below, so instead just clear the parent by // hand here. win->m_widget->parent = NULL; // don't receive switch page during addition gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback), (gpointer) this ); if (m_themeEnabled) win->SetThemeEnabled(true); GtkNotebook *notebook = GTK_NOTEBOOK(m_widget); wxGtkNotebookPage *nb_page = new wxGtkNotebookPage(); if ( position == GetPageCount() ) m_pagesData.Append( nb_page ); else m_pagesData.Insert( position, nb_page ); m_pages.Insert(win, position); nb_page->m_box = gtk_hbox_new( FALSE, 1 ); gtk_container_border_width( GTK_CONTAINER(nb_page->m_box), 2 ); gtk_signal_connect( GTK_OBJECT(win->m_widget), "size_allocate", GTK_SIGNAL_FUNC(gtk_page_size_callback), (gpointer)win ); gtk_notebook_insert_page( notebook, win->m_widget, nb_page->m_box, position ); nb_page->m_page = (GtkNotebookPage*) g_list_last(notebook->children)->data; /* set the label image */ nb_page->m_image = imageId; if (imageId != -1) { wxASSERT( HasImageList() ); const wxBitmap *bmp = GetImageList()->GetBitmapPtr(imageId); GdkPixmap *pixmap = bmp->GetPixmap(); GdkBitmap *mask = NULL; if ( bmp->GetMask() ) { mask = bmp->GetMask()->GetBitmap(); } GtkWidget *pixmapwid = gtk_pixmap_new (pixmap, mask ); gtk_box_pack_start(GTK_BOX(nb_page->m_box), pixmapwid, FALSE, FALSE, m_padding); gtk_widget_show(pixmapwid); } /* set the label text */ nb_page->m_text = text; if (nb_page->m_text.empty()) nb_page->m_text = wxEmptyString; nb_page->m_label = GTK_LABEL( gtk_label_new(wxGTK_CONV(nb_page->m_text)) ); gtk_box_pack_end( GTK_BOX(nb_page->m_box), GTK_WIDGET(nb_page->m_label), FALSE, FALSE, m_padding ); /* apply current style */ GtkRcStyle *style = CreateWidgetStyle(); if ( style ) { gtk_widget_modify_style(GTK_WIDGET(nb_page->m_label), style); gtk_rc_style_unref(style); } /* show the label */ gtk_widget_show( GTK_WIDGET(nb_page->m_label) ); if (select && (m_pagesData.GetCount() > 1)) { SetSelection( position ); } gtk_signal_connect( GTK_OBJECT(m_widget), "switch_page", GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback), (gpointer)this ); InvalidateBestSize(); return true; }
void CEnListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC* pDC; CRect rText, rItem, rClient, rHeader; COLORREF crOldText, crOldBack; CSize sizeText; LV_COLUMN lvc = { 0 }; // CPen* pOldPen; CImageList* pImageList; CImageList* pStateList; int nImage = -1; BOOL bItemFocused, bListFocused, bSelected, bDropHighlighted, bSelAlways; UINT uStyle, uState; CSize sizeState(0, 0), sizeImage(0, 0); int nIndent = 0; // get and prepare device context pDC = CDC::FromHandle(lpDrawItemStruct->hDC);//GetDC(); pDC->SelectObject(GetFont()); pDC->SetROP2(R2_COPYPEN); // init helper variables int nItem = lpDrawItemStruct->itemID; GetItemRect(nItem, rItem, LVIR_BOUNDS);//lpDrawItemStruct->rcItem; GetClientRect(&rClient); // some problems with drophiliting items during drag and drop // so we need to make sure drawing is clipped to client area // this fixes it admirably! if (GetHeader()) { GetHeader()->GetWindowRect(rHeader); ScreenToClient(rHeader); rClient.top = max(0, rHeader.bottom); pDC->IntersectClipRect(rClient); } rText = rItem; uStyle = GetStyle(); uState = GetItemState(nItem, LVIS_DROPHILITED | LVIS_SELECTED); bDropHighlighted = (uState & LVIS_DROPHILITED); bItemFocused = (GetFocusedItem() == nItem); bListFocused = (GetFocus() == this); bSelected = (uState & LVIS_SELECTED); bSelAlways = ((uStyle & LVS_SHOWSELALWAYS) == LVS_SHOWSELALWAYS); bSelected = bSelected && (bListFocused || bSelAlways); crOldText = pDC->SetTextColor(COLORREF(0)); // this will be overwritten on a per subitem basis crOldBack = pDC->SetBkColor(GetItemBackColor(nItem, bSelected, bDropHighlighted, bListFocused)); // images and indentation pImageList = GetImageList(LVSIL_SMALL); if (pImageList) { nImage = GetImageIndex(nItem, 0); ImageList_GetIconSize(pImageList->m_hImageList, (int*)&sizeImage.cx, (int*)&sizeImage.cy); nIndent = GetItemIndent(nItem) * sizeImage.cx; rText.left += nIndent; rItem.left += nIndent; // if (pImageList == &s_ilIndent) // pImageList = NULL; } // state pStateList = GetImageList(LVSIL_STATE); if (pStateList) ImageList_GetIconSize(pStateList->m_hImageList, (int*)&sizeState.cx, (int*)&sizeState.cy); if (lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) { // setup colors and pens int nImageStyle = GetImageStyle(bSelected, bDropHighlighted, bListFocused); // draw item images if required int nImageWidth = 0; // make sure there is enough space lvc.mask = LVCF_WIDTH | LVCF_FMT; int nCol = 0; BOOL bRes = GetColumn(nCol, &lvc); // must paint the background of column 0 before the icons if (bRes && (pStateList || pImageList)) pDC->ExtTextOut(0, rItem.top, ETO_CLIPPED | ETO_OPAQUE, CRect(0, rItem.top, lvc.cx, rItem.bottom), _T(""), NULL); // state if (pStateList && bRes) { int nState = (GetItemState(nItem, LVIS_STATEIMAGEMASK) & LVIS_STATEIMAGEMASK); nState = nState >> 12; if (lvc.cx > sizeState.cx) pStateList->Draw(pDC, nState, CPoint(rText.left + 1, rText.top), ILD_TRANSPARENT); nImageWidth = sizeState.cx + 2; // 1 pixel border either side }
void CClickList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { static const COLORREF COLOR_1 = RGB(239, 246, 249), COLOR_2 = RGB(209, 226, 239); ASSERT(NULL != lpDrawItemStruct); ASSERT(NULL != lpDrawItemStruct->hDC); CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); ASSERT_VALID(pDC); // The CWinApp idle-time handler will automatically call // CDC::DeleteTempMap to delete any temporary CDC objects // created by FromHandle CRect rcItem(lpDrawItemStruct->rcItem); int nItem = lpDrawItemStruct->itemID; int nSavedDC = pDC->SaveDC(); // Get item image and state info LV_ITEM lvi; lvi.mask = LVIF_IMAGE | LVIF_STATE; lvi.iItem = nItem; lvi.iSubItem = 0; lvi.stateMask = -1; GetItem(&lvi); // Should the item be highlighted bool bHighlight = LVIS_DROPHILITED == (lvi.state & LVIS_DROPHILITED) || LVIS_SELECTED == (lvi.state & LVIS_SELECTED) && (this == GetFocus() || LVS_SHOWSELALWAYS == (GetStyle() & LVS_SHOWSELALWAYS)); // Get rectangles for drawing CRect rcBounds, rcLabel, rcIcon; GetItemRect(nItem, rcBounds, LVIR_BOUNDS); GetItemRect(nItem, rcLabel, LVIR_LABEL); GetItemRect(nItem, rcIcon, LVIR_ICON); CRect rcCol(rcBounds); CString sLabel = GetItemText(nItem, 0); // Labels are offset by a certain amount // This offset is related to the width of a space character int offset = pDC->GetTextExtent(_T(" "), 1 ).cx * 2; CRect rcHighlight; CRect rcWnd; int nExt; switch (m_HighlightType) { case HT_NORMAL: nExt = pDC->GetOutputTextExtent(sLabel).cx + offset; rcHighlight = rcLabel; if (rcLabel.left + nExt < rcLabel.right) rcHighlight.right = rcLabel.left + nExt; break; case HT_ALLCOLUMNS: rcHighlight = rcBounds; rcHighlight.left = rcLabel.left; break; case HT_ROW: GetClientRect(&rcWnd); rcHighlight = rcBounds; rcHighlight.left = rcLabel.left; rcHighlight.right = rcWnd.right; break; default: ASSERT(false); } // Draw the background color if (bHighlight) { pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); pDC->FillRect(rcHighlight, &CBrush(::GetSysColor(COLOR_HIGHLIGHT))); } else { CRect rcClient, rcRow = rcItem; GetClientRect(&rcClient); rcRow.right = rcClient.right; pDC->FillRect(rcRow, &CBrush(nItem % 2 ? COLOR_1 : COLOR_2)); //pDC->FillRect(rcHighlight, &CBrush(::GetSysColor(COLOR_WINDOW))); } // Set clip region rcCol.right = rcCol.left + GetColumnWidth(0); CRgn rgn; rgn.CreateRectRgnIndirect(&rcCol); pDC->SelectClipRgn(&rgn); rgn.DeleteObject(); // Draw state icon CImageList *pImageList; if (LVIS_STATEIMAGEMASK == (lvi.state & LVIS_STATEIMAGEMASK)) { pImageList = GetImageList(LVSIL_STATE); if (NULL != pImageList) { int nImage = ((lvi.state & LVIS_STATEIMAGEMASK) >> 12) - 1; pImageList->Draw(pDC, nImage, CPoint(rcCol.left, rcCol.top), ILD_TRANSPARENT); }
void DLlist::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { /*CPoint picPt; picPt.x = rcCell.left+(rcCell.Width()-32)/2; picPt.y = rcCell.top+(rcCell.Height()-32)/2; m_imagelist.Draw ( pDC, rItem.iImage, picPt, uFormat );*/ CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); pDC->SetBkMode(TRANSPARENT); CRect itemRc=lpDrawItemStruct->rcItem; CRect rc; GetClientRect(&rc); memDc.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); pob=memDc.SelectObject(&bmp); memDc.FillSolidRect(rc,RGB(255,255,255)); //填充为白色 memDc.SetBkMode(TRANSPARENT); WCHAR lpBuffer[256]; //TCHAR lpBuffer[256]; memset(lpBuffer,0,256); LV_ITEM lvi; lvi.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM|LVIF_STATE ; lvi.iItem = lpDrawItemStruct->itemID ; lvi.iSubItem = 0; lvi.pszText = lpBuffer ; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); //判断状态 并绘背景 if(lpDrawItemStruct->itemID==m_hotItem && !(lpDrawItemStruct->itemState&ODS_SELECTED)) { memDc.FillSolidRect(itemRc,RGB(248,255,169)); //memDc.FillRect(itemRc,&CBrush(RGB(248,255,169))); } if(lpDrawItemStruct->itemState&ODS_SELECTED) { memDc.FillSolidRect(itemRc,RGB(173,180,253)); //memDc.FillRect(itemRc,&CBrush(RGB(173,180,253))); } //画图标 IMAGEINFO img; GetImageList(LVSIL_SMALL)->GetImageInfo(lvi.iImage,&img); CPoint pt; pt.x=itemRc.left+m_imgLeftMargin; pt.y=itemRc.top+(itemRc.Height()- (img.rcImage.bottom-img.rcImage.top) )/2; HRGN roundr=CreateRoundRectRgn(pt.x,pt.y,pt.x+img.rcImage.right,pt.y+img.rcImage.bottom,2,2); memDc.SelectClipRgn(CRgn::FromHandle(roundr)); this->GetImageList(LVSIL_SMALL)->Draw(&memDc,lvi.iImage,pt,ILD_TRANSPARENT); memDc.SelectClipRgn(NULL); //画文字 if(lpDrawItemStruct->itemAction & ODA_DRAWENTIRE) { LV_COLUMN lvc; ::ZeroMemory(&lvc, sizeof(lvc)); lvc.mask = LVIF_TEXT|LVIF_PARAM|LVCF_WIDTH | LVCF_FMT; lvc.pszText=lpBuffer; lvc.cchTextMax = sizeof(lpBuffer); memDc.SelectObject(m_font); TEXTMETRIC metric; memDc.GetTextMetrics(&metric); for(int i=0;this->GetColumn(i,&lvc);i++) { if(i==0) { lvi.iSubItem=0; VERIFY(GetItem(&lvi)); CRect rc; rc.left=img.rcImage.right+m_textLeftMargin+m_imgLeftMargin; rc.top=itemRc.top+m_textTopMargin; rc.bottom=rc.top+metric.tmHeight; rc.right=itemRc.right-m_textRightMargin; //保存第一列区域 m_colRc1.left=rc.left; m_colRc1.top=m_textTopMargin; m_colRc1.bottom=m_colRc1.top+metric.tmHeight; m_colRc1.right=itemRc.right-m_textRightMargin; memDc.SetTextColor(RGB(0,0,0)); memDc.DrawText(lpBuffer,_tcslen(lpBuffer),rc,DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_NOCLIP|DT_END_ELLIPSIS); } if(i==1) { lvi.iSubItem=1; VERIFY(GetItem(&lvi)); CRect rc; rc.left=img.rcImage.right+m_textLeftMargin+m_imgLeftMargin; rc.top=itemRc.top+m_textTopMargin+metric.tmHeight+2; rc.bottom=rc.top+metric.tmHeight; rc.right=itemRc.right-m_textRightMargin; m_colRc2.left=rc.left; m_colRc2.top=m_textTopMargin+metric.tmHeight+2; m_colRc2.bottom=m_colRc2.top+metric.tmHeight; m_colRc2.right=rc.right; memDc.SetTextColor(RGB(100,100,100)); memDc.DrawText(lpBuffer,_tcslen(lpBuffer),rc,DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_NOCLIP|DT_END_ELLIPSIS); } } memDc.SelectStockObject(SYSTEM_FONT); } pDC->BitBlt(itemRc.left,itemRc.top,itemRc.Width(),itemRc.Height(),&memDc,itemRc.left,itemRc.top,SRCCOPY); memDc.SelectObject(pob); memDc.DeleteDC(); bmp.DeleteObject(); //this->GetImageList(LVSIL_SMALL)->GetImageInfo(lvi.iImage,&img); //CListCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct); // TODO: 添加您的代码以绘制指定项 }
void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcItem(lpDrawItemStruct->rcItem); UINT uiFlags = ILD_TRANSPARENT; CImageList* pImageList; int nItem = lpDrawItemStruct->itemID; BOOL bFocus = (GetFocus() == this); COLORREF clrTextSave, clrBkSave; COLORREF clrImage = m_clrBkgnd; static _TCHAR szBuff[MAX_PATH]; LPCTSTR pszText; // get item data LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; lvi.iItem = nItem; lvi.iSubItem = 0; lvi.pszText = szBuff; lvi.cchTextMax = sizeof(szBuff); lvi.stateMask = 0xFFFF; // get all state flags GetItem(&lvi); BOOL bSelected = (bFocus || (GetStyle() & LVS_SHOWSELALWAYS)) && lvi.state & LVIS_SELECTED; bSelected = bSelected || (lvi.state & LVIS_DROPHILITED); // set colors if item is selected CRect rcAllLabels; GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS); CRect rcLabel; GetItemRect(nItem, rcLabel, LVIR_LABEL); rcAllLabels.left = rcLabel.left; if (m_bClientWidthSel && rcAllLabels.right<m_cxClient) rcAllLabels.right = m_cxClient; // @@ clrTextSave = pDC->SetTextColor(colTextColor[0]); if (bSelected) { //@@ //clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT))); } else pDC->FillRect(rcAllLabels, &CBrush(m_clrTextBk)); // set color and mask for the icon if (lvi.state & LVIS_CUT) { clrImage = m_clrBkgnd; uiFlags |= ILD_BLEND50; } else if (bSelected) { clrImage = ::GetSysColor(COLOR_HIGHLIGHT); uiFlags |= ILD_BLEND50; } // draw state icon UINT nStateImageMask = lvi.state & LVIS_STATEIMAGEMASK; if (nStateImageMask) { int nImage = (nStateImageMask>>12) - 1; pImageList = GetImageList(LVSIL_STATE); if (pImageList) { pImageList->Draw(pDC, nImage, CPoint(rcItem.left, rcItem.top), ILD_TRANSPARENT); } } // draw normal and overlay icon CRect rcIcon; GetItemRect(nItem, rcIcon, LVIR_ICON); pImageList = GetImageList(LVSIL_SMALL); if (pImageList) { UINT nOvlImageMask=lvi.state & LVIS_OVERLAYMASK; if (rcItem.left<rcItem.right-1) { ImageList_DrawEx(pImageList->m_hImageList, lvi.iImage, pDC->m_hDC,rcIcon.left,rcIcon.top, 16, 16, m_clrBkgnd, clrImage, uiFlags | nOvlImageMask); } } // draw item label GetItemRect(nItem, rcItem, LVIR_LABEL); rcItem.right -= m_cxStateImageOffset; pszText = MakeShortString(pDC, szBuff, rcItem.right-rcItem.left, 2*OFFSET_FIRST); rcLabel = rcItem; rcLabel.left += OFFSET_FIRST; rcLabel.right -= OFFSET_FIRST; pDC->DrawText(pszText,-1,rcLabel,DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); // draw labels for extra columns LV_COLUMN lvc; lvc.mask = LVCF_FMT | LVCF_WIDTH; for(int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++) { rcItem.left = rcItem.right; rcItem.right += lvc.cx; int nRetLen = GetItemText(nItem, nColumn, szBuff, sizeof(szBuff)); if (nRetLen == 0) continue; pszText = MakeShortString(pDC, szBuff, rcItem.right - rcItem.left, 2*OFFSET_OTHER); UINT nJustify = DT_LEFT; if(pszText == szBuff) { switch(lvc.fmt & LVCFMT_JUSTIFYMASK) { case LVCFMT_RIGHT: nJustify = DT_RIGHT; break; case LVCFMT_CENTER: nJustify = DT_CENTER; break; default: break; } } rcLabel = rcItem; rcLabel.left += OFFSET_OTHER; rcLabel.right -= OFFSET_OTHER; if (nColumn < NR_COL_COLORS) pDC->SetTextColor(colTextColor[nColumn]); pDC->DrawText(pszText, -1, rcLabel, nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); } // draw focus rectangle if item has focus if (lvi.state & LVIS_FOCUSED && bFocus) pDC->DrawFocusRect(rcAllLabels); // set original colors if item was selected if (bSelected) { pDC->SetTextColor(clrTextSave); pDC->SetBkColor(clrBkSave); } }
void CClosableTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rect = lpDrawItemStruct->rcItem; int nTabIndex = lpDrawItemStruct->itemID; if (nTabIndex < 0) return; BOOL bSelected = (nTabIndex == GetCurSel()); TCHAR szLabel[256]; TC_ITEM tci; tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_STATE; tci.pszText = szLabel; tci.cchTextMax = ARRSIZE(szLabel); tci.dwStateMask = TCIS_HIGHLIGHTED; if (!GetItem(nTabIndex, &tci)) return; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (!pDC) return; if (!g_xpStyle.IsThemeActive() || !g_xpStyle.IsAppThemed()) pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_BTNFACE)); int iOldBkMode = pDC->SetBkMode(TRANSPARENT); // Draw image on left side CImageList* piml = GetImageList(); if (tci.iImage >= 0 && piml && piml->m_hImageList) { IMAGEINFO ii; piml->GetImageInfo(0, &ii); rect.left += bSelected ? 8 : 4; piml->Draw(pDC, tci.iImage, CPoint(rect.left, rect.top + 2), ILD_TRANSPARENT); rect.left += (ii.rcImage.right - ii.rcImage.left); if (!bSelected) rect.left += 4; } bool bCloseable = m_bCloseable; if (bCloseable && GetParent()->SendMessage(UM_QUERYTAB, nTabIndex)) bCloseable = false; // Draw 'Close button' at right side if (bCloseable && m_ImgLstCloseButton.m_hImageList) { CRect rcCloseButton; GetCloseButtonRect(rect, rcCloseButton); m_ImgLstCloseButton.Draw(pDC, 0, rcCloseButton.TopLeft(), ILD_TRANSPARENT); rect.right = rcCloseButton.left - 2; } COLORREF crOldColor = RGB(0, 0, 0); if (tci.dwState & TCIS_HIGHLIGHTED) crOldColor = pDC->SetTextColor(RGB(192, 0, 0)); rect.top += 4; pDC->DrawText(szLabel, rect, DT_SINGLELINE | DT_TOP | DT_CENTER | DT_NOPREFIX); if (tci.dwState & TCIS_HIGHLIGHTED) pDC->SetTextColor(crOldColor); pDC->SetBkMode(iOldBkMode); }
//*************************************************************** void CMyColorList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if (!lpDrawItemStruct) return; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); int m=GetHeaderCtrl()->GetItemCount(); for(int i=0;i<m;i++) { CString str; CRect rcItem; GetSubItemRect(lpDrawItemStruct->itemID,i,LVIR_LABEL,rcItem); str=GetItemText(lpDrawItemStruct->itemID,i); CMyColor *col=(CMyColor *)m_ArrayCol.GetAt(lpDrawItemStruct->itemID); pDC->SetBkMode(TRANSPARENT); CBrush brush; brush.CreateSolidBrush(col->colBack); pDC->FillRect(rcItem,&brush); pDC->SetTextColor(col->colText); LV_ITEM lvi; lvi.mask = LVIF_IMAGE | LVIF_STATE; lvi.iItem = lpDrawItemStruct->itemID; lvi.iSubItem = 0; lvi.stateMask = 0xFFFF; // get all state flags GetItem(&lvi); if((lvi.state & LVIS_SELECTED)||(lvi.state & LVIS_FOCUSED)) { if(m_blnSelect) { int r1=GetRValue(col->colSelect); int g1=GetGValue(col->colSelect); int b1=GetBValue(col->colSelect); for(int i=rcItem.Height()/2;i>0;i--) { r1=(r1+5)>255?255:(r1+5); g1=(g1+5)>255?255:(g1+5); b1=(b1+5)>255?255:(b1+5); CPen pen(PS_SOLID, 1, RGB(r1, g1, b1)); CPen *old = pDC->SelectObject(&pen); pDC->MoveTo(rcItem.left,rcItem.top+i); pDC->LineTo(rcItem.right,rcItem.top+i); pDC->MoveTo(rcItem.left,rcItem.bottom-i); pDC->LineTo(rcItem.right,rcItem.bottom-i); pDC->SelectObject(old); } } } int nAlign=atoi(m_ArrayHeaderAlign.GetAt(i)); if(i==0&&GetImageList(LVSIL_SMALL)!=NULL) { CPoint ptImage; ptImage.x=rcItem.left; ptImage.y=rcItem.top; GetImageList(LVSIL_SMALL)->Draw(pDC,lvi.iImage,ptImage,ILD_TRANSPARENT); pDC->SetBkMode(TRANSPARENT); rcItem.left=rcItem.left+16; if(nAlign==LVCFMT_LEFT) rcItem.left=rcItem.left+8; } switch(nAlign) { case LVCFMT_LEFT: pDC->DrawText(str,rcItem,DT_LEFT); break; case LVCFMT_CENTER: pDC->DrawText(str,rcItem,DT_CENTER); break; case LVCFMT_RIGHT: pDC->DrawText(str,rcItem,DT_RIGHT); break; default: pDC->DrawText(str,rcItem,DT_CENTER); break; } } }
void CClosableTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CRect rect(lpDIS->rcItem); int nTabIndex = lpDIS->itemID; if (nTabIndex < 0) return; TCHAR szLabel[256]; TC_ITEM tci; tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_STATE; tci.pszText = szLabel; tci.cchTextMax = _countof(szLabel); tci.dwStateMask = TCIS_HIGHLIGHTED; if (!GetItem(nTabIndex, &tci)) return; //TRACE("CClosableTabCtrl::DrawItem: item=%u, state=%08x, color=%08x, rc=%3d,%3d,%3dx%3d\n", nTabIndex, tci.dwState, GetTextColor(lpDIS->hDC), lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right - lpDIS->rcItem.left, lpDIS->rcItem.bottom - lpDIS->rcItem.top); CDC* pDC = CDC::FromHandle(lpDIS->hDC); if (!pDC) return; CRect rcFullItem(lpDIS->rcItem); bool bSelected = (lpDIS->itemState & ODS_SELECTED) != 0; /////////////////////////////////////////////////////////////////////////////////////// // Adding support for XP Styles (Vista Themes) for owner drawn tab controls simply // does *not* work under Vista. Maybe it works under XP (did not try), but that is // meaningless because under XP a owner drawn tab control is already rendered *with* // the proper XP Styles. So, for XP there is no need to care about the theme API at all. // // However, under Vista, a tab control which has the TCS_OWNERDRAWFIXED // style gets additional 3D-borders which are applied by Vista *after* WM_DRAWITEM // was processed. Thus, there is no known workaround available to prevent Vista from // adding those old fashioned 3D-borders. We can render the tab control items within // the WM_DRAWITEM handler in whatever style we want, but Vista will in each case // overwrite the borders of each tab control item with old fashioned 3D-borders... // // To complete this experience, tab controls also do not support NMCUSTOMDRAW. So, the // only known way to customize a tab control is by using TCS_OWNERDRAWFIXED which does // however not work properly under Vista. // // The "solution" which is currently implemented to prevent Vista from drawing those // 3D-borders is by using "ExcludeClipRect" to reduce the drawing area which is used // by Windows after WM_DRAWITEM was processed. This "solution" is very sensitive to // the used rectangles and offsets in general. Incrementing/Decrementing one of the // "rcItem", "rcFullItem", etc. rectangles makes the entire "solution" flawed again // because some borders would become visible again. // HTHEME hTheme = NULL; int iPartId = TABP_TABITEM; int iStateId = TIS_NORMAL; bool bVistaHotTracked = false; bool bVistaThemeActive = theApp.IsVistaThemeActive(); if (bVistaThemeActive) { // To determine if the current item is in 'hot tracking' mode, we need to evaluate // the current foreground color - there is no flag which would indicate this state // more safely. This applies only for Vista and for tab controls which have the // TCS_OWNERDRAWFIXED style. bVistaHotTracked = pDC->GetTextColor() == GetSysColor(COLOR_HOTLIGHT); hTheme = g_xpStyle.OpenThemeData(m_hWnd, L"TAB"); if (hTheme) { if (bSelected) { // get the real tab item rect rcFullItem.left += 1; rcFullItem.right -= 1; rcFullItem.bottom -= 1; } else rcFullItem.InflateRect(2, 2); // get the real tab item rect CRect rcBk(rcFullItem); if (bSelected) { iStateId = TTIS_SELECTED; if (nTabIndex == 0) { // First item if (nTabIndex == GetItemCount() - 1) iPartId = TABP_TOPTABITEMBOTHEDGE; // First & Last item else iPartId = TABP_TOPTABITEMLEFTEDGE; } else if (nTabIndex == GetItemCount() - 1) { // Last item iPartId = TABP_TOPTABITEMRIGHTEDGE; } else { iPartId = TABP_TOPTABITEM; } } else { rcBk.top += 2; iStateId = bVistaHotTracked ? TIS_HOT : TIS_NORMAL; if (nTabIndex == 0) { // First item if (nTabIndex == GetItemCount() - 1) iPartId = TABP_TABITEMBOTHEDGE; // First & Last item else iPartId = TABP_TABITEMLEFTEDGE; } else if (nTabIndex == GetItemCount() - 1) { // Last item iPartId = TABP_TABITEMRIGHTEDGE; } else { iPartId = TABP_TABITEM; } } if (g_xpStyle.IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId)) g_xpStyle.DrawThemeParentBackground(m_hWnd, *pDC, &rcFullItem); g_xpStyle.DrawThemeBackground(hTheme, *pDC, iPartId, iStateId, &rcBk, NULL); } } // Following background clearing is needed for: // WinXP/Vista (when used without an application theme) // Vista (when used with an application theme but without a theme for the tab control) if ( (!g_xpStyle.IsThemeActive() || !g_xpStyle.IsAppThemed()) || (hTheme == NULL && bVistaThemeActive) ) pDC->FillSolidRect(&lpDIS->rcItem, GetSysColor(COLOR_BTNFACE)); int iOldBkMode = pDC->SetBkMode(TRANSPARENT); // Draw image on left side CImageList *piml = GetImageList(); if (tci.iImage >= 0 && piml && piml->m_hImageList) { IMAGEINFO ii; piml->GetImageInfo(0, &ii); rect.left += bSelected ? 8 : 4; piml->Draw(pDC, tci.iImage, CPoint(rect.left, rect.top + 2), ILD_TRANSPARENT); rect.left += (ii.rcImage.right - ii.rcImage.left); if (!bSelected) rect.left += 4; } bool bCloseable = m_bCloseable; if (bCloseable && GetParent()->SendMessage(UM_QUERYTAB, nTabIndex)) bCloseable = false; // Draw 'Close button' at right side if (bCloseable && m_ImgLstCloseButton.m_hImageList) { CRect rcCloseButton; GetCloseButtonRect(nTabIndex, rect, rcCloseButton, bSelected, bVistaThemeActive); HTHEME hThemeNC = bVistaThemeActive ? g_xpStyle.OpenThemeData(m_hWnd, _T("WINDOW")) : NULL; if (hThemeNC) { // Possible "Close" parts: WP_CLOSEBUTTON, WP_SMALLCLOSEBUTTON, WP_MDICLOSEBUTTON int iPartId = WP_SMALLCLOSEBUTTON; int iStateId = (bSelected || bVistaHotTracked) ? CBS_NORMAL : CBS_DISABLED; if (g_xpStyle.IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId)) g_xpStyle.DrawThemeParentBackground(m_hWnd, *pDC, &rcCloseButton); g_xpStyle.DrawThemeBackground(hThemeNC, *pDC, iPartId, iStateId, rcCloseButton, NULL); g_xpStyle.CloseThemeData(hThemeNC); } else { m_ImgLstCloseButton.Draw(pDC, (bSelected || bVistaHotTracked) ? 0 : 1, rcCloseButton.TopLeft(), ILD_TRANSPARENT); } rect.right = rcCloseButton.left - 2; if (bSelected) rect.left += hTheme ? 4 : 2; } COLORREF crOldColor = CLR_NONE; if (tci.dwState & TCIS_HIGHLIGHTED) crOldColor = pDC->SetTextColor(RGB(192, 0, 0)); else if (bVistaHotTracked) crOldColor = pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT)); rect.top += bSelected ? 4 : 3; // Vista: Tab control has troubles with determining the width of a tab if the // label contains one '&' character. To get around this, we use the old code which // replaces one '&' character with two '&' characters and we do not specify DT_NOPREFIX // here when drawing the text. // // Vista: "DrawThemeText" can not be used in case we need a certain foreground color. Thus we always us // "DrawText" to always get the same font and metrics (just for safety). pDC->DrawText(szLabel, rect, DT_SINGLELINE | DT_TOP | DT_CENTER /*| DT_NOPREFIX*/); if (crOldColor != CLR_NONE) pDC->SetTextColor(crOldColor); pDC->SetBkMode(iOldBkMode); if (hTheme) { CRect rcClip(rcFullItem); if (bSelected) { rcClip.left -= 2 + 1; rcClip.right += 2 + 1; } else { rcClip.top += 2; } pDC->ExcludeClipRect(&rcClip); g_xpStyle.CloseThemeData(hTheme); } }
//绘画函数 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; }