IFACEMETHODIMP InternalDWriteTextRenderer::DrawUnderline(
    void*,
    FLOAT baselineOriginX,
    FLOAT baselineOriginY,
    DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
    DWRITE_UNDERLINE const* underline,
    IUnknown* customDrawingObject)
{
    return ExceptionBoundary(
        [&]
        {
            //
            // The renderer isn't required to specify a locale name.
            //
            WinString localeName;
            if (underline->localeName)
                localeName = WinString(underline->localeName);

            auto customDrawingObjectInspectable = GetCustomDrawingObjectInspectable(m_device.Get(), customDrawingObject);

            ThrowIfFailed(m_textRenderer->DrawUnderline(
                Vector2{ baselineOriginX, baselineOriginY },
                underline->width,
                underline->thickness,
                underline->offset,
                underline->runHeight,
                DWriteToCanvasTextDirection::Lookup(underline->readingDirection, underline->flowDirection)->TextDirection,
                customDrawingObjectInspectable.Get(),
                ToCanvasTextMeasuringMode(underline->measuringMode),
                localeName,
                ToCanvasGlyphOrientation(orientationAngle)));
        });
}
IFACEMETHODIMP InternalDWriteTextRenderer::DrawStrikethrough(
    void*,
    FLOAT baselineOriginX,
    FLOAT baselineOriginY,
    DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
    DWRITE_STRIKETHROUGH const* strikethrough,
    IUnknown* customDrawingObject)
{
    return ExceptionBoundary(
        [&]
        {
            WinString localeName;
            if (strikethrough->localeName)
                localeName = WinString(strikethrough->localeName);

            auto customDrawingObjectInspectable = GetCustomDrawingObjectInspectable(m_device.Get(), customDrawingObject);

            ThrowIfFailed(m_textRenderer->DrawStrikethrough(
                Vector2{ baselineOriginX, baselineOriginY },
                strikethrough->width,
                strikethrough->thickness,
                strikethrough->offset,
                DWriteToCanvasTextDirection::Lookup(strikethrough->readingDirection, strikethrough->flowDirection)->TextDirection,
                customDrawingObjectInspectable.Get(),
                ToCanvasTextMeasuringMode(strikethrough->measuringMode),
                localeName,
                ToCanvasGlyphOrientation(orientationAngle)));
        });
}
Example #3
0
    static WinString ToCanvasTrimmingDelimiter(uint32_t value)
    {
        // TODO #1658: Do the unicode conversion properly.
        // http://www.unicode.org/faq/utf_bom.html#utf16-3.  This code needs its
        // own set of tests.

        WinStringBuilder builder;

        if (value == 0)
        {
            return WinString();
        }
        else if (value <= 0x0000FFFF)
        {
            auto buffer = builder.Allocate(1);
            buffer[0] = static_cast<wchar_t>(value);
        }
        else
        {
            auto buffer = builder.Allocate(2);
            *(reinterpret_cast<uint32_t*>(buffer)) = value;
        }

        return builder.Get();
    }
Example #4
0
MSG  BottomlineProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 )
    {

    switch( Msg )
	{
	case WM_CREATE:
	    return( WM_PROCESSED );

	case WM_HELP:
	    {
	    struct HelpKey *HelpKeys;
	    BYTE LineCounter;

	    WinColor( HWnd, KEYHELP, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );
	    WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );

	    HelpKeys = (struct HelpKey *)MP1;

	    for( LineCounter = 0; LineCounter < (BYTE)MP2; LineCounter++ )
		WinString( HWnd, HelpKeys[LineCounter].Text, LEFT, HelpKeys[LineCounter].x, HelpKeys[LineCounter].y );

	    return( WM_PROCESSED );
	    }
	case WM_MESSAGE:
	    {
	    WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );

	    if( (VOID *)MP1 != NULL )
		WinString( HWnd, (CHAR *)MP1, CENTER, 0, 0 );
	    if( (VOID *)MP2 != NULL )
		WinString( HWnd, (CHAR *)MP2, CENTER, 0, 1 );

	    return( WM_PROCESSED );
	    }
	}

    return( WinDefWindowProc( HWnd, Msg, MP1, MP2 ) );
    }
Example #5
0
MSG  InactiveProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 )
    {

    switch( Msg )
	{
	case WM_CREATE:
	    return( WM_PROCESSED );

	case WM_SHOW:
	    {
	    WinColor( HWnd, PANEL, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );
	    WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );

	    WinString( HWnd, "Dieser Menupunkt ist noch nicht aktiv.", LEFT, 0, 0 );
	    }

	case WM_CHAR:
	    return( MP1 );
	}

    return( WinDefWindowProc( HWnd, Msg, MP1, MP2 ) );
    }
