<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Hilfe zur modulauswahlleiste]]></title><description><![CDATA[<p>Hallo Ich bin am verzweifeln habe ein projekt wo ich in der Modulauswahleiste ein Bitmap einfügen möchte welches ich dann in das Bearbeitungsfenster ziehen kann</p>
<p>Das Bitmap heist Makro (siehe Bild) was ich schon erstellt habe<br />
<a href="http://img150.imagevenue.com/img.php?loc=loc178&amp;image=78146_makro_rsource.JPG" rel="nofollow"></a><a href="http://img150.imagevenue.com/loc178/th_78146_makro_rsource.JPG" rel="nofollow">http://img150.imagevenue.com/loc178/th_78146_makro_rsource.JPG</a></p>
<p>Und es sollte in dieses MOdul Auswahlfenster (siehe Bild)<br />
<a href="http://img109.imagevenue.com/img.php?loc=loc199&amp;image=78141_hauptfenster_makro.JPG" rel="nofollow"></a><a href="http://img109.imagevenue.com/loc199/th_78141_hauptfenster_makro.JPG" rel="nofollow">http://img109.imagevenue.com/loc199/th_78141_hauptfenster_makro.JPG</a></p>
<p>So nun habe ich versuche den quellcode von den anderen Bitmaps zu übernehmen für mein Makro.bmp aber leider sehe ich mein Bitmap dann immernoch nicht in der Auswahlleiste.</p>
<p>Deswegen wollte ich fragen ob ich den quellcode hier posten darf dies sind aber ca 1200 Zeilen quellcode und das bei 5 verschiedenen cpp dateien.</p>
<p>Deswegen wollte ich erstmaöl fragen ob ich dies darf oder wie man sich sonst irgendwie man mir bei meinene Projekt helfen kann</p>
<p>ok folgender code der blockgrafik.cpp</p>
<pre><code>#define Test

#include &lt;afxext.h&gt;
#include &lt;windows.h&gt;
#include &quot;AllgDekla.h&quot;
#include &quot;BlockGrafik.h&quot;
#include &quot;resource.h&quot;

bool erstelleStandardAbbildung(HBITMAP *ZBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info);
bool Negierung_in_Bitmap_Zeichen(HDC *Abbhdc,HBITMAP *Abbildung,BlockSpeicherFeld *ModulDaten,ProgrammInformation *info);
bool kopiereBlock(BlockSpeicherFeld *LokZeiger, BlockSpeicherFeld *hZeiger);

bool liefereAbbildung  (HDC *Abbhdc, HBITMAP *Abbildung , BlockSpeicherFeld *ModulDaten, ProgrammInformation *info);
bool TextEinfuegen     (HDC *Abbhdc, HBITMAP *AbbBild   , BlockSpeicherFeld *ModulDaten,ProgrammInformation *info);
bool Bitmap_ins_Fenster(HDC *Abbhdc, HBITMAP *Abbildung , BlockSpeicherFeld *ModulDaten, HWND handle, WListe ListeTyp,	ProgrammInformation *info);
bool zeichneaktiviert  (HDC *Abbhdc, HBITMAP *Abbildung);

bool BlockDatenHolen(  ProgrammInformation *info,HGLOBAL SpeicherHandle
                     , HWND handle,bool Lokale,BlockSpeicherFeld *LokVar
                     , BlockSpeicherFeld *aktuellerBlock);

bool HindergrundHolen (HDC *Hghdc, HBITMAP *HinterBild, BlockSpeicherFeld *aktuellerBlock, ProgrammInformation *info);

////////////////////////////////////////////////////////////
//				'InitSchrift'							                      //
//														                            //
// Beim Start werden Schriften einmal initiert. Dabei gibt//
// es einmal eine Schrift für die Pin-Beschriftung und    //
// einmal eine Schrift für die selbst eingetragene Beschr.// 
//														                            //
////////////////////////////////////////////////////////////
//														                            //	
//	erstellt am     : 02.03.2001						              //	
//														                            //	
//	letzte Änderung : 15.01.2002						              //	
//														                            //	

//														                            //	
////////////////////////////////////////////////////////////
extern bool InitSchrift (ProgrammInformation *info)
{
	LOGFONT EigenFont;
	//Erste Schrift, zum reizeichnen in die Blöcke
	EigenFont.lfHeight = INT(info-&gt;Raster);
	EigenFont.lfWidth = INT((info-&gt;Raster / 2)) ;
	EigenFont.lfEscapement = 0;
	EigenFont.lfOrientation = 0;
	EigenFont.lfWeight = 400;
	EigenFont.lfItalic = FALSE;
	EigenFont.lfUnderline = FALSE;
	EigenFont.lfStrikeOut = FALSE;
	EigenFont.lfCharSet = ANSI_CHARSET;
	EigenFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
	EigenFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	EigenFont.lfQuality = DEFAULT_QUALITY;
	EigenFont.lfPitchAndFamily = DEFAULT_PITCH;
	info-&gt;Schrift.Schrift1 = CreateFontIndirect (&amp;EigenFont);
	// Zweite Schrift für die individuelle Bezeichnung
	EigenFont.lfHeight = INT(1.5 *  info-&gt;Raster);
	EigenFont.lfWidth = INT((1.5 * (info-&gt;Raster / 2)) + 1);
	info-&gt;Schrift.Schrift2 = CreateFontIndirect (&amp;EigenFont);
  // Dritte und feste Schrift jk 15.01.03
  EigenFont.lfHeight = INT(1 * RasterMass);
	EigenFont.lfWidth = INT((1 * (RasterMass / 2)) + 1);
	info-&gt;Schrift.Schrift = CreateFontIndirect (&amp;EigenFont);

	return TRUE;
};

////////////////////////////////////////////////////////////
//				'KillSchrift'					                    		  //
//													                          	  //
// Die Schriften müsse für Windows wieder freigegeben     //
// werden.												                        //
//														                            //
////////////////////////////////////////////////////////////
//														                            //	
//	erstellt am     : 02.03.2001			              		  //	
//													                              //	
//	letzte Änderung : 02.03.2001			            			  //	
//														                            //	
//	von			    : Jan Karstens (Diplom, FH Westküste)     //	
//														                            //	
//	betreut von     : Prof. Christian Siemers			        //	
//														                            //	
////////////////////////////////////////////////////////////
extern bool	KillSchrift(ProgrammInformation *info)
{
	// Löschen der verwendeten Schriften !
	DeleteObject(info-&gt;Schrift.Schrift1);
	DeleteObject(info-&gt;Schrift.Schrift2);
	DeleteObject(info-&gt;Schrift.Schrift );
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'InitBilder'							  //
//														  //
// Die Bitmap aus der resource.h werden in Variablen      //
// geladen.												  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 03.03.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//														  //	
/
//														  //	
////////////////////////////////////////////////////////////
extern bool InitBilder(ProgrammInformation *info)
{
	(*info).Bilder.Leer				= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_LEER));
	(*info).Bilder.Eingang			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_EINGANG));
	(*info).Bilder.Ausgang			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_AUSGANG));
	(*info).Bilder.Merker_Ausgang	= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_MERKER_AUSGANG));
	(*info).Bilder.Merker_Eingang	= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_MERKER_EINGANG));
	(*info).Bilder.Register_Ausgang = LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_REGISTER_AUSGANG));
	(*info).Bilder.Register_Merker  = LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_REGISTER_MERKER));
	(*info).Bilder.Timer			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_TIMER));
	(*info).Bilder.Verknuepft		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_VERKNUEPFT));
	(*info).Bilder.HIGH				= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_HIGH));
	(*info).Bilder.Negiert			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_NEGIERT));
	//makro eingefügt
	(*info).Bilder.MAKRO			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_MAKRO));
	// neue Module
	(*info).Bilder.R_Ausgang		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_R_AUSGANG));
	(*info).Bilder.EA_Ausgang		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_EA_AUS));
	(*info).Bilder.EA_Eingang		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_EA_EIN));
	//04_08_01 POR hinzugefügt
	(*info).Bilder.POR				= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_PowerOnReset));
	HintergrungFarbe.Eingang = CreateSolidBrush(RGB(213,234,138));	// pastell gruen
	HintergrungFarbe.Ausgang = CreateSolidBrush(RGB(249,188,179));	// pastell rot
	HintergrungFarbe.Merker  = CreateSolidBrush(RGB(136,209,244));	 // pastell blau
	HintergrungFarbe.Bloecke = CreateSolidBrush(RGB(252,251,220));	// pastell gelb	
	HintergrungFarbe.Timer   = CreateSolidBrush(RGB(237,211,231));	//	grau
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'KillBilder'							  //
//														  //
// Die Bitmap müssen beim Programmende wieder freigegeben //
// werden.												  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 03.03.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//														  //	
						  //	
