예제 #1
0
//--------------------------------------------------------------
// 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);
}
예제 #2
0
// 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;
}
예제 #3
0
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);
}
예제 #4
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);
}
예제 #5
0
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;

}
예제 #6
0
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);
}