Example #6
0
MSG MenuProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 )
    {
    static struct MenuPoint MenuPoints[NUMMENUPOINTS] =
	{ { DOT,  0, "Einstellungen", EinstellungenProc, NULL },
	  { 0,	  0, "", NULL, NULL },
	  { 0,	  0, "", NULL, NULL },
	  { 0,	  0, "Durchschnitt", DurchschnittProc, NULL },
	  { 0,	  0, "������������", NULL, NULL },
	  { DOT,  1, "Periode", PeriodeProc, NULL },
	  { DOT,  1, "Abteilungen", AbteilungenProc, NULL },
	  { DOT,  1, "Begr�ndungen", BegruendungenProc, NULL },
	  { 0,	  0, "", NULL, NULL },

	  { 0,	  0, "�bersicht", UebersichtProc, NULL },
	  { 0,	  0, "���������", NULL, NULL },
	  { DOT,  1, "Periode", PeriodeProc, NULL },
	  { DOT,  1, "Person(en)", PersonenProc, NULL },
	  { DOT,  1, "Begr�ndungen", BegruendungenProc, NULL },
	  { 0,	  0, "", NULL, NULL },

	  { 0,	  0, "Grenzwerte �berschritten", UeberzeitProc, NULL },
	  { 0,	  0, "������������������������", NULL, NULL },
	  { DOT,  1, "Periode", PeriodeProc, NULL },
	  { DOT,  1, "Abteilungen", AbteilungenProc, NULL },
	  { DOT,  1, "Begr�ndungen", PMBegruendungenProc, NULL },
	  { 0,	  0, "", NULL, NULL },

	  { 0,	  0, "Summierung Zeitkonti", ZeitKontiSumProc, NULL },
	  { 0,	  0, "��������������������", NULL, NULL },
	  { DOT,  1, "Periode", PeriodeProc, NULL },
	  { DOT,  1, "Zeitkonti", ZeitKontiProc, NULL } };

    static struct HelpKey HelpKeys[NUMMENUHELPKEYS] =
	{ {  0,  0, "</>    Men�punkt anw�hlen" },
	  {  0,  1, "<Enter>  Men�punkt ausf�hren" },
	  { 40,  1, "<Esc>    Programm verlassen" } };

    static BYTE Selection;
    static BYTE TopLine;

    static BOOL PanelFocus;

    switch( Msg )
	{
	case WM_CREATE:
	    {

	    MenuPoints[5].Data = &ConfigData->Perioden[0];
	    MenuPoints[11].Data = &ConfigData->Perioden[1];
	    MenuPoints[17].Data = &ConfigData->Perioden[2];
	    MenuPoints[23].Data = &ConfigData->Perioden[3];

	    MenuPoints[6].Data = (VOID FAR *)0;
	    MenuPoints[12].Data = (VOID FAR *)1;
	    MenuPoints[18].Data = (VOID FAR *)2;

	    MenuPoints[7].Data = (VOID FAR *)0;
	    MenuPoints[13].Data = (VOID FAR *)1;
	    MenuPoints[19].Data = (VOID FAR *)2;

	    MenuPoints[24].Data = (VOID FAR *)3;
	    WinCreateWindow( HWnd, &MenuArrows, MenuArrowsProc, 0, 0, 25, -1, 25, 20 );
	    Selection = 0;
	    TopLine = 0;
	    PanelFocus = FALSE;
	    return( WM_PROCESSED );
	    }

	case WM_SHOW:
	    {
	    BYTE LineCounter;

	    WinColor( HWnd, MENU, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );
	    WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );

	    for( LineCounter = 0; LineCounter <= WinGety2( HWnd ); LineCounter++ )
		{
		if( LineCounter + TopLine == NUMMENUPOINTS )
		    break;

		if( MenuPoints[LineCounter + TopLine].Style & DOT )
		    {
		    WinString( HWnd, "� ", LEFT, (BYTE)(MenuPoints[LineCounter + TopLine].Indent + 1), LineCounter );
		    WinString( HWnd, MenuPoints[LineCounter + TopLine].Text, LEFT, (BYTE)(MenuPoints[LineCounter + TopLine].Indent + 3), LineCounter );
		    }
		else
		    WinString( HWnd, MenuPoints[LineCounter + TopLine].Text, LEFT, (BYTE)(MenuPoints[LineCounter + TopLine].Indent + 1), LineCounter );
		}

	    return( WM_PROCESSED );
	    }

	case WM_SETFOCUS:
	    {
	    BYTE Length;

	    WinSendMsg( MenuArrows, WM_SET, (TopLine == 0 ? FALSE : TRUE ),
					    ((BYTE)(NUMMENUPOINTS - 1 - TopLine) <= WinGety2( HWnd ) ? FALSE : TRUE ) );

	    WinSendMsg( MenuArrows, WM_SHOW, 0, 0 );

	    Length = (BYTE)strlen( MenuPoints[Selection].Text );
	    if( MenuPoints[Selection].Style & DOT )
		Length += 2;

	    WinColor( HWnd, HIGHLIGHT, (BYTE)(MenuPoints[Selection].Indent), (BYTE)(Selection - TopLine), (BYTE)(MenuPoints[Selection].Indent + Length + 1), (BYTE)(Selection - TopLine) );

	    WinSendMsg( Bottomline, WM_HELP, (WORD)&HelpKeys, NUMMENUHELPKEYS );

	    WinCreateWindow( HWnd, &Panel, MenuPoints[Selection].Proc, SEG(MenuPoints[Selection].Data), OFS(MenuPoints[Selection].Data), PANELX1, PANELY1, PANELX2, PANELY2 );
	    WinSendMsg( Panel, WM_SHOW, 0, 0 );
	    return( WM_PROCESSED );
	    }

	case WM_CLEARFOCUS:
	    WinDestroyWindow( Panel );
	    WinColor( HWnd, MENU, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );
	    return( WM_PROCESSED );

	case WM_CHAR:
	    if( PanelFocus )
		if( WinSendMsg( Panel, Msg, MP1, MP2 ) == WM_PROCESSED )
		    return( WM_PROCESSED );

	    switch( (WORD)MP1 )
		{
		case KBDOWN:
		case KBRIGHT:
		case KBTAB:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );
		    do
			{
			if( Selection == NUMMENUPOINTS - 1)
			    break;

			Selection++;

			if( Selection - TopLine > WinGety2( HWnd ) )
			    {
			    TopLine++;
			    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
			    }
			}
		    while( MenuPoints[Selection].Proc == NULL );

		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBUP:
		case KBLEFT:
		case KBSHTAB:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );
		    do
			{
			if( Selection == 0)
			    break;

			Selection--;

			if( Selection < TopLine )
			    {
			    TopLine--;
			    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
			    }
			}
		    while( MenuPoints[Selection].Proc == NULL );

		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBHOME:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );

		    TopLine = 0;
		    Selection = 0;

		    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBEND:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );

		    Selection = NUMMENUPOINTS - 1;
		    if( NUMMENUPOINTS - 1 < WinGety2( HWnd ) )
			TopLine = 0;
		    else
			TopLine = (BYTE)(NUMMENUPOINTS - 1 - WinGety2( HWnd ));

		    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBENTER:
		    if( !PanelFocus )
			{
			WinSendMsg( Panel, WM_SETFOCUS, 0, 0 );
			PanelFocus = TRUE;
			return( WM_PROCESSED );
			}
		    else
			WinSendMsg( HWnd, WM_CHAR, (MPARAM)KBESC, 0 );


		case KBESC:
		    if( PanelFocus )
			{
			WinSendMsg( Panel, WM_CLEARFOCUS, 0, 0 );
			PanelFocus = FALSE;
			WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
			return( WM_PROCESSED );
			}

		default:
		    return( MP1 );
		}
	    return( WM_PROCESSED );

	case WM_DESTROY:
	    WinDestroyWindow( MenuArrows );
	    return( WM_PROCESSED );

	}

    return( WinDefWindowProc( HWnd, Msg, MP1, MP2 ) );
    }