////////////////////////////////////////////////////////////
extern bool KillBilder (ProgrammInformation *info)
{
	DeleteObject((*info).Bilder.Leer);
	DeleteObject((*info).Bilder.Ausgang);
	DeleteObject((*info).Bilder.Eingang);
	DeleteObject((*info).Bilder.Merker_Ausgang);
	DeleteObject((*info).Bilder.Merker_Eingang);
	DeleteObject((*info).Bilder.Register_Ausgang);
	DeleteObject((*info).Bilder.Register_Merker);
	DeleteObject((*info).Bilder.Timer);
	DeleteObject((*info).Bilder.Verknuepft);
	DeleteObject((*info).Bilder.HIGH);
	DeleteObject((*info).Bilder.Negiert);
	DeleteObject((*info).Bilder.R_Ausgang);
	DeleteObject((*info).Bilder.EA_Ausgang);
	DeleteObject((*info).Bilder.EA_Eingang);
	DeleteObject((*info).Bilder.MAKRO);
	//04_08_01 POR hinzugefügt
	DeleteObject((*info).Bilder.POR);
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'BlockEinreihen'						  //
//														  //
// Beim erstellen der Module für die Modulauswahl müssen  //
// angereiht werden. Dabei wird einfach das letzte		  //
// gespeicherte Modul genommen un daraus die neuen		  //
// Koordinaten ermittelt und eingetragen.				  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 26.02.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//												  //	
//														  //	
////////////////////////////////////////////////////////////
extern bool BlockEinreihen(ProgrammInformation *info,HGLOBAL SpeicherHandle,int pos,HWND handle)
{
	BlockSpeicherFeld *Zeiger;
	int a,b,i;
	RECT rect;
	Zeiger = (BlockSpeicherFeld *) GlobalLock(SpeicherHandle);
	(*(Zeiger + pos)).BausteinHandle = handle;
	// Die dazugehörigen Informationen raussuchen
	for (i = 1; handle != (*(Zeiger + i)).BausteinHandle;i++);
		if(i &gt; 1)
			{
			GetClientRect((*(Zeiger + i - 1)).BausteinHandle,&amp;rect);
			(*(Zeiger + i )).yPosition = INT((rect.bottom + ((*(Zeiger +i -1)).yPosition * ((*info).Raster / 2)) + 10) 
											/ ((*info).Raster / 2));
			}
		else (*(Zeiger + i)).yPosition = INT(10  / ((*info).Raster / 2));

		//Die Modulgroesse anpassen
		switch ((*(Zeiger + i)).Bausteintyp)
			{
			case Eingang :
			case Ausgang :
			case R_Ausgang :
			case Merker_Eingang :
			case Merker_Ausgang :
				{
				a = 7; // Die grösse des Bildes im Rastermass
				b = 2;
				break;
				};
			case Register_Merker :
			case Register_Ausgang :
				{
				a =  9;
				b = 10;
				break;
				};
			case Timer :
				{
				a = 7;
				b = 4;
				break;
				};
			case XOR :
			case Und :
			case Oder :
			case MAKRO :
				{
				a = 7;
				b = 7;
				break;
				};
			case High	:
			case POR	:	//04_08_01 POR hinzugefügt
				{
				a = 2;
				b = 2;
				break;
				};
			case EA_Eingang:
				{
				// Abfrage, da dieser Port nur bei Speedy vorhanden ist
				if ((*info).SPS_Typ == SPEEDY)
					{
					a = 7;
					b = 2;
					}
				else
					{
					a = 0;
					b = 0;
					};
				break;
				};
			case EA_Ausgang:
				{
				// Abfrage, da dieser Port nur bei Speedy vorhanden ist
				if ((*info).SPS_Typ == SPEEDY)
					{
					a = 5;
					b = 7;
					}
				else
					{
					a = 0;
					b = 0;
					};
				break;
				};
			default :
				{
				a = 0;
				b = 0;
				break;
				};
			};
		// Koordinaten festlegen
	MoveWindow(	handle,	((*(Zeiger + i)).xPosition * (*info).Raster),
						((*(Zeiger + i)).yPosition * (*info).Raster / 2),
						a * (*info).Raster,
						b * (*info).Raster,
						TRUE);
	GetClientRect(handle,&amp;rect);
	GlobalUnlock(SpeicherHandle);
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'BlockSichtbarImFenster'				  //
//														  //
// Diese Funktion diente ebenfalls zum abgrenzen von      //
// Blöcken, Jedoch wegen Problem mit dem Handling der     //
// Handles, wurde diese nicht weiter verfolgt.			  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 27.02.2001						  //	
//														  //	
//	letzte Änderung : 27.03.2001						  //	
//														  //	
							  //	
////////////////////////////////////////////////////////////
extern bool BlockSichtbarImFenster(ProgrammInformation *info,HGLOBAL SpeicherHandle,HWND handle)
{
	RECT rect,gueltiges_rect,Modul_rect;
	int i;

	BlockSpeicherFeld *Zeiger;
	Zeiger = (BlockSpeicherFeld *) GlobalLock(SpeicherHandle);
	// überprüfen, ob vorhanden und die eigene Position
	for ( i = 1; ((i &lt; (*Zeiger).Bausteinnummer) &amp;&amp; (handle != (*(Zeiger + i)).BausteinHandle)); i++);
	if ( i == (*Zeiger).Bausteinnummer)
		{
		GlobalUnlock(SpeicherHandle);
		return FALSE;
		}
	int zwischen;
	// Grenzbereich festlegen
	GetClientRect((*info).handles.Zeichnenfenster,&amp;rect);
	GetClientRect(handle,&amp;Modul_rect);
	zwischen = INT(Modul_rect.bottom * 2 / (*info).Raster);
	gueltiges_rect.top		=	(*info).Zeichenblatt.VertPos - 
								zwischen;
	zwischen = 0;//INT(rect.bottom * 2/ (*info).Raster);	
	gueltiges_rect.bottom	=	(*info).Zeichenblatt.VertPos + 
								zwischen;
	zwischen = INT(Modul_rect.right / (*info).Raster);
	gueltiges_rect.left		=	(*info).Zeichenblatt.HorzPos -
								zwischen;
	zwischen = 0;//INT(rect.right / (*info).Raster);
	gueltiges_rect.right	=	(*info).Zeichenblatt.HorzPos + 
								zwischen;
	// Abfrage ob dieser im erlaubten Bereich liegt
	if (((*(Zeiger +i)).xPosition &gt; gueltiges_rect.left   ) &amp;&amp;
		((*(Zeiger +i)).yPosition &gt; gueltiges_rect.top    ) &amp;&amp;
		((*(Zeiger +i)).xPosition &lt; gueltiges_rect.right  ) &amp;&amp;
		((*(Zeiger +i)).yPosition &lt; gueltiges_rect.bottom ) )
	{
		GlobalUnlock(SpeicherHandle);
		return TRUE;
	}
	else
	{
		GlobalUnlock(SpeicherHandle);
		return FALSE;
	}
	GlobalUnlock(SpeicherHandle);
	return FALSE;
};

////////////////////////////////////////////////////////////
//				'BlockZeichnen'							  //
//														  //
// Kommt vom Hauptprogramm die Message zum Neuzeichnen,   //
// hat man zuerst nur den Handle. Dieser wird dann aus der//
// Liste herausgesucht und eintsprechend dem Typ neugezei.//
// Die LokVar hat nur am Anfang eine Sonderbehandlung	  //
// wegen dem aktiviert zeichnen und weil nicht die Werte  //
// aus dem Speicher genommen werden.					  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 01.03.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//														  //	

//														  //	
////////////////////////////////////////////////////////////
extern bool BlockZeichnen(ProgrammInformation *info,HGLOBAL SpeicherHandle,
						  HWND handle,WListe ListeTyp,bool Lokale,BlockSpeicherFeld *LokVar)
{

  HDC               Abbhdc;
	HBITMAP	          Abbildung;
  BlockSpeicherFeld aktuellerBlock;

  if (!BlockDatenHolen(  info, SpeicherHandle, handle, Lokale, LokVar, &amp;aktuellerBlock))
    return FALSE;
  // Erstellen der Bitmap
  liefereAbbildung           (&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock, info);
  // Negierung in das Bitmap Zeichnen
  Negierung_in_Bitmap_Zeichen(&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock, info);
  // Evt. Texte einfuegen
  TextEinfuegen              (&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock, info);
  // Aktivierung Zeichnen
  if (aktuellerBlock.aktiviert)
    zeichneaktiviert(&amp;Abbhdc, &amp;Abbildung);
  // Und Bitmap ins Fenster Zeichnen!!
  Bitmap_ins_Fenster         (&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock,handle,ListeTyp,info);

  // Objekte loeschen, da diese sonst ihre Gueltigkeit verlieren
  DeleteObject(Abbildung);
  DeleteDC(Abbhdc);
	return TRUE;
};

bool BlockDatenHolen(  ProgrammInformation *info,HGLOBAL SpeicherHandle
                     , HWND handle,bool Lokale,BlockSpeicherFeld *LokVar
                     , BlockSpeicherFeld *aktuellerBlock)
{

 	int i = 1, AnzElement;
	BlockSpeicherFeld *Zeiger;
	if (Lokale)
	{
		kopiereBlock(aktuellerBlock,LokVar);
	}
	else
	{
		Zeiger = (BlockSpeicherFeld *) GlobalLock(SpeicherHandle);
    AnzElement = Zeiger-&gt;Bausteinnummer; 
    Zeiger ++;  // Um einen erhoehen, weil an der ersten Stelle Array Infos stehen!
		// Die dazugehörigen Informationen raussuchen
		for (i = 1; (handle != Zeiger-&gt;BausteinHandle) ;i++, Zeiger++)
			if(i &gt;= AnzElement)
				return FALSE;
		kopiereBlock(aktuellerBlock,Zeiger );
		GlobalUnlock(SpeicherHandle);
	};
  return TRUE;
}

bool Bitmap_ins_Fenster(HDC *Abbhdc, HBITMAP	*Abbildung, BlockSpeicherFeld *ModulDaten, HWND handle, WListe ListeTyp,	ProgrammInformation *info)
{
  HDC hdc;
 	RECT rect;
	PAINTSTRUCT ps;
	BITMAP bm;
  RECT ModulRect;
  // Variablen um Hintergrund zu ermitteln
  HBITMAP ModulHintergrund;
  HDC     ZeichenflaechHdc, HintergrundHdc;
  BITMAP  Modul_size;

  int i;
  int vertikal= 0; // Verschiebung in er Modulauswahl

  //Zeichnen-Konstukt fürs Modulfenster
	hdc = BeginPaint(handle,&amp;ps);

  SetROP2(hdc,R2_XORPEN);

	//Grösse der vorhandenen Abbildung ermitteln
	GetObject(*Abbildung,sizeof(BITMAP), &amp;bm);							
	//Wenn die Zeile gescrollt wurde (Gilt nur fuer die Modulauswahl)
	if(ListeTyp == Auswahl)
	{
		vertikal = info-&gt;AuswahlLeiste.VertPos;
	}
  ModulRect.left   = ModulDaten-&gt;xPosition * info-&gt;Raster;
  ModulRect.top    = (ModulDaten-&gt;yPosition - vertikal) * info-&gt;Raster / 2;
  ModulRect.right  = INT(bm.bmWidth * info-&gt;Zoom);
  ModulRect.bottom = INT(bm.bmHeight * info-&gt;Zoom);

	MoveWindow(	handle
            ,	ModulRect.left
            ,	ModulRect.top
            ,	ModulRect.right
            ,	ModulRect.bottom
            ,	TRUE
            );
	GetClientRect(handle,&amp;rect);
  //Bild Infos holen
 	if(ListeTyp != Auswahl)
  {
 	  GetObject(*Abbildung,sizeof(BITMAP), &amp;Modul_size);							
    // Groesse Aendern
    Modul_size.bmWidth = ModulRect.right  - ModulRect.left;
    Modul_size.bmHeight= ModulRect.bottom - ModulRect.top ;
    // Bitmap Generieren
    ModulHintergrund = CreateBitmapIndirect(&amp;Modul_size);
    HintergrundHdc   = CreateCompatibleDC(NULL);
    SelectObject(HintergrundHdc, ModulHintergrund);
    ZeichenflaechHdc = GetDC(info-&gt;handles.Zeichenblatt);
   BitBlt( HintergrundHdc
          , ModulRect.left, ModulRect.top
          , ModulRect.right - ModulRect.left, ModulRect.bottom - ModulRect.top
          , ZeichenflaechHdc
          , ModulDaten-&gt;xPosition, ModulDaten-&gt;yPosition
          , SRCAND
          );
    ReleaseDC(info-&gt;handles.Zeichenblatt,ZeichenflaechHdc);
  //Neues Bild einfügen und evt. erweitern
  // Zuerst den Hintergrund!
  //SetBkMode(*Abbhdc,TRANSPARENT);
  //  SetBkMode(hdc,TRANSPARENT);
  /*  StretchBlt(	hdc		
              , 0,0,rect.right,rect.bottom
              ,	HintergrundHdc
              , 0,0,rect.right,rect.bottom
              , SRCCOPY
              );*/
/*    BitBlt( hdc
          , 0, 0
          , rect.right, rect.bottom
          , ZeichenflaechHdc
          , 0, 0
          , SRCCOPY
          );*/
 /*   BitBlt( hdc
          , 0, 0
          , rect.right, rect.bottom
          , ZeichenflaechHdc
          , 0, 0
          , SRCCOPY
          );*/
/*  StretchBlt(	ZeichenflaechHdc		
            , 0,0,rect.right,rect.bottom
            ,	*Abbhdc	
            , 0,0,bm.bmWidth,bm.bmHeight
            , SRCAND
            );*/

  }
  if(ListeTyp != Auswahl)
  StretchBlt(	hdc		
            , 0,0,rect.right,rect.bottom
            ,	*Abbhdc
            , 0,0,bm.bmWidth,bm.bmHeight
            , SRCCOPY
            );
//  i=i;
  else
    StretchBlt(	hdc		
              , 0,0,rect.right,rect.bottom
              ,	*Abbhdc	
              , 0,0,bm.bmWidth,bm.bmHeight
              , SRCCOPY
              );

//  DeleteObject(ModulHintergrund);
  DeleteDC(HintergrundHdc);

	EndPaint(handle,&amp;ps);
	UpdateWindow(handle);
  return TRUE;
}

bool erstelleStandardAbbildung(HBITMAP *ZBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info)
{
  HDC hdc, hdcAbb;

	RECT AbBild_rect, Kasten, hilfsrect;

	int i;

	int Hoch,Breit;

	int BreiteMax = 112;

	hdc = GetDC(NULL);
	hdcAbb = CreateCompatibleDC(hdc);
  *ZBild = CreateCompatibleBitmap(	hdc
																	, INT(RasterMass * 7)
																	, INT(((RasterMass * 3 * (ModulDaten-&gt;AnzEingaenge - 1)) + (RasterMass * 4)))
				              					 );
  SelectObject(hdcAbb , *ZBild);

  AbBild_rect.left   = 0;
	AbBild_rect.top    = 0;
	Hoch =
	AbBild_rect.bottom = INT(((RasterMass * 3 * (ModulDaten-&gt;AnzEingaenge - 1)) + (RasterMass * 4)));
	Breit =
	AbBild_rect.right  = INT(RasterMass * 7);

	FillRect(hdcAbb,&amp;AbBild_rect,(HBRUSH) GetStockObject (WHITE_BRUSH));

	// Der Rahmen
	Rectangle(hdcAbb,INT(RasterMass * 2),0,INT(RasterMass * 5),AbBild_rect.bottom);
	// Den Rahmen versärken
	Rectangle(hdcAbb,INT(RasterMass * 2) + 1,1,INT(RasterMass * 5) - 1,AbBild_rect.bottom - 1);

	// Die Füllfarbe
	Kasten.top = 0 + 2;
	Kasten.left = (INT(RasterMass * 2) + 2);
	Kasten.right =(INT(RasterMass * 5) - 2);
	Kasten.bottom = (AbBild_rect.bottom - 2);
  FillRect(hdcAbb,&amp;Kasten,HintergrungFarbe.Bloecke);
	// Die Eingangspins
	for(i=0; i &lt; ModulDaten-&gt;AnzEingaenge; i++)
	{
		hilfsrect.top    = INT(((RasterMass * 2) + (RasterMass * 3 * i) - 1));
		hilfsrect.left   = 0;
		hilfsrect.right = INT((RasterMass * 2));
		hilfsrect.bottom  = INT(((RasterMass * 2) + (RasterMass * 3 * i) + 1));
		FillRect(hdcAbb,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	};

	// Der Ausgangspin
	hilfsrect.top    = INT(((RasterMass * 3.5) - 1));
	hilfsrect.left   = INT(RasterMass * 5);
	hilfsrect.right =  INT(RasterMass * 7);
	hilfsrect.bottom  = INT(((RasterMass * 3.5) + 1));
	FillRect(hdcAbb,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	//Schrift wählen
	SelectObject (hdcAbb,info-&gt;Schrift.Schrift);
	SetBkMode(hdcAbb,TRANSPARENT);
	TextOut(hdcAbb,INT(RasterMass * 2) + 1,INT(RasterMass * 3),ModulDaten-&gt;Pin,3);

  DeleteDC(hdc);
	DeleteDC(hdcAbb);

	return TRUE;
}

bool TextEinfuegen(HDC *Abbhdc, HBITMAP *AbbBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info)
{
 	KOORDINATE	TextPos;
  BITMAP bmrect;

  switch(ModulDaten-&gt;Bausteintyp)
  { //Zuerst die Festen Abbildungen
 		case Eingang :
    case Merker_Eingang :
    case R_Ausgang :
    {
			TextPos.x = INT( (RasterMass + 2)) - 1;
			TextPos.y = INT( (RasterMass / 2));
      break;
    }
    case Ausgang :
    case Merker_Ausgang :
    {
			TextPos.x = INT(((RasterMass * 3)) + 1);    
			TextPos.y = INT( (RasterMass / 2));
      break;
    }
    case Register_Merker :
    case Register_Ausgang :
    {
			TextPos.x = INT(((RasterMass * 5) + 2));
			TextPos.y = INT(((RasterMass * 4.5)));
      break;
    }
    case Timer :
    {
 			TextPos.x = INT((RasterMass * 2) + 4);
			TextPos.y = INT(((RasterMass * 2) + 1));
      break;
    }
    case EA_Eingang :
    {
			TextPos.x = INT( (RasterMass + 2)) - 2;
			TextPos.y = INT( (RasterMass / 2));
      break;
    }
    case EA_Ausgang :
    {
			TextPos.x = INT(((RasterMass * 2)) + 1);    
			TextPos.y = INT( (RasterMass * 1.5));
      break;
    }
    default :
    { 
      return TRUE;
      break;
    }
  };

	SetBkMode(*Abbhdc,TRANSPARENT);

	TextOut(*Abbhdc,TextPos.x,TextPos.y,ModulDaten-&gt;Pin,strlen(ModulDaten-&gt;Pin));	

  // Den Zusaetzlichen Text ausgeben!
  if(ModulDaten-&gt;TextDarstellen)
  { 
    RECT AbBild_rect;
 		GetObject(*AbbBild,sizeof(BITMAP), &amp;bmrect);				//Mass bestimmen			
    SelectObject (*Abbhdc,info-&gt;Schrift.Schrift);           //Schrift neu setzen
    // Flaeche vorher einweissen
    AbBild_rect.left   = 0;
    AbBild_rect.top    = bmrect.bmHeight - 2 * RasterMass;
    AbBild_rect.bottom = bmrect.bmHeight;
    AbBild_rect.right  = bmrect.bmWidth;
   	FillRect(*Abbhdc,&amp;AbBild_rect,(HBRUSH) GetStockObject (WHITE_BRUSH));

    TextOut(*Abbhdc,0,INT(bmrect.bmHeight - 1.5 * RasterMass),ModulDaten-&gt;Bezeichnung,strlen(ModulDaten-&gt;Bezeichnung));
  }

  return TRUE;

};

bool liefereAbbildung( HDC *Abbhdc, HBITMAP *Abbildung, BlockSpeicherFeld *ModulDaten, ProgrammInformation *info)
{
  HDC hdc, Bildhdc;
  BITMAP  bm_size;
  HBITMAP ZBild;  //Zichablage fuer ein Bitmap
  bool    zBild_loeschen=FALSE;
  //AllgemeinerZeichenHandel
  hdc = GetDC(info-&gt;handles.Zeichnenfenster);
  //Zeichenhandle fuers Bild erstellen
  *Abbhdc = CreateCompatibleDC(NULL);
  Bildhdc = CreateCompatibleDC(NULL);
  //Bitmap erstellen
  switch(ModulDaten-&gt;Bausteintyp)
  { //Zuerst die Festen Abbildungen
 		case Eingang :
    {
      GetObject(info-&gt;Bilder.Eingang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Eingang);
      break;
    }
    case Ausgang :
    {
      GetObject(info-&gt;Bilder.Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Ausgang);
      break;
    }
    case Merker_Ausgang :
    {
      GetObject(info-&gt;Bilder.Merker_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Merker_Ausgang);
      break;
    }
    case Merker_Eingang :
    {
      GetObject(info-&gt;Bilder.Merker_Eingang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Merker_Eingang);
      break;
    }
    case Register_Merker :
    {
      GetObject(info-&gt;Bilder.Register_Merker,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Register_Merker);
      break;
    }
    case Register_Ausgang :
    {
      GetObject(info-&gt;Bilder.Register_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Register_Ausgang);
      break;
    }
    case Timer :
    {
      GetObject(info-&gt;Bilder.Timer,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Timer);
      break;
    }
    case High :
    {
      GetObject(info-&gt;Bilder.HIGH,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.HIGH);
      break;
    }
    case R_Ausgang :
    {
      GetObject(info-&gt;Bilder.R_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.R_Ausgang);
      break;
    }
    case EA_Eingang :
    {
      GetObject(info-&gt;Bilder.EA_Eingang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.EA_Eingang);
      break;
    }
    case EA_Ausgang :
    {
      GetObject(info-&gt;Bilder.EA_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.EA_Ausgang);
      break;
    }
//Makro
    case MAKRO :
    {
      GetObject(info-&gt;Bilder.MAKRO,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.MAKRO);
      break;
    }
    case POR :
    {
      GetObject(info-&gt;Bilder.POR,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.POR);
      break;
    }
    case Und :
    case Oder :
    case XOR :
    {
      erstelleStandardAbbildung(&amp;ZBild,ModulDaten,info);
      GetObject(ZBild,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, ZBild);
      zBild_loeschen = TRUE;
      break;
    }
    default :
      {  
      GetObject(info-&gt;Bilder.Leer,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Leer);
      break;
    }
  };

  if(ModulDaten-&gt;TextDarstellen)
    bm_size.bmHeight += (2 * RasterMass);

  *Abbildung = CreateBitmapIndirect(&amp;bm_size);
  SelectObject(*Abbhdc, *Abbildung);

  BitBlt(*Abbhdc,0,0,bm_size.bmWidth,bm_size.bmHeight,Bildhdc,0,0,SRCCOPY);
  DeleteDC(Bildhdc);
  if(zBild_loeschen)
    DeleteObject(ZBild);
  return TRUE;
};

////////////////////////////////////////////////////////////
//				'NegierungZeichen'						  //
//														  //
// Hier wird für jeden ModulTyp die Negierung, wenn		  //
// vorhanden, gezeichnet.						          //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 18.04.2001						  //	
//														  //	
//	letzte Änderung : 20.06.2001						  //	
//														  //	
							  //	
////////////////////////////////////////////////////////////
bool NegierungZeichen(HDC hdc,BlockSpeicherFeld *BlockZeiger,ProgrammInformation *info)
{
	int i;
	RECT BlockRect,hilfsrect;
	GetClientRect((*BlockZeiger).BausteinHandle,&amp;BlockRect);
	// Zuerst die Eingänge. Da die Lage unterschiedlich muss hier differentiert werden
	switch ((*BlockZeiger).Bausteintyp)
		{
		case Ausgang			:		
		case Merker_Ausgang		:
			{
			if((*BlockZeiger).NegEingang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (*info).Raster - ((*info).Raster / 2);
				hilfsrect.bottom  = (*info).Raster + ((*info).Raster / 2);
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Timer				:
			{
			if((*BlockZeiger).NegEingang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (2 * (*info).Raster) - ((*info).Raster / 2);
				hilfsrect.bottom  = (2 * (*info).Raster) + ((*info).Raster / 2);
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Register_Merker	:
		case Register_Ausgang	:
			{
			for (i = 0; i &lt; (*BlockZeiger).AnzEingaenge; i++)
				if((*BlockZeiger).NegEingang[i])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));					
				hilfsrect.top     = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - ((*info).Raster / 2)));
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				hilfsrect.bottom  = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + ((*info).Raster / 2)));
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Oder				:
		case XOR				:
		case Und				:
		{
			for (i = 0; i &lt; (*BlockZeiger).AnzEingaenge; i++)
			{
				if((*BlockZeiger).NegEingang[i])
				{
  				// Die Negierung
					hilfsrect.top     = (INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - ((*info).Raster / 2))));
					hilfsrect.left    = (*info).Raster;
					hilfsrect.right   = (*info).Raster * 2;
					hilfsrect.bottom  = (INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + ((*info).Raster / 2))));
          FillRect(hdc,&amp;hilfsrect,(HBRUSH) GetStockObject (WHITE_BRUSH));
					//SelectObject(hdc,GetStockObject(BLACK_PEN));					
					Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			};
			break;
		};
		case EA_Ausgang			:
			{
			for (i = 0; i &lt; (*BlockZeiger).AnzEingaenge; i++)
				{
				if((*BlockZeiger).NegEingang[i])
					{
					SelectObject(hdc,GetStockObject(BLACK_PEN));					
					}
				else
					SelectObject(hdc,GetStockObject(WHITE_PEN));
				// Die Negierung
				hilfsrect.top     = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - ((*info).Raster / 2)));
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				hilfsrect.bottom  = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + ((*info).Raster / 2)));
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);

				// Den Anschluss nachzeichnen
				hilfsrect.top    = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - (2 * (*info).Zoom)));
				hilfsrect.left   = (*info).Raster;
				hilfsrect.right = INT(((*info).Raster * 2));
				hilfsrect.bottom  = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + (2 * (*info).Zoom)));
				if(!(*BlockZeiger).NegEingang[i])
					FillRect(hdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));	
				};
			break;

			};
		};
	// Dann die Ausgänge !! Da die Ausgänge teilweise verschieden liegen, muss hier differentiert werden.
	switch ((*BlockZeiger).Bausteintyp)
		{
		case Eingang		:
		case Merker_Eingang	:
		case High			:
		case R_Ausgang		:
		case EA_Eingang		:
		case MAKRO          :
		case POR			:	//04_08_01 POR hinzugefügt
			{
			if((*BlockZeiger).NegAusgang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (*info).Raster - ((*info).Raster / 2);
				hilfsrect.bottom  = (*info).Raster + ((*info).Raster / 2);
				hilfsrect.left    = BlockRect.right - (2 *(*info).Raster);
				hilfsrect.right   = BlockRect.right - (*info).Raster;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};	
			break;
			};
		case Timer			:
			{
			if((*BlockZeiger).NegAusgang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (2 * (*info).Raster) - ((*info).Raster / 2);
				hilfsrect.bottom  = (2 * (*info).Raster) + ((*info).Raster / 2);
				hilfsrect.left    = BlockRect.right - (2 *(*info).Raster);
				hilfsrect.right   = BlockRect.right - (*info).Raster;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};	
			break;
			};
		case Oder			:
		case XOR			:
		case Und			:
		{
			if((*BlockZeiger).NegAusgang[0])
			{
				SelectObject(hdc,GetStockObject(BLACK_PEN));					
				hilfsrect.top     = 3 * (*info).Raster;
				hilfsrect.left    = BlockRect.right - (2 *(*info).Raster);
				hilfsrect.right   = BlockRect.right - (*info).Raster;
				hilfsrect.bottom  = 4 * (*info).Raster;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};
				break;
		};
		};
	return TRUE;
};

