示例#1
0
文件: MacGraph.c 项目: rolk/ug
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);
}
示例#2
0
/*******************************************************************************
** 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);
}
示例#4
0
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);
}
示例#5
0
void TDC::invert_rect(const Rect& rt)
//-----------------------------------
{  InvertRect(m_hdc,(RECT *)&rt); }
示例#6
0
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;
}
示例#7
0
//
//	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);
}
示例#8
0
文件: console.c 项目: AreaScout/vice
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);
}
示例#9
0
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;
}
示例#10
0
文件: tpaint.c 项目: mingpen/OpenNT
/*
 * 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);
	}
}
示例#11
0
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;
}
示例#15
0
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) ;

}
示例#16
0
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;
}
示例#17
0
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);
}
示例#18
0
void
nsRenderingContext::InvertRect(nscoord aX, nscoord aY,
                               nscoord aWidth, nscoord aHeight)
{
    InvertRect(nsRect(aX, aY, aWidth, aHeight));
}
示例#19
0
//************************************************************************
// 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;
}
示例#20
0
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; 
		}
	
	}
}
示例#21
0
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 );

	}
}
示例#22
0
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);
}
示例#23
0
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);
}
示例#24
0
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));
}
示例#27
0
/*******************************************************************************
** 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);
	}
}
示例#28
0
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);
        }
    }

}
示例#29
0
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);
}
示例#30
0
文件: childwnd.c 项目: AlexSteel/wine
/*******************************************************************************
 *
 *  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;
}