Example #7
0
VOID _cdecl Main( WORD NumArgs, CHAR *Args[], CHAR *EnvStrings[] )
    {
    MSG     Msg;
    WORD    Key;

    CHAR FileName[65];
    CHAR PrinterPort[65];

    HFILE TMSBegrFile;
    HFILE TMSAbtFile;
    HFILE TMSZKontFile;

    DWORD EffTime;

    WinInitialize( MAXNUMWINDOWS );
    WinCreateWindow( Desktop, &Desktop, NULL, 0, 0, 0, 0, 0, 0 );

    WinHideCursor();
    WinColor( Desktop, NORMAL, 0, 0, WinGetx2( Desktop ), WinGety2( Desktop ) );

    WinCreateWindow( Desktop, &Bottomline, BottomlineProc, 0, 0, BOTTOMLINEX1, BOTTOMLINEY1, BOTTOMLINEX2, BOTTOMLINEY2 );

    if( !ReadConfigData() )
	{
	static struct HelpKey HelpKeys[NUMLAUFWERKHELPKEYS] =
	    { {	0,   0, "</>    Wert erh�hen/erniedrigen" },
	      { 0,   1, "<Enter>  Wert akzeptieren" },
	      { 40,  1, "<Esc>    Programm verlassen" } };

	HWND TMSLaufwerk;
	BOOL LaufwerkOK;

	WinFill( Desktop, '�',	0, 22, 79, 22 );
	InitConfigData();

	WinString( Desktop, "TMS Laufwerk", CENTER, 0, 7 );
	WinString( Desktop, "������������", CENTER, 0, 8 );
	WinColor( Desktop, HIGHLIGHT, 33, 7, 46, 7 );
	WinCreateWindow( Desktop, &TMSLaufwerk, TMSLaufWerkProc, 0, 0, 37, 10, 40, 10 );
	WinString( Desktop, "Geben Sie bitte an, in welchem Laufwerk sich TMS befindet.", CENTER, 0, 14 );

	WinSendMsg( Bottomline, WM_HELP, (WORD)&HelpKeys, NUMLAUFWERKHELPKEYS );

	WinSendMsg( TMSLaufwerk, WM_SHOW, 0, 0 );
	WinSendMsg( TMSLaufwerk, WM_SETFOCUS, 0, 0 );

	do
	    {
	    LaufwerkOK = TRUE;
	    do
		{
		Key = BiosGetKey();
		Msg = WinSendMsg( TMSLaufwerk, WM_CHAR, (MPARAM)Key, 0 );
		}
	    while( (WORD)Msg != KBENTER && (WORD)Msg != KBESC );

	    if( (WORD)Msg == KBESC )
		{
		DosFreeFarMem( ConfigData );

		WinDestroyWindow( TMSLaufwerk );
		WinDestroyWindow( Bottomline );
		WinDestroyWindow( Desktop );
		return;
		}

	    if( !OpenPathFile() )
		{
		LaufwerkOK = FALSE;
		}
	    }
	while( !LaufwerkOK );

	ClosePathFile();
	WinDestroyWindow( TMSLaufwerk );
	WinColor( Desktop, NORMAL, 0, 0, WinGetx2( Desktop ), 21 );
	WinFill( Desktop, SPACECHAR, 0, 0, WinGetx2( Desktop ), WinGety2( Desktop ) );
	}

    switch( NumArgs )
	{
	case 2:
	    StdStrLwr( Args[1] );
	    if( StdStrCmp( Args[1], "exportfile" ) == 0 ||
		StdStrCmp( Args[1], "export" ) == 0 )
		{
		WinFill( Desktop, '�',	0, 22, 79, 22 );
		ExportFileConversion();
		}
	    else
		{
		; // Debug!!!!
		}
	    break;

	case 1:
	    if( !OpenPathFile() )
		; // Debug!!!!!

	    ReadPathFileEntry( TMSBEGRUENDNO, FileName, FALSE );

	    DosOpen( FileName, &TMSBegrFile, OPEN_RDONLY );
	    DosLastModTime( TMSBegrFile, &EffTime );
	    if( ConfigData->TMSBegruendungsDatum != EffTime )
		{
		if( !CreateList( TMSBegrFile, BEGRUENDUNGEN ) )
		    {
		    WinString( Desktop, "In TMS sind 0 Begr�ndungen verzeichnet!", LEFT, 0, 0 );
		    return; // Debug-Version!!!!!
		    }

		SortList( BEGRUENDUNGEN );
		ConfigData->TMSBegruendungsDatum = EffTime;
		StdFarMemSet( ConfigData->BegrCheckListe, TRUE, sizeof( ConfigData->BegrCheckListe ) );
		}
	    DosClose( TMSBegrFile );

	    ReadPathFileEntry( TMSABTEILNO, FileName, FALSE );

	    DosOpen( FileName, &TMSAbtFile, OPEN_RDONLY );
	    DosLastModTime( TMSAbtFile, &EffTime );
	    if( ConfigData->TMSAbteilungsDatum != EffTime )
		{
		if( !CreateList( TMSAbtFile, ABTEILUNGEN ) )
		    {
		    WinString( Desktop, "In TMS sind 0 Abteilungen verzeichnet!", LEFT, 0, 0 );
		    return; // Debug-Version!!!!!
		    }
		SortList( ABTEILUNGEN );
		ConfigData->TMSAbteilungsDatum = EffTime;
		StdFarMemSet( ConfigData->AbtCheckListe, TRUE, sizeof( ConfigData->AbtCheckListe ) );
		}
	    DosClose( TMSAbtFile );

	    ReadPathFileEntry( TMSZEITKNO, FileName, FALSE );

	    DosOpen( FileName, &TMSZKontFile, OPEN_RDONLY );
	    DosLastModTime( TMSZKontFile, &EffTime );
	    if( ConfigData->TMSZeitKontiDatum != EffTime )
		{
		if( !CreateList( TMSZKontFile, ZEITKONTI ) )
		    {
		    WinString( Desktop, "In TMS sind 0 Zeitkonti verzeichnet!", LEFT, 0, 0 );
		    return; // Debug-Version!!!!!
		    }
		// SortList( ZEITKONTI );
		ConfigData->TMSZeitKontiDatum = EffTime;
		StdFarMemSet( ConfigData->ZKontCheckListe, TRUE, sizeof( ConfigData->ZKontCheckListe ) );
		}
	    DosClose( TMSZKontFile );

	    ReadPathFileEntry( TMSPRINTERINFONO, FileName, FALSE );
	    ReadPathFileEntry( TMSPRINTERPORTNO, PrinterPort, TRUE );
	    GetPrinterInfo( FileName, PrinterPort );

	    ClosePathFile();

	    LoadList( BEGRUENDUNGEN );
	    LoadList( ABTEILUNGEN );
	    LoadList( ZEITKONTI );

	    WinString( Desktop, "������������������������������������Ŀ", CENTER, 0,  3 );
	    WinString( Desktop, "�                                    �", CENTER, 0,  4 );
	    WinString( Desktop, "�      Statistik - Generierung       �", CENTER, 0,  5 );
	    WinString( Desktop, "�      �����������������������       �", CENTER, 0,  6 );
	    WinString( Desktop, "�                und                 �", CENTER, 0,  7 );
	    WinString( Desktop, "�                ���                 �", CENTER, 0,  8 );
	    WinString( Desktop, "�     Verwaltung der Exportdaten     �", CENTER, 0,  9 );
	    WinString( Desktop, "�     ��������������������������     �", CENTER, 0, 10 );
	    WinString( Desktop, "�                                    �", CENTER, 0, 11 );
	    WinString( Desktop, "�              von TMS               �", CENTER, 0, 12 );
	    WinString( Desktop, "�                                    �", CENTER, 0, 13 );
	    WinString( Desktop, "��������������������������������������", CENTER, 0, 14 );

	    WinString( Desktop, " (c) Copyright 1992, 1993 J.Skripsky  ", CENTER, 0, 16 );

	    WinString( Desktop, "      Designed and Developed by       ", CENTER, 0, 18 );
	    WinString( Desktop, "           Juraj Skripsky             ", CENTER, 0, 19 );
	    WinString( Desktop, "         CH-8952 Schlieren            ", CENTER, 0, 20 );

	    BiosGetKey();
	    WinFill( Desktop, SPACECHAR, 0, 0, WinGetx2( Desktop ), WinGety2( Desktop ) );

	    WinFill( Desktop, '�', 0, 22, 79, 22 );

	    WinFill( Desktop, '�', 27,	0, 27, 21 );
	    WinFill( Desktop, '�',  0, 22, 79, 22 );
	    WinCreateWindow( Desktop, &Menu, MenuProc, 0, 0, 1, 1, 25, 20 );

	    WinSendMsg( Menu, WM_SHOW, 0, 0 );
	    WinSendMsg( Menu, WM_SETFOCUS, 0, 0 );

	    do
		{
		Key = BiosGetKey();
		Msg = WinSendMsg( Menu, WM_CHAR, (MPARAM)Key, 0 );
		}
	    while( (WORD)Msg != KBESC );


	    FreeList( BEGRUENDUNGEN );
	    FreeList( ABTEILUNGEN );
	    FreeList( ZEITKONTI );

	    FreePrinterInfo();

	    WinDestroyWindow( Menu );
	    break;
	 }

    if( !WriteConfigData() )
	; // Debug!!!!!

    WinDestroyWindow( Bottomline );
    WinDestroyWindow( Desktop );
    WinTerminate();
    }