bool Negierung_in_Bitmap_Zeichen(HDC *Abbhdc,HBITMAP *AbbBild,BlockSpeicherFeld *ModulDaten,ProgrammInformation *info)
{

  RECT hilfsrect;

  int i;
  BITMAP bm_size;

	SelectObject(*Abbhdc,GetStockObject(BLACK_PEN));
  SetBkMode(*Abbhdc,TRANSPARENT);

  //Zuerts die Eingaenge
  switch (ModulDaten-&gt;Bausteintyp)
	{
    case Oder				:
    case XOR				:
		case Und				:
		case Register_Merker	:
		case Register_Ausgang	:
 		case EA_Ausgang			:
		{
			for (i = 0; i &lt; ModulDaten-&gt;AnzEingaenge; i++)
			{
				if(ModulDaten-&gt;NegEingang[i])
				{
  				// Die Negierung
					hilfsrect.top     = (INT(((RasterMass * 2) + (RasterMass * 3 * i) - (RasterMass / 2))));
					hilfsrect.left    = RasterMass;
					hilfsrect.right   = RasterMass * 2;
					hilfsrect.bottom  = (INT(((RasterMass * 2) + (RasterMass * 3 * i) + (RasterMass / 2))));
					Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			};
			break;
		}
 		case Ausgang			:		
		case Merker_Ausgang		:
		{
			if(ModulDaten-&gt;NegEingang[0])
			{
				hilfsrect.top     = RasterMass - (RasterMass / 2);
				hilfsrect.bottom  = RasterMass + (RasterMass / 2);
				hilfsrect.left    = RasterMass;
				hilfsrect.right   = RasterMass * 2;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Timer				:
		{
			if(ModulDaten-&gt;NegEingang[0])
			{
				hilfsrect.top     = (2 * RasterMass) - (RasterMass / 2);
				hilfsrect.bottom  = (2 * RasterMass) + (RasterMass / 2);
				hilfsrect.left    = RasterMass;
				hilfsrect.right   = RasterMass * 2;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};
			break;
		};
  };

	// Dann die Ausgänge !! Da die Ausgänge teilweise verschieden liegen, muss hier differentiert werden.
	switch (ModulDaten-&gt;Bausteintyp)
	{
		case Eingang		:
		case Merker_Eingang	:
		case High			:
		case R_Ausgang		:
		case EA_Eingang		:
		case MAKRO          ://nachträglich makro eingefügt
		case POR			:	//04_08_01 POR hinzugefügt
		{
			if(ModulDaten-&gt;NegAusgang[0])
			{
        GetObject(*AbbBild,sizeof(BITMAP), &amp;bm_size);
				hilfsrect.top     = INT(RasterMass * 0.5);
				hilfsrect.bottom  = INT(RasterMass * 1.5);
				hilfsrect.left    = bm_size.bmWidth - (2 * RasterMass);
				hilfsrect.right   = bm_size.bmWidth - RasterMass;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};	
			break;
		};
		case Timer			:
		{
			if(ModulDaten-&gt;NegAusgang[0])
			{
        GetObject(*AbbBild,sizeof(BITMAP), &amp;bm_size);
				hilfsrect.top     = INT(1.5 * RasterMass);
				hilfsrect.bottom  = INT(2.5 * RasterMass);
				hilfsrect.left    = bm_size.bmWidth - (2 * RasterMass);
				hilfsrect.right   = bm_size.bmWidth - RasterMass;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};	
			break;
		};
		case Oder			:
		case XOR			:
		case Und			:
		{
			if(ModulDaten-&gt;NegAusgang[0])
			{
        GetObject(*AbbBild,sizeof(BITMAP), &amp;bm_size);
				hilfsrect.top     = 3 * RasterMass;
				hilfsrect.left    = bm_size.bmWidth - (2 * RasterMass);
				hilfsrect.right   = bm_size.bmWidth - RasterMass;
				hilfsrect.bottom  = 4 * RasterMass;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};
				break;
		};
  };
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'zeichneaktiviert'						  //
//														  //
// Die Module in der lokalen Variable müssen aktiv		  //
// gezeichnet werden.								      //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 07.03.2001						  //	
//														  //	
//	letzte Änderung : 12.03.2001						  //	
//														  //	

//														  //	
////////////////////////////////////////////////////////////
bool zeichneaktiviert(HDC *Abbhdc, HBITMAP *Abbildung)

{
	RECT hilfsrect;
  BITMAP bm_size;
	int groesse = 4;
	GetObject(*Abbildung,sizeof(BITMAP), &amp;bm_size);
	// Oben links
	hilfsrect.top    = 0;
	hilfsrect.left   = 0;
	hilfsrect.right  = groesse;
	hilfsrect.bottom = groesse;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	// Oben rechts
	hilfsrect.left  = bm_size.bmWidth - groesse;
	hilfsrect.right = bm_size.bmWidth;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	// unten rechts
	hilfsrect.top    = bm_size.bmHeight - groesse;
	hilfsrect.bottom = bm_size.bmHeight;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	// unten links
	hilfsrect.left  = 0;
	hilfsrect.right = groesse;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	return TRUE;
}

////////////////////////////////////////////////////////////
//				'kopiereBlock'							                    //
//														                            //
// Die ist nur eine Unterfunktion, um alle Element aus dem//
// Speicher in ein lokaleVariable zum Weiterverarbeiten   //
// umzukopieren.                                          //
//														                            //
////////////////////////////////////////////////////////////
//														                            //	
//	erstellt am     : 08.06.2001						              //	
//														                            //	
//	letzte Änderung : 08.06.2001						              //	
//														                            //	

//														                            //	
////////////////////////////////////////////////////////////
bool kopiereBlock(BlockSpeicherFeld *LokZeiger, BlockSpeicherFeld *hZeiger)
{
	int i;
	(*LokZeiger).aktiviert		= (*hZeiger).aktiviert;
	(*LokZeiger).AnzEingaenge	= (*hZeiger).AnzEingaenge;
	(*LokZeiger).BausteinHandle = (*hZeiger).BausteinHandle;
	(*LokZeiger).Bausteinnummer = (*hZeiger).Bausteinnummer;
	(*LokZeiger).Bausteintyp	= (*hZeiger).Bausteintyp;
	strcpy((*LokZeiger).Bezeichnung,(*hZeiger).Bezeichnung);
	for (i = 0; i &lt; 8; i++)
		{
		(*LokZeiger).NegAusgang[i] = (*hZeiger).NegAusgang[i];
		(*LokZeiger).NegEingang[i] = (*hZeiger).NegEingang[i];
		};
	strcpy((*LokZeiger).Pin, (*hZeiger).Pin);
	(*LokZeiger).TextDarstellen = (*hZeiger).TextDarstellen;
	(*LokZeiger).xPosition = (*hZeiger).xPosition;
	(*LokZeiger).yPosition = (*hZeiger).yPosition;
	return TRUE;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/147194/hilfe-zur-modulauswahlleiste</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 22:58:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147194.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 May 2006 07:53:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 12:40:22 GMT]]></title><description><![CDATA[<p>Hallo Ich bin am verzweifeln habe ein projekt wo ich in der Modulauswahleiste ein Bitmap einfügen möchte welches ich dann in das Bearbeitungsfenster ziehen kann</p>
<p>Das Bitmap heist Makro (siehe Bild) was ich schon erstellt habe<br />
<a href="http://img150.imagevenue.com/img.php?loc=loc178&amp;image=78146_makro_rsource.JPG" rel="nofollow"></a><a href="http://img150.imagevenue.com/loc178/th_78146_makro_rsource.JPG" rel="nofollow">http://img150.imagevenue.com/loc178/th_78146_makro_rsource.JPG</a></p>
<p>Und es sollte in dieses MOdul Auswahlfenster (siehe Bild)<br />
<a href="http://img109.imagevenue.com/img.php?loc=loc199&amp;image=78141_hauptfenster_makro.JPG" rel="nofollow"></a><a href="http://img109.imagevenue.com/loc199/th_78141_hauptfenster_makro.JPG" rel="nofollow">http://img109.imagevenue.com/loc199/th_78141_hauptfenster_makro.JPG</a></p>
<p>So nun habe ich versuche den quellcode von den anderen Bitmaps zu übernehmen für mein Makro.bmp aber leider sehe ich mein Bitmap dann immernoch nicht in der Auswahlleiste.</p>
<p>Deswegen wollte ich fragen ob ich den quellcode hier posten darf dies sind aber ca 1200 Zeilen quellcode und das bei 5 verschiedenen cpp dateien.</p>
<p>Deswegen wollte ich erstmaöl fragen ob ich dies darf oder wie man sich sonst irgendwie man mir bei meinene Projekt helfen kann</p>
<p>ok folgender code der blockgrafik.cpp</p>
<pre><code>#define Test

#include &lt;afxext.h&gt;
#include &lt;windows.h&gt;
#include &quot;AllgDekla.h&quot;
#include &quot;BlockGrafik.h&quot;
#include &quot;resource.h&quot;

bool erstelleStandardAbbildung(HBITMAP *ZBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info);
bool Negierung_in_Bitmap_Zeichen(HDC *Abbhdc,HBITMAP *Abbildung,BlockSpeicherFeld *ModulDaten,ProgrammInformation *info);
bool kopiereBlock(BlockSpeicherFeld *LokZeiger, BlockSpeicherFeld *hZeiger);

bool liefereAbbildung  (HDC *Abbhdc, HBITMAP *Abbildung , BlockSpeicherFeld *ModulDaten, ProgrammInformation *info);
bool TextEinfuegen     (HDC *Abbhdc, HBITMAP *AbbBild   , BlockSpeicherFeld *ModulDaten,ProgrammInformation *info);
bool Bitmap_ins_Fenster(HDC *Abbhdc, HBITMAP *Abbildung , BlockSpeicherFeld *ModulDaten, HWND handle, WListe ListeTyp,	ProgrammInformation *info);
bool zeichneaktiviert  (HDC *Abbhdc, HBITMAP *Abbildung);

bool BlockDatenHolen(  ProgrammInformation *info,HGLOBAL SpeicherHandle
                     , HWND handle,bool Lokale,BlockSpeicherFeld *LokVar
                     , BlockSpeicherFeld *aktuellerBlock);

bool HindergrundHolen (HDC *Hghdc, HBITMAP *HinterBild, BlockSpeicherFeld *aktuellerBlock, ProgrammInformation *info);

////////////////////////////////////////////////////////////
//				'InitSchrift'							                      //
//														                            //
// Beim Start werden Schriften einmal initiert. Dabei gibt//
// es einmal eine Schrift für die Pin-Beschriftung und    //
// einmal eine Schrift für die selbst eingetragene Beschr.// 
//														                            //
////////////////////////////////////////////////////////////
//														                            //	
//	erstellt am     : 02.03.2001						              //	
//														                            //	
//	letzte Änderung : 15.01.2002						              //	
//														                            //	

//														                            //	
////////////////////////////////////////////////////////////
extern bool InitSchrift (ProgrammInformation *info)
{
	LOGFONT EigenFont;
	//Erste Schrift, zum reizeichnen in die Blöcke
	EigenFont.lfHeight = INT(info-&gt;Raster);
	EigenFont.lfWidth = INT((info-&gt;Raster / 2)) ;
	EigenFont.lfEscapement = 0;
	EigenFont.lfOrientation = 0;
	EigenFont.lfWeight = 400;
	EigenFont.lfItalic = FALSE;
	EigenFont.lfUnderline = FALSE;
	EigenFont.lfStrikeOut = FALSE;
	EigenFont.lfCharSet = ANSI_CHARSET;
	EigenFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
	EigenFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	EigenFont.lfQuality = DEFAULT_QUALITY;
	EigenFont.lfPitchAndFamily = DEFAULT_PITCH;
	info-&gt;Schrift.Schrift1 = CreateFontIndirect (&amp;EigenFont);
	// Zweite Schrift für die individuelle Bezeichnung
	EigenFont.lfHeight = INT(1.5 *  info-&gt;Raster);
	EigenFont.lfWidth = INT((1.5 * (info-&gt;Raster / 2)) + 1);
	info-&gt;Schrift.Schrift2 = CreateFontIndirect (&amp;EigenFont);
  // Dritte und feste Schrift jk 15.01.03
  EigenFont.lfHeight = INT(1 * RasterMass);
	EigenFont.lfWidth = INT((1 * (RasterMass / 2)) + 1);
	info-&gt;Schrift.Schrift = CreateFontIndirect (&amp;EigenFont);

	return TRUE;
};

////////////////////////////////////////////////////////////
//				'KillSchrift'					                    		  //
//													                          	  //
// Die Schriften müsse für Windows wieder freigegeben     //
// werden.												                        //
//														                            //
////////////////////////////////////////////////////////////
//														                            //	
//	erstellt am     : 02.03.2001			              		  //	
//													                              //	
//	letzte Änderung : 02.03.2001			            			  //	
//														                            //	
//	von			    : Jan Karstens (Diplom, FH Westküste)     //	
//														                            //	
//	betreut von     : Prof. Christian Siemers			        //	
//														                            //	
////////////////////////////////////////////////////////////
extern bool	KillSchrift(ProgrammInformation *info)
{
	// Löschen der verwendeten Schriften !
	DeleteObject(info-&gt;Schrift.Schrift1);
	DeleteObject(info-&gt;Schrift.Schrift2);
	DeleteObject(info-&gt;Schrift.Schrift );
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'InitBilder'							  //
//														  //
// Die Bitmap aus der resource.h werden in Variablen      //
// geladen.												  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 03.03.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//														  //	
/
//														  //	
////////////////////////////////////////////////////////////
extern bool InitBilder(ProgrammInformation *info)
{
	(*info).Bilder.Leer				= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_LEER));
	(*info).Bilder.Eingang			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_EINGANG));
	(*info).Bilder.Ausgang			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_AUSGANG));
	(*info).Bilder.Merker_Ausgang	= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_MERKER_AUSGANG));
	(*info).Bilder.Merker_Eingang	= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_MERKER_EINGANG));
	(*info).Bilder.Register_Ausgang = LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_REGISTER_AUSGANG));
	(*info).Bilder.Register_Merker  = LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_REGISTER_MERKER));
	(*info).Bilder.Timer			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_TIMER));
	(*info).Bilder.Verknuepft		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_VERKNUEPFT));
	(*info).Bilder.HIGH				= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_HIGH));
	(*info).Bilder.Negiert			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_NEGIERT));
	//makro eingefügt
	(*info).Bilder.MAKRO			= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_MAKRO));
	// neue Module
	(*info).Bilder.R_Ausgang		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_R_AUSGANG));
	(*info).Bilder.EA_Ausgang		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_EA_AUS));
	(*info).Bilder.EA_Eingang		= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_EA_EIN));
	//04_08_01 POR hinzugefügt
	(*info).Bilder.POR				= LoadBitmap((*info).hInstance,MAKEINTRESOURCE(ID_PowerOnReset));
	HintergrungFarbe.Eingang = CreateSolidBrush(RGB(213,234,138));	// pastell gruen
	HintergrungFarbe.Ausgang = CreateSolidBrush(RGB(249,188,179));	// pastell rot
	HintergrungFarbe.Merker  = CreateSolidBrush(RGB(136,209,244));	 // pastell blau
	HintergrungFarbe.Bloecke = CreateSolidBrush(RGB(252,251,220));	// pastell gelb	
	HintergrungFarbe.Timer   = CreateSolidBrush(RGB(237,211,231));	//	grau
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'KillBilder'							  //
//														  //
// Die Bitmap müssen beim Programmende wieder freigegeben //
// werden.												  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 03.03.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//														  //	
						  //	
