本文整理汇总了C++中LKSurface::FillRect方法的典型用法代码示例。如果您正苦于以下问题:C++ LKSurface::FillRect方法的具体用法?C++ LKSurface::FillRect怎么用?C++ LKSurface::FillRect使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LKSurface
的用法示例。
在下文中一共展示了LKSurface::FillRect方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: OnPaintComboPopupListItem
static void OnPaintComboPopupListItem(WindowControl * Sender, LKSurface& Surface) {
if (Sender) {
if (ComboListPopup->ComboPopupDrawListIndex >= 0 &&
ComboListPopup->ComboPopupDrawListIndex < ComboListPopup->ComboPopupItemCount) {
// Fill Background with Highlight color if Selected Item
if (!Sender->HasFocus() && ComboListPopup->ComboPopupItemIndex == ComboListPopup->ComboPopupDrawListIndex) {
RECT rc = Sender->GetClientRect();
Surface.FillRect(&rc, LKBrush_Higlighted);
}
const int w = Sender->GetWidth();
const int h = Sender->GetHeight();
const TCHAR* szText = ComboListPopup->ComboPopupItemList[ComboListPopup->ComboPopupDrawListIndex]->StringValueFormatted;
Surface.SetBackgroundTransparent();
Surface.SetTextColor(RGB_BLACK);
const int xText = 3 * ScreenScale;
const int yText = (h - Surface.GetTextHeight(szText)) / 2;
Surface.DrawTextClip(xText, yText, szText, w - ScreenScale * 5);
}
}
}
示例2: OnProgressPaint
static void OnProgressPaint(WindowControl * Sender, LKSurface& Surface) {
RECT PrintAreaR = Sender->GetClientRect();
const auto oldFont = Surface.SelectObject(MapWindowBoldFont);
Surface.FillRect(&PrintAreaR, LKBrush_Petrol);
// Create text area
// we cannot use LKPen here because they are not still initialised for startup menu. no problem
LKPen hP(PEN_SOLID,NIBLSCALE(1),RGB_GREEN);
auto ohP = Surface.SelectObject(hP);
const auto ohB = Surface.SelectObject(LKBrush_Petrol);
Surface.Rectangle(PrintAreaR.left,PrintAreaR.top,PrintAreaR.right,PrintAreaR.bottom);
Surface.SelectObject(ohP);
hP.Release();
hP.Create(PEN_SOLID,NIBLSCALE(1),RGB_BLACK);
ohP = Surface.SelectObject(hP);
Surface.SelectObject(LK_HOLLOW_BRUSH);
InflateRect(&PrintAreaR, -NIBLSCALE(2), -NIBLSCALE(2));
Surface.Rectangle(PrintAreaR.left,PrintAreaR.top,PrintAreaR.right,PrintAreaR.bottom);
Surface.SetTextColor(RGB_WHITE);
Surface.SetBackgroundTransparent();
InflateRect(&PrintAreaR, -NIBLSCALE(2), -NIBLSCALE(2));
const TCHAR* text = Sender->GetCaption();
Surface.DrawText(text, &PrintAreaR, DT_VCENTER|DT_SINGLELINE);
Surface.SelectObject(ohB);
Surface.SelectObject(ohP);
Surface.SelectObject(oldFont);
}
示例3: SharedTopView
//.........这里部分代码省略.........
}
int iOldLocator = EnableThermalLocator;
EnableThermalLocator =0;
/*******/
#warning "wrong place for do that, always bad idea to change layout inside drawing fonctions !"
MapWindow::ChangeDrawRect(rct); // set new area for terrain and topology
/*******/
zoom.RequestedScale((m_Dia.fXMax -m_Dia.fXMin) * fFact * (DISTANCEMODIFY)/10.0f);
POINT Orig = { CalcDistanceCoordinat(0.0, (DiagrammStruct*) &m_Dia),(rct.bottom-rct.top)/2};
POINT Orig_Aircraft= {0,0};
zoom.ModifyMapScale();
zoom.UpdateMapScale();
const ScreenProjection _Proj = CalculateScreenPositions( Orig, rct, &Orig_Aircraft);
CalculateScreenPositionsAirspace(rct, _Proj);
bool terrainpainted=false;
if (IsMultimapTerrain() && DerivedDrawInfo.TerrainValid && RasterTerrain::isTerrainLoaded() ) {
LKTextBlack=false;
BlackScreen=false;
LockTerrainDataGraphics();
DrawTerrain(Surface, rct, _Proj, GetAzimuth(), 40.0);
UnlockTerrainDataGraphics();
terrainpainted=true;
} else {
// We fill up the background wity chosen empty map color
Surface.FillRect(&rct, hInvBackgroundBrush[BgMapColor]);
// We force LK painting black values on screen depending on the background color in use
// blackscreen would force everything to be painted white, instead
LKTextBlack=BgMapColorTextBlack[BgMapColor];
if (BgMapColor>6 ) BlackScreen=true;
else BlackScreen=false;
}
ResetLabelDeclutter();
// We reduce screen cluttering for some cases..
short olddecluttermode=DeclutterMode;
if (Current_Multimap_SizeY==SIZE4) goto _nomoredeclutter;
if (Current_Multimap_SizeY<SIZE3) {
DeclutterMode+=2;
} else {
if (Current_Multimap_SizeY==SIZE3)
DeclutterMode++;
}
if (DeclutterMode>dmVeryHigh) DeclutterMode=dmVeryHigh;
_nomoredeclutter:
if (IsMultimapTopology()) {
// Do not print topology labels, to be used with another config later!
// SaturateLabelDeclutter();
DrawTopology(Surface, rct, _Proj);
} else {
// No topology is desired, but terrain requires water areas nevertheless
if (terrainpainted) {
DrawTopology(Surface, rct, _Proj, true); // water only!
}
}
示例4: DrawVisualGlide
void MapWindow::DrawVisualGlide(LKSurface& Surface, const DiagrammStruct& sDia) {
const RECT& rci = sDia.rc;
unsigned short numboxrows = 1;
#if BUGSTOP
LKASSERT(Current_Multimap_SizeY < SIZE4);
#endif
switch (Current_Multimap_SizeY) {
case SIZE0:
case SIZE1:
numboxrows = 3;
break;
case SIZE2:
numboxrows = 2;
break;
case SIZE3:
numboxrows = 1;
break;
case SIZE4:
return;
default:
LKASSERT(0);
break;
}
if (!ScreenLandscape) {
numboxrows++;
if (numboxrows > 3) numboxrows = 3;
}
TCHAR tmpT[30];
line1Font = LK8VisualTopFont;
line2Font = LK8VisualBotFont;
SIZE textSizeTop, textSizeBot;
Surface.SelectObject(line1Font);
_stprintf(tmpT, _T("MMMM"));
Surface.GetTextSize(tmpT, &textSizeTop);
Surface.SelectObject(line2Font);
_stprintf(tmpT, _T("55.5%s 79%s%s "), Units::GetDistanceName(), MsgToken(2179), MsgToken(2183));
Surface.GetTextSize(tmpT, &textSizeBot);
// we can cut the waypoint name, but not the value data, so we use the second row of data
// to size the box for everything.
maxtSizeX = textSizeBot.cx;
int a = (rci.right-rci.left) / (textSizeBot.cx+BOXINTERVAL);
int b = (rci.right-rci.left) - a * (textSizeBot.cx)-(BOXINTERVAL * (a + 1));
boxSizeX = textSizeBot.cx + (b / (a + 1));
boxSizeY = textSizeTop.cy + 1; // single line (wp name) + distance from bottombar
if (numboxrows > 1) {
boxSizeY += (textSizeBot.cy * (numboxrows - 1)) - NIBLSCALE(2);
if (numboxrows > 2) boxSizeY -= NIBLSCALE(1);
}
#if DEBUG_SCR
StartupStore(_T("boxX=%d boxY=%d \n"), boxSizeX, boxSizeY);
#endif
#if DEBUG_SCR
StartupStore(_T("VG AREA LTRB: %d,%d %d,%d\n"), rci.left, rci.top, rci.right, rci.bottom);
#endif
const auto oldBrush = Surface.SelectObject(LKBrush_White);
const auto oldPen = Surface.SelectObject(LK_BLACK_PEN);
BrushReference brush_back;
if (!INVERTCOLORS) {
brush_back = LKBrush_Black;
} else {
brush_back = LKBrush_Nlight;
}
Surface.FillRect(&rci, brush_back);
POINT center, p1, p2;
center.y = rci.top + (rci.bottom - rci.top) / 2;
center.x = rci.left + (rci.right - rci.left) / 2;
// numSlotX is the number items we can print horizontally.
unsigned short numSlotX = (rci.right - rci.left) / (boxSizeX + BOXINTERVAL);
if (numSlotX > MAXBSLOT) numSlotX = MAXBSLOT;
#if BUGSTOP
LKASSERT(numSlotX > 0);
#endif
if (numSlotX == 0) return;
unsigned short boxInterval = ((rci.right - rci.left)-(boxSizeX * numSlotX)) / (numSlotX + 1);
unsigned short oddoffset = ( (rci.right-rci.left) - (boxSizeX * numSlotX) - boxInterval * (numSlotX + 1)) / 2;
/*
#if BUGSTOP
// not really harmful
LKASSERT(oddoffset<=boxInterval);
#endif
*/
//.........这里部分代码省略.........
示例5: RenderMapWindowBg
//.........这里部分代码省略.........
terrainpainted = true;
}
if (DONTDRAWTHEMAP) {
UnlockTerrainDataGraphics();
goto QuickRedraw;
}
if (!QUICKDRAW) {
// SHADED terrain unreachable, aka glide amoeba. This is not the outlined perimeter!
#ifdef GTL2
if (((FinalGlideTerrain == 2) || (FinalGlideTerrain == 4)) &&
DerivedDrawInfo.TerrainValid) {
#else
if ((FinalGlideTerrain == 2) && DerivedDrawInfo.TerrainValid) {
#endif
DrawTerrainAbove(Surface, DrawRect);
}
}
UnlockTerrainDataGraphics();
}
//
// REMINDER: WE ARE IN MAIN MAP HERE: MSM_MAP ONLY, OR PANNING MODE!
// MAPSPACEMODE CAN STILL CHANGE, DUE TO USER INPUT. BUT WE GOT HERE IN
// EITHER PAN OR MSM_MAP.
//
if (DONTDRAWTHEMAP) {
goto QuickRedraw;
}
if(!terrainpainted) {
// fill background..
Surface.FillRect(&rc, hInvBackgroundBrush[BgMapColor]);
}
if (IsMultimapTopology()) {
DrawTopology(Surface, DrawRect, _Proj);
} else {
// If no topology wanted, but terrain painted, we paint only water stuff
if (terrainpainted) DrawTopology(Surface, DrawRect, _Proj, true);
}
#if 0
StartupStore(_T("... Experimental1=%.0f\n"), Experimental1);
StartupStore(_T("... Experimental2=%.0f\n"), Experimental2);
Experimental1 = 0.0;
Experimental2 = 0.0;
#endif
// Topology labels are printed first, using OLD wps positions from previous run!
// Reset for topology labels decluttering engine occurs also in another place here!
ResetLabelDeclutter();
if ((Flags_DrawTask || TargetDialogOpen) && ValidTaskPoint(ActiveTaskPoint) && ValidTaskPoint(1)) {
DrawTaskAAT(Surface, DrawRect);
}
if (DONTDRAWTHEMAP) {
goto QuickRedraw;
}
if (IsMultimapAirspace()) {
DrawAirSpace(Surface, rc, _Proj);
}
示例6: LKDrawVario
//.........这里部分代码省略.........
mc_value = MACCREADY;
} else {
switch (LKVarioVal) {
default:
case vValVarioNetto:
vario_value = DerivedDrawInfo.NettoVario;
// simple hack for avoid to used polar curve : glider_sink_rate = Vario - NettoVario;
mc_value = MACCREADY + (DerivedDrawInfo.Vario - DerivedDrawInfo.NettoVario);
break;
case vValVarioSoll:
double ias;
if (DrawInfo.AirspeedAvailable && DrawInfo.VarioAvailable)
ias = DrawInfo.IndicatedAirspeed;
else
ias = DerivedDrawInfo.IndicatedAirspeedEstimated;
// m/s 0-nnn autolimit to 20m/s full scale (72kmh diff)
vario_value = clamp(DerivedDrawInfo.VOpt - ias, -20., 20.);
vario_value /= 3.3333; // 0-20 -> 0-6
vario_value *= -1; // if up, push down
break;
}
}
// Backup selected Brush & Pen
LKSurface::OldPen oldPen = Surface.SelectObject(LK_NULL_PEN);
LKSurface::OldBrush oldBrush = Surface.SelectObject(LKBrush_Hollow);
// draw Vario box ( only if not transparent )
if (LKVarioBar <= vBarVarioGR) {
Surface.SelectObject(borderPen);
Surface.SelectObject(hInvBackgroundBrush[BgMapColor]);
Surface.Rectangle(vrc.left, vrc.top, vrc.right, vrc.bottom);
}
// draw middle separator for 0 scale indicator
Surface.FillRect(&hrc, forgroundBrush);
Surface.SelectObject(borderPen);
if (dogaugeinit) {
// this is causing problems on emulators and condor and most of the times when the gps has no valid date
// so we don't use seconds, but loop counter
if (startInitCounter++ > 2) {
dogaugeinit = false;
}
// Demo show all bricks
for (unsigned i = 0; i < positive_brick_count; ++i) {
const RECT& brc = positiveBricks[i];
Surface.SelectObject(positiveBrush[i]);
Surface.Rectangle(brc.left, brc.top, brc.right, brc.bottom);
}
for (unsigned i = 0; i < negative_brick_count; ++i) {
const RECT& brc = negativeBricks[i];
Surface.SelectObject(negativeBrush[i]);
Surface.Rectangle(brc.left, brc.top, brc.right, brc.bottom);
}
} else {
// Draw Real Vario Data
// Draw Positive Brick
for (unsigned i = 0; i < positive_brick_count && vario_value >= positive_vario_step[i]; ++i) {
const RECT& brc = positiveBricks[i];
Surface.SelectObject(positiveBrush[i]);
Surface.Rectangle(brc.left, brc.top, brc.right, brc.bottom);
}
// Draw Negative Brick
for (unsigned i = 0; i < negative_brick_count && vario_value <= negative_vario_step[i]; ++i) {
const RECT& brc = negativeBricks[i];
Surface.SelectObject(negativeBrush[i]);
Surface.Rectangle(brc.left, brc.top, brc.right, brc.bottom);
}
// Draw MacCready Indicator
const auto step_iterator = std::upper_bound(std::begin(positive_vario_step), std::end(positive_vario_step), mc_value);
size_t mc_brick_idx = std::distance(std::begin(positive_vario_step), step_iterator);
if (mc_brick_idx > 1) {
const PixelRect& brc_next = positiveBricks[mc_brick_idx];
const PixelRect& brc_Prev = positiveBricks[mc_brick_idx-1];
const PixelSize IconSize = hMcVario.GetSize();
const PixelSize DrawSize = {
vrc.GetSize().cx,
IconSize.cy * vrc.GetSize().cx / IconSize.cx
};
const RasterPoint DrawPos = {
vrc.left,
brc_Prev.top + ((brc_next.bottom - brc_Prev.top) / 2) + (IconSize.cy / 2)
};
hMcVario.Draw(Surface, DrawPos.x, DrawPos.y, DrawSize.cx, DrawSize.cy);
}
}
// cleanup
Surface.SelectObject(oldPen);
Surface.SelectObject(oldBrush);
}
示例7: DrawAspNearest
//.........这里部分代码省略.........
break;
case LKEVENT_PAGEDOWN:
LKevent=LKEVENT_NONE;
break;
case LKEVENT_NEWRUN:
for (i=0; i<MAXNEARAIRSPACES; i++) {
for (k=0; k<MAXAIRSPACENUMPAGES; k++) {
_stprintf(Buffer1[i][k], _T("----------------------------")); // max 30
Buffer1[i][k][s_maxnlname+7]='\0'; // some more dashes
_stprintf(Buffer2[i][k],_T("----"));
_stprintf(Buffer3[i][k],_T("----"));
_stprintf(Buffer4[i][k],_T("----"));
_stprintf(Buffer5[i][k],_T(" "));
}
}
break;
case LKEVENT_NEWPAGE:
break;
default:
LKevent=LKEVENT_NONE;
break;
}
if (INVERTCOLORS)
Surface.DrawLine(PEN_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc);
else
Surface.DrawLine(PEN_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc);
Surface.SelectObject(LK8InfoNormalFont); // Heading line
short cursortbox=SortedMode[curmapspace];
if ( !ScreenLandscape ) { // portrait mode
Surface.FillRect(&s_sortBox[cursortbox], sortbrush);
_stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1);
Surface.SelectObject(LK8PanelMediumFont);
LKWriteText(Surface, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false);
Surface.SelectObject(LK8InfoNormalFont);
_stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("[email protected]_")), curpage+1, AspNumpages); // ASP
if (cursortbox == 0)
LKWriteText(Surface, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false);
else
LKWriteText(Surface, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false);
_tcscpy(Buffer,gettext(TEXT("[email protected]_"))); // Type
if (cursortbox==1)
LKWriteText(Surface, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false);
else
LKWriteText(Surface, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false);
_tcscpy(Buffer,gettext(TEXT("[email protected]_"))); // Dist
if (cursortbox==2)
LKWriteText(Surface, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false);
else
LKWriteText(Surface, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false);
_tcscpy(Buffer,gettext(TEXT("[email protected]_"))); // Dir
if (cursortbox==3)
LKWriteText(Surface, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false);
else
LKWriteText(Surface, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false);
示例8: DrawMapSpace
//
// Called by LKDrawLook8000, this is what happens when we change mapspace mode, advancing through types.
// We paint infopages, nearest, tri, etc.etc.
// Normally there is plenty of cpu available because the map is not even calculated.
// This is why we bring to the Draw thread, in the nearest pages case, also calculations.
//
void MapWindow::DrawMapSpace(LKSurface& Surface, const RECT& rc) {
BrushReference hB;
TextInBoxMode_t TextDisplayMode = {0};
TCHAR Buffer[LKSIZEBUFFERLARGE*2];
#ifdef DRAWLKSTATUS
bool dodrawlkstatus=false;
#endif
#ifndef DITHER
if (MapSpaceMode==MSM_WELCOME) {
if (INVERTCOLORS)
hB=LKBrush_Petrol;
else
hB=LKBrush_Mlight;
} else {
if (INVERTCOLORS)
hB=LKBrush_Mdark;
else
hB=LKBrush_Mlight;
}
#else
if (INVERTCOLORS)
hB=LKBrush_Black;
else
hB=LKBrush_White;
#endif
const auto oldfont = Surface.SelectObject(LKINFOFONT); // save font
if (MapSpaceMode==MSM_WELCOME) {
LKBitmap WelcomeBitmap = LoadSplash(_T("LKPROFILE"));
if(WelcomeBitmap) {
DrawSplash(Surface, WelcomeBitmap);
}
} else {
Surface.FillRect(&rc, hB);
}
// Paint borders in green, but only in nearest pages and welcome, and not in DITHER mode
// In case we want it in dithered mode, some changes are ready to be used.
#ifndef DITHER
if (MapSpaceMode==MSM_WELCOME || (!IsMultiMap() && MapSpaceMode!=MSM_MAP) )
{
#ifdef DITHER
LKPen BorderPen(PEN_SOLID, ScreenThinSize, INVERTCOLORS?RGB_WHITE:RGB_BLACK);
#else
LKPen BorderPen(PEN_SOLID, ScreenThinSize, INVERTCOLORS?RGB_GREEN:RGB_DARKGREEN);
#endif
auto OldPen = Surface.SelectObject(BorderPen);
auto OldBrush = Surface.SelectObject(LK_HOLLOW_BRUSH);
Surface.Rectangle(rc.left, rc.top, rc.right, rc.bottom - BottomSize);
Surface.SelectObject(OldPen);
Surface.SelectObject(OldBrush);
}
#endif
#ifdef DRAWLKSTATUS
if (LKevent==LKEVENT_NEWRUN) dodrawlkstatus=true;
#endif
// We are entering mapspacemodes with no initial check on configured subpages.
// Thus we need to ensure that the page is really available, or find the first valid.
// However, this will prevent direct customkey access to pages!
// Instead, we do it when we call next page from InfoPageChange
// if (!ConfIP[ModeIndex][CURTYPE]) NextModeType();
switch (MapSpaceMode) {
case MSM_WELCOME:
#if 0
SetModeType(LKMODE_MAP,MP_MOVING);
RefreshMap();
break;
#endif
#if (1)
if (!DrawInfo.NAVWarning) {
static double firsttime=DrawInfo.Time;
// delayed automatic exit from welcome mode
if ( DrawInfo.Time > (firsttime+3.0) ) {
SetModeType(LKMODE_MAP,MP_MOVING);
LKevent=LKEVENT_NONE;
LKSound(_T("LK_BEEP1.WAV"));
RefreshMap();
break;
}
}
#endif
if(GlobalModelType==MODELTYPE_PNA_MINIMAP)
{
SetModeType(LKMODE_MAP,MP_MOVING);
//.........这里部分代码省略.........
示例9: RenderAirspaceTerrain
void RenderAirspaceTerrain(LKSurface& Surface, double PosLat, double PosLon, double brg, DiagrammStruct* psDiag) {
RECT rc = psDiag->rc;
//rc.bottom +=BORDER_Y;
double range = psDiag->fXMax - psDiag->fXMin; // km
double hmax = psDiag->fYMax;
double lat, lon;
int i, j;
if (!IsDithered() && IsMultimapTerrain()) {
RenderSky(Surface, rc, SKY_HORIZON_COL, SKY_SPACE_COL, GC_NO_COLOR_STEPS);
} else {
Surface.FillRect(&rc, MapWindow::hInvBackgroundBrush[BgMapColor]);
}
FindLatitudeLongitude(PosLat, PosLon, brg, psDiag->fXMin, &lat, &lon);
POINT apTerrainPolygon[AIRSPACE_SCANSIZE_X + 4] = {};
double d_lat[AIRSPACE_SCANSIZE_X] = {};
double d_lon[AIRSPACE_SCANSIZE_X] = {};
double d_h[AIRSPACE_SCANSIZE_X] = {};
#define FRAMEWIDTH 2
RasterTerrain::Lock(); // want most accurate rounding here
RasterTerrain::SetTerrainRounding(0, 0);
double fj;
for (j = 0; j < AIRSPACE_SCANSIZE_X; j++) { // scan range
fj = (double) j * 1.0 / (double) (AIRSPACE_SCANSIZE_X - 1);
FindLatitudeLongitude(lat, lon, brg, range*fj, &d_lat[j], &d_lon[j]);
d_h[j] = RasterTerrain::GetTerrainHeight(d_lat[j], d_lon[j]);
if (d_h[j] == TERRAIN_INVALID) d_h[j] = 0; //@ 101027 BUGFIX
hmax = max(hmax, d_h[j]);
}
RasterTerrain::Unlock();
/********************************************************************************
* scan line
********************************************************************************/
if (IsMultimapAirspace())
Sideview_iNoHandeldSpaces = CAirspaceManager::Instance().ScanAirspaceLineList(d_lat, d_lon, d_h, Sideview_pHandeled, MAX_NO_SIDE_AS); // Sideview_pHandeled[GC_MAX_NO];
else
Sideview_iNoHandeldSpaces = 0;
#if BUGSTOP
LKASSERT(Sideview_iNoHandeldSpaces < MAX_NO_SIDE_AS);
#endif
if (Sideview_iNoHandeldSpaces >= MAX_NO_SIDE_AS) Sideview_iNoHandeldSpaces = MAX_NO_SIDE_AS - 1;
/********************************************************************************
* bubble sort to start with biggest airspaces
********************************************************************************/
int iSizeLookupTable[MAX_NO_SIDE_AS];
for (i = 0; i < Sideview_iNoHandeldSpaces; i++)
iSizeLookupTable[i] = i;
for (i = 0; i < Sideview_iNoHandeldSpaces; i++) {
#if BUGSTOP
LKASSERT(iSizeLookupTable[i] < MAX_NO_SIDE_AS);
#endif
for (j = i; j < Sideview_iNoHandeldSpaces; j++) {
#if BUGSTOP
LKASSERT(iSizeLookupTable[j] < MAX_NO_SIDE_AS);
#endif
if (iSizeLookupTable[i] >= MAX_NO_SIDE_AS) continue;
if (iSizeLookupTable[j] >= MAX_NO_SIDE_AS) continue;
if (Sideview_pHandeled[iSizeLookupTable[i]].iAreaSize < Sideview_pHandeled[iSizeLookupTable[j]].iAreaSize) {
int iTmp = iSizeLookupTable[i];
iSizeLookupTable[i] = iSizeLookupTable[j];
iSizeLookupTable[j] = iTmp;
}
}
}
/**********************************************************************************
* transform into diagram coordinates
**********************************************************************************/
double dx1 = (double) (rc.right) / (double) (AIRSPACE_SCANSIZE_X - 1);
int x0 = rc.left;
LKASSERT(Sideview_iNoHandeldSpaces < MAX_NO_SIDE_AS);
for (i = 0; i < Sideview_iNoHandeldSpaces; i++) {
Sideview_pHandeled[i].rc.left = (long) ((Sideview_pHandeled[i].rc.left) * dx1) + x0 - FRAMEWIDTH / 2;
Sideview_pHandeled[i].rc.right = (long) ((Sideview_pHandeled[i].rc.right) * dx1) + x0 + FRAMEWIDTH / 2;
Sideview_pHandeled[i].rc.bottom = CalcHeightCoordinat((double) Sideview_pHandeled[i].rc.bottom, psDiag) + FRAMEWIDTH / 2;
Sideview_pHandeled[i].rc.top = CalcHeightCoordinat((double) Sideview_pHandeled[i].rc.top, psDiag) - FRAMEWIDTH / 2;
Sideview_pHandeled[i].iMaxBase = Sideview_pHandeled[i].rc.bottom;
Sideview_pHandeled[i].iMinTop = Sideview_pHandeled[i].rc.top;
int iN = Sideview_pHandeled[i].iNoPolyPts;
#if BUGSTOP
LKASSERT(iN < GC_MAX_POLYGON_PTS);
#endif
if (iN >= GC_MAX_POLYGON_PTS) iN = GC_MAX_POLYGON_PTS - 1;
if (Sideview_pHandeled[i].bRectAllowed == false) {
for (j = 0; j < iN; j++) {
Sideview_pHandeled[i].apPolygon[j].x = (long) (((Sideview_pHandeled[i].apPolygon[j].x) * dx1) + x0);
Sideview_pHandeled[i].apPolygon[j].y = CalcHeightCoordinat((double) Sideview_pHandeled[i].apPolygon[j].y, psDiag);
if (j != iN - 1) {
if ((j < iN / 2)) {
Sideview_pHandeled[i].iMaxBase = min((long) Sideview_pHandeled[i].iMaxBase, (long) Sideview_pHandeled[i].apPolygon[j].y);
//.........这里部分代码省略.........