static void DrawToolBox (GRAPH_WINDOW *gw, INT tool) { Rect r,dstRect; CGrafPtr myPort; PicHandle toolBox; WindowPtr theWindow; theWindow = MAC_WIN(gw); myPort = GetWindowPort(theWindow); SetPort(myPort); GetPortBounds(myPort,&r); toolBox = GetPicture(TOOLBOX_RSRC_ID); if (toolBox!=NULL) { SetRect(&dstRect,r.right-120,r.bottom-15,r.right-15,r.bottom); DrawPicture(toolBox,&dstRect); } SetRect(&dstRect,r.right-119+tool*15,r.bottom-14,r.right-104+tool*15,r.bottom); InvertRect(&dstRect); }
/******************************************************************************* ** Set the current progress. **/ VOID FAR SetProgress(int iVal) { RECT rcArea; /* Area to fill. */ int iMeterWidth; /* Meter width. */ HDC hDC; /* Window HDC. */ AssertEx((iVal <= iDilMax), "SetProgress(iVal)"); /* Check value for change. */ if (iVal <= iDilLast) return; /* Calculate meter width. */ iMeterWidth = iDilWidth - LFT_BORDER - RGT_BORDER; /* Calculate the new area. */ rcArea.left = (int) (((long) iDilLast * (long) iMeterWidth) / (long) iDilMax); rcArea.top = TOP_BORDER; rcArea.right = (int) (((long) iVal * (long) iMeterWidth) / (long) iDilMax); rcArea.bottom = iDilHeight - BOT_BORDER + 1; /* Adjust for border. */ rcArea.left += LFT_BORDER; rcArea.right += LFT_BORDER; /* Get an HDC for the window. */ hDC = GetDC(hDilWnd); /* Perform the update. */ InvertRect(hDC, (LPRECT) &rcArea); /* Free HDC. */ ReleaseDC(hDilWnd, hDC); /* Update current & last value. */ iDilLast = iVal; }
//__________________________________________________________________ void _HYPlatformGraphicPane::_InvertRect (_HYRect& rct) { Rect r = HYRect2Rect (rct); InvertRect (&r); }
void CColorBar::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default char tchBuffer[256]; RECT rect; TEXTMETRIC tm; int i; int OffSet; PropertyStruct * tPS; if ( ( lpDrawItemStruct->CtlType == ODT_LISTBOX) && (lpDrawItemStruct->CtlID == IDC_COLORLIST) && (lpDrawItemStruct->itemID != -1) ) { GetTextMetrics( lpDrawItemStruct->hDC, &tm); OffSet = tm.tmHeight * 2; switch ( lpDrawItemStruct->itemAction ) { case ODA_DRAWENTIRE: tPS = (PropertyStruct *)lpDrawItemStruct->itemData; sprintf ( tchBuffer, "%2d:", tPS->RowNum ); // OffSet = LOWORD(GetTextExtent( lpDrawItemStruct->hDC, tchBuffer, 5 )); SetBkColor ( lpDrawItemStruct->hDC, RGB(255,255,255) ); SetTextColor ( lpDrawItemStruct->hDC, RGB(0,0,0) ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, tchBuffer, 3 ); m_ColorList.GetText( lpDrawItemStruct->itemID, tchBuffer ); for ( i = strlen ( tchBuffer ); i < 75; ++i ) { tchBuffer[i] = ' '; } tchBuffer[i] = 0; SetBkColor ( lpDrawItemStruct->hDC, tPS->BkColor ); SetTextColor ( lpDrawItemStruct->hDC, tPS->TextColor ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left + OffSet, lpDrawItemStruct->rcItem.top, tchBuffer, strlen(tchBuffer) ); if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); } break; case ODA_SELECT: rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); break; } } if ( nIDCtl == IDC_DISP ) { TEXTMETRIC m_TM; HGDIOBJ tFont; LOGFONT tLOGFONT; int tPointSize; int tFontWeight; memset ( &tLOGFONT, 0, sizeof(tLOGFONT) ); CGenedocDoc *pDoc = ((CGenedocView *)m_pParent)->GetDocument(); tFontWeight = pDoc->m_UserVars.m_FontWeight; tPointSize = pDoc->m_UserVars.m_FontSize; strcpy ( tLOGFONT.lfFaceName, "Courier New" ); tLOGFONT.lfWeight = tFontWeight; tLOGFONT.lfHeight = -MulDiv( tPointSize , GetDeviceCaps(lpDrawItemStruct->hDC, LOGPIXELSY), 72); tFont = CreateFontIndirect( &tLOGFONT ); HGDIOBJ oFont = SelectObject( lpDrawItemStruct->hDC, tFont); GetTextMetrics( lpDrawItemStruct->hDC, &m_TM ); MoveToEx ( lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, NULL ); LineTo ( lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom - 1 ); LineTo ( lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.right - 1, lpDrawItemStruct->rcItem.bottom - 1 ); LineTo ( lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.right - 1, lpDrawItemStruct->rcItem.top ); LineTo ( lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top ); int hx = (lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left) / 2; int hy = (lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top) / 2; hx -= m_TM.tmAveCharWidth / 2; hy -= (m_TM.tmHeight - m_TM.tmInternalLeading) / 2; SetBkColor( lpDrawItemStruct->hDC, m_BackColor ); SetTextColor( lpDrawItemStruct->hDC, m_TextColor ); // RECT TextOut ( lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left + hx, lpDrawItemStruct->rcItem.top + hy, "G", 1 ); if ( oFont != NULL ) { SelectObject( lpDrawItemStruct->hDC, oFont); } } // Was commented // CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); }
void TDC::invert_rect(const Rect& rt) //----------------------------------- { InvertRect(m_hdc,(RECT *)&rt); }
void MapWindow::DrawTraffic(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXTRAFFIC][MAXTRAFFICNUMPAGES][24], Buffer2[MAXTRAFFIC][MAXTRAFFICNUMPAGES][10]; static TCHAR Buffer3[MAXTRAFFIC][MAXTRAFFICNUMPAGES][10]; static TCHAR Buffer4[MAXTRAFFIC][MAXTRAFFICNUMPAGES][12], Buffer5[MAXTRAFFIC][MAXTRAFFICNUMPAGES][12]; static short s_maxnlname; char text[30]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double value; COLORREF rcolor; // column0 starts after writing 1:2 (ModeIndex:CURTYPE+1) with a different font.. static short Column0; static short Column1, Column2, Column3, Column4, Column5; static POINT p1, p2; static short s_rawspace; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused short curmapspace=MapSpaceMode; static int TrafficNumraws=0; //static int TrafficNumpages=0; global.. // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) HBRUSH sortbrush; RECT invsel; if (INVERTCOLORS) { sortbrush=LKBrush_LightGreen; } else { sortbrush=LKBrush_DarkGreen; } if (DoInit[MDI_DRAWTRAFFIC]) { if ( ScreenSize < (ScreenSize_t)sslandscape ) { left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); s_maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; s_maxnlname=MAXNLNAME-3; // 9 chars, sized 10 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); // Heading line was MapWindow QUI _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; TrafficNumraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (TrafficNumraws>MAXTRAFFIC) TrafficNumraws=MAXTRAFFIC; s_rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; TrafficNumraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (TrafficNumraws>MAXTRAFFIC) TrafficNumraws=MAXTRAFFIC; s_rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 // Traffic name s_sortBox[0].left=Column0; // FIX 090925 era solo 0 if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=2; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_TRAFFIC][0]=s_sortBox[0].right; // Distance if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=2; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_TRAFFIC][1]=s_sortBox[1].right; // Bearing s_sortBox[2].left=Column2+INTERBOX; s_sortBox[2].right=Column3+INTERBOX; s_sortBox[2].top=2; s_sortBox[2].bottom=p1.y; SortBoxX[MSM_TRAFFIC][2]=s_sortBox[2].right; // Vario s_sortBox[3].left=Column3+INTERBOX; s_sortBox[3].right=Column4+INTERBOX; s_sortBox[3].top=2; s_sortBox[3].bottom=p1.y; SortBoxX[MSM_TRAFFIC][3]=s_sortBox[3].right; // Altitude s_sortBox[4].left=Column4+INTERBOX; //s_sortBox[4].right=Column5+INTERBOX; s_sortBox[4].right=rc.right-1; s_sortBox[4].top=2; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_TRAFFIC][4]=s_sortBox[4].right; SortBoxY[MSM_TRAFFIC]=p1.y; TrafficNumpages=roundupdivision(MAXTRAFFIC, TrafficNumraws); if (TrafficNumpages>MAXTRAFFICNUMPAGES) TrafficNumpages=MAXTRAFFICNUMPAGES; else if (TrafficNumpages<1) TrafficNumpages=1; SelectedRaw[MSM_TRAFFIC]=0; SelectedPage[MSM_TRAFFIC]=0; DoInit[MDI_DRAWTRAFFIC]=false; return; } // doinit DoTraffic(&DrawInfo, &DerivedDrawInfo); TrafficNumpages=roundupdivision(LKNumTraffic, TrafficNumraws); if (TrafficNumpages>MAXTRAFFICNUMPAGES) TrafficNumpages=MAXTRAFFICNUMPAGES; else if (TrafficNumpages<1) TrafficNumpages=1; curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXTRAFFICNUMPAGES) { // DoStatusMessage(_T("ERR-041 traffic curpage invalid!")); // selection while waiting for data ready SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: LKevent=LKEVENT_NONE; i=LKSortedTraffic[SelectedRaw[curmapspace]+(curpage*TrafficNumraws)]; if ( (i<0) || (i>=MAXTRAFFIC) || (LKTraffic[i].ID<=0) ) { #if 0 // selection while waiting for data ready if (LKNumTraffic>0) DoStatusMessage(_T("ERR-045 Invalid selection")); #endif break; } LKevent=LKEVENT_NONE; // Do not update Traffic while in details mode, max 10m LastDoTraffic=DrawInfo.Time+600; dlgLKTrafficDetails(i); LastDoTraffic=0; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=TrafficNumraws) SelectedRaw[curmapspace]=0; // Reset LastDoTraffic so that it wont be updated while selecting an item LastDoTraffic=DrawInfo.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=TrafficNumraws-1; LastDoTraffic=DrawInfo.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXTRAFFIC; i++) { for (k=0; k<MAXTRAFFICNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line short cursortbox=SortedMode[curmapspace]; if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode FillRect(hdc,&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1331_ "TRF" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1331_")), curpage+1,TrafficNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1332_ "Var" _stprintf(Buffer, gettext(TEXT("_@M1332_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1334_ "Alt" _stprintf(Buffer, gettext(TEXT("_@M1334_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { FillRect(hdc,&s_sortBox[cursortbox], sortbrush); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240)|| ScreenSize==ss896x672 ) { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1331_ "TRF" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1331_")), curpage+1,TrafficNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1332_ "Var" _stprintf(Buffer, gettext(TEXT("_@M1332_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1334_ "Alt" _stprintf(Buffer, gettext(TEXT("_@M1334_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1331_ "TRF" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1331_")), curpage+1,TrafficNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer, gettext(TEXT("_@M1304_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer, gettext(TEXT("_@M1305_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1333_ "Vario" _stprintf(Buffer, gettext(TEXT("_@M1333_"))); if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1334_ "Alt" _stprintf(Buffer, gettext(TEXT("_@M1334_"))); if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest #ifdef DEBUG_LKT_DRAWTRAFFIC TCHAR v2buf[100]; wsprintf(v2buf,_T("MAXTRAFFIC=%d LKNumTraff=%d / TrafficNumraws=%d TrafficNumpages=%d calc=%d\n"),MAXTRAFFIC, LKNumTraffic,TrafficNumraws, TrafficNumpages, (short)(ceil(MAXTRAFFIC/TrafficNumraws))); StartupStore(v2buf); #endif for (i=0, drawn_items_onpage=0; i<TrafficNumraws; i++) { iRaw=TopSize+(s_rawspace*i); short curraw=(curpage*TrafficNumraws)+i; if (curraw>=MAXTRAFFIC) break; rli=LKSortedTraffic[curraw]; #ifdef DEBUG_LKT_DRAWTRAFFIC StartupStore(_T("..LKDrawTraff page=%d curraw=%d rli=%d \n"), curpage,curraw,rli); #endif if ( (rli>=0) && (LKTraffic[rli].ID>0) ) { // Traffic name wlen=wcslen(LKTraffic[rli].Name); // if name is unknown then it is a '?' if (wlen==1) { _stprintf(Buffer,_T("%06x"),LKTraffic[rli].ID); Buffer[s_maxnlname]='\0'; } else { // if XY I-ABCD doesnt fit.. if ( (wlen+3)>s_maxnlname) { LK_tcsncpy(Buffer, LKTraffic[rli].Name, s_maxnlname); } else { unsigned short cnlen=_tcslen(LKTraffic[rli].Cn); // if cn is XY create XY I-ABCD if (cnlen==1 || cnlen==2) { _tcscpy(Buffer,LKTraffic[rli].Cn); _tcscat(Buffer,_T(" ")); _tcscat(Buffer,LKTraffic[rli].Name); // for safety Buffer[s_maxnlname]='\0'; } else { // else use only long name LK_tcsncpy(Buffer, LKTraffic[rli].Name, wlen); } } ConvToUpper(Buffer); } if (LKTraffic[rli].Locked) { TCHAR buf2[LKSIZEBUFFERLARGE]; _stprintf(buf2,_T("*%s"),Buffer); buf2[s_maxnlname]='\0'; _tcscpy(Buffer,buf2); } #ifdef DEBUG_LKT_DRAWTRAFFIC StartupStore(_T(".. Traffic[%d] Name=<%s> Id=<%0x> Status=%d Named:<%s>\n"),rli,LKTraffic[rli].Name, LKTraffic[rli].ID, LKTraffic[rli].Status,Buffer); #endif _tcscpy(Buffer1[i][curpage],Buffer); // Distance value=LKTraffic[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),value); // relative bearing if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { value = LKTraffic[rli].Bearing - DrawInfo.TrackBearing; if (value < -180.0) value += 360.0; else if (value > 180.0) value -= 360.0; #ifndef __MINGW32__ if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); #else if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f°»"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("«%2.0f°"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("«»")); #endif } else { _stprintf(Buffer3[i][curpage], _T("%2.0f°"), LKTraffic[rli].Bearing); } // Vario value=LIFTMODIFY*LKTraffic[rli].Average30s; if (value<-6 || value>6) _stprintf(Buffer4[i][curpage],_T("---")); else { sprintf(text,"%+.1f",value); _stprintf(Buffer4[i][curpage],_T("%S"),text); } // Altitude value=ALTITUDEMODIFY*LKTraffic[rli].Altitude; if (value<-1000 || value >45000 ) strcpy(text,"---"); else sprintf(text,"%.0f",value); wsprintf(Buffer5[i][curpage], TEXT("%S"),text); } else { // Empty traffic, fill in all empty data and maybe break loop _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } if ((rli>=0) && (LKTraffic[rli].ID>0)) { drawn_items_onpage++; if (LKTraffic[rli].Status == LKT_REAL) { rcolor=RGB_WHITE; SelectObject(hdc, LK8InfoBigFont); } else { if (LKTraffic[rli].Status == LKT_GHOST) { rcolor=RGB_LIGHTYELLOW; } else { rcolor=RGB_LIGHTRED; } SelectObject(hdc, LK8InfoBigItalicFont); } } else rcolor=RGB_GREY; LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } // for if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(TrafficNumraws-1)) { LKevent=LKEVENT_NONE; // 100328 return; } if (SelectedRaw[curmapspace] >= drawn_items_onpage) { if (LKevent==LKEVENT_DOWN) SelectedRaw[curmapspace]=0; else if (LKevent==LKEVENT_UP) SelectedRaw[curmapspace]=drawn_items_onpage-1; else { SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(s_rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
// // Invert the specified window's border // void InvertWindow(HWND hwnd, BOOL fShowHidden) { RECT rect; RECT rect2; RECT rectc; HDC hdc; int x1,y1; int border = INVERT_BORDER; if(hwnd == 0) return; //window rectangle (screen coords) GetWindowRect(hwnd, &rect); //client rectangle (screen coords) GetClientRect(hwnd, &rectc); ClientToScreen(hwnd, (POINT *)&rectc.left); ClientToScreen(hwnd, (POINT *)&rectc.right); //MapWindowPoints(hwnd, 0, (POINT *)&rectc, 2); x1 = rect.left; y1 = rect.top; OffsetRect(&rect, -x1, -y1); OffsetRect(&rectc, -x1, -y1); if(rect.bottom - border * 2 < 0) border = 1; if(rect.right - border * 2 < 0) border = 1; if(fShowHidden == TRUE) hwnd = 0; hdc = GetWindowDC(hwnd); if(hdc == 0) return; //top edge //border = rectc.top-rect.top; SetRect(&rect2, 0,0,rect.right, border); if(fShowHidden == TRUE) OffsetRect(&rect2, x1, y1); InvertRect(hdc, &rect2); //left edge //border = rectc.left-rect.left; SetRect(&rect2, 0,border,border, rect.bottom); if(fShowHidden == TRUE) OffsetRect(&rect2, x1, y1); InvertRect(hdc, &rect2); //right edge //border = rect.right-rectc.right; SetRect(&rect2, border,rect.bottom-border,rect.right, rect.bottom); if(fShowHidden == TRUE) OffsetRect(&rect2, x1, y1); InvertRect(hdc, &rect2); //bottom edge //border = rect.bottom-rectc.bottom; SetRect(&rect2, rect.right-border, border,rect.right, rect.bottom-border); if(fShowHidden == TRUE) OffsetRect(&rect2, x1, y1); InvertRect(hdc, &rect2); ReleaseDC(hwnd, hdc); }
static void mark_window_i(console_private_t *pcp, BOOLEAN bMark) { static BOOLEAN bIsMarked = FALSE; static int xMinOld, yMinOld, xMaxOld, yMaxOld; int xMin, yMin, xMax, yMax; RECT rect; if (bMark) { assert(pcp->yMarkStart <= pcp->yMarkEnd); assert((pcp->yMarkStart < pcp->yMarkEnd) || (pcp->xMarkStart <= pcp->xMarkEnd)); xMinOld = xMin = pcp->xMarkStart; yMinOld = yMin = pcp->yMarkStart; xMaxOld = xMax = pcp->xMarkEnd; yMaxOld = yMax = pcp->yMarkEnd; bIsMarked = TRUE; } else { if (!bIsMarked) { return; } xMin = xMinOld; yMin = yMinOld; xMax = xMaxOld; yMax = yMaxOld; bIsMarked = FALSE; } cursor(pcp, CS_SUSPEND); if (pcp->bMarkModeBlock) { rect.left = xMin * pcp->xCharDimension; rect.top = yMin * pcp->yCharDimension; rect.right = xMax * pcp->xCharDimension; rect.bottom = yMax * pcp->yCharDimension; InvertRect(pcp->hdc, &rect); } else { if (yMin + 1 == yMax) { /* we have just one line */ rect.left = xMin * pcp->xCharDimension; rect.top = yMin * pcp->yCharDimension; rect.right = xMax * pcp->xCharDimension; rect.bottom = yMax * pcp->yCharDimension; InvertRect(pcp->hdc, &rect); } else { /* handle first line */ rect.left = xMin * pcp->xCharDimension; rect.top = yMin * pcp->yCharDimension; rect.right = pcp->xMax * pcp->xCharDimension; rect.bottom = (yMin + 1) * pcp->yCharDimension; InvertRect(pcp->hdc, &rect); /* handle intermediate lines */ rect.left = 0; rect.top = (yMin + 1) * pcp->yCharDimension; rect.right = pcp->xMax * pcp->xCharDimension; rect.bottom = (yMax - 1) * pcp->yCharDimension; InvertRect(pcp->hdc, &rect); /* handle last line */ rect.left = 0; rect.top = (yMax - 1) * pcp->yCharDimension; rect.right = xMax * pcp->xCharDimension; rect.bottom = yMax * pcp->yCharDimension; InvertRect(pcp->hdc, &rect); } } cursor(pcp, CS_RESUME); }
void MapWindow::DrawCommon(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXCOMMON][MAXCOMMONNUMPAGES][24], Buffer2[MAXCOMMON][MAXCOMMONNUMPAGES][10], Buffer3[MAXCOMMON][MAXCOMMONNUMPAGES][10]; static TCHAR Buffer4[MAXCOMMON][MAXCOMMONNUMPAGES][12], Buffer5[MAXCOMMON][MAXCOMMONNUMPAGES][12]; static short maxnlname; char text[LKSIZETEXT]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double Value; COLORREF rcolor; static short Column0, Column1, Column2, Column3, Column4, Column5; static POINT p1, p2; static short rawspace; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) RECT invsel; short curmapspace=MapSpaceMode; static bool doinit=true; if (doinit) { // Set screen borders to avoid writing on extreme pixels if ( ScreenSize < (ScreenSize_t)sslandscape ) { // Portrait mode has tight horizontal margins... left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; maxnlname=MAXNLNAME-3; // 9 chars, sized 10 100213 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); // Size distance _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); // Bearing _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); // reqE _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); // Altitude Arrival _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; CommonNumraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (CommonNumraws>MAXCOMMON) CommonNumraws=MAXCOMMON; rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; CommonNumraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (CommonNumraws>MAXCOMMON) CommonNumraws=MAXCOMMON; rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 // Wpname s_sortBox[0].left=0; if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=0; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_COMMON][0]=s_sortBox[0].right; SortBoxX[MSM_RECENT][0]= SortBoxX[MSM_COMMON][0]; // Distance if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=0; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_COMMON][1]=s_sortBox[1].right; SortBoxX[MSM_RECENT][1]= SortBoxX[MSM_COMMON][1]; // Bearing s_sortBox[2].left=Column2+INTERBOX; s_sortBox[2].right=Column3+INTERBOX; s_sortBox[2].top=0; s_sortBox[2].bottom=p1.y; SortBoxX[MSM_COMMON][2]=s_sortBox[2].right; SortBoxX[MSM_RECENT][2]= SortBoxX[MSM_COMMON][2]; // reqE s_sortBox[3].left=Column3+INTERBOX; s_sortBox[3].right=Column4+INTERBOX; s_sortBox[3].top=0; s_sortBox[3].bottom=p1.y; SortBoxX[MSM_COMMON][3]=s_sortBox[3].right; SortBoxX[MSM_RECENT][3]= SortBoxX[MSM_COMMON][3]; // AltArr s_sortBox[4].left=Column4+INTERBOX; s_sortBox[4].right=Column5+INTERBOX; s_sortBox[4].top=0; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_COMMON][4]=s_sortBox[4].right; SortBoxX[MSM_RECENT][4]= SortBoxX[MSM_COMMON][4]; SortBoxY[MSM_COMMON]=p1.y; SortBoxY[MSM_RECENT]=SortBoxY[MSM_COMMON]; // Caution: could be wrong? no.. //CommonNumpages=(short)ceil( (float)MAXCOMMON / (float)CommonNumraws ); CommonNumpages=roundupdivision(MAXCOMMON, CommonNumraws); if (CommonNumpages>MAXCOMMONNUMPAGES) CommonNumpages=MAXCOMMONNUMPAGES; else if (CommonNumpages<1) CommonNumpages=1; // set the initial highlighted item to the first, in each MapSpace SelectedRaw[MSM_COMMON]=0; SelectedRaw[MSM_RECENT]=0; SelectedPage[MSM_COMMON]=0; SelectedPage[MSM_RECENT]=0; doinit=false; return; } // doinit int *pNumber; int *pIndex; switch(curmapspace) { case MSM_COMMON: pNumber=&CommonNumber; pIndex=CommonIndex; break; case MSM_RECENT: default: pNumber=&RecentNumber; pIndex=RecentIndex; break; } // calculate again real number of pages CommonNumpages=roundupdivision(*pNumber, CommonNumraws); if (CommonNumpages>MAXCOMMONNUMPAGES) CommonNumpages=MAXCOMMONNUMPAGES; else if (CommonNumpages<1) CommonNumpages=1; // current page in use by current mapspacemode curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXCOMMONNUMPAGES) { // DoStatusMessage(_T("ERR-092 current page invalid!")); // selection while waiting for data ready // immediate action to resolve this problem, take it back to normality SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } // list changed, and we are now over the real new size> resetting if (curpage>=CommonNumpages) curpage=0; // synthetic event handler . Remember to always clear events! switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: // i=CommonIndex[SelectedRaw[curmapspace] + (curpage*CommonNumraws)]; OLD i=pIndex[SelectedRaw[curmapspace] + (curpage*CommonNumraws)]; if ( !ValidWayPoint(i)) { #if 0 // selection while waiting for data ready // dont say error if empty list and an enter was pressed if (*pNumber) DoStatusMessage(_T("ERR-018 Invalid selection")); #endif break; } SelectedWaypoint=i; LastDoCommon = GPS_INFO.Time+NEARESTONHOLD; //@ 101003 PopupWaypointDetails(); LastDoCommon = 0; //@ 101003 // SetModeType(LKMODE_MAP, MP_MOVING); Experimental OFF 101219 LKevent=LKEVENT_NONE; return; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=CommonNumraws) SelectedRaw[curmapspace]=0; LastDoCommon=GPS_INFO.Time+PAGINGTIMEOUT-1.0; //@ 101003 // Event to be cleared at the end break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=CommonNumraws-1; LastDoCommon=GPS_INFO.Time+PAGINGTIMEOUT-1.0; //@ 101003 break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXCOMMON; i++) { for (k=0; k<MAXCOMMONNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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; } // Draw Headline if (INVERTCOLORS) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); if (curmapspace == MSM_COMMON ) // LKTOKEN _@M1309_ "COMN" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1309_")), curpage+1, CommonNumpages); else // LKTOKEN _@M1310_ "HIST" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1310_")), curpage+1, CommonNumpages); LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer,gettext(TEXT("_@M1300_"))); // always sorted manually here! LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer,gettext(TEXT("_@M1301_"))); LKWriteText(hdc, Buffer, Column3, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1302_ "rEff" _stprintf(Buffer,gettext(TEXT("_@M1302_"))); LKWriteText(hdc, Buffer, Column4, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1303_ "AltA" _stprintf(Buffer,gettext(TEXT("_@M1303_"))); LKWriteText(hdc, Buffer, Column5, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240) || ScreenSize == ss896x672 ) { if (curmapspace == MSM_COMMON ) // LKTOKEN _@M1309_ "COMN" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1309_")), curpage+1,CommonNumpages); else // LKTOKEN _@M1310_ "HIST" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1310_")), curpage+1,CommonNumpages); LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer,gettext(TEXT("_@M1300_"))); LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer,gettext(TEXT("_@M1301_"))); LKWriteText(hdc, Buffer, Column3, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1302_ "rEff" _stprintf(Buffer,gettext(TEXT("_@M1302_"))); LKWriteText(hdc, Buffer, Column4, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1308_ "Arriv" _stprintf(Buffer,gettext(TEXT("_@M1308_"))); LKWriteText(hdc, Buffer, Column5, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { if (curmapspace==MSM_COMMON) // LKTOKEN _@M1309_ "COMN" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1309_")), curpage+1,CommonNumpages); else // LKTOKEN _@M1310_ "HIST" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1310_")), curpage+1,CommonNumpages); LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer,gettext(TEXT("_@M1304_"))); LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer,gettext(TEXT("_@M1305_"))); LKWriteText(hdc, Buffer, Column3, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1306_ "ReqEff" _stprintf(Buffer,gettext(TEXT("_@M1306_"))); LKWriteText(hdc, Buffer, Column4, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1307_ "AltArr" _stprintf(Buffer,gettext(TEXT("_@M1307_"))); LKWriteText(hdc, Buffer, Column5, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest // try to reduce conflicts, as task thread could change it while we are using it here. // so we copy it and clear it here once forever in this run bool ndr; switch (curmapspace) { case MSM_COMMON: ndr=CommonDataReady; CommonDataReady=false; break; case MSM_RECENT: ndr=RecentDataReady; RecentDataReady=false; break; default: ndr=false; break; } // numraws always <= MAXNEAREST for (i=0, drawn_items_onpage=0; i<CommonNumraws; i++) { iRaw=TopSize+(rawspace*i); short curraw=(curpage*CommonNumraws)+i; if (curraw>=MAXCOMMON) break; rli=pIndex[curraw]; if (!ndr) goto KeepOldValues; if ( ValidWayPoint(rli) ) { wlen=wcslen(WayPointList[rli].Name); if (wlen>maxnlname) { _tcsncpy(Buffer, WayPointList[rli].Name, maxnlname); Buffer[maxnlname]='\0'; } else { _tcsncpy(Buffer, WayPointList[rli].Name, wlen); Buffer[wlen]='\0'; } ConvToUpper(Buffer); // 100213 FIX UPPERCASE DRAWNEAREST _tcscpy(Buffer1[i][curpage],Buffer); // Distance Value=WayPointCalc[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),Value); // relative bearing if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { Value = WayPointCalc[rli].Bearing - GPS_INFO.TrackBearing; if (Value < -180.0) Value += 360.0; else if (Value > 180.0) Value -= 360.0; #ifndef __MINGW32__ if (Value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), Value); else if (Value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -Value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); #else if (Value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f°»"), Value); else if (Value < -1) _stprintf(Buffer3[i][curpage], TEXT("«%2.0f°"), -Value); else _tcscpy(Buffer3[i][curpage], TEXT("«»")); #endif } else _stprintf(Buffer3[i][curpage], TEXT("%2.0f°"), WayPointCalc[rli].Bearing); // Requested GR Value=WayPointCalc[rli].GR; if (Value<1 || Value>=MAXEFFICIENCYSHOW) _stprintf(Buffer4[i][curpage],_T("---")); else { if (Value>99) sprintf(text,"%.0f",Value); else sprintf(text,"%.1f",Value); _stprintf(Buffer4[i][curpage],_T("%S"),text); } // arrival altitude Value=ALTITUDEMODIFY*WayPointCalc[rli].AltArriv[AltArrivMode]; if (Value <-9999 || Value >9999 ) strcpy(text,"---"); else sprintf(text,"%+.0f",Value); wsprintf(Buffer5[i][curpage], TEXT("%S"),text); } else { // Invalid waypoint, fill in all empty data and maybe break loop _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } KeepOldValues: if ( ValidWayPoint(rli) ) { SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest drawn_items_onpage++; // Common turnpoints are mixed, so we must be sure that reachable is checked only against a landable if ((WayPointCalc[rli].VGR == 3 )|| ( WayPointCalc[rli].IsLandable && !WayPointList[rli].Reachable)) // 091205 rcolor=RGB_LIGHTRED; else rcolor=RGB_WHITE; } else rcolor=RGB_GREY; //TextDisplayMode.AsFlag.Color = TEXTGREY; LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); // set again correct font SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } // for // clear flag, and don't outbox if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } // BOXOUT SELECTED ITEM if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(CommonNumraws-1)) { LKevent=LKEVENT_NONE; return; } // avoid boxing and selecting nonexistent items // selectedraw starts from 0, drawnitems from 1... // In this case we set the first one, or last one, assuming we are rotating forward or backward if (SelectedRaw[curmapspace] >= drawn_items_onpage) { if (LKevent==LKEVENT_DOWN) SelectedRaw[curmapspace]=0; else // up from top to bottom, bottom empty, look for the last valid one (ie first going back from bottom) if (LKevent==LKEVENT_UP) SelectedRaw[curmapspace]=drawn_items_onpage-1; else { // DoStatusMessage(_T("Cant find valid raw")); // no more needed SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
/* * mark the selected line, if visible, in the style chosen by the * client app. This can be TM_SOLID, meaning an inversion of * the whole selected area or TM_FOCUS, meaning, inversion of the first * cell, and then a dotted focus rectangle for the rest. * * this function inverts either style, and so will turn the selection * both on and off. */ void gtab_invertsel(HWND hwnd, lpTable ptab, HDC hdc_in) { HDC hdc; int firstline, lastline; long startrow, lastrow, toprow, bottomrow; RECT rc; int lastcell; /* get the selection start and end rows ordered vertically */ if (ptab->select.nrows == 0) { return; } else if (ptab->select.nrows < 0) { startrow = ptab->select.startrow + ptab->select.nrows + 1; lastrow = ptab->select.startrow; } else { startrow = ptab->select.startrow; lastrow = ptab->select.startrow + ptab->select.nrows -1; } /* is selected area (or part of it) visible on screen ? */ firstline = gtab_rowtoline(hwnd, ptab, startrow); lastline = gtab_rowtoline(hwnd, ptab, lastrow); if (firstline < 0) { toprow = gtab_linetorow(hwnd, ptab, ptab->hdr.fixedselectable ? 0: ptab->hdr.fixedrows); if ((toprow >= startrow) && (toprow <= lastrow)) { firstline = gtab_rowtoline(hwnd, ptab, toprow); } else { return; } } else { toprow = 0; } if (lastline < 0) { bottomrow = gtab_linetorow(hwnd, ptab, ptab->nlines-1); if ((bottomrow <= lastrow) && (bottomrow >=startrow)) { lastline = gtab_rowtoline(hwnd, ptab, bottomrow); } else { return; } } rc.top = ptab->pdata[firstline].linepos.clipstart; rc.bottom = ptab->pdata[lastline].linepos.clipend; /* selection mode includes a flag TM_FOCUS indicating we should * use a focus rect instead of the traditional inversion for * selections in this table. This interferes with multiple backgrnd * colours less. However we still do inversion for fixedcols. */ lastcell = (int)(ptab->select.startcell + ptab->select.ncells - 1); /* * invert the whole area for TM_SOLID or just the first * cell for TM_FOCUS */ rc.left = ptab->pcellpos[ptab->select.startcell].clipstart; if (ptab->hdr.selectmode & TM_FOCUS) { rc.right = ptab->pcellpos[ptab->select.startcell].clipend; }else { rc.right = ptab->pcellpos[lastcell].clipend; } if (hdc_in == NULL) { hdc = GetDC(hwnd); } else { hdc = hdc_in; } InvertRect(hdc, &rc); /* * draw focus rectangle around remaining cells on this line, if there * are any */ if (ptab->hdr.selectmode & TM_FOCUS) { /* * now this is a real fudge. if we are drawing TM_FOCUS * selection, and the real top line is off the top of the * window, then the top of the focus rect will be drawn at * the top of our window. If we then scroll up one line, * a new focus rect will be drawn, but the old top of focus * rect line will still be there as junk on the * screen. To fix this, we have 2 choices: we undo the selection * before every scroll (too slow) or we set the focus rect a little * bigger if the real top line is off-window, so that the top line * is clipped (as it should be). This latter is what we do here */ if (toprow > startrow) { rc.top--; } if (ptab->select.ncells > 1) { rc.left = ptab->pcellpos[ptab->select.startcell+1].clipstart; rc.right = ptab->pcellpos[lastcell].clipend; DrawFocusRect(hdc, &rc); } } if (hdc_in == NULL) { ReleaseDC(hwnd, hdc); } }
NS_IMETHODIMP nsRenderingContextQt::InvertRect(const nsRect &aRect) { return InvertRect(aRect.x,aRect.y,aRect.width,aRect.height); }
BOOL CTextLayout::Render(HDC hdc, const WCHAR *psz, UINT nCnt, UINT nSelStart, UINT nSelEnd, UINT nCompStart, UINT nCompEnd, const BYTE *prgAttr, LONG lAttrSize, const LONG *prgClauseInfo, LONG lClauseInfo) { POINT ptCurrent; ptCurrent.x = 0; ptCurrent.y = 0; // Render lines for (UINT i = 0; i < _nLineCnt; i++) { if (_prgLines[i].nCnt) { TextOut(hdc, ptCurrent.x, ptCurrent.y, psz + _prgLines[i].nPos, _prgLines[i].nCnt); } ptCurrent.x = 0; ptCurrent.y += _nLineHeight; } _fCaret = FALSE; // Render selection/caret RECT rcSel; if (_nLineCnt) { for (UINT i = 0; i < _nLineCnt; i++) { // Rendering Selection if ((nSelEnd >= _prgLines[i].nPos) && (nSelStart <= _prgLines[i].nPos + _prgLines[i].nCnt)) { UINT nSelStartInLine = 0; UINT nSelEndInLine = _prgLines[i].nCnt; if (nSelStart > _prgLines[i].nPos) nSelStartInLine = nSelStart - _prgLines[i].nPos; if (nSelEnd < _prgLines[i].nPos + _prgLines[i].nCnt) nSelEndInLine = nSelEnd - _prgLines[i].nPos; if (nSelStartInLine != nSelEndInLine) { for (UINT j = nSelStartInLine; j < nSelEndInLine; j++) { InvertRect(hdc, &_prgLines[i].prgCharInfo[j].rc); } } else { if (nSelStartInLine == _prgLines[i].nCnt) { rcSel = _prgLines[i].prgCharInfo[nSelStartInLine - 1].rc; rcSel.left = rcSel.right; rcSel.right++; } else { rcSel = _prgLines[i].prgCharInfo[nSelStartInLine].rc; rcSel.right = rcSel.left + 1; } InvertRect(hdc, &rcSel); _fCaret = TRUE; _rcCaret = rcSel; } } // Rendering the composition display attribute. if (prgAttr && prgClauseInfo && (nCompEnd >= _prgLines[i].nPos) && (nCompStart <= _prgLines[i].nPos + _prgLines[i].nCnt)) { UINT nCompStartInLine = 0; UINT nCompEndInLine = _prgLines[i].nCnt; int nBaseLineWidth = (_nLineHeight / 18) + 1; if (nCompStart > _prgLines[i].nPos) nCompStartInLine = nCompStart - _prgLines[i].nPos; if (nCompEnd < _prgLines[i].nPos + _prgLines[i].nCnt) nCompEndInLine = nCompEnd - _prgLines[i].nPos; for (UINT j = nCompStartInLine; j < nCompEndInLine; j++) { HPEN hpen = NULL; UINT uCurrentCompPos = _prgLines[i].nPos + j - nCompStart; BOOL bClause = FALSE; for (LONG k = 0; k < lClauseInfo; k++) { if (uCurrentCompPos + 1 == (UINT)prgClauseInfo[k]) { bClause = TRUE; } } hpen = CreateUnderlinePen(prgAttr[uCurrentCompPos], nBaseLineWidth); if (hpen) { HPEN hpenOrg; hpenOrg = (HPEN)SelectObject(hdc, hpen); RECT rc = _prgLines[i].prgCharInfo[j].rc; POINT pts[2]; pts[0].x = rc.left; pts[0].y = rc.bottom; pts[1].x = rc.right - (bClause ? nBaseLineWidth : 0); pts[1].y = rc.bottom; Polyline(hdc, pts, 2); SelectObject(hdc, hpenOrg); } } } } } else { rcSel.left = 0; rcSel.top = 0; rcSel.right = 1; rcSel.bottom = _nLineHeight; InvertRect(hdc, &rcSel); _fCaret = TRUE; _rcCaret = rcSel; } return TRUE; }
/* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndButton1, hwndButton2, hwndButton3, hwndButton4, hwndButton5, hwndButton6, hwndButton7; static HWND hwndCheckBox3, hwndCheckBox5, hwndCheckBox6; static HBITMAP hBitmap; static int cxClient, cyClient, cxSource, cySource; BITMAP bitmap; HDC hdc, hdcMem; int x, y; PAINTSTRUCT ps; LPDRAWITEMSTRUCT pdis; POINT pt[3]; RECT rc,rect, rectTemp; HPEN hPen; HBRUSH hBrush; HBRUSH hbr; UINT coll = 0; COLORREF colRef; HDC hDC = GetDC(hwnd); static BOOL IsDrawing = FALSE; static int StartX, StartY; static int EndX, EndY; static BOOL isLine, isFreeHand, isEllipse, isTriangle, isRectangle, isEraser; int state; switch (message) { /* handle the messages */ case WM_CREATE: hBitmap = LoadBitmap (hInst, TEXT ("header")); GetObject (hBitmap, sizeof (BITMAP), &bitmap); cxSource = bitmap.bmWidth; cySource = bitmap.bmHeight; hwndButton1 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 60, 30, 30, hwnd, (HMENU) IDB_BUTTON1, hInst, NULL); hwndButton2 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 95, 30, 30, hwnd, (HMENU) IDB_BUTTON2, hInst, NULL); hwndCheckBox3 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 130, 13, 13, hwnd, (HMENU) IDR_RADIOBUTTON3, hInst, NULL); hwndButton3 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 130, 30, 30, hwnd, (HMENU) IDB_BUTTON3, hInst, NULL); hwndButton4 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 165, 30, 30, hwnd, (HMENU) IDB_BUTTON4, hInst, NULL); hwndCheckBox5 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 200, 13, 13, hwnd, (HMENU) IDR_RADIOBUTTON5, hInst, NULL); hwndButton5 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 200, 30, 30, hwnd, (HMENU) IDB_BUTTON5, hInst, NULL); hwndCheckBox6 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 235, 13, 13, hwnd, (HMENU) IDR_RADIOBUTTON6, hInst, NULL); hwndButton6 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 235, 30, 30, hwnd, (HMENU) IDB_BUTTON6, hInst, NULL); hwndButton7 = CreateWindow ( TEXT("BUTTON"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 50, 270, 30, 30, hwnd, (HMENU) IDB_BUTTON7, hInst, NULL); return 0 ; case WM_DRAWITEM : pdis = (LPDRAWITEMSTRUCT) lParam; FillRect (pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject (WHITE_BRUSH)); FrameRect (pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject (BLACK_BRUSH)); switch (pdis->CtlID) { case IDB_BUTTON1 : hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); SelectObject(pdis->hDC, hPen); MoveToEx (pdis->hDC, 5, 18, NULL) ; LineTo (pdis->hDC, 19, 4) ; hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); SelectObject(pdis->hDC, hPen); MoveToEx (pdis->hDC, 8, 21, NULL) ; LineTo (pdis->hDC, 22, 7) ; hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); SelectObject(pdis->hDC, hPen); MoveToEx (pdis->hDC, 11, 25, NULL); LineTo (pdis->hDC, 25, 11); break; case IDB_BUTTON2 : pt[0].x = 3; pt[0].y = 3; pt[1].x = 3; pt[1].y = 27; pt[2].x = 27; pt[2].y = 15; pt[3].x = 27; pt[3].y = 3; DrawBezier (pdis->hDC, pt); break; case IDB_BUTTON3 : state = SendMessage(hwndCheckBox3, BM_GETCHECK, 0, 0); if(state == BST_CHECKED) { Circle (pdis->hDC, 3, 3, 24, true); } else { Circle (pdis->hDC, 3, 3, 24, false); } break; case IDB_BUTTON4 : hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); SelectObject(pdis->hDC, hPen); MoveToEx (pdis->hDC, 8, 21, NULL) ; LineTo (pdis->hDC, 22, 7) ; hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); SelectObject(pdis->hDC, hPen); MoveToEx (pdis->hDC, 8, 21, NULL); LineTo (pdis->hDC, 3, 24); break; case IDB_BUTTON5 : pt[0].x = 4; pt[0].y = 26; pt[1].x = 26; pt[1].y = 26; pt[2].x = 15; pt[2].y = 3; Triangle (pdis->hDC, pt); break; case IDB_BUTTON6 : pt[0].x = 3; pt[0].y = 3; pt[1].x = 3; pt[1].y = 26; pt[2].x = 26; pt[2].y = 26; pt[3].x = 26; pt[3].y = 3; Rectangle(pdis->hDC, pt); break; case IDB_BUTTON7 : pt[0].x = 3; pt[0].y = 20; pt[1].x = 6; pt[1].y = 15; pt[2].x = 16; pt[2].y = 15; pt[3].x = 13; pt[3].y = 20; Rectangle(pdis->hDC, pt); hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); SelectObject(pdis->hDC, hPen); MoveToEx (pdis->hDC, 6, 15, NULL); LineTo (pdis->hDC, 15, 11); MoveToEx (pdis->hDC, 16, 15, NULL); LineTo (pdis->hDC, 25, 11); MoveToEx (pdis->hDC, 13, 20, NULL); LineTo (pdis->hDC, 22, 16); MoveToEx (pdis->hDC, 15, 11, NULL); LineTo (pdis->hDC, 25, 11); MoveToEx (pdis->hDC, 25, 11, NULL); LineTo (pdis->hDC, 21, 17); break; } if (pdis->itemState & ODS_SELECTED) InvertRect (pdis->hDC, &pdis->rcItem); if (pdis->itemState & ODS_FOCUS) // Draw a focus rectangle if the button has the focus DrawFocusRect (pdis->hDC, &pdis->rcItem) ; return 0; case WM_LBUTTONDOWN: if((LOWORD(lParam) > 15) && (HIWORD(lParam) > 400) && (LOWORD(lParam) < 90) && (HIWORD(lParam) <550) ) { coll = 255* (HIWORD(lParam) - 400)/150; updateColorPreview(hDC, RGB(coll, coll, coll), 15, 350); colRef = RGB(coll, coll, coll); return 0; } hDC = GetDC(hwnd); StartX = LOWORD(lParam); StartY = HIWORD(lParam); EndX = LOWORD(lParam); EndY = HIWORD(lParam); if(isLine) { hPen = CreatePen(PS_SOLID, 1, colRef); hbr = CreateSolidBrush(colRef); SelectObject(hDC, hPen); SelectObject(hDC, hbr); SetROP2(hDC, R2_XORPEN); MoveToEx(hDC, StartX, StartY, NULL); LineTo(hDC, EndX, EndY); IsDrawing = TRUE; DeleteObject(hPen); DeleteObject(hbr); } if(isFreeHand) { hPen = CreatePen(PS_SOLID, 1, colRef); hbr = CreateSolidBrush(colRef); SelectObject(hDC, hPen); SelectObject(hDC, hbr); StartX = LOWORD(lParam); StartY = HIWORD(lParam); IsDrawing = TRUE; DeleteObject(hPen); DeleteObject(hbr); } if(isEllipse){ state = SendMessage(hwndCheckBox3, BM_GETCHECK, 0, 0); hPen = CreatePen(PS_SOLID, 1, colRef); if(state){ hbr = CreateSolidBrush(colRef); SelectObject(hDC, hbr); } else { hbr = (HBRUSH)GetStockObject(NULL_BRUSH); SelectObject(hDC, hbr); } SelectObject(hDC, hPen); SetROP2(hDC, R2_XORPEN); Ellipse(hDC, StartX, StartY, EndX, EndY); ReleaseDC(hwnd, hDC); IsDrawing = TRUE; DeleteObject(hPen); DeleteObject(hbr); } if (isTriangle) { state = SendMessage(hwndCheckBox5, BM_GETCHECK, 0, 0); hPen = CreatePen(PS_SOLID, 1, colRef); if (state){ hbr = CreateSolidBrush(colRef); SelectObject(hDC, hbr); } else { hbr = (HBRUSH)GetStockObject(NULL_BRUSH); SelectObject(hDC, hbr); } SelectObject(hDC, hPen); SetROP2(hDC, R2_XORPEN); pt[0].x = StartX; pt[0].y = EndY; pt[1].x = (EndX + StartX) / 2; pt[1].y = StartY; pt[2].x = EndX; pt[2].y = EndY; Triangle(hDC, pt); ReleaseDC(hwnd, hDC); IsDrawing = TRUE; DeleteObject(hPen); DeleteObject(hbr); } if (isRectangle) { hPen = CreatePen(PS_SOLID, 1, colRef); state = SendMessage(hwndCheckBox6, BM_GETCHECK, 0, 0); if (state) { hbr = CreateSolidBrush(colRef); } else { hbr = (HBRUSH)GetStockObject(NULL_BRUSH); } SelectObject(hDC, hbr); SelectObject(hDC, hPen); SetROP2(hDC, R2_XORPEN); pt[0].x = StartX; pt[0].y = StartY; pt[1].x = StartX; pt[1].y = EndY; pt[2].x = EndX; pt[2].y = EndY; pt[3].x = EndX; pt[3].y = StartY; Rectangle(hDC, pt); ReleaseDC(hwnd, hDC); IsDrawing = TRUE; DeleteObject(hPen); DeleteObject(hbr); } if (isEraser) { rect.left = StartX - 15; rect.right = StartX + 15; rect.top = StartY - 15; rect.bottom = StartY + 15 ; InvalidateRect(hwnd, &rect, FALSE); SendMessage(hwnd, WM_PAINT, 0, 0); ValidateRect(hwnd, &rect); } ReleaseDC(hwnd, hDC); return 0; case WM_MOUSEMOVE: if(IsDrawing) { hDC = GetDC(hwnd); if(isLine) { hPen = CreatePen(PS_SOLID, 1, colRef); SelectObject(hDC, hPen); SetROP2(hDC, R2_NOTXORPEN); MoveToEx(hDC, StartX, StartY, NULL); LineTo(hDC, EndX, EndY); EndX = LOWORD(lParam); EndY = HIWORD(lParam); MoveToEx(hDC, StartX, StartY, NULL); LineTo(hDC, EndX, EndY); DeleteObject(hPen); } if(isFreeHand) { hPen = CreatePen(PS_SOLID, 1, colRef); SelectObject(hDC, hPen); MoveToEx(hDC, EndX, EndY, NULL); EndX = LOWORD(lParam); EndY = HIWORD(lParam); LineTo(hDC, EndX, EndY); DeleteObject(hPen); } if(isEllipse) { hPen = CreatePen(PS_SOLID, 1, colRef); state = SendMessage(hwndCheckBox3, BM_GETCHECK, 0, 0); if(state) { hbr = CreateSolidBrush(colRef); } else { hbr = (HBRUSH)GetStockObject(NULL_BRUSH); } SelectObject(hDC, hbr); SelectObject(hDC, hPen); SetROP2(hDC, R2_NOTXORPEN); Ellipse(hDC, StartX, StartY, EndX, EndY); EndX = LOWORD(lParam); EndY = HIWORD(lParam); Ellipse(hDC, StartX, StartY, EndX, EndY); DeleteObject(hbr); DeleteObject(hPen); } if(isTriangle) { hPen = CreatePen(PS_SOLID, 1, colRef); state = SendMessage(hwndCheckBox5, BM_GETCHECK, 0, 0); if (state){ hbr = CreateSolidBrush(colRef); } else { hbr = (HBRUSH)GetStockObject(NULL_BRUSH); } SelectObject(hDC, hbr); SelectObject(hDC, hPen); SetROP2(hDC, R2_NOTXORPEN); pt[0].x = StartX; pt[0].y = EndY; pt[1].x = (EndX + StartX) / 2; pt[1].y = StartY; pt[2].x = EndX; pt[2].y = EndY; Triangle(hDC, pt); EndX = LOWORD(lParam); EndY = HIWORD(lParam); pt[0].x = StartX; pt[0].y = EndY; pt[1].x = (EndX + StartX) / 2; pt[1].y = StartY; pt[2].x = EndX ; pt[2].y = EndY; Triangle(hDC, pt); DeleteObject(hPen); DeleteObject(hbr); } if (isRectangle) { hPen = CreatePen(PS_SOLID, 1, colRef); state = SendMessage(hwndCheckBox6, BM_GETCHECK, 0, 0); hPen = CreatePen(PS_SOLID, 1, colRef); if(state) { hbr = CreateSolidBrush(colRef); SelectObject(hDC, hbr); } else { hbr = (HBRUSH)GetStockObject(NULL_BRUSH); SelectObject(hDC, hbr); } SelectObject(hDC, hPen); SetROP2(hDC, R2_NOTXORPEN); pt[0].x = StartX ; pt[0].y = StartY; pt[1].x = StartX; pt[1].y = EndY ; pt[2].x = EndX ; pt[2].y = EndY ; pt[3].x = EndX ; pt[3].y = StartY ; Rectangle(hDC, pt); EndX = LOWORD(lParam); EndY = HIWORD(lParam); pt[0].x = StartX; pt[0].y = StartY; pt[1].x = StartX; pt[1].y = EndY; pt[2].x = EndX; pt[2].y = EndY; pt[3].x = EndX; pt[3].y = StartY; Rectangle(hDC, pt); DeleteObject(hPen); DeleteObject(hbr); } if (isEraser) { SetROP2(hDC, R2_NOTXORPEN); rect.left = StartX - 5; rect.right = StartX + 5; rect.top = StartY - 5; rect.bottom = StartY + 5 ; InvalidateRect(hwnd, &rect, FALSE); SendMessage(hwnd, WM_PAINT, 0, 0); ValidateRect(hwnd, &rect); EndX = LOWORD(lParam); EndY = HIWORD(lParam); rect.left = EndX - 5; rect.right = EndX + 5; rect.top = EndY - 5; rect.bottom = EndY + 5 ; InvalidateRect(hwnd, &rect, FALSE); SendMessage(hwnd, WM_PAINT, 0, 0); ValidateRect(hwnd, &rect); } } ReleaseDC(hwnd, hDC); break; case WM_LBUTTONUP: hDC = GetDC(hwnd); EndX = LOWORD(lParam); EndY = HIWORD(lParam); SetROP2(hDC, R2_XORPEN); MoveToEx(hDC, StartX, StartY, NULL); LineTo(hDC, EndX, EndY); IsDrawing = FALSE; ReleaseDC(hwnd, hDC); break; case WM_SIZE: cxClient = LOWORD (lParam); cyClient = HIWORD (lParam); return 0; case WM_COMMAND : switch (LOWORD(wParam)){ case IDB_BUTTON1: isEraser = false; isRectangle = false; isLine = true; isFreeHand = false; isEllipse = false; isTriangle = false; break; case IDB_BUTTON3: isEraser = false; isRectangle = false; isLine = false; isFreeHand = false; isEllipse = true; isTriangle = false; break; case IDB_BUTTON4: isEraser = false; isRectangle = false; isLine = false; isFreeHand = true; isEllipse = false; isTriangle = false; break; case IDB_BUTTON5: isEraser = false; isRectangle = false; isTriangle = true; isLine = false; isFreeHand = false; isEllipse = false; break; case IDB_BUTTON6: isEraser = false; isRectangle = true; isTriangle = false; isLine = false; isFreeHand = false; isEllipse = false; break; case IDB_BUTTON7: isEraser = true; isRectangle = false; isTriangle = false; isLine = false; isFreeHand = false; isEllipse = false; break; } GetWindowRect (hwnd, &rc); return 0; case WM_PAINT: /*draw the header*/ hdc = BeginPaint (hwnd, &ps); hdcMem = CreateCompatibleDC (hdc); SelectObject (hdcMem, hBitmap); for (y = 0 ; y < cySource ; y += cySource) for (x = 0 ; x < cxSource ; x += cxSource) BitBlt (hdc, x, y, cxSource, cySource, hdcMem, 0, 0, SRCCOPY); DeleteDC (hdcMem) ; updateColorPreview(hdc, colRef, 15, 350); rectTemp.top = 400; rectTemp.bottom = 550; rectTemp.left =15; rectTemp.right =90; for(int l = 0; l < 150; l++) { int r; r = l * 255 / 150; rectTemp.top = 400 + l; rectTemp.bottom = 400 + l + 1; hBrush = CreateSolidBrush(RGB(r, r, r)); FillRect(hdc, &rectTemp, hBrush); DeleteObject(hBrush); } EndPaint (hwnd, &ps) ; return 0; case WM_DESTROY: DeleteObject (hBitmap) ; PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
BOOL CTextLayout::Render(HDC hdc, const WCHAR *psz, UINT nCnt, UINT nSelStart, UINT nSelEnd) { POINT ptCurrent; ptCurrent.x = 0; ptCurrent.y = 0; // Render lines for (UINT i = 0; i < _nLineCnt; i++) { if (_prgLines[i].nCnt) { TextOut(hdc, ptCurrent.x, ptCurrent.y, psz + _prgLines[i].nPos, _prgLines[i].nCnt); } ptCurrent.x = 0; ptCurrent.y += _nLineHeight; } _fCaret = FALSE; // Render selection/caret RECT rcSel; if (_nLineCnt) { for (UINT i = 0; i < _nLineCnt; i++) { if ((nSelEnd >= _prgLines[i].nPos) && (nSelStart <= _prgLines[i].nPos + _prgLines[i].nCnt)) { UINT nSelStartInLine = 0; UINT nSelEndInLine = _prgLines[i].nCnt; if (nSelStart > _prgLines[i].nPos) nSelStartInLine = nSelStart - _prgLines[i].nPos; if (nSelEnd < _prgLines[i].nPos + _prgLines[i].nCnt) nSelEndInLine = nSelEnd - _prgLines[i].nPos; if (nSelStartInLine != nSelEndInLine) { for (UINT j = nSelStartInLine; j < nSelEndInLine; j++) { InvertRect(hdc, &_prgLines[i].prgCharInfo[j].rc); } } else { if (nSelStartInLine == _prgLines[i].nCnt) { rcSel = _prgLines[i].prgCharInfo[nSelStartInLine - 1].rc; rcSel.left = rcSel.right; rcSel.right++; } else { rcSel = _prgLines[i].prgCharInfo[nSelStartInLine].rc; rcSel.right = rcSel.left + 1; } InvertRect(hdc, &rcSel); _fCaret = TRUE; _rcCaret = rcSel; } } } } else { rcSel.left = 0; rcSel.top = 0; rcSel.right = 1; rcSel.bottom = _nLineHeight; InvertRect(hdc, &rcSel); _fCaret = TRUE; _rcCaret = rcSel; } return TRUE; }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) { static HWND hwndSmaller, hwndLarger ; static int cxClient, cyClient, cxChar, cyChar ; int cx, cy ; LPDRAWITEMSTRUCT pdis ; POINT pt[3] ; RECT rc ; switch (message) { case WM_CREATE : cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; // Create the owner-draw pushbuttons hwndSmaller = CreateWindow (TEXT ("button"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 0, 0, BTN_WIDTH, BTN_HEIGHT, hwnd, (HMENU) ID_SMALLER, hInst, NULL) ; hwndLarger = CreateWindow (TEXT ("button"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 0, 0, BTN_WIDTH, BTN_HEIGHT, hwnd, (HMENU) ID_LARGER, hInst, NULL) ; return 0 ; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; // Move the buttons to the new center MoveWindow ( hwndSmaller, cxClient / 2 - 3 * BTN_WIDTH / 2, cyClient / 2 - BTN_HEIGHT / 2, BTN_WIDTH, BTN_HEIGHT, TRUE) ; MoveWindow ( hwndLarger, cxClient / 2 + BTN_WIDTH / 2,cyClient / 2 - BTN_HEIGHT / 2, BTN_WIDTH, BTN_HEIGHT, TRUE) ; return 0 ; case WM_COMMAND : GetWindowRect (hwnd, &rc) ; // Make the window 10% smaller or larger switch (wParam) { case ID_SMALLER : rc.left += cxClient / 20 ; rc.right -= cxClient / 20 ; rc.top += cyClient / 20 ; rc.bottom -= cyClient / 20 ; break ; case ID_LARGER : rc.left -= cxClient / 20 ; rc.right += cxClient / 20 ; rc.top -= cyClient / 20 ; rc.bottom += cyClient / 20 ; break ; } MoveWindow ( hwnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE) ; return 0 ; case WM_DRAWITEM : pdis = (LPDRAWITEMSTRUCT) lParam ; // Fill area with white and frame it black FillRect(pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject (WHITE_BRUSH)) ; FrameRect ( pdis->hDC, &pdis->rcItem, (HBRUSH) GetStockObject (BLACK_BRUSH)) ; // Draw inward and outward black triangles cx = pdis->rcItem.right - pdis->rcItem.left ; cy = pdis->rcItem.bottom - pdis->rcItem.top ; switch (pdis->CtlID) { case ID_SMALLER : pt[0].x = 3 * cx / 8 ; pt[0].y = 1 * cy / 8 ; pt[1].x = 5 * cx / 8 ; pt[1].y = 1 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 3 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 7 * cx / 8 ; pt[0].y = 3 * cy / 8 ; pt[1].x = 7 * cx / 8 ; pt[1].y = 5 * cy / 8 ; pt[2].x = 5 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 5 * cx / 8 ; pt[0].y = 7 * cy / 8 ; pt[1].x = 3 * cx / 8 ; pt[1].y = 7 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 5 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 1 * cx / 8 ; pt[0].y = 5 * cy / 8 ; pt[1].x = 1 * cx / 8 ; pt[1].y = 3 * cy / 8 ; pt[2].x = 3 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; break ; case ID_LARGER : pt[0].x = 5 * cx / 8 ; pt[0].y = 3 * cy / 8 ; pt[1].x = 3 * cx / 8 ; pt[1].y = 3 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 1 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 5 * cx / 8 ; pt[0].y = 5 * cy / 8 ; pt[1].x = 5 * cx / 8 ; pt[1].y = 3 * cy / 8 ; pt[2].x = 7 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 3 * cx / 8 ; pt[0].y = 5 * cy / 8 ; pt[1].x = 5 * cx / 8 ; pt[1].y = 5 * cy / 8 ; pt[2].x = 4 * cx / 8 ; pt[2].y = 7 * cy / 8 ; Triangle (pdis->hDC, pt) ; pt[0].x = 3 * cx / 8 ; pt[0].y = 3 * cy / 8 ; pt[1].x = 3 * cx / 8 ; pt[1].y = 5 * cy / 8 ; pt[2].x = 1 * cx / 8 ; pt[2].y = 4 * cy / 8 ; Triangle (pdis->hDC, pt) ; break ; } // Invert the rectangle if the button is selected if (pdis->itemState & ODS_SELECTED) InvertRect (pdis->hDC, &pdis->rcItem) ; // Draw a focus rectangle if the button has the focus if (pdis->itemState & ODS_FOCUS) { pdis->rcItem.left += cx / 16 ; pdis->rcItem.top += cy / 16 ; pdis->rcItem.right -= cx / 16 ; pdis->rcItem.bottom-= cy / 16 ; DrawFocusRect (pdis->hDC, &pdis->rcItem) ; } return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
void MapWindow::DrawThermalHistory(HDC hdc, RECT rc) { SIZE WPTextSize, DSTextSize, BETextSize, RETextSize, AATextSize, HLTextSize, MITextSize; TCHAR Buffer[LKSIZEBUFFERLARGE]; static RECT s_sortBox[6]; static TCHAR Buffer1[MAXTHISTORY][MAXTHISTORYNUMPAGES][24], Buffer2[MAXTHISTORY][MAXTHISTORYNUMPAGES][10]; static TCHAR Buffer3[MAXTHISTORY][MAXTHISTORYNUMPAGES][10]; static TCHAR Buffer4[MAXTHISTORY][MAXTHISTORYNUMPAGES][12], Buffer5[MAXTHISTORY][MAXTHISTORYNUMPAGES][12]; static short s_maxnlname; char text[30]; short i, k, iRaw, wlen, rli=0, curpage, drawn_items_onpage; double value; COLORREF rcolor; // column0 starts after writing 1:2 (ModeIndex:CURTYPE+1) with a different font.. static short Column0; static short Column1, Column2, Column3, Column4, Column5; static POINT p1, p2; static short s_rawspace; // Printable area for live nearest values static short left,right,bottom; // one for each mapspace, no matter if 0 and 1 are unused short curmapspace=MapSpaceMode; static int thistoryNumraws=0; // Vertical and horizontal spaces #define INTERRAW 1 #define HEADRAW NIBLSCALE(6) HBRUSH sortbrush; RECT invsel; if (INVERTCOLORS) { sortbrush=LKBrush_LightGreen; } else { sortbrush=LKBrush_DarkGreen; } if (DoInit[MDI_DRAWTHERMALHISTORY]) { if ( ScreenSize < (ScreenSize_t)sslandscape ) { left=rc.left+NIBLSCALE(1); right=rc.right-NIBLSCALE(1); bottom=rc.bottom-BottomSize-NIBLSCALE(2); s_maxnlname=MAXNLNAME-5; // 7 chars max, 8 sized _stprintf(Buffer,TEXT("MAKSJSMM")); } else { left=rc.left+NIBLSCALE(5); right=rc.right-NIBLSCALE(5); bottom=rc.bottom-BottomSize; s_maxnlname=MAXNLNAME-3; // 9 chars, sized 10 _stprintf(Buffer,TEXT("ABCDEFGHMx")); } SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest was LK8Title GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &WPTextSize); _stprintf(Buffer,TEXT("000.0")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &DSTextSize); _stprintf(Buffer,TEXT("<<123")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &BETextSize); _stprintf(Buffer,TEXT("5299")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &RETextSize); _stprintf(Buffer,TEXT("+9999")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &AATextSize); SelectObject(hdc, LK8InfoNormalFont); // Heading line was MapWindow QUI _stprintf(Buffer,TEXT("MMMM")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &HLTextSize); SelectObject(hdc, LK8PanelMediumFont); _stprintf(Buffer,TEXT("1.1")); GetTextExtentPoint(hdc, Buffer, _tcslen(Buffer), &MITextSize); short afterwpname=left+WPTextSize.cx+NIBLSCALE(5); short intercolumn=(right-afterwpname- DSTextSize.cx-BETextSize.cx-RETextSize.cx-AATextSize.cx)/3; Column0=MITextSize.cx+LEFTLIMITER+NIBLSCALE(5); Column1=left; // WP align left Column2=afterwpname+DSTextSize.cx; // DS align right Column3=Column2+intercolumn+BETextSize.cx; // BE align right Column4=Column3+intercolumn+RETextSize.cx; // RE align right Column5=Column4+intercolumn+AATextSize.cx; // AA align right if ( ScreenSize < (ScreenSize_t)sslandscape ) { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW; thistoryNumraws=(bottom - TopSize) / (WPTextSize.cy+(INTERRAW*2)); if (thistoryNumraws>MAXTHISTORY) thistoryNumraws=MAXTHISTORY; s_rawspace=(WPTextSize.cy+INTERRAW); } else { TopSize=rc.top+HEADRAW*2+HLTextSize.cy; p1.x=0; p1.y=TopSize; p2.x=rc.right; p2.y=p1.y; TopSize+=HEADRAW/2; thistoryNumraws=(bottom - TopSize) / (WPTextSize.cy+INTERRAW); if (thistoryNumraws>MAXTHISTORY) thistoryNumraws=MAXTHISTORY; s_rawspace=(WPTextSize.cy+INTERRAW); } #define INTERBOX intercolumn/2 // Thermal name s_sortBox[0].left=Column0; // FIX 090925 era solo 0 if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(2); else s_sortBox[0].right=left+WPTextSize.cx-NIBLSCALE(10); s_sortBox[0].top=2; s_sortBox[0].bottom=p1.y; SortBoxX[MSM_THERMALS][0]=s_sortBox[0].right; // Distance if ( ScreenSize < (ScreenSize_t)sslandscape ) s_sortBox[1].left=Column1+afterwpname-INTERBOX; else s_sortBox[1].left=Column1+afterwpname-INTERBOX-NIBLSCALE(2); s_sortBox[1].right=Column2+INTERBOX; s_sortBox[1].top=2; s_sortBox[1].bottom=p1.y; SortBoxX[MSM_THERMALS][1]=s_sortBox[1].right; // Bearing s_sortBox[2].left=Column2+INTERBOX; s_sortBox[2].right=Column3+INTERBOX; s_sortBox[2].top=2; s_sortBox[2].bottom=p1.y; SortBoxX[MSM_THERMALS][2]=s_sortBox[2].right; // Vario s_sortBox[3].left=Column3+INTERBOX; s_sortBox[3].right=Column4+INTERBOX; s_sortBox[3].top=2; s_sortBox[3].bottom=p1.y; SortBoxX[MSM_THERMALS][3]=s_sortBox[3].right; // Altitude s_sortBox[4].left=Column4+INTERBOX; //s_sortBox[4].right=Column5+INTERBOX; s_sortBox[4].right=rc.right-1; s_sortBox[4].top=2; s_sortBox[4].bottom=p1.y; SortBoxX[MSM_THERMALS][4]=s_sortBox[4].right; SortBoxY[MSM_THERMALS]=p1.y; THistoryNumpages=roundupdivision(MAXTHISTORY, thistoryNumraws); if (THistoryNumpages>MAXTHISTORYNUMPAGES) THistoryNumpages=MAXTHISTORYNUMPAGES; else if (THistoryNumpages<1) THistoryNumpages=1; SelectedRaw[MSM_THERMALS]=0; SelectedPage[MSM_THERMALS]=0; DoInit[MDI_DRAWTHERMALHISTORY]=false; return; } // doinit DoThermalHistory(&GPS_INFO, &CALCULATED_INFO); THistoryNumpages=roundupdivision(LKNumThermals, thistoryNumraws); if (THistoryNumpages>MAXTHISTORYNUMPAGES) THistoryNumpages=MAXTHISTORYNUMPAGES; else if (THistoryNumpages<1) THistoryNumpages=1; curpage=SelectedPage[curmapspace]; if (curpage<0||curpage>=MAXTHISTORYNUMPAGES) { #if TESTBENCH DoStatusMessage(_T("ERR-041 thermals curpage invalid")); // selection while waiting for data ready #endif SelectedPage[curmapspace]=0; LKevent=LKEVENT_NONE; return; } switch (LKevent) { case LKEVENT_NONE: break; case LKEVENT_ENTER: LKevent=LKEVENT_NONE; i=LKSortedThermals[SelectedRaw[curmapspace]+(curpage*thistoryNumraws)]; if ( (i<0) || (i>=MAXTHISTORY) || (CopyThermalHistory[i].Valid != true) ) { #if 0 // selection while waiting for data ready if (LKNumThermals>0) DoStatusMessage(_T("ERR-045 Invalid selection")); #endif break; } LKevent=LKEVENT_NONE; // Do not update while in details mode, max 10m LastDoThermalH=GPS_INFO.Time+600; dlgThermalDetails(i); LastDoThermalH=0; break; case LKEVENT_DOWN: if (++SelectedRaw[curmapspace] >=thistoryNumraws) SelectedRaw[curmapspace]=0; // Reset LastDoThermalH so that it wont be updated while selecting an item LastDoThermalH=GPS_INFO.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_UP: if (--SelectedRaw[curmapspace] <0) SelectedRaw[curmapspace]=thistoryNumraws-1; LastDoThermalH=GPS_INFO.Time+PAGINGTIMEOUT-1.0; break; case LKEVENT_PAGEUP: LKevent=LKEVENT_NONE; break; case LKEVENT_PAGEDOWN: LKevent=LKEVENT_NONE; break; case LKEVENT_NEWRUN: for (i=0; i<MAXTHISTORY; i++) { for (k=0; k<MAXTHISTORYNUMPAGES; k++) { _stprintf(Buffer1[i][k],_T("------------")); // 12 chars _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) _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_GREEN, rc); else _DrawLine(hdc, PS_SOLID, NIBLSCALE(1), p1, p2, RGB_DARKGREEN, rc); SelectObject(hdc, LK8InfoNormalFont); // Heading line short cursortbox=SortedMode[curmapspace]; if ( ScreenSize < (ScreenSize_t)sslandscape ) { // portrait mode FillRect(hdc,&s_sortBox[cursortbox], sortbrush); _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1670_")), curpage+1,THistoryNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0, WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1673_"))); // Avg if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1307_"))); // AltArr if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { FillRect(hdc,&s_sortBox[cursortbox], sortbrush); if ( (ScreenSize == (ScreenSize_t)ss640x480) || (ScreenSize == (ScreenSize_t)ss320x240)|| ScreenSize==ss896x672 ) { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1670_")), curpage+1,THistoryNumpages); // THE if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1300_ "Dist" _stprintf(Buffer, gettext(TEXT("_@M1300_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1301_ "Dir" _stprintf(Buffer, gettext(TEXT("_@M1301_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1673_"))); // Avg if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1307_"))); // AltArr if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } else { _stprintf(Buffer,TEXT("%d.%d"),ModeIndex,CURTYPE+1); SelectObject(hdc, LK8PanelMediumFont); LKWriteText(hdc, Buffer, LEFTLIMITER, rc.top+TOPLIMITER , 0, WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); SelectObject(hdc, LK8InfoNormalFont); // LKTOKEN _@M1670_ "THE" _stprintf(Buffer,TEXT("%s %d/%d"), gettext(TEXT("_@M1670_")), curpage+1,THistoryNumpages); if (cursortbox==0) LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column0, HEADRAW-NIBLSCALE(1) , 0,WTMODE_NORMAL, WTALIGN_LEFT, RGB_LIGHTGREEN, false); // LKTOKEN _@M1304_ "Distance" _stprintf(Buffer, gettext(TEXT("_@M1304_"))); if (cursortbox==1) LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column2, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); // LKTOKEN _@M1305_ "Direction" _stprintf(Buffer, gettext(TEXT("_@M1305_"))); if (cursortbox==2) LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column3, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1673_"))); // Avg if (cursortbox==3) LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column4, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); _stprintf(Buffer, gettext(TEXT("_@M1307_"))); // AltArr if (cursortbox==4) LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_BLACK, false); else LKWriteText(hdc, Buffer, Column5, HEADRAW , 0,WTMODE_NORMAL, WTALIGN_RIGHT, RGB_WHITE, false); } } // landscape mode SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest #ifdef DEBUG_LKT_DRAWTHISTORY TCHAR v2buf[100]; wsprintf(v2buf,_T("MAXTHISTORY=%d LKNumTherm=%d / thistoryNumraws=%d THistoryNumpages=%d calc=%d\n"),MAXTHISTORY, LKNumThermals,thistoryNumraws, THistoryNumpages, (short)(ceil(MAXTHISTORY/thistoryNumraws))); StartupStore(v2buf); #endif for (i=0, drawn_items_onpage=0; i<thistoryNumraws; i++) { iRaw=TopSize+(s_rawspace*i); short curraw=(curpage*thistoryNumraws)+i; if (curraw>=MAXTHISTORY) break; rli=LKSortedThermals[curraw]; #ifdef DEBUG_LKT_DRAWTHISTORY StartupStore(_T("..LKDrawThistory page=%d curraw=%d rli=%d \n"), curpage,curraw,rli); #endif if ( (rli>=0) && (CopyThermalHistory[rli].Valid==true) ) { // Thermal name wlen=wcslen(CopyThermalHistory[rli].Name); if (wlen>s_maxnlname) { LKASSERT(CopyThermalHistory[rli].Name); _tcsncpy(Buffer, CopyThermalHistory[rli].Name, s_maxnlname); Buffer[s_maxnlname]='\0'; } else { LKASSERT(CopyThermalHistory[rli].Name); _tcsncpy(Buffer, CopyThermalHistory[rli].Name, wlen); Buffer[wlen]='\0'; } if (IsThermalMultitarget(rli)) { TCHAR Buffer2[40]; _stprintf(Buffer2,_T(">%s"),Buffer); wcscpy(Buffer,Buffer2); } ConvToUpper(Buffer); _tcscpy(Buffer1[i][curpage],Buffer); // Distance value=CopyThermalHistory[rli].Distance*DISTANCEMODIFY; _stprintf(Buffer2[i][curpage],TEXT("%0.1lf"),value); // relative bearing if (!MapWindow::mode.Is(MapWindow::Mode::MODE_CIRCLING)) { value = CopyThermalHistory[rli].Bearing - GPS_INFO.TrackBearing; if (value < -180.0) value += 360.0; else if (value > 180.0) value -= 360.0; #ifndef __MINGW32__ if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f\xB0\xBB"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("\xAB%2.0f\xB0"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("\xAB\xBB")); #else if (value > 1) _stprintf(Buffer3[i][curpage], TEXT("%2.0f°»"), value); else if (value < -1) _stprintf(Buffer3[i][curpage], TEXT("«%2.0f°"), -value); else _tcscpy(Buffer3[i][curpage], TEXT("«»")); #endif } else { _stprintf(Buffer3[i][curpage], _T("%2.0f°"), CopyThermalHistory[rli].Bearing); } // Average lift value=LIFTMODIFY*CopyThermalHistory[rli].Lift; if (value<-99 || value>99) _stprintf(Buffer4[i][curpage],_T("---")); else { sprintf(text,"%+.1f",value); _stprintf(Buffer4[i][curpage],_T("%S"),text); } // Altitude value=ALTITUDEMODIFY*CopyThermalHistory[rli].Arrival; if (value<-1000 || value >45000 ) strcpy(text,"---"); else sprintf(text,"%.0f",value); wsprintf(Buffer5[i][curpage], TEXT("%S"),text); } else { // Empty thermals, fill in all empty data and maybe break loop _stprintf(Buffer1[i][curpage],_T("------------")); _stprintf(Buffer2[i][curpage],_T("---")); _stprintf(Buffer3[i][curpage],_T("---")); _stprintf(Buffer4[i][curpage],_T("---")); _stprintf(Buffer5[i][curpage],_T("---")); } if ((rli>=0) && (CopyThermalHistory[rli].Valid==true)) { drawn_items_onpage++; if (CopyThermalHistory[rli].Arrival >=0) { rcolor=RGB_WHITE; SelectObject(hdc, LK8InfoBigFont); } else { rcolor=RGB_LIGHTRED; SelectObject(hdc, LK8InfoBigItalicFont); } } else rcolor=RGB_GREY; LKWriteText(hdc, Buffer1[i][curpage], Column1, iRaw , 0, WTMODE_NORMAL, WTALIGN_LEFT, rcolor, false); SelectObject(hdc, LK8InfoBigFont); // Text font for Nearest LKWriteText(hdc, Buffer2[i][curpage], Column2, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer3[i][curpage], Column3, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer4[i][curpage], Column4, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); LKWriteText(hdc, Buffer5[i][curpage], Column5, iRaw , 0, WTMODE_NORMAL, WTALIGN_RIGHT, rcolor, false); } // for if (LKevent==LKEVENT_NEWRUN || LKevent==LKEVENT_NEWPAGE ) { LKevent=LKEVENT_NONE; return; } if (drawn_items_onpage>0) { if (SelectedRaw[curmapspace] <0 || SelectedRaw[curmapspace]>(thistoryNumraws-1)) { LKevent=LKEVENT_NONE; // 100328 return; } if (SelectedRaw[curmapspace] >= drawn_items_onpage) { if (LKevent==LKEVENT_DOWN) SelectedRaw[curmapspace]=0; else if (LKevent==LKEVENT_UP) SelectedRaw[curmapspace]=drawn_items_onpage-1; else { SelectedRaw[curmapspace]=0; } } invsel.left=left; invsel.right=right; invsel.top=TopSize+(s_rawspace*SelectedRaw[curmapspace])+NIBLSCALE(2); invsel.bottom=TopSize+(s_rawspace*(SelectedRaw[curmapspace]+1))-NIBLSCALE(1); InvertRect(hdc,&invsel); } LKevent=LKEVENT_NONE; return; }
int _jGetString(char *dest, char *start, int maxlen, GS_TYPE type) { /* * Returns 1 if OK; 0 if rejected or quit. */ int y; event e; int i; int startx; int key; curpos = 0; HideCursor(); startx = QueryX(); y = QueryY(); lrects = malloc(maxlen * sizeof(rect)); for (i = 0; i < maxlen; i++) { rect R; R.Xmin = startx + i * StringWidthX; R.Xmax = R.Xmin + StringWidthX - 1; R.Ymax = y; R.Ymin = R.Ymax - FontHeight + 1; lrects[i] = R; } tbuf = malloc(maxlen + 1); memset(tbuf, ' ', maxlen); tbuf[maxlen] = 0; i = 0; if (start) { for (i = 0; i < maxlen && start[i]; i++) tbuf[i] = start[i]; } curpos = min(i, maxlen - 1); TextAlign(alignLeft, alignBottom); DrawString(tbuf); /* Now highlight somebody */ InvertRect(&lrects[curpos]); while (1) { key = 0; KeyEvent(true, &e); if (e.ASCII && e.ASCII != 0xe0) key = e.ASCII; else if (e.ScanCode != 0xff) key = e.ScanCode << 8; if (key) { if (key == 0x0d || key == 0x1b) break; if (key == 0x08) /* backspace */ backspace(maxlen); else if (key == 0x15) /* control U */ { while(curpos) backspace(maxlen); } else { int acceptable = 0; if (type == GS_ANYTHING) acceptable = isprint(key); else if (type == GS_INTEGER) acceptable = isdigit(key) || key == '-'; else if (type == GS_UNSIGNED) acceptable = isdigit(key); else if (type == GS_FLOAT) acceptable = isdigit(key) || key == '.' || key == '-' || key == 'E' || key == 'e'; if (acceptable) { InvertRect(&lrects[curpos]); MoveTo(lrects[curpos].Xmin, lrects[curpos].Ymax); DrawChar(key); tbuf[curpos] = key; if (curpos < maxlen - 1) curpos++; InvertRect(&lrects[curpos]); } } } else { int button = (e.State & 0x700) >> 8; if (button == swRight) { key = 0x1b; break; } } } if (key != 0x1b) strcpy(dest, tbuf); ShowCursor(); free(lrects); free(tbuf); return (key != 0x1b); }
void nsRenderingContext::InvertRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight) { InvertRect(nsRect(aX, aY, aWidth, aHeight)); }
//************************************************************************ // CLCDInput::Draw //************************************************************************ bool CLCDInput::Draw(CLCDGfx *pGfx) { if(!CLCDTextObject::Draw(pGfx)) return false; SelectObject(pGfx->GetHDC(),m_hFont); RECT rBoundary = { 0, 0,0 + GetWidth(), 0 + GetHeight() }; int iLine = m_iLinePosition; int iEndLine = m_iLinePosition + m_iLineCount; int iLen = 0; TCHAR *pcOffset = NULL; while(iLine < iEndLine && iLine < m_vLineOffsets.size()) { // Calculate the text length if(iLine < m_vLineOffsets.size() -1) { iLen = m_vLineOffsets[iLine+1].iOffset - m_vLineOffsets[iLine].iOffset; // Draw the linebreak marker if(m_bShowSymbols && m_vLineOffsets[iLine+1].bLineBreak) pGfx->DrawFilledRect(m_vLineOffsets[iLine].iWidth+1,rBoundary.top+m_iFontHeight/3,m_iFontHeight/3,m_iFontHeight/3); } else iLen = (int)m_strText.length() - m_vLineOffsets[iLine].iOffset; // Draw the text pcOffset = (TCHAR*)m_strText.c_str() + m_vLineOffsets[iLine].iOffset; DrawTextEx(pGfx->GetHDC(), (LPTSTR)pcOffset, iLen, &rBoundary, m_iTextFormat, &m_dtp); // Draw the input cursor if(m_pInput && m_bShowMarker && m_Marker[0].iLine == iLine) { // insert-mode cursor if(m_bInsert ||m_Marker[0].iXWidth == 1) { pGfx->DrawFilledRect(m_Marker[0].iXLine, m_iFontHeight*(iLine-m_iLinePosition), 1, m_iFontHeight); } // replace-mode cursor else { RECT rMarker = {m_Marker[0].iXLine, m_iFontHeight*(iLine-m_iLinePosition), m_Marker[0].iXLine+m_Marker[0].iXWidth, m_iFontHeight*(iLine-m_iLinePosition+1)}; InvertRect(pGfx->GetHDC(),&rMarker); } } rBoundary.top += m_iFontHeight; rBoundary.bottom += m_iFontHeight; iLine++; } return true; }
void CMotSeqDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default char tchBuffer[2048]; RECT rect; TEXTMETRIC tm; int i; int OffSet; stcLogOdds* pLogOdds; if ( ( lpDrawItemStruct->CtlType == ODT_LISTBOX) && (lpDrawItemStruct->CtlID == IDC_LISTMOTIF) && (lpDrawItemStruct->itemID != -1) ) { GetTextMetrics( lpDrawItemStruct->hDC, &tm); OffSet = tm.tmHeight * 7; switch ( lpDrawItemStruct->itemAction ) { case ODA_DRAWENTIRE: pLogOdds = (stcLogOdds *)lpDrawItemStruct->itemData; sprintf ( tchBuffer, "%s", (const char *)pLogOdds->strName ); // OffSet = LOWORD(GetTextExtent( lpDrawItemStruct->hDC, tchBuffer, 5 )); SetBkColor ( lpDrawItemStruct->hDC, RGB(255,255,255) ); SetTextColor ( lpDrawItemStruct->hDC, RGB(0,0,0) ); rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; ExtTextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, ETO_CLIPPED, &rect, tchBuffer, pLogOdds->strName.GetLength(), NULL ); // Bingo .. m_listMotif.GetText( lpDrawItemStruct->itemID, tchBuffer ); for ( i = strlen ( tchBuffer ); i < 100; ++i ) { tchBuffer[i] = ' '; } tchBuffer[i] = 0; SetBkColor ( lpDrawItemStruct->hDC, pLogOdds->rgbBack ); SetTextColor ( lpDrawItemStruct->hDC, pLogOdds->rgbText ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left + OffSet, lpDrawItemStruct->rcItem.top, tchBuffer, strlen(tchBuffer) ); if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); } break; case ODA_SELECT: rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); break; } } }
void CEditView::Draw( HDC hDC, LPRECT prcClipBox, CSelection *pSel ) const { // prcClipBox is control-relative, not view-relative int nRowStart = ( max( m_rcView.top, prcClipBox->top ) - m_rcView.top ) / m_cyLine; int ySnap = m_rcView.top + nRowStart * m_cyLine; nRowStart += m_nTopIndex; int nRowEnd = m_nTopIndex + ( min( prcClipBox->bottom, m_rcView.bottom ) - m_rcView.top ) / m_cyLine; //#define _DRAWCHARGRID #ifdef _DRAWCHARGRID { RECT rc; if ( IntersectRect( &rc, prcClipBox, &m_rcView ) ) { rc.left = GetLeftMargin( TRUE, TRUE ); HPEN hPen = CreatePen( PS_SOLID, 0, RGB( 192, 192, 192 ) ); HPEN hPenOld = ( HPEN ) SelectObject( hDC, hPen ); int xStart = m_rcView.left + GetLeftMargin( TRUE, TRUE ) + ( ( prcClipBox->left - m_rcView.left ) / m_cxChar ) * m_cxChar; int xEnd = min( prcClipBox->right, m_rcView.right ); int yStart = ySnap; int yEnd = min( prcClipBox->bottom, m_rcView.bottom ); for ( int y = yStart; y <= yEnd; y += m_cyLine ) { MoveToEx( hDC, rc.left, y, NULL ); LineTo( hDC, rc.right, y ); } for ( int x = xStart; x <= xEnd; x += m_cxChar ) { MoveToEx( hDC, x, rc.top, NULL ); LineTo( hDC, x, rc.bottom ); } SelectObject( hDC, hPenOld ); DeleteObject( hPen ); } } #endif int nLastLine = m_pBuffer->GetLineCount() - 1; nLastLine = min( nLastLine, nRowEnd ); int nSelStartCol, nSelStartRow, nSelEndCol, nSelEndRow; BOOL bColumnSel = FALSE; int cxCaret = 0; if ( pSel ) { pSel->GetNormalizedViewSelection( nSelStartCol, nSelStartRow, nSelEndCol, nSelEndRow ); bColumnSel = pSel->IsColumnSel(); cxCaret = pSel->GetCaretWidth(); } int cxLeftMargin1 = GetLeftMargin( FALSE ); COLORREF crVDividerLines = m_pCtrl->GetVDividerLineColor(); // draw the left margin in a different color if ( cxLeftMargin1 ) { COLORREF crMargin = m_pCtrl->GetLeftMarginColor(); if ( crMargin != CLR_INVALID ) { RECT rc = m_rcView; rc.right = rc.left + cxLeftMargin1; SetBkColor( hDC, crMargin ); ExtTextOut( hDC, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL ); } } // draw the line numbers in a different color int cxLeftMargin2 = GetLeftMargin( TRUE ); if ( cxLeftMargin2 != cxLeftMargin1 ) { COLORREF crLineNumbers = m_pCtrl->GetLineNumberBackColor(); if ( crLineNumbers != CLR_INVALID ) { RECT rc = m_rcView; rc.left = m_rcView.left + cxLeftMargin1; rc.right = m_rcView.left + cxLeftMargin2; SetBkColor( hDC, crLineNumbers ); ExtTextOut( hDC, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL ); } } // draw the divider lines if ( crVDividerLines != CLR_INVALID ) { if ( cxLeftMargin1 ) DrawVDividerLine( hDC, m_rcView, m_rcView.left + cxLeftMargin1 ); if ( cxLeftMargin1 != cxLeftMargin2 ) DrawVDividerLine( hDC, m_rcView, m_rcView.left + cxLeftMargin2 ); } int cxLeftMargin3 = GetLeftMargin( TRUE, TRUE ); // draw the stuff in the left margin in one pass, rather than with each // line. This is much faster. int y = ySnap; int xLineNumber = m_rcView.left + cxLeftMargin1; int nLineNumRadix; BOOL bLineNumbers; // if line numbering, select the font once, or else things slow down a bit // if done for each line if ( ( bLineNumbers = m_pCtrl->LineNumberingEnabled( nLineNumRadix ) ) == TRUE ) { SetTextCharacterExtra( hDC, 0 ); SelectObject( hDC, m_pCtrl->GetLineNumberFont() ); SetTextColor( hDC, m_pCtrl->GetLineNumberForeColor() ); ::SetBkMode( hDC, TRANSPARENT ); } int cyDescentShiftNormal = m_pCtrl->m_font->cyDescentShift; int nLine; for ( nLine = nRowStart; nLine <= nLastLine; nLine++ ) { // draw the bookmark and images if present if ( cxLeftMargin1 > 0 ) { BOOL bHasBookmark = m_pBuffer->HasBookmark( nLine ); BYTE byImages = m_pBuffer->GetMarginImages( nLine ); if ( bHasBookmark || byImages ) { DrawLeftMarginImages( hDC, bHasBookmark, byImages, m_rcView.left, y ); } } // Draw the line number if asked to if ( bLineNumbers ) { DrawLineNumber( nLine, nLineNumRadix, hDC, xLineNumber, y - cyDescentShiftNormal ); } y += m_cyLine; } int x = m_rcView.left + cxLeftMargin3; int xDividerStart = m_rcView.left + cxLeftMargin2; // draw the text for ( nLine = nRowStart, y = ySnap; nLine <= nLastLine; nLine++, y += m_cyLine ) DrawLine( nLine, hDC, x, y, xDividerStart ); // draw the selection as a separate pass, because the text will overlap slightly // (for tighter display), and the invert code would end up double-inverting the // overlapping regions, resulting in normal display. if ( pSel ) { for ( nLine = nRowStart, y = ySnap; nLine <= nLastLine; nLine++, y += m_cyLine ) { if ( ( nLine >= nSelStartRow ) && ( nLine <= nSelEndRow ) ) { RECT rcInvert; rcInvert.top = y; rcInvert.bottom = y + m_cyLine; if ( bColumnSel ) { int xSel = nSelStartCol - m_nLeftIndex; xSel = max( 0, xSel ); rcInvert.left = m_rcView.left + xSel * m_cxChar + cxLeftMargin3; xSel = nSelEndCol - m_nLeftIndex; xSel = max( 0, xSel ); rcInvert.right = m_rcView.left + xSel * m_cxChar + cxLeftMargin3; if ( rcInvert.left == rcInvert.right ) { // Is a column selection and is 'empty' -- make selection appear as a // giant insertion cursor rcInvert.right = rcInvert.left + cxCaret; } } else { int xSel = ( nLine == nSelStartRow ) ? nSelStartCol - m_nLeftIndex : 0; xSel = max( 0, xSel ); rcInvert.left = m_rcView.left + xSel * m_cxChar + cxLeftMargin3; rcInvert.left = max( rcInvert.left, x ); xSel = ( nLine == nSelEndRow ) ? ( nSelEndCol - m_nLeftIndex ) : ( m_nRightIndex - m_nLeftIndex + 1 ); rcInvert.right = m_rcView.left + xSel * m_cxChar + cxLeftMargin3; rcInvert.right = max( rcInvert.right, x ); } int xMaxLeft = m_rcView.left + cxLeftMargin2; rcInvert.left = max( rcInvert.left, xMaxLeft ); rcInvert.right = max( rcInvert.right, xMaxLeft ); InvertRect( hDC, &rcInvert ); } } } if ( m_pCtrl->ShowHScrollBar() && m_pCtrl->ShowVScrollBar() ) { // Draw the size box HBRUSH hbr = CreateSolidBrush( GetSysColor( COLOR_BTNFACE ) ); RECT rcBox = m_rcAll; rcBox.left = rcBox.right - GetSystemMetrics( SM_CXVSCROLL ); rcBox.top = rcBox.bottom - GetSystemMetrics( SM_CYHSCROLL ); FillRect( hDC, &rcBox, hbr ); DeleteObject( hbr ); } }
static void NEAR PASCAL ClockwiseBox (HWND hWnd,int x,int y) /***********************************************************************/ { HDC hDC; int nCells; RECT rCell; RECT rClient; RECT rDone; RECT rTemp; GetClientRect (hWnd,&rClient); nCells = (max (rClient.right,rClient.bottom) * 2 + 19) / 20; nCells *= nCells; rCell.left = x - 10; rCell.right = x + 10; rCell.top = y - 10; rCell.bottom = y + 10; hDC = GetDC (hWnd); InvertRect (hDC,&rCell); nCells--; rDone = rCell; while (nCells > 0) { while (rCell.bottom > rDone.top) // go north { rCell.top -= 20; rCell.bottom -= 20; if (rCell.bottom > rClient.top) InvertRect (hDC,&rCell); nCells--; } rTemp.top = rCell.top; while (rCell.left < rDone.right) // go east { rCell.left += 20; rCell.right += 20; if (rCell.left < rClient.right) InvertRect (hDC,&rCell); nCells--; } rTemp.right = rCell.right; while (rCell.top < rDone.bottom) // go south { rCell.top += 20; rCell.bottom += 20; if (rCell.top < rClient.bottom) InvertRect (hDC,&rCell); nCells--; } rTemp.bottom = rCell.bottom; while (rCell.right > rDone.left) // go west { rCell.left -= 20; rCell.right -= 20; if (rCell.right > rClient.left) InvertRect (hDC,&rCell); nCells--; } rTemp.left = rCell.left; rDone = rTemp; } FillRect (hDC,&rClient,(HBRUSH) GetStockObject (WHITE_BRUSH)); ReleaseDC (hWnd,hDC); }
void BButton::Draw(BRect updateRect) { if (be_control_look != NULL) { BRect rect(Bounds()); rgb_color background = LowColor(); rgb_color base = background; uint32 flags = be_control_look->Flags(this); if (IsDefault()) flags |= BControlLook::B_DEFAULT_BUTTON; be_control_look->DrawButtonFrame(this, rect, updateRect, base, background, flags); be_control_look->DrawButtonBackground(this, rect, updateRect, base, flags); // always leave some room around the label rect.InsetBy(3.0, 3.0); be_control_look->DrawLabel(this, Label(), rect, updateRect, base, flags, BAlignment(B_ALIGN_CENTER, B_ALIGN_MIDDLE)); return; } font_height fh; GetFontHeight(&fh); const BRect bounds = Bounds(); BRect rect = bounds; const bool enabled = IsEnabled(); const bool pushed = Value() == B_CONTROL_ON; // Default indicator if (IsDefault()) rect = _DrawDefault(rect, enabled); BRect fillArea = rect; fillArea.InsetBy(3.0, 3.0); BString text = Label(); #if 1 // Label truncation BFont font; GetFont(&font); font.TruncateString(&text, B_TRUNCATE_END, fillArea.Width() - 4); #endif // Label position const float stringWidth = StringWidth(text.String()); const float x = (rect.right - stringWidth) / 2.0; const float labelY = bounds.top + ((bounds.Height() - fh.ascent - fh.descent) / 2.0) + fh.ascent + 1.0; const float focusLineY = labelY + fh.descent; /* speed trick: if the focus changes but the button is not pressed then we can redraw only the focus line, if the focus changes and the button is pressed invert the internal rect this block takes care of all the focus changes */ if (IsFocusChanging()) { if (pushed) { rect.InsetBy(2.0, 2.0); InvertRect(rect); } else { _DrawFocusLine(x, focusLineY, stringWidth, IsFocus() && Window()->IsActive()); } return; } // colors rgb_color panelBgColor = ui_color(B_PANEL_BACKGROUND_COLOR); rgb_color buttonBgColor = tint_color(panelBgColor, B_LIGHTEN_1_TINT); rgb_color lightColor; rgb_color maxLightColor; rgb_color dark1BorderColor; rgb_color dark2BorderColor; rgb_color bevelColor1; rgb_color bevelColor2; rgb_color bevelColorRBCorner; rgb_color borderBevelShadow; rgb_color borderBevelLight; if (enabled) { lightColor = tint_color(panelBgColor, B_LIGHTEN_2_TINT); maxLightColor = tint_color(panelBgColor, B_LIGHTEN_MAX_TINT); dark1BorderColor = tint_color(panelBgColor, B_DARKEN_3_TINT); dark2BorderColor = tint_color(panelBgColor, B_DARKEN_4_TINT); bevelColor1 = tint_color(panelBgColor, B_DARKEN_2_TINT); bevelColor2 = panelBgColor; if (IsDefault()) { borderBevelShadow = tint_color(dark1BorderColor, (B_NO_TINT + B_DARKEN_1_TINT) / 2); borderBevelLight = tint_color(dark1BorderColor, B_LIGHTEN_1_TINT); borderBevelLight.red = (borderBevelLight.red + panelBgColor.red) / 2; borderBevelLight.green = (borderBevelLight.green + panelBgColor.green) / 2; borderBevelLight.blue = (borderBevelLight.blue + panelBgColor.blue) / 2; dark1BorderColor = tint_color(dark1BorderColor, B_DARKEN_3_TINT); dark2BorderColor = tint_color(dark1BorderColor, B_DARKEN_4_TINT); bevelColorRBCorner = borderBevelShadow; } else { borderBevelShadow = tint_color(panelBgColor, (B_NO_TINT + B_DARKEN_1_TINT) / 2); borderBevelLight = buttonBgColor; bevelColorRBCorner = dark1BorderColor; } } else { lightColor = tint_color(panelBgColor, B_LIGHTEN_2_TINT); maxLightColor = tint_color(panelBgColor, B_LIGHTEN_1_TINT); dark1BorderColor = tint_color(panelBgColor, B_DARKEN_1_TINT); dark2BorderColor = tint_color(panelBgColor, B_DARKEN_2_TINT); bevelColor1 = panelBgColor; bevelColor2 = buttonBgColor; if (IsDefault()) { borderBevelShadow = dark1BorderColor; borderBevelLight = panelBgColor; dark1BorderColor = tint_color(dark1BorderColor, B_DARKEN_1_TINT); dark2BorderColor = tint_color(dark1BorderColor, 1.16); } else { borderBevelShadow = panelBgColor; borderBevelLight = panelBgColor; } bevelColorRBCorner = tint_color(panelBgColor, 1.08);; } // fill the button area SetHighColor(buttonBgColor); FillRect(fillArea); BeginLineArray(22); // bevel around external border AddLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top), borderBevelShadow); AddLine(BPoint(rect.left + 1, rect.top), BPoint(rect.right, rect.top), borderBevelShadow); AddLine(BPoint(rect.right, rect.top + 1), BPoint(rect.right, rect.bottom), borderBevelLight); AddLine(BPoint(rect.left + 1, rect.bottom), BPoint(rect.right - 1, rect.bottom), borderBevelLight); rect.InsetBy(1.0, 1.0); // external border AddLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top), dark1BorderColor); AddLine(BPoint(rect.left + 1, rect.top), BPoint(rect.right, rect.top), dark1BorderColor); AddLine(BPoint(rect.right, rect.top + 1), BPoint(rect.right, rect.bottom), dark2BorderColor); AddLine(BPoint(rect.right - 1, rect.bottom), BPoint(rect.left + 1, rect.bottom), dark2BorderColor); rect.InsetBy(1.0, 1.0); // Light AddLine(BPoint(rect.left, rect.top), BPoint(rect.left, rect.top), buttonBgColor); AddLine(BPoint(rect.left, rect.top + 1), BPoint(rect.left, rect.bottom - 1), lightColor); AddLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.bottom), bevelColor2); AddLine(BPoint(rect.left + 1, rect.top), BPoint(rect.right - 1, rect.top), lightColor); AddLine(BPoint(rect.right, rect.top), BPoint(rect.right, rect.top), bevelColor2); // Shadow AddLine(BPoint(rect.left + 1, rect.bottom), BPoint(rect.right - 1, rect.bottom), bevelColor1); AddLine(BPoint(rect.right, rect.bottom), BPoint(rect.right, rect.bottom), bevelColorRBCorner); AddLine(BPoint(rect.right, rect.bottom - 1), BPoint(rect.right, rect.top + 1), bevelColor1); rect.InsetBy(1.0, 1.0); // Light AddLine(BPoint(rect.left, rect.top), BPoint(rect.left, rect.bottom - 1), maxLightColor); AddLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.bottom), buttonBgColor); AddLine(BPoint(rect.left + 1, rect.top), BPoint(rect.right - 1, rect.top), maxLightColor); AddLine(BPoint(rect.right, rect.top), BPoint(rect.right, rect.top), buttonBgColor); // Shadow AddLine(BPoint(rect.left + 1, rect.bottom), BPoint(rect.right, rect.bottom), bevelColor2); AddLine(BPoint(rect.right, rect.bottom - 1), BPoint(rect.right, rect.top + 1), bevelColor2); rect.InsetBy(1.0,1.0); EndLineArray(); // Invert if clicked if (enabled && pushed) { rect.InsetBy(-2.0, -2.0); InvertRect(rect); } // Label color if (enabled) { if (pushed) { SetHighColor(maxLightColor); SetLowColor(255 - buttonBgColor.red, 255 - buttonBgColor.green, 255 - buttonBgColor.blue); } else { SetHighColor(ui_color(B_CONTROL_TEXT_COLOR)); SetLowColor(buttonBgColor); } } else { SetHighColor(tint_color(panelBgColor, B_DISABLED_LABEL_TINT)); SetLowColor(buttonBgColor); } // Draw the label DrawString(text.String(), BPoint(x, labelY)); // Focus line if (enabled && IsFocus() && Window()->IsActive() && !pushed) _DrawFocusLine(x, focusLineY, stringWidth, true); }
HRESULT CGifSmileyCtrl::OnDrawSmiley(ATL_DRAWINFO& di, bool bCustom=false) { USES_CONVERSION; if (di.dwDrawAspect != DVASPECT_CONTENT) { return E_FAIL; } if ( bCustom && !IsVisible(di)) { return S_OK; } if (!m_pGifImage) { return E_FAIL; } RECT& rc = *(RECT*)di.prcBounds; HRGN hOldRgn, hNewRgn; if (!IsRectEmpty(&m_rectPos)) { //strange workaround for drawing zoom out smileys (look MS calculate it one pix larger than exactly) if (rc.bottom-rc.top-1 == m_rectPos.bottom-m_rectPos.top && rc.right-rc.left== m_rectPos.right-m_rectPos.left) rc.top+=1; } if ( bCustom )SelectSmileyClipRgn(di.hdcDraw, rc, hOldRgn, hNewRgn, TRUE); InflateRect(&rc,-1,0); //border offset to fix blinked cursor painting if ( (m_dwFlags&REO_INVERTEDSELECT) == 0 || !bCustom || m_bTransparent) DoDrawSmiley(di.hdcDraw, rc, rc.right-rc.left,rc.bottom-rc.top, m_nFrameSize.Width, m_nFrameSize.Height); else { Bitmap bmp(rc.right-rc.left,rc.bottom-rc.top, PixelFormat32bppARGB); Graphics g(&bmp); COLORREF col=(COLORREF)(m_clrBackColor); SolidBrush brush(Color(GetRValue(col),GetGValue(col),GetBValue(col))); g.FillRectangle( &brush, 0 ,0, rc.right-rc.left, rc.bottom-rc.top); HDC hdc=g.GetHDC(); RECT mrc={0}; mrc.right=rc.right-rc.left; mrc.bottom=rc.bottom-rc.top; DoDrawSmiley(hdc, mrc, mrc.right-mrc.left,mrc.bottom-mrc.top, m_nFrameSize.Width, m_nFrameSize.Height); InvertRect(hdc, &mrc); BitBlt(di.hdcDraw, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hdc, 0, 0, SRCCOPY ); g.ReleaseHDC(hdc); } if ((m_dwFlags&REO_SELECTED) == REO_SELECTED && bCustom) { //Draw frame around HBRUSH oldBrush=(HBRUSH)SelectObject(di.hdcDraw, GetStockObject(NULL_BRUSH)); HPEN oldPen=(HPEN)SelectObject(di.hdcDraw, GetStockObject(BLACK_PEN)); ::Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom ); SelectObject(di.hdcDraw, oldBrush); SelectObject(di.hdcDraw, oldPen); } AdvanceFrame(); if (!bCustom) m_bPaintValid=false; ResetClip(di.hdcDraw, hOldRgn, hNewRgn); return S_OK; }
BOOL CTextLayout::Render(HDC hdc, const WCHAR *psz, UINT nCnt, UINT nSelStart, UINT nSelEnd, const COMPOSITIONRENDERINFO *pCompositionRenderInfo, UINT nCompositionRenderInfo) { POINT ptCurrent; ptCurrent.x = 0; ptCurrent.y = 0; SetBkMode(hdc, OPAQUE); SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT)); SetBkColor(hdc, GetSysColor(COLOR_WINDOW)); // Render lines for (UINT i = 0; i < _nLineCnt; i++) { if (_prgLines[i].nCnt) { TextOut(hdc, ptCurrent.x, ptCurrent.y, psz + _prgLines[i].nPos, _prgLines[i].nCnt); } ptCurrent.x = 0; ptCurrent.y += _nLineHeight; } _fCaret = FALSE; // Render selection/caret RECT rcSel; if (_nLineCnt) { for (UINT i = 0; i < _nLineCnt; i++) { if ((nSelEnd >= _prgLines[i].nPos) && (nSelStart <= _prgLines[i].nPos + _prgLines[i].nCnt)) { UINT nSelStartInLine = 0; UINT nSelEndInLine = _prgLines[i].nCnt; if (nSelStart > _prgLines[i].nPos) nSelStartInLine = nSelStart - _prgLines[i].nPos; if (nSelEnd < _prgLines[i].nPos + _prgLines[i].nCnt) nSelEndInLine = nSelEnd - _prgLines[i].nPos; if (nSelStartInLine != nSelEndInLine) { for (UINT j = nSelStartInLine; j < nSelEndInLine; j++) { InvertRect(hdc, &_prgLines[i].prgCharInfo[j].rc); } } else { if (nSelStartInLine == _prgLines[i].nCnt) { rcSel = _prgLines[i].prgCharInfo[nSelStartInLine - 1].rc; rcSel.left = rcSel.right; rcSel.right++; } else { rcSel = _prgLines[i].prgCharInfo[nSelStartInLine].rc; rcSel.right = rcSel.left + 1; } InvertRect(hdc, &rcSel); _fCaret = TRUE; _rcCaret = rcSel; } } for (UINT j = 0; j < nCompositionRenderInfo; j++) { if ((pCompositionRenderInfo[j].nEnd >= _prgLines[i].nPos) && (pCompositionRenderInfo[j].nStart <= _prgLines[i].nPos + _prgLines[i].nCnt)) { UINT nCompStartInLine = 0; UINT nCompEndInLine = _prgLines[i].nCnt; int nBaseLineWidth = (_nLineHeight / 18) + 1; if (pCompositionRenderInfo[j].nStart > _prgLines[i].nPos) nCompStartInLine = pCompositionRenderInfo[j].nStart - _prgLines[i].nPos; if (pCompositionRenderInfo[j].nEnd < _prgLines[i].nPos + _prgLines[i].nCnt) nCompEndInLine = pCompositionRenderInfo[j].nEnd - _prgLines[i].nPos; for (UINT k = nCompStartInLine; k < nCompEndInLine; k++) { UINT uCurrentCompPos = _prgLines[i].nPos + k - pCompositionRenderInfo[j].nStart; BOOL bClause = FALSE; if (k + 1 == nCompEndInLine) { bClause = TRUE; } if ((pCompositionRenderInfo[j].da.crText.type != TF_CT_NONE) && (pCompositionRenderInfo[j].da.crBk.type != TF_CT_NONE)) { SetBkMode(hdc, OPAQUE); SetTextColor(hdc, GetAttributeColor(&pCompositionRenderInfo[j].da.crText)); SetBkColor(hdc, GetAttributeColor(&pCompositionRenderInfo[j].da.crBk)); RECT rc = _prgLines[i].prgCharInfo[k].rc; ExtTextOut(hdc, rc.left, rc.top, ETO_OPAQUE, &rc, psz + _prgLines[i].nPos + k, 1, NULL); } if (pCompositionRenderInfo[j].da.lsStyle != TF_LS_NONE) { HPEN hpen = CreateUnderlinePen(&pCompositionRenderInfo[j].da, nBaseLineWidth); if (hpen) { HPEN hpenOrg; hpenOrg = (HPEN)SelectObject(hdc, hpen); RECT rc = _prgLines[i].prgCharInfo[k].rc; POINT pts[2]; pts[0].x = rc.left; pts[0].y = rc.bottom; pts[1].x = rc.right - (bClause ? nBaseLineWidth : 0); pts[1].y = rc.bottom; Polyline(hdc, pts, 2); SelectObject(hdc, hpenOrg); } } } } } } } else { rcSel.left = 0; rcSel.top = 0; rcSel.right = 1; rcSel.bottom = _nLineHeight; InvertRect(hdc, &rcSel); _fCaret = TRUE; _rcCaret = rcSel; } return TRUE; }
NS_IMETHODIMP nsThebesRenderingContext::InvertRect(nscoord aX, nscoord aY, nscoord aWidth, nscoord aHeight) { return InvertRect(nsRect(aX, aY, aWidth, aHeight)); }
/******************************************************************************* ** Paint the DIL. ** The DIL consists of a recessed border with a hint. It may also be displaying ** a progress meter, if in progress mode. **/ VOID NEAR PaintDil(HDC hDC) { HPEN hOldPen; // Old device pen. HFONT hOldFont; // Old device font. RECT rcClip; // Text clipping rectangle. /* ** Draw border. */ /* Draw window top black line. */ hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); MoveToEx(hDC, 0, 0, NULL); LineTo(hDC, iDilWidth, 0); /* Draw hint border top-left portion. */ MoveToEx(hDC, LFT_BORDER, iDilHeight-BOT_BORDER, NULL); LineTo(hDC, LFT_BORDER, TOP_BORDER); LineTo(hDC, iDilWidth-RGT_BORDER, TOP_BORDER); /* Draw window top white line. */ SelectObject(hDC, GetStockObject(WHITE_PEN)); MoveToEx(hDC, 0, 1, NULL); LineTo(hDC, iDilWidth, 1); /* Draw hint border bottom-right portion. */ MoveToEx(hDC, LFT_BORDER, iDilHeight-BOT_BORDER, NULL); LineTo(hDC, iDilWidth-RGT_BORDER, iDilHeight-BOT_BORDER); LineTo(hDC, iDilWidth-RGT_BORDER, TOP_BORDER); /* Restore HDC. */ SelectObject(hDC, hOldPen); /* ** Draw hint. */ /* Setup text. */ hOldFont = SelectObject(hDC, hDilFont); SetTextAlign(hDC, TA_TOP | TA_LEFT); SetBkMode(hDC, TRANSPARENT); /* Setup clipping rectangle. */ rcClip.left = LFT_BORDER; rcClip.top = TOP_BORDER; rcClip.right = iDilWidth-RGT_BORDER; rcClip.bottom = iDilHeight-BOT_BORDER; /* Output text. */ ExtTextOut(hDC, LFT_BORDER + TEXT_OFFSET, TOP_BORDER, ETO_CLIPPED, (LPRECT) &rcClip, (LPSTR) szDilHint, lstrlen((LPSTR) szDilHint), NULL); /* Restore HDC. */ SelectObject(hDC, hOldFont); /* ** Draw mode information. */ if (iDilMode == DIL_PROGRESS) { RECT rcArea; /* Area to fill. */ int iMeterWidth; /* Meter width. */ /* Calculate meter width. */ iMeterWidth = iDilWidth - LFT_BORDER - RGT_BORDER; /* Calculate the new area. */ rcArea.left = LFT_BORDER; rcArea.top = TOP_BORDER; rcArea.right = (int) (((long) iDilLast * (long) iMeterWidth) / (long) iDilMax); rcArea.bottom = iDilHeight - BOT_BORDER + 1; /* Adjust for border. */ rcArea.right += LFT_BORDER; /* Perform the update. */ InvertRect(hDC, (LPRECT) &rcArea); } }
void TLDisplay::DrawScene() { //STLBlocs::value_type bloc; char strpos[200]; int y, yy, frame, w; float x, x2; float step = (ScaleX+ScaleMouseX) * (float)PixBlocW; float stepY = (ScaleY+ScaleMouseY) * (float)PixBlocH; x2 = (int)(step * (xoffs + NumFrames)); if(x2 > bmpW) x2 = bmpW; // //----> y is the 0 level // y = bmpH/2; y += yoffs; // //----> Clear the Screen // SelectObject(bmpDC, hbrush_bgnd); Rectangle(bmpDC, 0,0, bmpW, bmpH); // //----> Cleanup the free Levels // YLevelsDn.clear(); YLevelsUp.clear(); // //----> annotations as rectangles // SelectObject(bmpDC, hpen_arrows_sel[0]); for(int i=0; i<rangeAnnotations.size(); i++) { RangeAnnotation &item = rangeAnnotations[i]; RECT rc; rc.left = step * (xoffs + item.start); rc.right = step * (xoffs + item.end); rc.bottom = y - (int)(item.minY * stepY)+ 20 - TlineHalfH - TlineDecoH; rc.top = y - (int)(item.maxY * stepY)- 20 - TlineHalfH - TlineDecoH; FillRect(bmpDC, &rc, selectedRangeAnnot == i ? hbrush_annot_selected : hbrush_annot); } for(int i=0; i<rangeAnnotations.size(); i++) { RangeAnnotation &item = rangeAnnotations[i]; RECT rc; rc.left = step * (xoffs + item.start); rc.right = step * (xoffs + item.end); rc.bottom = y - (int)(item.minY * stepY)+ 20 - TlineHalfH - TlineDecoH; rc.top = y - (int)(item.maxY * stepY)- 20 - TlineHalfH - TlineDecoH; //FillRect(bmpDC, &rc, selectedRangeAnnot == i ? hbrush_annot_selected : hbrush_annot); FrameRect(bmpDC, &rc, hbrush_blocs_hightlight); rc.left-=2; rc.right+=2; rc.top-=2; rc.bottom+=2; FrameRect(bmpDC, &rc, hbrush_blocs_hightlight); COLORREF c = selectedRangeAnnot == i ? RGB(220,220,210) : RGB(180,180,180); DrawTitle(rc.left, 1, item.text.c_str(), NULL, 1, &c); MoveToEx(bmpDC, rc.left, y - TlineHalfH - TlineDecoH, NULL); LineTo(bmpDC, rc.left, rc.bottom); } // //----> display the FILM style of Timeline // SelectObject(bmpDC, hbrush_filmholes); yy = y-TlineHalfH-TlineDecoH; SetBrushOrgEx(bmpDC, 0, yy%TlineDecoH, NULL); PatBlt(bmpDC, 0, yy, x2, TlineDecoH, PATCOPY); yy = y+TlineHalfH; SetBrushOrgEx(bmpDC, 0, yy%TlineDecoH, NULL); PatBlt(bmpDC, 0, yy, x2, TlineDecoH, PATCOPY); SelectObject(bmpDC, hbrush_frames); PatBlt(bmpDC, 0, y-TlineHalfH, x2, 2*TlineHalfH, PATCOPY); // //----> display legend // RECT r; if(!name.empty()) { r.left = r.right = bmpW/10; r.top = r.bottom = 3; DrawText(bmpDC,name.c_str(), name.length(),&r,DT_CALCRECT); //FillRect(bmpDC, &r, hbrush_colors[graph.color&7]); //FrameRect(bmpDC, &r, hbrush_colors[graph.color&7]); DrawText(bmpDC,name.c_str(), name.length(),&r,DT_LEFT); } int shift = bmpW/8; int ngraphs = Graphs.size(); //if(ngraphs <= 8) for(int g=0; g<ngraphs; g++) { TGraph &graph = Graphs[g]; if(!graph.valid) continue; r.left = r.right = shift; r.top = r.bottom = 0; DrawText(bmpDC,graph.name.c_str(), graph.name.length(),&r,DT_CALCRECT); r.top = bmpH - r.bottom - 4; r.bottom = bmpH - 4; DrawText(bmpDC,graph.name.c_str(), graph.name.length(),&r,DT_LEFT); r.top = bmpH - 3; r.bottom = bmpH; FillRect(bmpDC, &r, hbrush_colors[graph.color&7]); //FrameRect(bmpDC, &r, hbrush_colors[graph.color&7]); shift += 3 + r.right - r.left; }//legend // //====> Display the Frames // SelectObject(bmpDC, hbrush_filmsepare); frame = -(int)xoffs; x = shifting*step; w = step > 8 ? 2 : 1; for(; x < (float)bmpW; x+= step, frame++) { if(frame >= NumFrames) break; // //----> Display the separation // if(step > 2) PatBlt(bmpDC, (int)x, y-TlineHalfH, w, 2*TlineHalfH, PATCOPY); // //----> Display the Frame // RECT rc; rc = rtcode; rc.left = (int)x; rc.right = (int)x + step; rc.top += y-TlineHalfH; rc.bottom += y-TlineHalfH; if(step >= 16) { SetTextColor(bmpDC, TextColor); SetBkMode(bmpDC, TRANSPARENT); sprintf(strpos," %d", frame); DrawText(bmpDC,strpos, strlen(strpos),&rc,DT_LEFT);//DT_CALCRECT); } if((framePicked == frame)&&(framePicked>=0)&&(Graphs.size() > 0)) { if(framePicked < Graphs[0].Measures.size()) { TMeasure &measure = Graphs[0].Measures[framePicked]; if( (measure.valid) && (measure.drawcall > 0) && (measure.drawcall != frame)) sprintf(strpos," %d (call %d)", frame, measure.drawcall); else sprintf(strpos," %d ", frame); } else sprintf(strpos," %d ", frame); DrawTitle(x + (step*0.4f),50,strpos, NULL, 1); // // draw a vertical line from the base to the max of all the graphs at frame # // float h=0; for(int i=0; i<Graphs.size(); i++) { if(framePicked >= Graphs[i].Measures.size()) break; float h2 = Graphs[i].Measures[framePicked].timing; if(h2 > h) h = h2; } h = y - (int)(h * stepY) - TlineHalfH - TlineDecoH; MoveToEx(bmpDC, x+(step/2), y - TlineHalfH - TlineDecoH, NULL); LineTo(bmpDC, x+(step/2), h); } } // //----> vertical Grid display // SelectObject(bmpDC, hpen_grid); float l = ((float)bmpW/step); float e = floor((float)log10f(l)-0.5); if(e < 1.0) e = 1.0; l = powf(10.0, e); e= (fmodf(xoffs,l)); frame = ((float)((int)(-xoffs / l))+1)*l; float dx = l * step; float barx = e * step + dx; if(l > 0.0f) for(; barx < bmpW; barx += dx, frame += l) { MoveToEx(bmpDC, barx, y, NULL); LineTo(bmpDC,barx, 0); RECT rc; rc = rtcode; rc.left += (int)barx; rc.right += (int)barx; rc.top += y-TlineHalfH; rc.bottom += y-TlineHalfH; SetTextColor(bmpDC, TextColor); SetBkMode(bmpDC, OPAQUE); SetBkColor(bmpDC, RGB(200,180,180)); sprintf(strpos," %d", frame); DrawText(bmpDC,strpos, strlen(strpos),&rc,DT_LEFT);//DT_CALCRECT); } // //----> horizontal Grid display // SelectObject(bmpDC, hpen_grid); l = ((float)bmpH/stepY); e = (float)log10f(l); e = floor(e-0.5); l = powf(10.0, e); e= (fmodf(-yoffs,l)); float v = l; dx = l * stepY; barx = y-TlineHalfH - TlineDecoH - dx; if(l > 0.0f) for(; barx > 0; barx -= dx, v += l) { MoveToEx(bmpDC, 0, barx, NULL); LineTo(bmpDC,bmpW, barx); RECT rc; rc = rtcode; rc.left += 0; rc.right += 0; rc.top += barx; rc.bottom += barx; SetTextColor(bmpDC, TextColor); SetBkMode(bmpDC, TRANSPARENT); sprintf(strpos," %.2f", v); DrawText(bmpDC,strpos, strlen(strpos),&rc,DT_LEFT);//DT_CALCRECT); */ } // //----> display the Graphs // ngraphs = Graphs.size(); for(int g=0; g<ngraphs; g++) { if(!Graphs[g].valid) continue; int tempYOffset = Graphs[g].tempYOffset; // hack for shifting the curve temporarily STLMeasures &Measures = Graphs[g].Measures; frame = -(int)xoffs; bool bFirstOne = true; SelectObject(bmpDC, hpen_colors[Graphs[g].color&7]); x = shifting*step+(step/2); for(; x < (float)bmpW; x+= step, frame++) { if(frame >= NumFrames) break; if(frame < 0) continue; if(frame >= Measures.size()) break; TMeasure &m = Measures[frame]; if(m.valid) { if((!m.userComment.empty())||(m.tagged)) { MoveToEx(bmpDC, x, tempYOffset + y - TlineHalfH - TlineDecoH, NULL); LineTo(bmpDC, x, tempYOffset + y - (int)(m.timing * stepY) - TlineHalfH - TlineDecoH); } } } }//graphs // //----> searchResults display // for(int i=0; i<searchResults.size(); i++) { FoundItem &item = searchResults[i]; int x = step * (xoffs + item.frame)+(step/2); if((x < 0)||(x >= bmpW)) continue; SelectObject(bmpDC, hpen_arrows_sel[item.color & 3]); MoveToEx(bmpDC, x, y - TlineHalfH - TlineDecoH, NULL); LineTo(bmpDC, x, y - (int)(Graphs[item.graph].Measures[item.frame].timing * stepY) - TlineHalfH - TlineDecoH); } // //----> rest of the graph // ngraphs = Graphs.size(); for(int g=0; g<ngraphs; g++) { if(!Graphs[g].valid) continue; int tempYOffset = Graphs[g].tempYOffset; // hack for shifting the curve temporarily STLMeasures &Measures = Graphs[g].Measures; frame = -(int)xoffs; x = shifting*step+(step/2); bool bFirstOne = true; SelectObject(bmpDC, hpen_colors[Graphs[g].color&7]); int xint=(int)x, xintprev=-11111; for(; x < (float)bmpW; x+= step, frame++) { if(frame >= NumFrames) break; if(frame < 0) continue; if(frame >= Measures.size()) break; xint = (int)x; TMeasure &m = Measures[frame]; /*if(xint == xintprev) continue;*/ if(m.valid) { if(bFirstOne) { bFirstOne = false; MoveToEx(bmpDC, xint, tempYOffset + y - (int)(m.timing * stepY) - TlineHalfH - TlineDecoH, NULL); } else LineTo(bmpDC, xint, tempYOffset + y - (int)(m.timing * stepY) - TlineHalfH - TlineDecoH); } xintprev = xint; } frame = -(int)xoffs; x = shifting*step+(step/2); for(; x < (float)bmpW; x+= step, frame++) { if(frame >= NumFrames) break; if(frame < 0) continue; if(frame >= Measures.size()) break; TMeasure &m = Measures[frame]; if(!m.valid) continue; if(!m.userComment.empty()) { COLORREF c = m.colorComment == 0 ? RGB(200,200,250) : m.colorComment; if((frame == framePicked)&&(g == graphPicked)) c = RGB(200,250,200); else if((frame == frameSelected)&&(g == graphSelected)) c = RGB(250,200,200); sprintf(strpos, "%d: %s", frame, m.userComment.c_str()); DrawTitle(x,40, strpos, NULL, 1, &c); } } // Squares if(step > 2) { int ptsz = step/6; if(ptsz < 2) ptsz = 2; if(ptsz > 5) ptsz = 5; frame = -(int)xoffs; x = shifting*step+(step/2); SelectObject(bmpDC, hpen_arrows); for(; x < (float)bmpW; x+= step, frame++) { if(Measures.size() <= frame) break; if(frame >= NumFrames) break; if(frame < 0) continue; TMeasure &m = Measures[frame]; if(!m.valid) continue; RECT r; r.left = x-ptsz; r.top = y - (int)(m.timing * stepY) - TlineHalfH - TlineDecoH - ptsz; r.right = x+ptsz; r.bottom = r.top+ptsz+ptsz; FillRect(bmpDC, &r, hbrush_colors[Graphs[g].color&7]); if((frame == frameSelected)&&(g == graphSelected)) { r.top -= 2; r.bottom += 2; r.left -= 2; r.right += 2; InvertRect(bmpDC, &r); } } } }//graphs // // Tooltips // if((graphPicked >= 0) && (framePicked >= 0)) { TGraph &graph = Graphs[graphPicked]; TMeasure &m = graph.Measures[framePicked]; int x = (int)(step * (xoffs + framePicked)+(step/2)); int y = bmpH/2 + yoffs - (int)(m.timing * stepY) - TlineHalfH - TlineDecoH; static char tmpstr[512]; sprintf(tmpstr, "%s = %.3f (1k/x= %.1f)\n", graph.name.c_str(), m.timing, 1000.0f/m.timing); if(!m.drawcallType.empty()) // added for OpenGL Framebenchmark... prim type... sprintf(tmpstr, "%s%s\n", tmpstr, m.drawcallType.c_str()); if(m.fbo>=0) // added for OpenGL Framebenchmark... sprintf(tmpstr, "%sFBO=%d\n", tmpstr, m.fbo); if(!m.operation.empty()) sprintf(tmpstr, "%s%s\n", tmpstr, m.operation.c_str()); if(!m.vtxShader.empty() || !m.pixShader.empty()) sprintf(tmpstr, "%s\nVtx: %s\nPix: %s", tmpstr, m.vtxShader.c_str(), m.pixShader.c_str()); if(Graphs.size() <= 4) for(int g2=0; g2<Graphs.size(); g2++) { if(graphPicked == g2) continue; if(framePicked >= Graphs[g2].Measures.size()) continue; float t2 = Graphs[g2].Measures[framePicked].timing; sprintf(tmpstr, "%s\nDelta vs. %s = %.2f (%.1f%%)", tmpstr, Graphs[g2].name.c_str(), m.timing - t2, 100.0*(m.timing - t2)/t2); } if(!m.tooltipComments.empty()) sprintf(tmpstr, "%s\n----\n%s", tmpstr, m.tooltipComments.c_str()); int len = strlen(tmpstr); RECT r; r.left = r.right = x + 30; r.top = r.bottom = y; DrawText(bmpDC,tmpstr, len,&r,DT_CALCRECT); r.left = r.left-1; r.top = r.top-1; r.right = r.right+1; r.bottom = r.bottom+1; SetTextColor(bmpDC, TextColor); SetBkMode(bmpDC, TRANSPARENT); //SetBkColor(bmpDC, TextBgndColor); FillRect(bmpDC, &r, hbrush_blocs); FrameRect(bmpDC, &r, hbrush_frametxt); DrawText(bmpDC,tmpstr, len,&r,DT_LEFT);//DT_CALCRECT); } // //----> Highlight the selected rectangle // if(recthighlighted.left < recthighlighted.right) InvertRect(bmpDC, &recthighlighted); // //----> Selection mark // if(selRangeX[0] != selRangeX[1]) { int x1, x2; if(selRangeX[0] < selRangeX[1]) { x1 = selRangeX[0]; x2 = selRangeX[1]; } else { x1 = selRangeX[1]; x2 = selRangeX[0]; } RECT rSel; rSel.left = (int)(step * (xoffs + x1)); rSel.right = (int)(step * (xoffs + x2 + 1)); rSel.top = 0; rSel.bottom = bmpH; InvertRect(bmpDC, &rSel); // // Do the tooltip for stats on selection now : // if(!selStats.empty()) { rSel.top = 0; x2 = rSel.right; if(rSel.left < 0) rSel.left = 0; DrawText(bmpDC,selStats.c_str(), strlen(selStats.c_str()),&rSel,DT_CALCRECT); if(rSel.right < x2) rSel.right = x2; SetTextColor(bmpDC, TextColor); SetBkMode(bmpDC, TRANSPARENT); //SetBkColor(bmpDC, TextBgndColor); FillRect(bmpDC, &rSel, hbrush_blocs); FrameRect(bmpDC, &rSel, hbrush_frametxt); DrawText(bmpDC,selStats.c_str(), strlen(selStats.c_str()),&rSel,DT_LEFT);//DT_CALCRECT); } } }
void CChemPropProperty::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default char tchBuffer[256]; RECT rect; TEXTMETRIC tm; int i; int OffSet; stcChemProp* tCP; if ( ( lpDrawItemStruct->CtlType == ODT_LISTBOX) && (lpDrawItemStruct->CtlID == IDC_CHEMPROP) && (lpDrawItemStruct->itemID != -1) ) { GetTextMetrics( lpDrawItemStruct->hDC, &tm); OffSet = tm.tmHeight * 2; switch ( lpDrawItemStruct->itemAction ) { case ODA_DRAWENTIRE: tCP = (stcChemProp *)lpDrawItemStruct->itemData; sprintf ( tchBuffer, "%2d:", lpDrawItemStruct->itemID + 1 ); // OffSet = LOWORD(GetTextExtent( lpDrawItemStruct->hDC, tchBuffer, 5 )); SetBkColor ( lpDrawItemStruct->hDC, RGB(255,255,255) ); SetTextColor ( lpDrawItemStruct->hDC, RGB(0,0,0) ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, tchBuffer, 3 ); // Bingo .. m_ChemPropList.GetText( lpDrawItemStruct->itemID, tchBuffer ); for ( i = strlen ( tchBuffer ); i < 75; ++i ) { tchBuffer[i] = ' '; } tchBuffer[i] = 0; SetBkColor ( lpDrawItemStruct->hDC, tCP->BackColor ); SetTextColor ( lpDrawItemStruct->hDC, tCP->TextColor ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left + OffSet, lpDrawItemStruct->rcItem.top, tchBuffer, strlen(tchBuffer) ); if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); } break; case ODA_SELECT: rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); break; } } else if ( ( lpDrawItemStruct->CtlType == ODT_LISTBOX) && (lpDrawItemStruct->CtlID == IDC_PROPCONS) && (lpDrawItemStruct->itemID != -1) ) { GetTextMetrics( lpDrawItemStruct->hDC, &tm); OffSet = tm.tmHeight * 2; switch ( lpDrawItemStruct->itemAction ) { case ODA_DRAWENTIRE: tCP = (stcChemProp *)lpDrawItemStruct->itemData; sprintf ( tchBuffer, "%2d:", lpDrawItemStruct->itemID + 1 ); // OffSet = LOWORD(GetTextExtent( lpDrawItemStruct->hDC, tchBuffer, 5 )); SetBkColor ( lpDrawItemStruct->hDC, RGB(255,255,255) ); SetTextColor ( lpDrawItemStruct->hDC, RGB(0,0,0) ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, tchBuffer, 3 ); // Bingo .. m_PropConsList.GetText( lpDrawItemStruct->itemID, tchBuffer ); for ( i = strlen ( tchBuffer ); i < 75; ++i ) { tchBuffer[i] = ' '; } tchBuffer[i] = 0; SetBkColor ( lpDrawItemStruct->hDC, tCP->BackColor ); SetTextColor ( lpDrawItemStruct->hDC, tCP->TextColor ); TextOut(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.left + OffSet, lpDrawItemStruct->rcItem.top, tchBuffer, strlen(tchBuffer) ); if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); } break; case ODA_SELECT: rect.left = lpDrawItemStruct->rcItem.left; rect.top = lpDrawItemStruct->rcItem.top; rect.right = lpDrawItemStruct->rcItem.left + OffSet; rect.bottom = lpDrawItemStruct->rcItem.bottom; InvertRect(lpDrawItemStruct->hDC, &rect); break; } } // CPropertyPage::OnDrawItem(nIDCtl, lpDrawItemStruct); }
/******************************************************************************* * * FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG) * * PURPOSE: Processes messages for the child windows. * * WM_COMMAND - process the application menu * WM_PAINT - Paint the main window * WM_DESTROY - post a quit message and return * */ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: g_pChildWnd = HeapAlloc(GetProcessHeap(), 0, sizeof(ChildWnd)); if (!g_pChildWnd) return 0; LoadStringW(hInst, IDS_REGISTRY_ROOT_NAME, g_pChildWnd->szPath, MAX_PATH); g_pChildWnd->nSplitPos = 250; g_pChildWnd->hWnd = hWnd; g_pChildWnd->hTreeWnd = CreateTreeView(hWnd, g_pChildWnd->szPath, TREE_WINDOW); g_pChildWnd->hListWnd = CreateListView(hWnd, LIST_WINDOW/*, g_pChildWnd->szPath*/); g_pChildWnd->nFocusPanel = 1; SetFocus(g_pChildWnd->hTreeWnd); get_last_key(g_pChildWnd->hTreeWnd); break; case WM_COMMAND: if (!_CmdWndProc(hWnd, message, wParam, lParam)) { goto def; } break; case WM_PAINT: OnPaint(hWnd); return 0; case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) { POINT pt; GetCursorPos(&pt); ScreenToClient(hWnd, &pt); if (pt.x>=g_pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<g_pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) { SetCursor(LoadCursorW(0, (LPCWSTR)IDC_SIZEWE)); return TRUE; } } goto def; case WM_DESTROY: set_last_key(g_pChildWnd->hTreeWnd); HeapFree(GetProcessHeap(), 0, g_pChildWnd); g_pChildWnd = NULL; PostQuitMessage(0); break; case WM_LBUTTONDOWN: { RECT rt; int x = (short)LOWORD(lParam); GetClientRect(hWnd, &rt); if (x>=g_pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<g_pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) { last_split = g_pChildWnd->nSplitPos; draw_splitbar(hWnd, last_split); SetCapture(hWnd); } break; } /* WM_RBUTTONDOWN sets the splitbar the same way as WM_LBUTTONUP */ case WM_LBUTTONUP: case WM_RBUTTONDOWN: if (GetCapture() == hWnd) { finish_splitbar(hWnd, LOWORD(lParam)); } break; case WM_CAPTURECHANGED: if (GetCapture()==hWnd && last_split>=0) draw_splitbar(hWnd, last_split); break; case WM_KEYDOWN: if (wParam == VK_ESCAPE) if (GetCapture() == hWnd) { RECT rt; draw_splitbar(hWnd, last_split); GetClientRect(hWnd, &rt); ResizeWnd(rt.right, rt.bottom); last_split = -1; ReleaseCapture(); SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); } break; case WM_MOUSEMOVE: if (GetCapture() == hWnd) { RECT rt; int x = LOWORD(lParam); HDC hdc = GetDC(hWnd); GetClientRect(hWnd, &rt); rt.left = last_split-SPLIT_WIDTH/2; rt.right = last_split+SPLIT_WIDTH/2+1; InvertRect(hdc, &rt); last_split = x; rt.left = x-SPLIT_WIDTH/2; rt.right = x+SPLIT_WIDTH/2+1; InvertRect(hdc, &rt); ReleaseDC(hWnd, hdc); } break; case WM_SETFOCUS: if (g_pChildWnd != NULL) { SetFocus(g_pChildWnd->nFocusPanel? g_pChildWnd->hListWnd: g_pChildWnd->hTreeWnd); } break; case WM_TIMER: break; case WM_NOTIFY: if (((int)wParam == TREE_WINDOW) && (g_pChildWnd != NULL)) { switch (((LPNMHDR)lParam)->code) { case TVN_ITEMEXPANDINGW: return !OnTreeExpanding(g_pChildWnd->hTreeWnd, (NMTREEVIEWW*)lParam); case TVN_SELCHANGEDW: OnTreeSelectionChanged(g_pChildWnd->hTreeWnd, g_pChildWnd->hListWnd, ((NMTREEVIEWW *)lParam)->itemNew.hItem, TRUE); break; case NM_SETFOCUS: g_pChildWnd->nFocusPanel = 0; break; case NM_RCLICK: { POINT pt; GetCursorPos(&pt); TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL); break; } case TVN_BEGINLABELEDITW: { HKEY hRootKey; LPWSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); if (!path || !*path) return 1; return 0; } case TVN_ENDLABELEDITW: { HKEY hRootKey; LPNMTVDISPINFOW dispInfo = (LPNMTVDISPINFOW)lParam; LPWSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); BOOL res = RenameKey(hWnd, hRootKey, path, dispInfo->item.pszText); if (res) { TVITEMEXW item; LPWSTR fullPath = GetPathFullPath(g_pChildWnd->hTreeWnd, dispInfo->item.pszText); item.mask = TVIF_HANDLE | TVIF_TEXT; item.hItem = (HTREEITEM)SendMessageW(g_pChildWnd->hTreeWnd, TVM_GETNEXTITEM, TVGN_CARET, 0); item.pszText = dispInfo->item.pszText; SendMessageW( g_pChildWnd->hTreeWnd, TVM_SETITEMW, 0, (LPARAM)&item ); SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); } HeapFree(GetProcessHeap(), 0, path); return res; } default: return 0; /* goto def; */ } } else if (((int)wParam == LIST_WINDOW) && (g_pChildWnd != NULL)) { if (((LPNMHDR)lParam)->code == NM_SETFOCUS) { g_pChildWnd->nFocusPanel = 1; } else if (!SendMessageW(g_pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam)) { goto def; } } break; case WM_SIZE: if (wParam != SIZE_MINIMIZED && g_pChildWnd != NULL) { ResizeWnd(LOWORD(lParam), HIWORD(lParam)); } /* fall through */ default: def: return DefWindowProcW(hWnd, message, wParam, lParam); } return 0; }