////////////////////////////////////////////////////////////
extern bool KillBilder (ProgrammInformation *info)
{
	DeleteObject((*info).Bilder.Leer);
	DeleteObject((*info).Bilder.Ausgang);
	DeleteObject((*info).Bilder.Eingang);
	DeleteObject((*info).Bilder.Merker_Ausgang);
	DeleteObject((*info).Bilder.Merker_Eingang);
	DeleteObject((*info).Bilder.Register_Ausgang);
	DeleteObject((*info).Bilder.Register_Merker);
	DeleteObject((*info).Bilder.Timer);
	DeleteObject((*info).Bilder.Verknuepft);
	DeleteObject((*info).Bilder.HIGH);
	DeleteObject((*info).Bilder.Negiert);
	DeleteObject((*info).Bilder.R_Ausgang);
	DeleteObject((*info).Bilder.EA_Ausgang);
	DeleteObject((*info).Bilder.EA_Eingang);
	DeleteObject((*info).Bilder.MAKRO);
	//04_08_01 POR hinzugefügt
	DeleteObject((*info).Bilder.POR);
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'BlockEinreihen'						  //
//														  //
// Beim erstellen der Module für die Modulauswahl müssen  //
// angereiht werden. Dabei wird einfach das letzte		  //
// gespeicherte Modul genommen un daraus die neuen		  //
// Koordinaten ermittelt und eingetragen.				  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 26.02.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//												  //	
//														  //	
////////////////////////////////////////////////////////////
extern bool BlockEinreihen(ProgrammInformation *info,HGLOBAL SpeicherHandle,int pos,HWND handle)
{
	BlockSpeicherFeld *Zeiger;
	int a,b,i;
	RECT rect;
	Zeiger = (BlockSpeicherFeld *) GlobalLock(SpeicherHandle);
	(*(Zeiger + pos)).BausteinHandle = handle;
	// Die dazugehörigen Informationen raussuchen
	for (i = 1; handle != (*(Zeiger + i)).BausteinHandle;i++);
		if(i &gt; 1)
			{
			GetClientRect((*(Zeiger + i - 1)).BausteinHandle,&amp;rect);
			(*(Zeiger + i )).yPosition = INT((rect.bottom + ((*(Zeiger +i -1)).yPosition * ((*info).Raster / 2)) + 10) 
											/ ((*info).Raster / 2));
			}
		else (*(Zeiger + i)).yPosition = INT(10  / ((*info).Raster / 2));

		//Die Modulgroesse anpassen
		switch ((*(Zeiger + i)).Bausteintyp)
			{
			case Eingang :
			case Ausgang :
			case R_Ausgang :
			case Merker_Eingang :
			case Merker_Ausgang :
				{
				a = 7; // Die grösse des Bildes im Rastermass
				b = 2;
				break;
				};
			case Register_Merker :
			case Register_Ausgang :
				{
				a =  9;
				b = 10;
				break;
				};
			case Timer :
				{
				a = 7;
				b = 4;
				break;
				};
			case XOR :
			case Und :
			case Oder :
			case MAKRO :
				{
				a = 7;
				b = 7;
				break;
				};
			case High	:
			case POR	:	//04_08_01 POR hinzugefügt
				{
				a = 2;
				b = 2;
				break;
				};
			case EA_Eingang:
				{
				// Abfrage, da dieser Port nur bei Speedy vorhanden ist
				if ((*info).SPS_Typ == SPEEDY)
					{
					a = 7;
					b = 2;
					}
				else
					{
					a = 0;
					b = 0;
					};
				break;
				};
			case EA_Ausgang:
				{
				// Abfrage, da dieser Port nur bei Speedy vorhanden ist
				if ((*info).SPS_Typ == SPEEDY)
					{
					a = 5;
					b = 7;
					}
				else
					{
					a = 0;
					b = 0;
					};
				break;
				};
			default :
				{
				a = 0;
				b = 0;
				break;
				};
			};
		// Koordinaten festlegen
	MoveWindow(	handle,	((*(Zeiger + i)).xPosition * (*info).Raster),
						((*(Zeiger + i)).yPosition * (*info).Raster / 2),
						a * (*info).Raster,
						b * (*info).Raster,
						TRUE);
	GetClientRect(handle,&amp;rect);
	GlobalUnlock(SpeicherHandle);
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'BlockSichtbarImFenster'				  //
//														  //
// Diese Funktion diente ebenfalls zum abgrenzen von      //
// Blöcken, Jedoch wegen Problem mit dem Handling der     //
// Handles, wurde diese nicht weiter verfolgt.			  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 27.02.2001						  //	
//														  //	
//	letzte Änderung : 27.03.2001						  //	
//														  //	
							  //	
////////////////////////////////////////////////////////////
extern bool BlockSichtbarImFenster(ProgrammInformation *info,HGLOBAL SpeicherHandle,HWND handle)
{
	RECT rect,gueltiges_rect,Modul_rect;
	int i;

	BlockSpeicherFeld *Zeiger;
	Zeiger = (BlockSpeicherFeld *) GlobalLock(SpeicherHandle);
	// überprüfen, ob vorhanden und die eigene Position
	for ( i = 1; ((i &lt; (*Zeiger).Bausteinnummer) &amp;&amp; (handle != (*(Zeiger + i)).BausteinHandle)); i++);
	if ( i == (*Zeiger).Bausteinnummer)
		{
		GlobalUnlock(SpeicherHandle);
		return FALSE;
		}
	int zwischen;
	// Grenzbereich festlegen
	GetClientRect((*info).handles.Zeichnenfenster,&amp;rect);
	GetClientRect(handle,&amp;Modul_rect);
	zwischen = INT(Modul_rect.bottom * 2 / (*info).Raster);
	gueltiges_rect.top		=	(*info).Zeichenblatt.VertPos - 
								zwischen;
	zwischen = 0;//INT(rect.bottom * 2/ (*info).Raster);	
	gueltiges_rect.bottom	=	(*info).Zeichenblatt.VertPos + 
								zwischen;
	zwischen = INT(Modul_rect.right / (*info).Raster);
	gueltiges_rect.left		=	(*info).Zeichenblatt.HorzPos -
								zwischen;
	zwischen = 0;//INT(rect.right / (*info).Raster);
	gueltiges_rect.right	=	(*info).Zeichenblatt.HorzPos + 
								zwischen;
	// Abfrage ob dieser im erlaubten Bereich liegt
	if (((*(Zeiger +i)).xPosition &gt; gueltiges_rect.left   ) &amp;&amp;
		((*(Zeiger +i)).yPosition &gt; gueltiges_rect.top    ) &amp;&amp;
		((*(Zeiger +i)).xPosition &lt; gueltiges_rect.right  ) &amp;&amp;
		((*(Zeiger +i)).yPosition &lt; gueltiges_rect.bottom ) )
	{
		GlobalUnlock(SpeicherHandle);
		return TRUE;
	}
	else
	{
		GlobalUnlock(SpeicherHandle);
		return FALSE;
	}
	GlobalUnlock(SpeicherHandle);
	return FALSE;
};

////////////////////////////////////////////////////////////
//				'BlockZeichnen'							  //
//														  //
// Kommt vom Hauptprogramm die Message zum Neuzeichnen,   //
// hat man zuerst nur den Handle. Dieser wird dann aus der//
// Liste herausgesucht und eintsprechend dem Typ neugezei.//
// Die LokVar hat nur am Anfang eine Sonderbehandlung	  //
// wegen dem aktiviert zeichnen und weil nicht die Werte  //
// aus dem Speicher genommen werden.					  //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 01.03.2001						  //	
//														  //	
//	letzte Änderung : 04.08.2001						  //	
//														  //	

//														  //	
////////////////////////////////////////////////////////////
extern bool BlockZeichnen(ProgrammInformation *info,HGLOBAL SpeicherHandle,
						  HWND handle,WListe ListeTyp,bool Lokale,BlockSpeicherFeld *LokVar)
{

  HDC               Abbhdc;
	HBITMAP	          Abbildung;
  BlockSpeicherFeld aktuellerBlock;

  if (!BlockDatenHolen(  info, SpeicherHandle, handle, Lokale, LokVar, &amp;aktuellerBlock))
    return FALSE;
  // Erstellen der Bitmap
  liefereAbbildung           (&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock, info);
  // Negierung in das Bitmap Zeichnen
  Negierung_in_Bitmap_Zeichen(&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock, info);
  // Evt. Texte einfuegen
  TextEinfuegen              (&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock, info);
  // Aktivierung Zeichnen
  if (aktuellerBlock.aktiviert)
    zeichneaktiviert(&amp;Abbhdc, &amp;Abbildung);
  // Und Bitmap ins Fenster Zeichnen!!
  Bitmap_ins_Fenster         (&amp;Abbhdc, &amp;Abbildung, &amp;aktuellerBlock,handle,ListeTyp,info);

  // Objekte loeschen, da diese sonst ihre Gueltigkeit verlieren
  DeleteObject(Abbildung);
  DeleteDC(Abbhdc);
	return TRUE;
};

bool BlockDatenHolen(  ProgrammInformation *info,HGLOBAL SpeicherHandle
                     , HWND handle,bool Lokale,BlockSpeicherFeld *LokVar
                     , BlockSpeicherFeld *aktuellerBlock)
{

 	int i = 1, AnzElement;
	BlockSpeicherFeld *Zeiger;
	if (Lokale)
	{
		kopiereBlock(aktuellerBlock,LokVar);
	}
	else
	{
		Zeiger = (BlockSpeicherFeld *) GlobalLock(SpeicherHandle);
    AnzElement = Zeiger-&gt;Bausteinnummer; 
    Zeiger ++;  // Um einen erhoehen, weil an der ersten Stelle Array Infos stehen!
		// Die dazugehörigen Informationen raussuchen
		for (i = 1; (handle != Zeiger-&gt;BausteinHandle) ;i++, Zeiger++)
			if(i &gt;= AnzElement)
				return FALSE;
		kopiereBlock(aktuellerBlock,Zeiger );
		GlobalUnlock(SpeicherHandle);
	};
  return TRUE;
}

bool Bitmap_ins_Fenster(HDC *Abbhdc, HBITMAP	*Abbildung, BlockSpeicherFeld *ModulDaten, HWND handle, WListe ListeTyp,	ProgrammInformation *info)
{
  HDC hdc;
 	RECT rect;
	PAINTSTRUCT ps;
	BITMAP bm;
  RECT ModulRect;
  // Variablen um Hintergrund zu ermitteln
  HBITMAP ModulHintergrund;
  HDC     ZeichenflaechHdc, HintergrundHdc;
  BITMAP  Modul_size;

  int i;
  int vertikal= 0; // Verschiebung in er Modulauswahl

  //Zeichnen-Konstukt fürs Modulfenster
	hdc = BeginPaint(handle,&amp;ps);

  SetROP2(hdc,R2_XORPEN);

	//Grösse der vorhandenen Abbildung ermitteln
	GetObject(*Abbildung,sizeof(BITMAP), &amp;bm);							
	//Wenn die Zeile gescrollt wurde (Gilt nur fuer die Modulauswahl)
	if(ListeTyp == Auswahl)
	{
		vertikal = info-&gt;AuswahlLeiste.VertPos;
	}
  ModulRect.left   = ModulDaten-&gt;xPosition * info-&gt;Raster;
  ModulRect.top    = (ModulDaten-&gt;yPosition - vertikal) * info-&gt;Raster / 2;
  ModulRect.right  = INT(bm.bmWidth * info-&gt;Zoom);
  ModulRect.bottom = INT(bm.bmHeight * info-&gt;Zoom);

	MoveWindow(	handle
            ,	ModulRect.left
            ,	ModulRect.top
            ,	ModulRect.right
            ,	ModulRect.bottom
            ,	TRUE
            );
	GetClientRect(handle,&amp;rect);
  //Bild Infos holen
 	if(ListeTyp != Auswahl)
  {
 	  GetObject(*Abbildung,sizeof(BITMAP), &amp;Modul_size);							
    // Groesse Aendern
    Modul_size.bmWidth = ModulRect.right  - ModulRect.left;
    Modul_size.bmHeight= ModulRect.bottom - ModulRect.top ;
    // Bitmap Generieren
    ModulHintergrund = CreateBitmapIndirect(&amp;Modul_size);
    HintergrundHdc   = CreateCompatibleDC(NULL);
    SelectObject(HintergrundHdc, ModulHintergrund);
    ZeichenflaechHdc = GetDC(info-&gt;handles.Zeichenblatt);
   BitBlt( HintergrundHdc
          , ModulRect.left, ModulRect.top
          , ModulRect.right - ModulRect.left, ModulRect.bottom - ModulRect.top
          , ZeichenflaechHdc
          , ModulDaten-&gt;xPosition, ModulDaten-&gt;yPosition
          , SRCAND
          );
    ReleaseDC(info-&gt;handles.Zeichenblatt,ZeichenflaechHdc);
  //Neues Bild einfügen und evt. erweitern
  // Zuerst den Hintergrund!
  //SetBkMode(*Abbhdc,TRANSPARENT);
  //  SetBkMode(hdc,TRANSPARENT);
  /*  StretchBlt(	hdc		
              , 0,0,rect.right,rect.bottom
              ,	HintergrundHdc
              , 0,0,rect.right,rect.bottom
              , SRCCOPY
              );*/
/*    BitBlt( hdc
          , 0, 0
          , rect.right, rect.bottom
          , ZeichenflaechHdc
          , 0, 0
          , SRCCOPY
          );*/
 /*   BitBlt( hdc
          , 0, 0
          , rect.right, rect.bottom
          , ZeichenflaechHdc
          , 0, 0
          , SRCCOPY
          );*/
/*  StretchBlt(	ZeichenflaechHdc		
            , 0,0,rect.right,rect.bottom
            ,	*Abbhdc	
            , 0,0,bm.bmWidth,bm.bmHeight
            , SRCAND
            );*/

  }
  if(ListeTyp != Auswahl)
  StretchBlt(	hdc		
            , 0,0,rect.right,rect.bottom
            ,	*Abbhdc
            , 0,0,bm.bmWidth,bm.bmHeight
            , SRCCOPY
            );
//  i=i;
  else
    StretchBlt(	hdc		
              , 0,0,rect.right,rect.bottom
              ,	*Abbhdc	
              , 0,0,bm.bmWidth,bm.bmHeight
              , SRCCOPY
              );

//  DeleteObject(ModulHintergrund);
  DeleteDC(HintergrundHdc);

	EndPaint(handle,&amp;ps);
	UpdateWindow(handle);
  return TRUE;
}

bool erstelleStandardAbbildung(HBITMAP *ZBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info)
{
  HDC hdc, hdcAbb;

	RECT AbBild_rect, Kasten, hilfsrect;

	int i;

	int Hoch,Breit;

	int BreiteMax = 112;

	hdc = GetDC(NULL);
	hdcAbb = CreateCompatibleDC(hdc);
  *ZBild = CreateCompatibleBitmap(	hdc
																	, INT(RasterMass * 7)
																	, INT(((RasterMass * 3 * (ModulDaten-&gt;AnzEingaenge - 1)) + (RasterMass * 4)))
				              					 );
  SelectObject(hdcAbb , *ZBild);

  AbBild_rect.left   = 0;
	AbBild_rect.top    = 0;
	Hoch =
	AbBild_rect.bottom = INT(((RasterMass * 3 * (ModulDaten-&gt;AnzEingaenge - 1)) + (RasterMass * 4)));
	Breit =
	AbBild_rect.right  = INT(RasterMass * 7);

	FillRect(hdcAbb,&amp;AbBild_rect,(HBRUSH) GetStockObject (WHITE_BRUSH));

	// Der Rahmen
	Rectangle(hdcAbb,INT(RasterMass * 2),0,INT(RasterMass * 5),AbBild_rect.bottom);
	// Den Rahmen versärken
	Rectangle(hdcAbb,INT(RasterMass * 2) + 1,1,INT(RasterMass * 5) - 1,AbBild_rect.bottom - 1);

	// Die Füllfarbe
	Kasten.top = 0 + 2;
	Kasten.left = (INT(RasterMass * 2) + 2);
	Kasten.right =(INT(RasterMass * 5) - 2);
	Kasten.bottom = (AbBild_rect.bottom - 2);
  FillRect(hdcAbb,&amp;Kasten,HintergrungFarbe.Bloecke);
	// Die Eingangspins
	for(i=0; i &lt; ModulDaten-&gt;AnzEingaenge; i++)
	{
		hilfsrect.top    = INT(((RasterMass * 2) + (RasterMass * 3 * i) - 1));
		hilfsrect.left   = 0;
		hilfsrect.right = INT((RasterMass * 2));
		hilfsrect.bottom  = INT(((RasterMass * 2) + (RasterMass * 3 * i) + 1));
		FillRect(hdcAbb,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	};

	// Der Ausgangspin
	hilfsrect.top    = INT(((RasterMass * 3.5) - 1));
	hilfsrect.left   = INT(RasterMass * 5);
	hilfsrect.right =  INT(RasterMass * 7);
	hilfsrect.bottom  = INT(((RasterMass * 3.5) + 1));
	FillRect(hdcAbb,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	//Schrift wählen
	SelectObject (hdcAbb,info-&gt;Schrift.Schrift);
	SetBkMode(hdcAbb,TRANSPARENT);
	TextOut(hdcAbb,INT(RasterMass * 2) + 1,INT(RasterMass * 3),ModulDaten-&gt;Pin,3);

  DeleteDC(hdc);
	DeleteDC(hdcAbb);

	return TRUE;
}

bool TextEinfuegen(HDC *Abbhdc, HBITMAP *AbbBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info)
{
 	KOORDINATE	TextPos;
  BITMAP bmrect;

  switch(ModulDaten-&gt;Bausteintyp)
  { //Zuerst die Festen Abbildungen
 		case Eingang :
    case Merker_Eingang :
    case R_Ausgang :
    {
			TextPos.x = INT( (RasterMass + 2)) - 1;
			TextPos.y = INT( (RasterMass / 2));
      break;
    }
    case Ausgang :
    case Merker_Ausgang :
    {
			TextPos.x = INT(((RasterMass * 3)) + 1);    
			TextPos.y = INT( (RasterMass / 2));
      break;
    }
    case Register_Merker :
    case Register_Ausgang :
    {
			TextPos.x = INT(((RasterMass * 5) + 2));
			TextPos.y = INT(((RasterMass * 4.5)));
      break;
    }
    case Timer :
    {
 			TextPos.x = INT((RasterMass * 2) + 4);
			TextPos.y = INT(((RasterMass * 2) + 1));
      break;
    }
    case EA_Eingang :
    {
			TextPos.x = INT( (RasterMass + 2)) - 2;
			TextPos.y = INT( (RasterMass / 2));
      break;
    }
    case EA_Ausgang :
    {
			TextPos.x = INT(((RasterMass * 2)) + 1);    
			TextPos.y = INT( (RasterMass * 1.5));
      break;
    }
    default :
    { 
      return TRUE;
      break;
    }
  };

	SetBkMode(*Abbhdc,TRANSPARENT);

	TextOut(*Abbhdc,TextPos.x,TextPos.y,ModulDaten-&gt;Pin,strlen(ModulDaten-&gt;Pin));	

  // Den Zusaetzlichen Text ausgeben!
  if(ModulDaten-&gt;TextDarstellen)
  { 
    RECT AbBild_rect;
 		GetObject(*AbbBild,sizeof(BITMAP), &amp;bmrect);				//Mass bestimmen			
    SelectObject (*Abbhdc,info-&gt;Schrift.Schrift);           //Schrift neu setzen
    // Flaeche vorher einweissen
    AbBild_rect.left   = 0;
    AbBild_rect.top    = bmrect.bmHeight - 2 * RasterMass;
    AbBild_rect.bottom = bmrect.bmHeight;
    AbBild_rect.right  = bmrect.bmWidth;
   	FillRect(*Abbhdc,&amp;AbBild_rect,(HBRUSH) GetStockObject (WHITE_BRUSH));

    TextOut(*Abbhdc,0,INT(bmrect.bmHeight - 1.5 * RasterMass),ModulDaten-&gt;Bezeichnung,strlen(ModulDaten-&gt;Bezeichnung));
  }

  return TRUE;

};

bool liefereAbbildung( HDC *Abbhdc, HBITMAP *Abbildung, BlockSpeicherFeld *ModulDaten, ProgrammInformation *info)
{
  HDC hdc, Bildhdc;
  BITMAP  bm_size;
  HBITMAP ZBild;  //Zichablage fuer ein Bitmap
  bool    zBild_loeschen=FALSE;
  //AllgemeinerZeichenHandel
  hdc = GetDC(info-&gt;handles.Zeichnenfenster);
  //Zeichenhandle fuers Bild erstellen
  *Abbhdc = CreateCompatibleDC(NULL);
  Bildhdc = CreateCompatibleDC(NULL);
  //Bitmap erstellen
  switch(ModulDaten-&gt;Bausteintyp)
  { //Zuerst die Festen Abbildungen
 		case Eingang :
    {
      GetObject(info-&gt;Bilder.Eingang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Eingang);
      break;
    }
    case Ausgang :
    {
      GetObject(info-&gt;Bilder.Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Ausgang);
      break;
    }
    case Merker_Ausgang :
    {
      GetObject(info-&gt;Bilder.Merker_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Merker_Ausgang);
      break;
    }
    case Merker_Eingang :
    {
      GetObject(info-&gt;Bilder.Merker_Eingang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Merker_Eingang);
      break;
    }
    case Register_Merker :
    {
      GetObject(info-&gt;Bilder.Register_Merker,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Register_Merker);
      break;
    }
    case Register_Ausgang :
    {
      GetObject(info-&gt;Bilder.Register_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Register_Ausgang);
      break;
    }
    case Timer :
    {
      GetObject(info-&gt;Bilder.Timer,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Timer);
      break;
    }
    case High :
    {
      GetObject(info-&gt;Bilder.HIGH,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.HIGH);
      break;
    }
    case R_Ausgang :
    {
      GetObject(info-&gt;Bilder.R_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.R_Ausgang);
      break;
    }
    case EA_Eingang :
    {
      GetObject(info-&gt;Bilder.EA_Eingang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.EA_Eingang);
      break;
    }
    case EA_Ausgang :
    {
      GetObject(info-&gt;Bilder.EA_Ausgang,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.EA_Ausgang);
      break;
    }
//Makro
    case MAKRO :
    {
      GetObject(info-&gt;Bilder.MAKRO,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.MAKRO);
      break;
    }
    case POR :
    {
      GetObject(info-&gt;Bilder.POR,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.POR);
      break;
    }
    case Und :
    case Oder :
    case XOR :
    {
      erstelleStandardAbbildung(&amp;ZBild,ModulDaten,info);
      GetObject(ZBild,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, ZBild);
      zBild_loeschen = TRUE;
      break;
    }
    default :
      {  
      GetObject(info-&gt;Bilder.Leer,sizeof(BITMAP), &amp;bm_size);
      SelectObject(Bildhdc, info-&gt;Bilder.Leer);
      break;
    }
  };

  if(ModulDaten-&gt;TextDarstellen)
    bm_size.bmHeight += (2 * RasterMass);

  *Abbildung = CreateBitmapIndirect(&amp;bm_size);
  SelectObject(*Abbhdc, *Abbildung);

  BitBlt(*Abbhdc,0,0,bm_size.bmWidth,bm_size.bmHeight,Bildhdc,0,0,SRCCOPY);
  DeleteDC(Bildhdc);
  if(zBild_loeschen)
    DeleteObject(ZBild);
  return TRUE;
};

////////////////////////////////////////////////////////////
//				'NegierungZeichen'						  //
//														  //
// Hier wird für jeden ModulTyp die Negierung, wenn		  //
// vorhanden, gezeichnet.						          //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 18.04.2001						  //	
//														  //	
//	letzte Änderung : 20.06.2001						  //	
//														  //	
							  //	
////////////////////////////////////////////////////////////
bool NegierungZeichen(HDC hdc,BlockSpeicherFeld *BlockZeiger,ProgrammInformation *info)
{
	int i;
	RECT BlockRect,hilfsrect;
	GetClientRect((*BlockZeiger).BausteinHandle,&amp;BlockRect);
	// Zuerst die Eingänge. Da die Lage unterschiedlich muss hier differentiert werden
	switch ((*BlockZeiger).Bausteintyp)
		{
		case Ausgang			:		
		case Merker_Ausgang		:
			{
			if((*BlockZeiger).NegEingang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (*info).Raster - ((*info).Raster / 2);
				hilfsrect.bottom  = (*info).Raster + ((*info).Raster / 2);
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Timer				:
			{
			if((*BlockZeiger).NegEingang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (2 * (*info).Raster) - ((*info).Raster / 2);
				hilfsrect.bottom  = (2 * (*info).Raster) + ((*info).Raster / 2);
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Register_Merker	:
		case Register_Ausgang	:
			{
			for (i = 0; i &lt; (*BlockZeiger).AnzEingaenge; i++)
				if((*BlockZeiger).NegEingang[i])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));					
				hilfsrect.top     = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - ((*info).Raster / 2)));
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				hilfsrect.bottom  = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + ((*info).Raster / 2)));
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Oder				:
		case XOR				:
		case Und				:
		{
			for (i = 0; i &lt; (*BlockZeiger).AnzEingaenge; i++)
			{
				if((*BlockZeiger).NegEingang[i])
				{
  				// Die Negierung
					hilfsrect.top     = (INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - ((*info).Raster / 2))));
					hilfsrect.left    = (*info).Raster;
					hilfsrect.right   = (*info).Raster * 2;
					hilfsrect.bottom  = (INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + ((*info).Raster / 2))));
          FillRect(hdc,&amp;hilfsrect,(HBRUSH) GetStockObject (WHITE_BRUSH));
					//SelectObject(hdc,GetStockObject(BLACK_PEN));					
					Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			};
			break;
		};
		case EA_Ausgang			:
			{
			for (i = 0; i &lt; (*BlockZeiger).AnzEingaenge; i++)
				{
				if((*BlockZeiger).NegEingang[i])
					{
					SelectObject(hdc,GetStockObject(BLACK_PEN));					
					}
				else
					SelectObject(hdc,GetStockObject(WHITE_PEN));
				// Die Negierung
				hilfsrect.top     = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - ((*info).Raster / 2)));
				hilfsrect.left    = (*info).Raster;
				hilfsrect.right   = (*info).Raster * 2;
				hilfsrect.bottom  = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + ((*info).Raster / 2)));
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);

				// Den Anschluss nachzeichnen
				hilfsrect.top    = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) - (2 * (*info).Zoom)));
				hilfsrect.left   = (*info).Raster;
				hilfsrect.right = INT(((*info).Raster * 2));
				hilfsrect.bottom  = INT((((*info).Raster * 2) + ((*info).Raster * 3 * i) + (2 * (*info).Zoom)));
				if(!(*BlockZeiger).NegEingang[i])
					FillRect(hdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));	
				};
			break;

			};
		};
	// Dann die Ausgänge !! Da die Ausgänge teilweise verschieden liegen, muss hier differentiert werden.
	switch ((*BlockZeiger).Bausteintyp)
		{
		case Eingang		:
		case Merker_Eingang	:
		case High			:
		case R_Ausgang		:
		case EA_Eingang		:
		case MAKRO          :
		case POR			:	//04_08_01 POR hinzugefügt
			{
			if((*BlockZeiger).NegAusgang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (*info).Raster - ((*info).Raster / 2);
				hilfsrect.bottom  = (*info).Raster + ((*info).Raster / 2);
				hilfsrect.left    = BlockRect.right - (2 *(*info).Raster);
				hilfsrect.right   = BlockRect.right - (*info).Raster;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};	
			break;
			};
		case Timer			:
			{
			if((*BlockZeiger).NegAusgang[0])
				{
				SelectObject(hdc,GetStockObject(BLACK_PEN));
				hilfsrect.top     = (2 * (*info).Raster) - ((*info).Raster / 2);
				hilfsrect.bottom  = (2 * (*info).Raster) + ((*info).Raster / 2);
				hilfsrect.left    = BlockRect.right - (2 *(*info).Raster);
				hilfsrect.right   = BlockRect.right - (*info).Raster;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};	
			break;
			};
		case Oder			:
		case XOR			:
		case Und			:
		{
			if((*BlockZeiger).NegAusgang[0])
			{
				SelectObject(hdc,GetStockObject(BLACK_PEN));					
				hilfsrect.top     = 3 * (*info).Raster;
				hilfsrect.left    = BlockRect.right - (2 *(*info).Raster);
				hilfsrect.right   = BlockRect.right - (*info).Raster;
				hilfsrect.bottom  = 4 * (*info).Raster;
				Ellipse(hdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};
				break;
		};
		};
	return TRUE;
};

