diff options
Diffstat (limited to 'win32/PlatWin.cxx')
-rw-r--r-- | win32/PlatWin.cxx | 175 |
1 files changed, 101 insertions, 74 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 315af73db..5fb2b16d3 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -713,7 +713,8 @@ void SurfaceGDI::Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired void SurfaceGDI::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColor(back); - ::Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom); + const RECT rcw = RectFromPRectangle(rc); + ::Rectangle(hdc, rcw.left, rcw.top, rcw.right, rcw.bottom); } void SurfaceGDI::FillRectangle(PRectangle rc, ColourDesired back) { @@ -721,7 +722,7 @@ void SurfaceGDI::FillRectangle(PRectangle rc, ColourDesired back) { // There is no need to allocate a brush either. RECT rcw = RectFromPRectangle(rc); ::SetBkColor(hdc, back.AsLong()); - ::ExtTextOut(hdc, rc.left, rc.top, ETO_OPAQUE, &rcw, TEXT(""), 0, NULL); + ::ExtTextOut(hdc, rcw.left, rcw.top, ETO_OPAQUE, &rcw, TEXT(""), 0, NULL); } void SurfaceGDI::FillRectangle(PRectangle rc, Surface &surfacePattern) { @@ -738,9 +739,10 @@ void SurfaceGDI::FillRectangle(PRectangle rc, Surface &surfacePattern) { void SurfaceGDI::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColor(back); + const RECT rcw = RectFromPRectangle(rc); ::RoundRect(hdc, - rc.left + 1, rc.top, - rc.right - 1, rc.bottom, + rcw.left + 1, rcw.top, + rcw.right - 1, rcw.bottom, 8, 8); } @@ -773,10 +775,11 @@ static DWORD dwordFromBGRA(byte b, byte g, byte r, byte a) { void SurfaceGDI::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill, ColourDesired outline, int alphaOutline, int /* flags*/ ) { + const RECT rcw = RectFromPRectangle(rc); if (AlphaBlendFn && rc.Width() > 0) { HDC hMemDC = ::CreateCompatibleDC(reinterpret_cast<HDC>(hdc)); - int width = rc.Width(); - int height = rc.Height(); + int width = static_cast<int>(rc.Width()); + int height = static_cast<int>(rc.Height()); // Ensure not distorted too much by corners when small cornerSize = Platform::Minimum(cornerSize, (Platform::Minimum(width, height) / 2) - 2); BITMAPINFO bpih = {{sizeof(BITMAPINFOHEADER), width, height, 1, 32, BI_RGB, 0, 0, 0, 0, 0}}; @@ -819,7 +822,7 @@ void SurfaceGDI::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fil BLENDFUNCTION merge = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; - AlphaBlendFn(reinterpret_cast<HDC>(hdc), rc.left, rc.top, width, height, hMemDC, 0, 0, width, height, merge); + AlphaBlendFn(reinterpret_cast<HDC>(hdc), rcw.left, rcw.top, width, height, hMemDC, 0, 0, width, height, merge); SelectBitmap(hMemDC, hbmOld); ::DeleteObject(hbmMem); @@ -827,7 +830,6 @@ void SurfaceGDI::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fil ::DeleteDC(hMemDC); } else { BrushColor(outline); - RECT rcw = RectFromPRectangle(rc); FrameRect(hdc, &rcw, brush); } } @@ -863,7 +865,8 @@ void SurfaceGDI::DrawRGBAImage(PRectangle rc, int width, int height, const unsig BLENDFUNCTION merge = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; - AlphaBlendFn(reinterpret_cast<HDC>(hdc), rc.left, rc.top, rc.Width(), rc.Height(), hMemDC, 0, 0, width, height, merge); + AlphaBlendFn(reinterpret_cast<HDC>(hdc), static_cast<int>(rc.left), static_cast<int>(rc.top), + static_cast<int>(rc.Width()), static_cast<int>(rc.Height()), hMemDC, 0, 0, width, height, merge); SelectBitmap(hMemDC, hbmOld); ::DeleteObject(hbmMem); @@ -876,13 +879,16 @@ void SurfaceGDI::DrawRGBAImage(PRectangle rc, int width, int height, const unsig void SurfaceGDI::Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColor(back); - ::Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom); + const RECT rcw = RectFromPRectangle(rc); + ::Ellipse(hdc, rcw.left, rcw.top, rcw.right, rcw.bottom); } void SurfaceGDI::Copy(PRectangle rc, Point from, Surface &surfaceSource) { ::BitBlt(hdc, - rc.left, rc.top, rc.Width(), rc.Height(), - static_cast<SurfaceGDI &>(surfaceSource).hdc, from.x, from.y, SRCCOPY); + static_cast<int>(rc.left), static_cast<int>(rc.top), + static_cast<int>(rc.Width()), static_cast<int>(rc.Height()), + static_cast<SurfaceGDI &>(surfaceSource).hdc, + static_cast<int>(from.x), static_cast<int>(from.y), SRCCOPY); } typedef VarBuffer<int, stackBufferLength> TextPositionsI; @@ -892,7 +898,8 @@ void SurfaceGDI::DrawTextCommon(PRectangle rc, Font &font_, XYPOSITION ybase, co RECT rcw = RectFromPRectangle(rc); SIZE sz={0,0}; int pos = 0; - int x = rc.left; + int x = static_cast<int>(rc.left); + const int yBaseInt = static_cast<int>(ybase); // Text drawing may fail if the text is too big. // If it does fail, slice up into segments and draw each segment. @@ -901,10 +908,10 @@ void SurfaceGDI::DrawTextCommon(PRectangle rc, Font &font_, XYPOSITION ybase, co if ((!unicodeMode) && (IsNT() || (codePage==0) || win9xACPSame)) { // Use ANSI calls int lenDraw = Platform::Minimum(len, maxLenText); - if (!::ExtTextOutA(hdc, x, ybase, fuOptions, &rcw, s, lenDraw, NULL)) { + if (!::ExtTextOutA(hdc, x, yBaseInt, fuOptions, &rcw, s, lenDraw, NULL)) { while (lenDraw > pos) { int seglen = Platform::Minimum(maxSegmentLength, lenDraw - pos); - if (!::ExtTextOutA(hdc, x, ybase, fuOptions, &rcw, s+pos, seglen, NULL)) { + if (!::ExtTextOutA(hdc, x, yBaseInt, fuOptions, &rcw, s + pos, seglen, NULL)) { PLATFORM_ASSERT(false); return; } @@ -916,10 +923,10 @@ void SurfaceGDI::DrawTextCommon(PRectangle rc, Font &font_, XYPOSITION ybase, co } else { // Use Unicode calls const TextWide tbuf(s, len, unicodeMode, codePage); - if (!::ExtTextOutW(hdc, x, ybase, fuOptions, &rcw, tbuf.buffer, tbuf.tlen, NULL)) { + if (!::ExtTextOutW(hdc, x, yBaseInt, fuOptions, &rcw, tbuf.buffer, tbuf.tlen, NULL)) { while (tbuf.tlen > pos) { int seglen = Platform::Minimum(maxSegmentLength, tbuf.tlen - pos); - if (!::ExtTextOutW(hdc, x, ybase, fuOptions, &rcw, tbuf.buffer+pos, seglen, NULL)) { + if (!::ExtTextOutW(hdc, x, yBaseInt, fuOptions, &rcw, tbuf.buffer + pos, seglen, NULL)) { PLATFORM_ASSERT(false); return; } @@ -968,7 +975,7 @@ XYPOSITION SurfaceGDI::WidthText(Font &font_, const char *s, int len) { const TextWide tbuf(s, len, unicodeMode, codePage); ::GetTextExtentPoint32W(hdc, tbuf.buffer, tbuf.tlen, &sz); } - return sz.cx; + return static_cast<XYPOSITION>(sz.cx); } void SurfaceGDI::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION *positions) { @@ -1004,11 +1011,11 @@ void SurfaceGDI::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION * lenChar = 2; } for (unsigned int bytePos=0; (bytePos<lenChar) && (i<len); bytePos++) { - positions[i++] = poses.buffer[ui]; + positions[i++] = static_cast<XYPOSITION>(poses.buffer[ui]); } ui++; } - int lastPos = 0; + XYPOSITION lastPos = 0.0f; if (i > 0) lastPos = positions[i-1]; while (i<len) { @@ -1034,7 +1041,7 @@ void SurfaceGDI::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION * poses.buffer[i] = poses.buffer[fit-1]; } for (int i=0; i<lenBlock; i++) - positions[i] = poses.buffer[i] + startOffset; + positions[i] = static_cast<XYPOSITION>(poses.buffer[i] + startOffset); startOffset = poses.buffer[lenBlock-1]; len -= lenBlock; positions += lenBlock; @@ -1052,11 +1059,11 @@ void SurfaceGDI::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION * int ui = 0; for (int i=0; i<len;) { if (Platform::IsDBCSLeadByte(codePage, s[i])) { - positions[i] = poses.buffer[ui]; - positions[i+1] = poses.buffer[ui]; + positions[i] = static_cast<XYPOSITION>(poses.buffer[ui]); + positions[i + 1] = static_cast<XYPOSITION>(poses.buffer[ui]); i += 2; } else { - positions[i] = poses.buffer[ui]; + positions[i] = static_cast<XYPOSITION>(poses.buffer[ui]); i++; } @@ -1069,53 +1076,54 @@ XYPOSITION SurfaceGDI::WidthChar(Font &font_, char ch) { SetFont(font_); SIZE sz; ::GetTextExtentPoint32A(hdc, &ch, 1, &sz); - return sz.cx; + return static_cast<XYPOSITION>(sz.cx); } XYPOSITION SurfaceGDI::Ascent(Font &font_) { SetFont(font_); TEXTMETRIC tm; ::GetTextMetrics(hdc, &tm); - return tm.tmAscent; + return static_cast<XYPOSITION>(tm.tmAscent); } XYPOSITION SurfaceGDI::Descent(Font &font_) { SetFont(font_); TEXTMETRIC tm; ::GetTextMetrics(hdc, &tm); - return tm.tmDescent; + return static_cast<XYPOSITION>(tm.tmDescent); } XYPOSITION SurfaceGDI::InternalLeading(Font &font_) { SetFont(font_); TEXTMETRIC tm; ::GetTextMetrics(hdc, &tm); - return tm.tmInternalLeading; + return static_cast<XYPOSITION>(tm.tmInternalLeading); } XYPOSITION SurfaceGDI::ExternalLeading(Font &font_) { SetFont(font_); TEXTMETRIC tm; ::GetTextMetrics(hdc, &tm); - return tm.tmExternalLeading; + return static_cast<XYPOSITION>(tm.tmExternalLeading); } XYPOSITION SurfaceGDI::Height(Font &font_) { SetFont(font_); TEXTMETRIC tm; ::GetTextMetrics(hdc, &tm); - return tm.tmHeight; + return static_cast<XYPOSITION>(tm.tmHeight); } XYPOSITION SurfaceGDI::AverageCharWidth(Font &font_) { SetFont(font_); TEXTMETRIC tm; ::GetTextMetrics(hdc, &tm); - return tm.tmAveCharWidth; + return static_cast<XYPOSITION>(tm.tmAveCharWidth); } void SurfaceGDI::SetClip(PRectangle rc) { - ::IntersectClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom); + ::IntersectClipRect(hdc, static_cast<int>(rc.left), static_cast<int>(rc.top), + static_cast<int>(rc.right), static_cast<int>(rc.bottom)); } void SurfaceGDI::FlushCachedState() { @@ -1292,7 +1300,7 @@ void SurfaceD2D::InitPixMap(int width, int height, Surface *surface_, WindowID) SetScale(); SurfaceD2D *psurfOther = static_cast<SurfaceD2D *>(surface_); ID2D1BitmapRenderTarget *pCompatibleRenderTarget = NULL; - D2D1_SIZE_F desiredSize = D2D1::SizeF(width, height); + D2D1_SIZE_F desiredSize = D2D1::SizeF(static_cast<float>(width), static_cast<float>(height)); D2D1_PIXEL_FORMAT desiredFormat; #ifdef __MINGW32__ desiredFormat.format = DXGI_FORMAT_UNKNOWN; @@ -1316,10 +1324,10 @@ void SurfaceD2D::PenColour(ColourDesired fore) { void SurfaceD2D::D2DPenColour(ColourDesired fore, int alpha) { if (pRenderTarget) { D2D_COLOR_F col; - col.r = (fore.AsLong() & 0xff) / 255.0; - col.g = ((fore.AsLong() & 0xff00) >> 8) / 255.0; - col.b = (fore.AsLong() >> 16) / 255.0; - col.a = alpha / 255.0; + col.r = (fore.AsLong() & 0xff) / 255.0f; + col.g = ((fore.AsLong() & 0xff00) >> 8) / 255.0f; + col.b = (fore.AsLong() >> 16) / 255.0f; + col.a = alpha / 255.0f; if (pBrush) { pBrush->SetColor(col); } else { @@ -1378,8 +1386,8 @@ static int Delta(int difference) { return 0; } -static int RoundFloat(float f) { - return int(f+0.5); +static float RoundFloat(float f) { + return float(int(f+0.5f)); } void SurfaceD2D::LineTo(int x_, int y_) { @@ -1396,16 +1404,17 @@ void SurfaceD2D::LineTo(int x_, int y_) { int yEnd = y_ - yDelta; int top = Platform::Minimum(y, yEnd); int height = abs(y - yEnd) + 1; - D2D1_RECT_F rectangle1 = D2D1::RectF(left, top, left+width, top+height); + D2D1_RECT_F rectangle1 = D2D1::RectF(static_cast<float>(left), static_cast<float>(top), + static_cast<float>(left+width), static_cast<float>(top+height)); pRenderTarget->FillRectangle(&rectangle1, pBrush); } else if ((abs(xDiff) == abs(yDiff))) { // 45 degree slope - pRenderTarget->DrawLine(D2D1::Point2F(x + 0.5, y + 0.5), - D2D1::Point2F(x_ + 0.5 - xDelta, y_ + 0.5 - yDelta), pBrush); + pRenderTarget->DrawLine(D2D1::Point2F(x + 0.5f, y + 0.5f), + D2D1::Point2F(x_ + 0.5f - xDelta, y_ + 0.5f - yDelta), pBrush); } else { // Line has a different slope so difficult to avoid last pixel - pRenderTarget->DrawLine(D2D1::Point2F(x + 0.5, y + 0.5), - D2D1::Point2F(x_ + 0.5, y_ + 0.5), pBrush); + pRenderTarget->DrawLine(D2D1::Point2F(x + 0.5f, y + 0.5f), + D2D1::Point2F(x_ + 0.5f, y_ + 0.5f), pBrush); } x = x_; y = y_; @@ -1443,7 +1452,7 @@ void SurfaceD2D::Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired void SurfaceD2D::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) { if (pRenderTarget) { - D2D1_RECT_F rectangle1 = D2D1::RectF(RoundFloat(rc.left) + 0.5, rc.top+0.5, RoundFloat(rc.right) - 0.5, rc.bottom-0.5); + D2D1_RECT_F rectangle1 = D2D1::RectF(RoundFloat(rc.left) + 0.5f, rc.top+0.5f, RoundFloat(rc.right) - 0.5f, rc.bottom-0.5f); D2DPenColour(back); pRenderTarget->FillRectangle(&rectangle1, pBrush); D2DPenColour(fore); @@ -1486,13 +1495,13 @@ void SurfaceD2D::FillRectangle(PRectangle rc, Surface &surfacePattern) { void SurfaceD2D::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) { if (pRenderTarget) { D2D1_ROUNDED_RECT roundedRectFill = { - D2D1::RectF(rc.left+1.0, rc.top+1.0, rc.right-1.0, rc.bottom-1.0), + D2D1::RectF(rc.left+1.0f, rc.top+1.0f, rc.right-1.0f, rc.bottom-1.0f), 4, 4}; D2DPenColour(back); pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush); D2D1_ROUNDED_RECT roundedRect = { - D2D1::RectF(rc.left + 0.5, rc.top+0.5, rc.right - 0.5, rc.bottom-0.5), + D2D1::RectF(rc.left + 0.5f, rc.top+0.5f, rc.right - 0.5f, rc.bottom-0.5f), 4, 4}; D2DPenColour(fore); pRenderTarget->DrawRoundedRectangle(roundedRect, pBrush); @@ -1504,23 +1513,23 @@ void SurfaceD2D::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fil if (pRenderTarget) { if (cornerSize == 0) { // When corner size is zero, draw square rectangle to prevent blurry pixels at corners - D2D1_RECT_F rectFill = D2D1::RectF(RoundFloat(rc.left) + 1.0, rc.top + 1.0, RoundFloat(rc.right) - 1.0, rc.bottom - 1.0); + D2D1_RECT_F rectFill = D2D1::RectF(RoundFloat(rc.left) + 1.0f, rc.top + 1.0f, RoundFloat(rc.right) - 1.0f, rc.bottom - 1.0f); D2DPenColour(fill, alphaFill); pRenderTarget->FillRectangle(rectFill, pBrush); - D2D1_RECT_F rectOutline = D2D1::RectF(RoundFloat(rc.left) + 0.5, rc.top + 0.5, RoundFloat(rc.right) - 0.5, rc.bottom - 0.5); + D2D1_RECT_F rectOutline = D2D1::RectF(RoundFloat(rc.left) + 0.5f, rc.top + 0.5f, RoundFloat(rc.right) - 0.5f, rc.bottom - 0.5f); D2DPenColour(outline, alphaOutline); pRenderTarget->DrawRectangle(rectOutline, pBrush); } else { const float cornerSizeF = static_cast<float>(cornerSize); D2D1_ROUNDED_RECT roundedRectFill = { - D2D1::RectF(RoundFloat(rc.left) + 1.0, rc.top + 1.0, RoundFloat(rc.right) - 1.0, rc.bottom - 1.0), + D2D1::RectF(RoundFloat(rc.left) + 1.0f, rc.top + 1.0f, RoundFloat(rc.right) - 1.0f, rc.bottom - 1.0f), cornerSizeF, cornerSizeF}; D2DPenColour(fill, alphaFill); pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush); D2D1_ROUNDED_RECT roundedRect = { - D2D1::RectF(RoundFloat(rc.left) + 0.5, rc.top + 0.5, RoundFloat(rc.right) - 0.5, rc.bottom - 0.5), + D2D1::RectF(RoundFloat(rc.left) + 0.5f, rc.top + 0.5f, RoundFloat(rc.right) - 0.5f, rc.bottom - 0.5f), cornerSizeF, cornerSizeF}; D2DPenColour(outline, alphaOutline); pRenderTarget->DrawRoundedRectangle(roundedRect, pBrush); @@ -1724,7 +1733,7 @@ void SurfaceD2D::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION * } ui++; } - int lastPos = 0; + XYPOSITION lastPos = 0.0f; if (i > 0) lastPos = positions[i-1]; while (i<len) { @@ -1874,7 +1883,8 @@ PRectangle Window::GetPosition() { void Window::SetPosition(PRectangle rc) { ::SetWindowPos(reinterpret_cast<HWND>(wid), - 0, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER|SWP_NOACTIVATE); + 0, static_cast<int>(rc.left), static_cast<int>(rc.top), + static_cast<int>(rc.Width()), static_cast<int>(rc.Height()), SWP_NOZORDER | SWP_NOACTIVATE); } static RECT RectFromMonitor(HMONITOR hMonitor) { @@ -1900,7 +1910,7 @@ void Window::SetPositionRelative(PRectangle rc, Window w) { if (style & WS_POPUP) { POINT ptOther = {0, 0}; ::ClientToScreen(reinterpret_cast<HWND>(w.GetID()), &ptOther); - rc.Move(ptOther.x, ptOther.y); + rc.Move(static_cast<XYPOSITION>(ptOther.x), static_cast<XYPOSITION>(ptOther.y)); RECT rcMonitor = RectFromPRectangle(rc); @@ -2141,7 +2151,7 @@ class ListBoxX : public ListBox { int ItemHeight() const; int MinClientWidth() const; int TextOffset() const; - Point GetClientExtent() const; + POINT GetClientExtent() const; POINT MinTrackSize() const; POINT MaxTrackSize() const; void SetRedraw(bool on); @@ -2298,13 +2308,13 @@ PRectangle ListBoxX::GetDesiredRect() { int ListBoxX::TextOffset() const { int pixWidth = images.GetWidth(); - return pixWidth == 0 ? ItemInset.x : ItemInset.x + pixWidth + (ImageInset.x * 2); + return static_cast<int>(pixWidth == 0 ? ItemInset.x : ItemInset.x + pixWidth + (ImageInset.x * 2)); } int ListBoxX::CaretFromEdge() { PRectangle rc; AdjustWindowRect(&rc); - return TextOffset() + TextInset.x + (0 - rc.left) - 1; + return TextOffset() + static_cast<int>(TextInset.x + (0 - rc.left) - 1); } void ListBoxX::Clear() { @@ -2385,7 +2395,7 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) { int len = static_cast<int>(strlen(text)); RECT rcText = rcBox; - ::InsetRect(&rcText, TextInset.x, TextInset.y); + ::InsetRect(&rcText, static_cast<int>(TextInset.x), static_cast<int>(TextInset.y)); if (unicodeMode) { const TextWide tbuf(text, len, unicodeMode); @@ -2404,7 +2414,7 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) { if (surfaceItem) { if (technology == SCWIN_TECH_GDI) { surfaceItem->Init(pDrawItem->hDC, pDrawItem->hwndItem); - int left = pDrawItem->rcItem.left + ItemInset.x + ImageInset.x; + int left = pDrawItem->rcItem.left + static_cast<int>(ItemInset.x + ImageInset.x); PRectangle rcImage(left, pDrawItem->rcItem.top, left + images.GetWidth(), pDrawItem->rcItem.bottom); surfaceItem->DrawRGBAImage(rcImage, @@ -2432,7 +2442,7 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) { if (SUCCEEDED(hr)) { surfaceItem->Init(pDCRT, pDrawItem->hwndItem); pDCRT->BeginDraw(); - int left = pDrawItem->rcItem.left + ItemInset.x + ImageInset.x; + int left = pDrawItem->rcItem.left + static_cast<int>(ItemInset.x + ImageInset.x); PRectangle rcImage(left, pDrawItem->rcItem.top, left + images.GetWidth(), pDrawItem->rcItem.bottom); surfaceItem->DrawRGBAImage(rcImage, @@ -2514,8 +2524,8 @@ void ListBoxX::AdjustWindowRect(PRectangle *rc) { } int ListBoxX::ItemHeight() const { - int itemHeight = lineHeight + (TextInset.y * 2); - int pixHeight = images.GetHeight() + (ImageInset.y * 2); + int itemHeight = lineHeight + (static_cast<int>(TextInset.y) * 2); + int pixHeight = images.GetHeight() + (static_cast<int>(ImageInset.y) * 2); if (itemHeight < pixHeight) { itemHeight = pixHeight; } @@ -2536,7 +2546,7 @@ POINT ListBoxX::MinTrackSize() const { POINT ListBoxX::MaxTrackSize() const { PRectangle rc(0, 0, Platform::Maximum(MinClientWidth(), - maxCharWidth * maxItemCharacters + TextInset.x * 2 + + maxCharWidth * maxItemCharacters + static_cast<int>(TextInset.x) * 2 + TextOffset() + ::GetSystemMetrics(SM_CXVSCROLL)), ItemHeight() * lti.Count()); AdjustWindowRect(&rc); @@ -2550,6 +2560,20 @@ void ListBoxX::SetRedraw(bool on) { ::InvalidateRect(lb, NULL, TRUE); } +static XYPOSITION XYMinimum(XYPOSITION a, XYPOSITION b) { + if (a < b) + return a; + else + return b; +} + +static XYPOSITION XYMaximum(XYPOSITION a, XYPOSITION b) { + if (a > b) + return a; + else + return b; +} + void ListBoxX::ResizeToCursor() { PRectangle rc = GetPosition(); POINT ptw; @@ -2592,10 +2616,10 @@ void ListBoxX::ResizeToCursor() { POINT ptMin = MinTrackSize(); POINT ptMax = MaxTrackSize(); // We don't allow the left edge to move at present, but just in case - rc.left = Platform::Maximum(Platform::Minimum(rc.left, rcPreSize.right - ptMin.x), rcPreSize.right - ptMax.x); - rc.top = Platform::Maximum(Platform::Minimum(rc.top, rcPreSize.bottom - ptMin.y), rcPreSize.bottom - ptMax.y); - rc.right = Platform::Maximum(Platform::Minimum(rc.right, rcPreSize.left + ptMax.x), rcPreSize.left + ptMin.x); - rc.bottom = Platform::Maximum(Platform::Minimum(rc.bottom, rcPreSize.top + ptMax.y), rcPreSize.top + ptMin.y); + rc.left = XYMaximum(XYMinimum(rc.left, rcPreSize.right - ptMin.x), rcPreSize.right - ptMax.x); + rc.top = XYMaximum(XYMinimum(rc.top, rcPreSize.bottom - ptMin.y), rcPreSize.bottom - ptMax.y); + rc.right = XYMaximum(XYMinimum(rc.right, rcPreSize.left + ptMax.x), rcPreSize.left + ptMin.x); + rc.bottom = XYMaximum(XYMinimum(rc.bottom, rcPreSize.top + ptMax.y), rcPreSize.top + ptMin.y); SetPosition(rc); } @@ -2692,15 +2716,18 @@ void ListBoxX::OnDoubleClick() { } } -Point ListBoxX::GetClientExtent() const { +POINT ListBoxX::GetClientExtent() const { PRectangle rc = const_cast<ListBoxX*>(this)->GetClientPosition(); - return Point(rc.Width(), rc.Height()); + POINT ret; + ret.x = static_cast<LONG>(rc.Width()); + ret.y = static_cast<LONG>(rc.Height()); + return ret; } void ListBoxX::CentreItem(int n) { // If below mid point, scroll up to centre, but with more items below if uneven if (n >= 0) { - Point extent = GetClientExtent(); + POINT extent = GetClientExtent(); int visible = extent.y/ItemHeight(); if (visible < Length()) { int top = ::SendMessage(lb, LB_GETTOPINDEX, 0, 0); @@ -2713,14 +2740,14 @@ void ListBoxX::CentreItem(int n) { // Performs a double-buffered paint operation to avoid flicker void ListBoxX::Paint(HDC hDC) { - Point extent = GetClientExtent(); + POINT extent = GetClientExtent(); HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, extent.x, extent.y); HDC bitmapDC = ::CreateCompatibleDC(hDC); HBITMAP hBitmapOld = SelectBitmap(bitmapDC, hBitmap); // The list background is mainly erased during painting, but can be a small // unpainted area when at the end of a non-integrally sized list with a // vertical scroll bar - RECT rc = { 0, 0, static_cast<LONG>(extent.x), static_cast<LONG>(extent.y) }; + RECT rc = { 0, 0, extent.x, extent.y }; ::FillRect(bitmapDC, &rc, reinterpret_cast<HBRUSH>(COLOR_WINDOW+1)); // Paint the entire client area and vertical scrollbar ::SendMessage(lb, WM_PRINT, reinterpret_cast<WPARAM>(bitmapDC), PRF_CLIENT|PRF_NONCLIENT); @@ -2976,7 +3003,7 @@ void Menu::Destroy() { void Menu::Show(Point pt, Window &w) { ::TrackPopupMenu(reinterpret_cast<HMENU>(mid), - 0, pt.x - 4, pt.y, 0, + 0, static_cast<int>(pt.x - 4), static_cast<int>(pt.y), 0, reinterpret_cast<HWND>(w.GetID()), NULL); Destroy(); } @@ -3014,7 +3041,7 @@ double ElapsedTime::Duration(bool reset) { LARGE_INTEGER lBegin; lBegin.HighPart = bigBit; lBegin.LowPart = littleBit; - double elapsed = lEnd.QuadPart - lBegin.QuadPart; + double elapsed = static_cast<double>(lEnd.QuadPart - lBegin.QuadPart); result = elapsed / static_cast<double>(frequency.QuadPart); } else { endBigBit = clock(); |