Example #8
0
MSG  CheckListeProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 )
    {
    static struct HelpKey HelpKeys[NUMCHECKLSTHELPKEYS] =
	{ {  0,  0, "</>    Wert erh�hen/erniedrigen" },
	  {  0,	 1, "<Tab>    Schaltfeld wechseln" },
	  { 40,  1, "<Esc>    Schalttafel verlassen" } };

    static HWND CheckLstArrows;

    static struct Eintrag FAR *Liste;
    static WORD NumEintraege;

    static BOOL FAR *CheckListe;

    static WORD Selection;
    static WORD TopLine;

    static BYTE Type;


    switch( Msg )
	{
	case WM_CREATE:
	    {
	    WinCreateWindow( HWnd, &CheckLstArrows, CheckLstArrowsProc, 0, 0, -3, -4, -3, 20 );

	    Type = (BYTE)MP1;

	    switch( Type )
		{
		case BEGRUENDUNGEN:
		case PMBEGRUENDUNGEN:
		    Liste = Begruendungen;
		    NumEintraege = NumBegruendungen;

		    CheckListe = ConfigData->BegrCheckListe[MP2];
		    break;

		case ABTEILUNGEN:
		    Liste = Abteilungen;
		    NumEintraege = NumAbteilungen;
		    CheckListe = ConfigData->AbtCheckListe[MP2];
		    break;

		case ZEITKONTI:
		    Liste = ZeitKonti;
		    NumEintraege = NumZeitKonti;
		    CheckListe = ConfigData->ZKontCheckListe[MP2];
		    break;
		}

	    Selection = 0;
	    TopLine = 0;

	    return( WM_PROCESSED );
	    }

	case WM_DESTROY:
	    WinDestroyWindow( CheckLstArrows );
	    return( WM_PROCESSED );

	case WM_SHOW:
	    {
	    CHAR String[31];
	    BYTE LineCounter;

	    WinColor( HWnd, PANEL, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );
	    WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) );

	    WinString( HWnd, "�����������������������������������������", LEFT, 1, 0 );
	    WinString( HWnd, "�����������������������������������������", LEFT, 1, WinGety2( HWnd ) );


	    for( LineCounter = 0; LineCounter <= (BYTE)(WinGety2( HWnd ) - 2); LineCounter++ )
		{
		if( LineCounter + TopLine == NumEintraege )
		    break;

		switch( Type )
		    {
		    case PMBEGRUENDUNGEN:
			switch( CheckListe[LineCounter + TopLine] )
			    {
			    case PLUS:
				WinString( HWnd, "+", LEFT, 1, (BYTE)(LineCounter + 1) );
				break;

			    case MINUS:
				WinString( HWnd, "-", LEFT, 1, (BYTE)(LineCounter + 1) );
				break;
			    }
			break;

		    default:
			if( CheckListe[LineCounter + TopLine] )
			    WinString( HWnd, "�", LEFT, 1, (BYTE)(LineCounter + 1) );
		    }

		StdFarMemCpy( String, Liste[LineCounter + TopLine].Code, sizeof( Liste[LineCounter + TopLine].Code ) );
		WinString( HWnd, String, LEFT, 3, (BYTE)(LineCounter + 1) );
		StdFarMemCpy( String, Liste[LineCounter + TopLine].Description, sizeof( Liste[LineCounter + TopLine].Description ) );
		WinString( HWnd, String, LEFT, 10, (BYTE)(LineCounter + 1) );
		}

	    return( WM_PROCESSED );
	    }

	case WM_SETFOCUS:
	    WinColor( HWnd, HIGHLIGHT, 0, (BYTE)(Selection - TopLine + 1), WinGetx2( HWnd ), (BYTE)(Selection - TopLine + 1) );
	    return( WM_PROCESSED );

	case WM_CLEARFOCUS:
	    WinColor( HWnd, PANEL, 0, (BYTE)(Selection - TopLine + 1), WinGetx2( HWnd ), (BYTE)(Selection - TopLine + 1) );
	    return( WM_PROCESSED );

	case WM_CHAR:
	    switch( (WORD)MP1 )
		{
		case KBDOWN:
		case KBRIGHT:
		    if( Selection == NumEintraege - 1 )
			break;

		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );
		    Selection++;

		    if( Selection - TopLine + 1 > (WORD)(WinGety2( HWnd ) - 1) )
			{
			TopLine++;
			WinSendMsg( HWnd, WM_SHOW, 0, 0 );
			}

		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBUP:
		case KBLEFT:
		    if( Selection == 0)
			break;

		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );
		    Selection--;

		    if( Selection < TopLine )
			{
			TopLine--;
			WinSendMsg( HWnd, WM_SHOW, 0, 0 );
			}

		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBHOME:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );

		    TopLine = 0;
		    Selection = 0;

		    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBEND:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );

		    Selection = NumEintraege - 1;
		    if( NumEintraege - 1 < (WORD)(WinGety2( HWnd ) - 1) )
			TopLine = 0;
		    else
			TopLine = NumEintraege - (WinGety2( HWnd ) - 1);

		    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		case KBSPACE:
		    WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 );

		    switch( Type )
			{
			case PMBEGRUENDUNGEN:
			    switch( CheckListe[Selection] )
				{
				case FALSE:
				    CheckListe[Selection] = PLUS;
				    break;
				case PLUS:
				    CheckListe[Selection] = MINUS;
				    break;
				case MINUS:
				    CheckListe[Selection] = FALSE;
				    break;
				}
			    break;

			default:
			    CheckListe[Selection] = (BOOL)(!CheckListe[Selection]);
			}
		    WinSendMsg( HWnd, WM_SHOW, 0, 0 );
		    WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 );
		    break;

		default:
		    return( MP1 );
		}

	    return( WM_PROCESSED );
	}
    }