bool Negierung_in_Bitmap_Zeichen(HDC *Abbhdc,HBITMAP *AbbBild,BlockSpeicherFeld *ModulDaten,ProgrammInformation *info)
{

  RECT hilfsrect;

  int i;
  BITMAP bm_size;

	SelectObject(*Abbhdc,GetStockObject(BLACK_PEN));
  SetBkMode(*Abbhdc,TRANSPARENT);

  //Zuerts die Eingaenge
  switch (ModulDaten-&gt;Bausteintyp)
	{
    case Oder				:
    case XOR				:
		case Und				:
		case Register_Merker	:
		case Register_Ausgang	:
 		case EA_Ausgang			:
		{
			for (i = 0; i &lt; ModulDaten-&gt;AnzEingaenge; i++)
			{
				if(ModulDaten-&gt;NegEingang[i])
				{
  				// Die Negierung
					hilfsrect.top     = (INT(((RasterMass * 2) + (RasterMass * 3 * i) - (RasterMass / 2))));
					hilfsrect.left    = RasterMass;
					hilfsrect.right   = RasterMass * 2;
					hilfsrect.bottom  = (INT(((RasterMass * 2) + (RasterMass * 3 * i) + (RasterMass / 2))));
					Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			};
			break;
		}
 		case Ausgang			:		
		case Merker_Ausgang		:
		{
			if(ModulDaten-&gt;NegEingang[0])
			{
				hilfsrect.top     = RasterMass - (RasterMass / 2);
				hilfsrect.bottom  = RasterMass + (RasterMass / 2);
				hilfsrect.left    = RasterMass;
				hilfsrect.right   = RasterMass * 2;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};
			break;
			};
		case Timer				:
		{
			if(ModulDaten-&gt;NegEingang[0])
			{
				hilfsrect.top     = (2 * RasterMass) - (RasterMass / 2);
				hilfsrect.bottom  = (2 * RasterMass) + (RasterMass / 2);
				hilfsrect.left    = RasterMass;
				hilfsrect.right   = RasterMass * 2;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};
			break;
		};
  };

	// Dann die Ausgänge !! Da die Ausgänge teilweise verschieden liegen, muss hier differentiert werden.
	switch (ModulDaten-&gt;Bausteintyp)
	{
		case Eingang		:
		case Merker_Eingang	:
		case High			:
		case R_Ausgang		:
		case EA_Eingang		:
		case MAKRO          ://nachträglich makro eingefügt
		case POR			:	//04_08_01 POR hinzugefügt
		{
			if(ModulDaten-&gt;NegAusgang[0])
			{
        GetObject(*AbbBild,sizeof(BITMAP), &amp;bm_size);
				hilfsrect.top     = INT(RasterMass * 0.5);
				hilfsrect.bottom  = INT(RasterMass * 1.5);
				hilfsrect.left    = bm_size.bmWidth - (2 * RasterMass);
				hilfsrect.right   = bm_size.bmWidth - RasterMass;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};	
			break;
		};
		case Timer			:
		{
			if(ModulDaten-&gt;NegAusgang[0])
			{
        GetObject(*AbbBild,sizeof(BITMAP), &amp;bm_size);
				hilfsrect.top     = INT(1.5 * RasterMass);
				hilfsrect.bottom  = INT(2.5 * RasterMass);
				hilfsrect.left    = bm_size.bmWidth - (2 * RasterMass);
				hilfsrect.right   = bm_size.bmWidth - RasterMass;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
				};	
			break;
		};
		case Oder			:
		case XOR			:
		case Und			:
		{
			if(ModulDaten-&gt;NegAusgang[0])
			{
        GetObject(*AbbBild,sizeof(BITMAP), &amp;bm_size);
				hilfsrect.top     = 3 * RasterMass;
				hilfsrect.left    = bm_size.bmWidth - (2 * RasterMass);
				hilfsrect.right   = bm_size.bmWidth - RasterMass;
				hilfsrect.bottom  = 4 * RasterMass;
				Ellipse(*Abbhdc,hilfsrect.left,hilfsrect.top,hilfsrect.right,hilfsrect.bottom);
			};
				break;
		};
  };
	return TRUE;
};

////////////////////////////////////////////////////////////
//				'zeichneaktiviert'						  //
//														  //
// Die Module in der lokalen Variable müssen aktiv		  //
// gezeichnet werden.								      //
//														  //
////////////////////////////////////////////////////////////
//														  //	
//	erstellt am     : 07.03.2001						  //	
//														  //	
//	letzte Änderung : 12.03.2001						  //	
//														  //	

//														  //	
////////////////////////////////////////////////////////////
bool zeichneaktiviert(HDC *Abbhdc, HBITMAP *Abbildung)

{
	RECT hilfsrect;
  BITMAP bm_size;
	int groesse = 4;
	GetObject(*Abbildung,sizeof(BITMAP), &amp;bm_size);
	// Oben links
	hilfsrect.top    = 0;
	hilfsrect.left   = 0;
	hilfsrect.right  = groesse;
	hilfsrect.bottom = groesse;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	// Oben rechts
	hilfsrect.left  = bm_size.bmWidth - groesse;
	hilfsrect.right = bm_size.bmWidth;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	// unten rechts
	hilfsrect.top    = bm_size.bmHeight - groesse;
	hilfsrect.bottom = bm_size.bmHeight;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	// unten links
	hilfsrect.left  = 0;
	hilfsrect.right = groesse;
	FillRect(*Abbhdc,&amp;hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH));
	return TRUE;
}

