void STabCtrl::OnPaint(IRenderTarget *pRT) { SPainter painter; BeforePaint(pRT,painter); CRect rcItem,rcItemPrev; CRect rcSplit; DWORD dwState; CRect rcTitle=GetTitleRect(); pRT->PushClipRect(&rcTitle,RGN_AND); for(size_t i=0; i<GetItemCount(); i++) { dwState=WndState_Normal; if(i == m_nCurrentPage) dwState=WndState_PushDown; else if(i== m_nHoverTabItem) dwState=WndState_Hover; GetItemRect(i,rcItem); //画分隔线 if(i>0 && m_pSkinTabInter) { rcSplit=rcItem; if(m_nTabAlign==AlignLeft) { rcSplit.top=rcItemPrev.bottom; rcSplit.bottom = rcSplit.top + m_nTabInterSize; } else { rcSplit.left=rcItemPrev.right; rcSplit.right=rcSplit.left + m_nTabInterSize; } m_pSkinTabInter->Draw(pRT,rcSplit,0); } DrawItem(pRT,rcItem,i,dwState); rcItemPrev=rcItem; } pRT->PopClip(); if (m_pSkinFrame) { CRect rcPage = GetChildrenLayoutRect(); m_pSkinFrame->Draw(pRT, rcPage, WndState_Normal); } if(IsFocused() && IsFocusable() && m_bDrawFocusRect) { CRect rc; GetItemRect(m_nCurrentPage,rc); rc.DeflateRect(2,2); DrawDefFocusRect(pRT,&rc); } AfterPaint(pRT,painter); }
BOOL STabCtrl::SetItemTitle( int nIndex, LPCTSTR lpszTitle ) { STabPage* pTab = GetItem(nIndex); if (pTab) { pTab->SetTitle(lpszTitle); CRect rcTitle = GetTitleRect(); InvalidateRect(rcTitle); return TRUE; } return FALSE; }
//绘制标题栏 void CDBFrame::DrawCaption(CDC *pDC) { CRect rcWindow; GetWindowRect(&rcWindow); //画标题栏位图 CRect rcCaption(0,//m_rcSysBorder.left, m_rcSysBorder.top, rcWindow.Width(),// - m_rcSysBorder.right, m_rcSysBorder.top + m_imageCaption.Height()); if (m_bNcActivate) m_imageCaption.Render(pDC, rcCaption.TopLeft(), rcCaption.Size()); else m_imageCaptionNA.Render(pDC, rcCaption.TopLeft(), rcCaption.Size()); CRect rcTitle; GetTitleRect(rcTitle); DrawTitle(pDC, rcTitle); }
BOOL STabCtrl::RemoveItem( int nIndex , int nSelPage/*=0*/) { STabPage * pTab = GetItem(nIndex); DestroyChild(pTab); m_lstPages.RemoveAt(nIndex); if (m_nCurrentPage == nIndex) { if(nSelPage<0) nSelPage=0; if(nSelPage>=(int)GetItemCount()) nSelPage=GetItemCount()-1; m_nCurrentPage=-1; SetCurSel(nSelPage); }else { if(m_nCurrentPage>nIndex) m_nCurrentPage--; CRect rcTitle = GetTitleRect(); InvalidateRect(rcTitle); } return TRUE; }
BOOL STabCtrl::GetItemRect( int nIndex, CRect &rcItem ) { if (nIndex < 0 || nIndex >= (int)GetItemCount()) return FALSE; CRect rcTitle = GetTitleRect(); rcItem = CRect(rcTitle.TopLeft(),m_szTab); switch (m_nTabAlign) { case AlignTop: case AlignBottom: rcItem.OffsetRect(m_nTabPos + nIndex * (rcItem.Width()+ m_nTabInterSize),0); break; case AlignLeft: case AlignRight: rcItem.OffsetRect(0, m_nTabPos + nIndex * (rcItem.Height()+ m_nTabInterSize)); break; } rcItem.IntersectRect(rcItem,rcTitle); return TRUE; }
int STabCtrl::InsertItem( pugi::xml_node xmlNode,int iInsert/*=-1*/,BOOL bLoading/*=FALSE*/ ) { if (wcscmp(xmlNode.name(),STabPage::GetClassName()) != 0) return -1; STabPage *pChild = (STabPage *)SApplication::getSingleton().CreateWindowByName(STabPage::GetClassName()); InsertChild(pChild); pChild->InitFromXml(xmlNode); pChild->GetLayout()->SetFitParent(PD_ALL); if(iInsert==-1) iInsert=m_lstPages.GetCount(); m_lstPages.InsertAt(iInsert,pChild); if(!bLoading ) { CRect rcPage=GetChildrenLayoutRect(); pChild->Move(&rcPage); pChild->SetVisible(FALSE,FALSE); if(m_nCurrentPage>=iInsert) m_nCurrentPage++; InvalidateRect(GetTitleRect()); if(m_nCurrentPage == -1) SetCurSel(iInsert); } return iInsert; }
unsigned int GMsgBox::initialize (GMessage& msg) { LCD_MODULE* lcd = ((LCD_MODULE **)msg.lparam)[0]; id = ID_MB_DLG; rect = lcd->rect; flags = GO_FLG_BORDER|GO_FLG_ENABLED|GO_FLG_SHOW|GO_FLG_SELECTED; RECT_T button_rect; RECT_T title_rect; RECT_T message_rect; int bnum =0; for(int mask = 1; type && mask < MBF_LAST_BTN; mask <<=1) if(type & mask) bnum++; if(body.empty() && !init_size.as_int ) { for(int i=0; i < lcd->chars_per_row/2; i++) body += '.'; type |= MBF_CLR; } POINT_T bs = get_border_size(); text_metrics_t msg_size; int x_offset, y_offset; while(1) { allocate_border(); if(bnum) button_rect = GetButtonRect(); title_rect = GetTitleRect(); message_rect =client_rect; message_rect.y0 += title_rect.height()+1; // title to message spacing 1 dot message_rect.y1 -= (button_rect.height())?(button_rect.height()):1; // message to buttons spacing 1 dot int width=0; int dec = message_rect.width(); if(type & MBF_EDIT) dec -= 2*bs.x; if(init_size.as_int) msg_size.as_int = init_size.as_int; else msg_size = get_text_metrics(body.c_str(), dec, font); if(msg_size.height + font->vspacing < message_rect.height()) { rect.y1 -= message_rect.height() - (msg_size.height + font->vspacing); continue; } else { if(message_rect.height() < msg_size.height) { flags |= GO_FLG_VSCROLL; x_offset = message_rect.height(); if(client_rect.height() > msg_size.height) message_rect.y1 = message_rect.y0 + msg_size.height; else message_rect.y1 = message_rect.y0 + client_rect.height();// +client_rect.y1; x_offset = message_rect.height() - x_offset; if(button_rect) { button_rect.Offset(0, x_offset); } } } if(dec > msg_size.width + 3*font->hdistance) { message_rect.x1 -= dec - msg_size.width - 3*font->hdistance; text_metrics_t new_msg_size; new_msg_size = get_text_metrics(body.c_str(), message_rect.width(), font); while(new_msg_size.height != msg_size.height ) { message_rect.x1 += 3*font->hdistance; new_msg_size = get_text_metrics(body.c_str(), message_rect.width(), font); } } width = message_rect.width(); if( title_rect.width() > width) width = title_rect.width(); if(button_rect.width() + bnum * bs.x > width) width = button_rect.width() + bnum * bs.x ; if(client_rect.width() > width) { rect.x1 -= client_rect.width() - width; continue; } break; } if(type & MBF_CLR) body.clear(); x_offset = (lcd->rect.width() - rect.width())/2; y_offset = (lcd->rect.height() - rect.height())/2; rect.Offset(x_offset, y_offset); client_rect.Offset(x_offset, y_offset); button_rect.Offset(x_offset, y_offset); if(title_rect) { title_rect.x0 = rect.x0; title_rect.x1 = rect.x1; title_rect.Offset(0, y_offset); GFlags flg = GO_FLG_SHOW|GO_FLG_TRANSPARENT; if(message_rect.height() >= client_rect.height()) flg |= GO_FLG_ENABLED; title_box = new GTitle( ID_MB_TITLE, title_rect, title, nullptr, flg, SS_CENTER|SS_TOP); addChild(title_box); } if(message_rect.width() < client_rect.width()) x_offset += (client_rect.width() - message_rect.width())/2; message_rect.Offset(x_offset, y_offset); if(type & MBF_EDIT) { edit_box = new GEdit(ID_MB_TEXT_BOX, message_rect, body, nullptr, ((bnum)?0:GO_FLG_SELECTED)| GO_FLG_BORDER|GO_FLG_VSCROLL|GO_FLG_TRANSPARENT|GO_FLG_DEFAULT, GET_MBF_EDIT_FLAGS(type), font); if(addChild(edit_box)) { edit_box->shift = GET_MBF_INPUT_TYPE(type); text_box = edit_box; } } else { text_box = new GText(ID_MB_TEXT_BOX, message_rect, body, nullptr, GO_FLG_VSCROLL|GO_FLG_TRANSPARENT|GO_FLG_SHOW,SS_DEFAULT,font); if(addChild( text_box )) { if(message_rect.height() < msg_size.height) text_box->flags |= GO_FLG_ENABLED; } } int bdistance = client_rect.width(); if ( bnum ) { if(bdistance > button_rect.width()) { bdistance -= button_rect.width(); bdistance /= bnum+1; } else bdistance = 0; int distance = 4*font->hdistance + 2*bs.x; button_rect.Inflate(0,2); button_rect.Offset(0,1); for(unsigned char mask =1, i=0; mask < MBF_LAST_BTN; mask <<=1, i++) { if(type & mask) { if(!default_button) default_button = mask; button_rect.x0 += bdistance; button_rect.x1 = button_rect.x0 + (strlen(MB_IDS[i]) * font->hspacing) + distance; addChild(new GButton(mask/*ret_codes[i]*/, button_rect, ret_codes[i], MB_IDS[i], GO_FLG_DEFAULT|GO_FLG_BORDER|GO_FLG_TRANSPARENT| ((default_button&mask)?GO_FLG_SELECTED:0 ))); button_rect.x0 += button_rect.width(); } } } weak_gui_message_beep(GET_MBF_BEEP_TYPE(type)); return GDialog::initialize(msg); }
int CALLBACK GetMemoData( LPVOID lp, int nGetType, LPVOID lpData, int nDataSize) { switch( nGetType) { case _GET_MEMO: return GetMemo( lp, lpData, nDataSize); case _GET_TITLE: return GetTitle( lp, lpData, nDataSize); case _GET_FONT: return GetFont( lp, lpData, nDataSize); case _GET_FORECOLOR: return GetForeColor( lp, lpData, nDataSize); case _GET_BACKCOLOR: return GetBackColor( lp, lpData, nDataSize); case _GET_ICON: return GetIconIndex( lp); case _GET_ZORDER: return GetZOrder( lp); case _GET_WINDOWTYPE: return GetWindowType( lp); case _GET_RECT_NORMAL: return GetNormalRect( lp, lpData, nDataSize); case _GET_POINT_TITLE: return GetTitlePoint( lp, lpData, nDataSize); case _GET_POINT_ICON: return GetIconPoint( lp, lpData, nDataSize); case _GET_RECT_TITLE: return GetTitleRect( lp, lpData, nDataSize); case _GET_RECT_ICON: return GetIconRect( lp, lpData, nDataSize); case _GET_TIMERENABLE: return IsTimerEnable( lp); case _GET_TIMER_TYPE: return GetTimerType( lp); case _GET_TIMER_MONTH: return GetTimerMonth( lp); case _GET_TIMER_DAY: return GetTimerDay( lp); case _GET_TIMER_HOUR: return GetTimerHour( lp); case _GET_TIMER_MIN: return GetTimerMin( lp); case _GET_TIMER_WEEK: return GetTimerWeek( lp); case _GET_TIMER_SOUND: return GetTimerSound( lp, lpData, nDataSize); case _GET_LINKENABLE: return IsLink( lp); case _GET_LINK_FILE: return GetLinkFile( lp, lpData, nDataSize); case _GET_LINK_PARAM: return GetLinkParam( lp, lpData, nDataSize); case _GET_CREATE_YEAR: return GetCreateYear( lp); case _GET_CREATE_MONTH: return GetCreateMonth( lp); case _GET_CREATE_DAY: return GetCreateDay( lp); case _GET_DEF_FONT: return GetDefFont( lpData, nDataSize); case _GET_DEF_FORECLR: return GetDefForeColor( lpData, nDataSize); case _GET_DEF_BACKCLR: return GetDefBackColor( lpData, nDataSize); case _GET_VERSION: return VERSION_CODE; } return 0; }