//-------------------------------------------------------------- // Redraw just the indicator part //-------------------------------------------------------------- void RibbonControl::DrawIndicator (CDC* pDC) { CRect whr = m_bbox; whr.DeflateRect(6,6); CPoint obr; if (m_bbox.Width() > m_bbox.Height()) { // horizontal wheel CBrush hbr(HS_VERTICAL,RGB(0,0,0)); obr = pDC->SetBrushOrg(m_phase,0); pDC->FillRect(whr,&hbr); pDC->SetBrushOrg(obr); } else { // vertical wheel CBrush hbr(HS_HORIZONTAL,RGB(0,0,0)); obr = pDC->SetBrushOrg(0,m_phase); pDC->FillRect(whr,&hbr); pDC->SetBrushOrg(obr); } pDC->SetBrushOrg(obr); }
// draw the item bool wxOwnerDrawn::OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction, wxODStatus stat) { // we do nothing if item isn't ownerdrawn if ( !IsOwnerDrawn() ) return true; wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); HDC hdc = GetHdcOf(*impl); RECT rect; wxCopyRectToRECT(rc, rect); { // set the font and colors wxFont font; GetFontToUse(font); wxColour colText, colBack; GetColourToUse(stat, colText, colBack); SelectInHDC selFont(hdc, GetHfontOf(font)); wxMSWImpl::wxTextColoursChanger textCol(hdc, colText, colBack); wxMSWImpl::wxBkModeChanger bkMode(hdc, wxBRUSHSTYLE_TRANSPARENT); AutoHBRUSH hbr(wxColourToPalRGB(colBack)); SelectInHDC selBrush(hdc, hbr); ::FillRect(hdc, &rect, hbr); // using native API because it recognizes '&' wxString text = GetName(); SIZE sizeRect; ::GetTextExtentPoint32(hdc, text.c_str(), text.length(), &sizeRect); int flags = DST_PREFIXTEXT; if ( (stat & wxODDisabled) && !(stat & wxODSelected) ) flags |= DSS_DISABLED; if ( (stat & wxODHidePrefix) ) flags |= DSS_HIDEPREFIX; int x = rc.x + GetMarginWidth(); int y = rc.y + (rc.GetHeight() - sizeRect.cy) / 2; int cx = rc.GetWidth() - GetMarginWidth(); int cy = sizeRect.cy; ::DrawState(hdc, NULL, NULL, wxMSW_CONV_LPARAM(text), text.length(), x, y, cx, cy, flags); } // reset to default the font, colors and brush if (stat & wxODHasFocus) ::DrawFocusRect(hdc, &rect); return true; }
void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); wxMemoryDC memdc; RECT rc; ::GetClientRect(GetHwnd(), &rc); wxBitmap bmp(rc.right, rc.bottom); memdc.SelectObject(bmp); const wxLayoutDirection dir = dc.GetLayoutDirection(); memdc.SetLayoutDirection(dir); const HDC hdc = GetHdcOf(memdc); // The drawing logic of the native tab control is absolutely impenetrable // but observation shows that in the current Windows versions (XP and 7), // the tab control always erases its entire background in its window proc // when the tabs are top-aligned but does not do it when the tabs are in // any other position. // // This means that we can't rely on our background colour being used for // the blank area in the tab row because this doesn't work in the default // top-aligned case, hence the hack with ExtFloodFill() below. But it also // means that we still do need to erase the DC to account for the other // cases. // // Moreover, just in case some very old or very new (or even future, // although it seems unlikely that this is ever going to change by now) // version of Windows didn't do it like this, do both things in all cases // instead of optimizing away the one of them which doesn't do anything for // the effectively used tab orientation -- better safe than fast. // Notice that we use our own background here, not the background used for // the pages, because the tab row background must blend with the parent and // so the background colour inherited from it (if any) must be used. AutoHBRUSH hbr(wxColourToRGB(GetBackgroundColour())); ::FillRect(hdc, &rc, hbr); MSWDefWindowProc(WM_PAINT, (WPARAM)hdc, 0); // At least for the top-aligned tabs, our background colour was overwritten // and so we now replace the default background with our colour. This is // horribly inefficient, of course, but seems to be the only way to do it. if ( UseBgCol() ) { SelectInHDC selectBrush(hdc, hbr); // Find the point which must contain the default background colour: // this is a hack, of course, but using this point "close" to the // corner seems to work fine in practice. int x = 0, y = 0; switch ( GetWindowStyle() & wxBK_ALIGN_MASK ) { case wxBK_TOP: x = rc.right - 2; y = 2; break; case wxBK_BOTTOM: x = rc.right - 2; y = rc.bottom - 2; break; case wxBK_LEFT: x = 2; y = rc.bottom - 2; break; case wxBK_RIGHT: x = 2; y = rc.bottom - 2; break; } ::ExtFloodFill(hdc, x, y, ::GetSysColor(COLOR_BTNFACE), FLOODFILLSURFACE); } // For some reason in RTL mode, source offset has to be -1, otherwise the // right border (physical) remains unpainted. const wxCoord ofs = dir == wxLayout_RightToLeft ? -1 : 0; dc.Blit(ofs, 0, rc.right, rc.bottom, &memdc, ofs, 0); }
//--------------------------------------------------------------------- // 描画 //--------------------------------------------------------------------- void OnDraw(HWND hwnd, HDC hdc, PAINTSTRUCT* pps) { TCHAR szNum[8]; int candidateNum; int x, y; HBRUSH hbrOld; kjm::Brush hbr(RGB(255, 255, 255)), hbr2(RGB(200, 200, 200)), hbr3(RGB(150, 150, 250)), hbr4(RGB(250, 150, 150)), hbr5(RGB(150, 250, 150)), hbr6(RGB(240, 240, 100)); HFONT hfont, hfontOld, hfontGui; LOGFONT lf; hfontGui = (HFONT)GetStockObject(DEFAULT_GUI_FONT); GetObject(hfontGui, sizeof(lf), &lf); lf.lfHeight = lf.lfHeight * 300 / 100; //lf.lfWeight = 700; hfont = CreateFontIndirect(&lf); hfontOld = (HFONT)SelectObject(hdc, hfont); for (y = 0; y < 9; y++) { for (x = 0; x < 9; x++) { if (g_game.get_Value(y, x) != 0) { int bkOld; if (g_game.get_Sender(y, x) == 1) { hbrOld = (HBRUSH)SelectObject(hdc, hbr2); bkOld = SetBkColor(hdc, RGB(200, 200, 200)); // ブロック内で候補が一つになった時 } if (g_game.get_Sender(y, x) == 2) { // (青)候補がひとつになったとき hbrOld = (HBRUSH)SelectObject(hdc, hbr3); bkOld = SetBkColor(hdc, RGB(150, 150, 250)); } if (g_game.get_Sender(y, x) == 3) { // (赤)横方向にひとつだけ候補があったとき hbrOld = (HBRUSH)SelectObject(hdc, hbr4); bkOld = SetBkColor(hdc, RGB(250, 150, 150)); } if (g_game.get_Sender(y, x) == 4) { // (緑)縦方向にひとつだけ候補があったとき hbrOld = (HBRUSH)SelectObject(hdc, hbr5); bkOld = SetBkColor(hdc, RGB(150, 250, 150)); } if (g_game.get_Sender(y, x) == 5) { hbrOld = (HBRUSH)SelectObject(hdc, hbr6); bkOld = SetBkColor(hdc, RGB(240, 240, 100)); } Rectangle(hdc, g_view.get_Rect(y, x).left, g_view.get_Rect(y, x).top, g_view.get_Rect(y, x).right, g_view.get_Rect(y, x).bottom); SetTextColor(hdc, (g_currentNum == 0 || g_currentNum != g_game.get_Value(y, x)) ? RGB(0, 0, 0) : RGB(255, 0, 0)); wsprintf(szNum, _T("%d"), g_game.get_Value(y, x)); DrawText(hdc, szNum, -1, &g_view.get_Rect(y, x), DT_CENTER | DT_VCENTER | DT_SINGLELINE); if (g_game.get_Sender(y, x) != 0) { SelectObject(hdc, hbrOld); SetBkColor(hdc, bkOld); } } else if (g_game.GetCandidateCount(y, x, &candidateNum) == 1) { //hbrOld = (HBRUSH)SelectObject(hdc, hbr); Rectangle(hdc, g_view.get_Rect(y, x).left, g_view.get_Rect(y, x).top, g_view.get_Rect(y, x).right, g_view.get_Rect(y, x).bottom); //SelectObject(hdc, hbrOld); //int bkOld = SetBkColor(hdc, RGB(180, 255, 180)); wsprintf(szNum, _T("%d"), candidateNum); SetTextColor(hdc, (g_currentNum == 0 || g_currentNum != g_game.get_Value(y, x)) ? RGB(180, 255, 180) : RGB(255, 0, 0)); DrawText(hdc, szNum, -1, &g_view.get_Rect(y, x), DT_CENTER | DT_VCENTER | DT_SINGLELINE); //SetBkColor(hdc, bkOld); } else { Rectangle(hdc, g_view.get_Rect(y, x).left, g_view.get_Rect(y, x).top, g_view.get_Rect(y, x).right, g_view.get_Rect(y, x).bottom); } } } for (int i = 0; i < 9; i++) { Rectangle(hdc, g_view.get_NumRect(i).left, g_view.get_NumRect(i).top, g_view.get_NumRect(i).right, g_view.get_NumRect(i).bottom); wsprintf(szNum, _T("%d"), i + 1); SetTextColor(hdc, RGB(0, 0, 0)); DrawText(hdc, szNum, -1, &g_view.get_NumRect(i), DT_CENTER | DT_VCENTER | DT_SINGLELINE); if (2 == 9) { MoveToEx(hdc, g_view.get_NumRect(i).right, g_view.get_NumRect(i).top, NULL); LineTo(hdc, g_view.get_NumRect(i).left, g_view.get_NumRect(i).bottom); } } SelectObject(hdc, hfontOld); DeleteObject(hfont); }
bool wxMenuItem::OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction WXUNUSED(act), wxODStatus stat) { const MenuDrawData* data = MenuDrawData::Get(); wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); HDC hdc = GetHdcOf(*impl); RECT rect; wxCopyRectToRECT(rc, rect); int imgWidth = wxMax(GetMarginWidth(), data->CheckSize.cx); if ( IsOwnerDrawn() ) { // font and colors to use wxFont font; GetFontToUse(font); wxColour colText, colBack; GetColourToUse(stat, colText, colBack); // calculate metrics of item parts RECT rcSelection = rect; data->ItemMargin.ApplyTo(rcSelection); RECT rcSeparator = rcSelection; data->SeparatorMargin.ApplyTo(rcSeparator); RECT rcGutter = rcSelection; rcGutter.right = data->ItemMargin.cxLeftWidth + data->CheckBgMargin.cxLeftWidth + data->CheckMargin.cxLeftWidth + imgWidth + data->CheckMargin.cxRightWidth + data->CheckBgMargin.cxRightWidth; RECT rcText = rcSelection; rcText.left = rcGutter.right + data->TextBorder; // we draw the text label vertically centered, but this results in it // being 1px too low compared to native menus for some reason, fix it if ( data->MenuLayout() != MenuDrawData::FullTheme ) rcText.top--; #if wxUSE_UXTHEME // If a custom background colour is explicitly specified, we should use // it instead of the default theme background. wxUxThemeEngine* const theme = GetBackgroundColour().IsOk() ? NULL : MenuDrawData::GetUxThemeEngine(); if ( theme ) { POPUPITEMSTATES state; if ( stat & wxODDisabled ) { state = (stat & wxODSelected) ? MPI_DISABLEDHOT : MPI_DISABLED; } else if ( stat & wxODSelected ) { state = MPI_HOT; } else { state = MPI_NORMAL; } wxUxThemeHandle hTheme(GetMenu()->GetWindow(), L"MENU"); if ( theme->IsThemeBackgroundPartiallyTransparent(hTheme, MENU_POPUPITEM, state) ) { theme->DrawThemeBackground(hTheme, hdc, MENU_POPUPBACKGROUND, 0, &rect, NULL); } theme->DrawThemeBackground(hTheme, hdc, MENU_POPUPGUTTER, 0, &rcGutter, NULL); if ( IsSeparator() ) { rcSeparator.left = rcGutter.right; theme->DrawThemeBackground(hTheme, hdc, MENU_POPUPSEPARATOR, 0, &rcSeparator, NULL); return true; } theme->DrawThemeBackground(hTheme, hdc, MENU_POPUPITEM, state, &rcSelection, NULL); } else #endif // wxUSE_UXTHEME { if ( IsSeparator() ) { DrawEdge(hdc, &rcSeparator, EDGE_ETCHED, BF_TOP); return true; } AutoHBRUSH hbr(colBack.GetPixel()); SelectInHDC selBrush(hdc, hbr); ::FillRect(hdc, &rcSelection, hbr); } // draw text label // using native API because it recognizes '&' HDCTextColChanger changeTextCol(hdc, colText.GetPixel()); HDCBgColChanger changeBgCol(hdc, colBack.GetPixel()); HDCBgModeChanger changeBgMode(hdc, TRANSPARENT); SelectInHDC selFont(hdc, GetHfontOf(font)); // item text name without mnemonic for calculating size wxString text = GetName(); SIZE textSize; ::GetTextExtentPoint32(hdc, text.c_str(), text.length(), &textSize); // item text name with mnemonic text = GetItemLabel().BeforeFirst('\t'); int flags = DST_PREFIXTEXT; // themes menu is using specified color for disabled labels if ( data->MenuLayout() == MenuDrawData::Classic && (stat & wxODDisabled) && !(stat & wxODSelected) ) flags |= DSS_DISABLED; if ( (stat & wxODHidePrefix) && !data->AlwaysShowCues ) flags |= DSS_HIDEPREFIX; int x = rcText.left; int y = rcText.top + (rcText.bottom - rcText.top - textSize.cy) / 2; ::DrawState(hdc, NULL, NULL, wxMSW_CONV_LPARAM(text), text.length(), x, y, 0, 0, flags); // ::SetTextAlign(hdc, TA_RIGHT) doesn't work with DSS_DISABLED or DSS_MONO // as the last parameter in DrawState() (at least with Windows98). So we have // to take care of right alignment ourselves. wxString accel = GetItemLabel().AfterFirst(wxT('\t')); if ( !accel.empty() ) { SIZE accelSize; ::GetTextExtentPoint32(hdc, accel.c_str(), accel.length(), &accelSize); flags = DST_TEXT; // themes menu is using specified color for disabled labels if ( data->MenuLayout() == MenuDrawData::Classic && (stat & wxODDisabled) && !(stat & wxODSelected) ) flags |= DSS_DISABLED; x = rcText.right - data->ArrowMargin.GetTotalX() - data->ArrowSize.cx - data->ArrowBorder; // right align accel on FullTheme menu, left otherwise if ( data->MenuLayout() == MenuDrawData::FullTheme) x -= accelSize.cx; else x -= m_parentMenu->GetMaxAccelWidth(); y = rcText.top + (rcText.bottom - rcText.top - accelSize.cy) / 2; ::DrawState(hdc, NULL, NULL, wxMSW_CONV_LPARAM(accel), accel.length(), x, y, 0, 0, flags); } } // draw the bitmap RECT rcImg; SetRect(&rcImg, rect.left + data->ItemMargin.cxLeftWidth + data->CheckBgMargin.cxLeftWidth + data->CheckMargin.cxLeftWidth, rect.top + data->ItemMargin.cyTopHeight + data->CheckBgMargin.cyTopHeight + data->CheckMargin.cyTopHeight, rect.left + data->ItemMargin.cxLeftWidth + data->CheckBgMargin.cxLeftWidth + data->CheckMargin.cxLeftWidth + imgWidth, rect.bottom - data->ItemMargin.cyBottomHeight - data->CheckBgMargin.cyBottomHeight - data->CheckMargin.cyBottomHeight); if ( IsCheckable() && !m_bmpChecked.IsOk() ) { if ( stat & wxODChecked ) { DrawStdCheckMark((WXHDC)hdc, &rcImg, stat); } } else { wxBitmap bmp; if ( stat & wxODDisabled ) { bmp = GetDisabledBitmap(); } if ( !bmp.IsOk() ) { // for not checkable bitmaps we should always use unchecked one // because their checked bitmap is not set bmp = GetBitmap(!IsCheckable() || (stat & wxODChecked)); #if wxUSE_IMAGE if ( bmp.IsOk() && stat & wxODDisabled ) { // we need to grey out the bitmap as we don't have any specific // disabled bitmap wxImage imgGrey = bmp.ConvertToImage().ConvertToGreyscale(); if ( imgGrey.IsOk() ) bmp = wxBitmap(imgGrey); } #endif // wxUSE_IMAGE } if ( bmp.IsOk() ) { wxMemoryDC dcMem(&dc); dcMem.SelectObjectAsSource(bmp); // center bitmap int nBmpWidth = bmp.GetWidth(), nBmpHeight = bmp.GetHeight(); int x = rcImg.left + (imgWidth - nBmpWidth) / 2; int y = rcImg.top + (rcImg.bottom - rcImg.top - nBmpHeight) / 2; dc.Blit(x, y, nBmpWidth, nBmpHeight, &dcMem, 0, 0, wxCOPY, true); } } return true; }
void BlockManagerMaster::BlockManagerMasterActor::heartbeatReceiver(const HeartBeatMessage &message,const Theron::Address from){ cout<<"receive heartbeat from node "<<from.AsString()<<" shows:"<<message.mText<<endl; string respond="ok"; HeartBeatRespond hbr(respond.c_str()); Send(hbr,from); }