////////////////////////////////////////////////////////////
//				'kopiereBlock'							                    //
//														                            //
// Die ist nur eine Unterfunktion, um alle Element aus dem//
// Speicher in ein lokaleVariable zum Weiterverarbeiten   //
// umzukopieren.                                          //
//														                            //
////////////////////////////////////////////////////////////
//														                            //	
//	erstellt am     : 08.06.2001						              //	
//														                            //	
//	letzte Änderung : 08.06.2001						              //	
//														                            //	

//														                            //	
////////////////////////////////////////////////////////////
bool kopiereBlock(BlockSpeicherFeld *LokZeiger, BlockSpeicherFeld *hZeiger)
{
	int i;
	(*LokZeiger).aktiviert		= (*hZeiger).aktiviert;
	(*LokZeiger).AnzEingaenge	= (*hZeiger).AnzEingaenge;
	(*LokZeiger).BausteinHandle = (*hZeiger).BausteinHandle;
	(*LokZeiger).Bausteinnummer = (*hZeiger).Bausteinnummer;
	(*LokZeiger).Bausteintyp	= (*hZeiger).Bausteintyp;
	strcpy((*LokZeiger).Bezeichnung,(*hZeiger).Bezeichnung);
	for (i = 0; i &lt; 8; i++)
		{
		(*LokZeiger).NegAusgang[i] = (*hZeiger).NegAusgang[i];
		(*LokZeiger).NegEingang[i] = (*hZeiger).NegEingang[i];
		};
	strcpy((*LokZeiger).Pin, (*hZeiger).Pin);
	(*LokZeiger).TextDarstellen = (*hZeiger).TextDarstellen;
	(*LokZeiger).xPosition = (*hZeiger).xPosition;
	(*LokZeiger).yPosition = (*hZeiger).yPosition;
	return TRUE;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1057900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1057900</guid><dc:creator><![CDATA[Kapslerfun]]></dc:creator><pubDate>Mon, 15 May 2006 12:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 08:45:38 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=403" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=1" rel="nofollow">MFC (Visual C++)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1057934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1057934</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 15 May 2006 08:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 12:01:50 GMT]]></title><description><![CDATA[<p>das programm wurde nicht mit mfc geschrieben sonderm mit c++ 6.0<br />
warum wurde dieses verschoben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058061</guid><dc:creator><![CDATA[Kapslerfun]]></dc:creator><pubDate>Mon, 15 May 2006 12:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 12:08:35 GMT]]></title><description><![CDATA[<p>Weil du offensichtlich kein Problem mit ANSI C++ hast (das hat gar keine Ahnung von Bildern ;)), sondern mit Visual Studio.</p>
<p>PS: Und ohne wenigstens ein paar Code-Segmente zu sehen, kann dir hier wohl niemand wirklich helfen. Deine Oberfläche sieht stark nach &quot;selbstgebaut&quot; aus, und meine Kristallkugel ist immer noch in Reparatur (die Werkstatt findet den Fehler einfach nicht), also hast <strong>DU</strong> höhere Chancen, die richtige Stelle zu erraten als jeder andere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058067</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 15 May 2006 12:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 12:13:13 GMT]]></title><description><![CDATA[<p>Außerdem sehen wir am Code, ob du eventuell im WinApi-Forum besser aufgehoben wärst.<br />
Das vermute ich nämlich, wenn das Problem doch eher im Code als im Visual Studio steckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058072</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Mon, 15 May 2006 12:13:13 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 12:42:35 GMT]]></title><description><![CDATA[<p>Das Posting ist zu lang. Die maximal erlaubte Länge ist 65000 Bytes.</p>
<p>was mach ich nun<br />
der quellcode geht weiter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058100</guid><dc:creator><![CDATA[Kapslerfun]]></dc:creator><pubDate>Mon, 15 May 2006 12:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 12:58:02 GMT]]></title><description><![CDATA[<p>Such dir die Teile deines Quellcodes zusammen, die etwas mit dem Problem zu tun haben könnten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058110</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 15 May 2006 12:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Hilfe zur modulauswahlleiste on Mon, 15 May 2006 13:27:36 GMT]]></title><description><![CDATA[<p>Und wenn du es eh nochmal bearbeiten musst, nimm bitte die cpp-Tags, nicht die code. Cpp ist bunter. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058133</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Mon, 15 May 2006 13:27:36 GMT</pubDate></item></channel></rss>