IFACEMETHODIMP InternalDWriteTextRenderer::DrawGlyphRun(
    void*,
    FLOAT baselineOriginX,
    FLOAT baselineOriginY,
    DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle,
    DWRITE_MEASURING_MODE measuringMode,
    DWRITE_GLYPH_RUN const* glyphRun,
    DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
    IUnknown* customDrawingObject)
{
    return ExceptionBoundary(
        [&]
        {
            auto customDrawingObjectInspectable = GetCustomDrawingObjectInspectable(m_device.Get(), customDrawingObject);

            auto canvasFontFace = CanvasFontFace::GetOrCreate(As<IDWriteFontFace2>(glyphRun->fontFace).Get());

            std::vector<CanvasGlyph> glyphs;
            glyphs.reserve(glyphRun->glyphCount);
            for (uint32_t i = 0; i < glyphRun->glyphCount; ++i)
            {
                CanvasGlyph glyph{};
                glyph.Advance = glyphRun->glyphAdvances[i];
                glyph.Index = glyphRun->glyphIndices[i];
                if (glyphRun->glyphOffsets)
                {
                    glyph.AdvanceOffset = glyphRun->glyphOffsets[i].advanceOffset;
                    glyph.AscenderOffset = glyphRun->glyphOffsets[i].ascenderOffset;
                }
                glyphs.push_back(glyph);
            }

            WinString localeNameString;
            WinString textString;
            std::vector<int> clusterMapIndices;

            if (glyphRunDescription)
            {
                localeNameString = WinString(glyphRunDescription->localeName);
                textString = WinString(glyphRunDescription->string);
                clusterMapIndices.reserve(glyphRunDescription->stringLength);
                for (uint32_t i = 0; i < glyphRunDescription->stringLength; ++i)
                {
                    clusterMapIndices.push_back(glyphRunDescription->clusterMap[i]);
                }
            }

            ThrowIfFailed(m_textRenderer->DrawGlyphRun(
                Vector2{ baselineOriginX, baselineOriginY },
                canvasFontFace.Get(),
                glyphRun->fontEmSize,
                glyphRun->glyphCount,
                glyphs.data(),
                static_cast<boolean>(glyphRun->isSideways),
                glyphRun->bidiLevel,
                customDrawingObjectInspectable.Get(),
                ToCanvasTextMeasuringMode(measuringMode),
                localeNameString,
                textString,
                glyphRunDescription ? glyphRunDescription->stringLength : 0u,
                glyphRunDescription ? clusterMapIndices.data() : nullptr,
                glyphRunDescription ? glyphRunDescription->textPosition : 0u,
                ToCanvasGlyphOrientation(orientationAngle)));
        });
}
        SwitchableTestBrushFixture(bool initializeWithBitmap = false)
            : m_transform(D2D1::Matrix3x2F(1, 2, 3, 4, 5, 6))
        {
            auto canvasDevice = Make<MockCanvasDevice>();
            auto adapter = std::make_shared<TestCanvasImageBrushAdapter>();
            m_bitmapBrush = Make<MockD2DBitmapBrush>();
            m_imageBrush = Make<MockD2DImageBrush>();
            
            canvasDevice->MockCreateBitmap =
                [&]()
                {
                    return Make<StubD2DBitmap>();
                };
            
            canvasDevice->MockCreateBitmapBrush =
                [&](ID2D1Bitmap1* bitmap)
                {
                    m_bitmapBrush->MockGetBitmap = [&](ID2D1Bitmap** bitmap) 
                    { 
                        if (m_targetImage) m_targetImage.CopyTo(bitmap);
                        else *bitmap = nullptr;
                    };
                    m_bitmapBrush->MockSetBitmap = [&](ID2D1Bitmap* bitmap)
                    { 
                        m_targetImage = bitmap;
                    };

                    m_bitmapBrush->MockGetExtendModeX = [&]() { return D2D1_EXTEND_MODE_MIRROR; };
                    m_bitmapBrush->MockGetExtendModeY = [&]() { return D2D1_EXTEND_MODE_WRAP; };
                    m_bitmapBrush->MockGetInterpolationMode1 = [&]() { return D2D1_INTERPOLATION_MODE_ANISOTROPIC; };
                    m_bitmapBrush->MockGetOpacity = [&]() { return 0.1f; };
                    m_bitmapBrush->MockGetTransform = [&](D2D1_MATRIX_3X2_F* transform) {*transform = m_transform; };

                    m_bitmapBrush->MockSetExtendModeX = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_MIRROR, extend); };
                    m_bitmapBrush->MockSetExtendModeY = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_WRAP, extend); };
                    m_bitmapBrush->MockSetInterpolationMode1 = [&](D2D1_INTERPOLATION_MODE mode) { Assert::AreEqual(D2D1_INTERPOLATION_MODE_ANISOTROPIC, mode); };
                    m_bitmapBrush->MockSetOpacity = [&](float opacity) { Assert::AreEqual(0.1f, opacity); };
                    m_bitmapBrush->MockSetTransform = [&](const D2D1_MATRIX_3X2_F* transform) { m_transform = *transform; };

                    return m_bitmapBrush;
                };
            
            canvasDevice->MockCreateImageBrush =
                [&](ID2D1Image* image)
                {
                    m_imageBrush->MockGetImage = [&](ID2D1Image** image) 
                    {
                        if (m_targetImage) m_targetImage.CopyTo(image);
                        else *image = nullptr;
                    };
                    m_imageBrush->MockSetImage = [&](ID2D1Image* image)
                    {
                        m_targetImage = image;
                    };

                    m_imageBrush->MockGetExtendModeX = [&]() { return D2D1_EXTEND_MODE_MIRROR; };
                    m_imageBrush->MockGetExtendModeY = [&]() { return D2D1_EXTEND_MODE_WRAP; };
                    m_imageBrush->MockGetInterpolationMode = [&]() { return D2D1_INTERPOLATION_MODE_ANISOTROPIC; };
                    m_imageBrush->MockGetOpacity = [&]() { return 0.1f; };
                    m_imageBrush->MockGetTransform = [&](D2D1_MATRIX_3X2_F* transform) {*transform = m_transform; };

                    m_imageBrush->MockSetExtendModeX = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_MIRROR, extend); };
                    m_imageBrush->MockSetExtendModeY = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_WRAP, extend); };
                    m_imageBrush->MockSetInterpolationMode = [&](D2D1_INTERPOLATION_MODE mode) { Assert::AreEqual(D2D1_INTERPOLATION_MODE_ANISOTROPIC, mode); };
                    m_imageBrush->MockSetOpacity = [&](float opacity) { Assert::AreEqual(0.1f, opacity); };
                    m_imageBrush->MockSetTransform = [&](const D2D1_MATRIX_3X2_F* transform) { m_transform = *transform; };
                    m_imageBrush->MockSetSourceRectangle = [&](const D2D1_RECT_F* rect) { Assert::AreEqual(D2D1::RectF(0, 0, 10, 10), *rect); };

                    return m_imageBrush;
                };

            ComPtr<ICanvasImage> canvasBitmap;
            if (initializeWithBitmap)
            {
                auto fileName = WinString(L"asdf");
                auto wicConverter = Make<MockWICFormatConverter>();
                auto bitmapAdapter = std::make_shared<TestBitmapResourceCreationAdapter>(wicConverter);
                canvasBitmap = Make<CanvasBitmap>(canvasDevice.Get(), fileName, bitmapAdapter);
            }

            m_canvasImageBrush = Make<CanvasImageBrush>(canvasDevice.Get(), canvasBitmap.Get(), adapter);
        }