Hilfe zur modulauswahlleiste
-
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
Das Bitmap heist Makro (siehe Bild) was ich schon erstellt habe
http://img150.imagevenue.com/loc178/th_78146_makro_rsource.JPGUnd es sollte in dieses MOdul Auswahlfenster (siehe Bild)
http://img109.imagevenue.com/loc199/th_78141_hauptfenster_makro.JPGSo 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.
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.
Deswegen wollte ich erstmaöl fragen ob ich dies darf oder wie man sich sonst irgendwie man mir bei meinene Projekt helfen kann
ok folgender code der blockgrafik.cpp
#define Test #include <afxext.h> #include <windows.h> #include "AllgDekla.h" #include "BlockGrafik.h" #include "resource.h" 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->Raster); EigenFont.lfWidth = INT((info->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->Schrift.Schrift1 = CreateFontIndirect (&EigenFont); // Zweite Schrift für die individuelle Bezeichnung EigenFont.lfHeight = INT(1.5 * info->Raster); EigenFont.lfWidth = INT((1.5 * (info->Raster / 2)) + 1); info->Schrift.Schrift2 = CreateFontIndirect (&EigenFont); // Dritte und feste Schrift jk 15.01.03 EigenFont.lfHeight = INT(1 * RasterMass); EigenFont.lfWidth = INT((1 * (RasterMass / 2)) + 1); info->Schrift.Schrift = CreateFontIndirect (&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->Schrift.Schrift1); DeleteObject(info->Schrift.Schrift2); DeleteObject(info->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 > 1) { GetClientRect((*(Zeiger + i - 1)).BausteinHandle,&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,&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 < (*Zeiger).Bausteinnummer) && (handle != (*(Zeiger + i)).BausteinHandle)); i++); if ( i == (*Zeiger).Bausteinnummer) { GlobalUnlock(SpeicherHandle); return FALSE; } int zwischen; // Grenzbereich festlegen GetClientRect((*info).handles.Zeichnenfenster,&rect); GetClientRect(handle,&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 > gueltiges_rect.left ) && ((*(Zeiger +i)).yPosition > gueltiges_rect.top ) && ((*(Zeiger +i)).xPosition < gueltiges_rect.right ) && ((*(Zeiger +i)).yPosition < 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, &aktuellerBlock)) return FALSE; // Erstellen der Bitmap liefereAbbildung (&Abbhdc, &Abbildung, &aktuellerBlock, info); // Negierung in das Bitmap Zeichnen Negierung_in_Bitmap_Zeichen(&Abbhdc, &Abbildung, &aktuellerBlock, info); // Evt. Texte einfuegen TextEinfuegen (&Abbhdc, &Abbildung, &aktuellerBlock, info); // Aktivierung Zeichnen if (aktuellerBlock.aktiviert) zeichneaktiviert(&Abbhdc, &Abbildung); // Und Bitmap ins Fenster Zeichnen!! Bitmap_ins_Fenster (&Abbhdc, &Abbildung, &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->Bausteinnummer; Zeiger ++; // Um einen erhoehen, weil an der ersten Stelle Array Infos stehen! // Die dazugehörigen Informationen raussuchen for (i = 1; (handle != Zeiger->BausteinHandle) ;i++, Zeiger++) if(i >= 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,&ps); SetROP2(hdc,R2_XORPEN); //Grösse der vorhandenen Abbildung ermitteln GetObject(*Abbildung,sizeof(BITMAP), &bm); //Wenn die Zeile gescrollt wurde (Gilt nur fuer die Modulauswahl) if(ListeTyp == Auswahl) { vertikal = info->AuswahlLeiste.VertPos; } ModulRect.left = ModulDaten->xPosition * info->Raster; ModulRect.top = (ModulDaten->yPosition - vertikal) * info->Raster / 2; ModulRect.right = INT(bm.bmWidth * info->Zoom); ModulRect.bottom = INT(bm.bmHeight * info->Zoom); MoveWindow( handle , ModulRect.left , ModulRect.top , ModulRect.right , ModulRect.bottom , TRUE ); GetClientRect(handle,&rect); //Bild Infos holen if(ListeTyp != Auswahl) { GetObject(*Abbildung,sizeof(BITMAP), &Modul_size); // Groesse Aendern Modul_size.bmWidth = ModulRect.right - ModulRect.left; Modul_size.bmHeight= ModulRect.bottom - ModulRect.top ; // Bitmap Generieren ModulHintergrund = CreateBitmapIndirect(&Modul_size); HintergrundHdc = CreateCompatibleDC(NULL); SelectObject(HintergrundHdc, ModulHintergrund); ZeichenflaechHdc = GetDC(info->handles.Zeichenblatt); BitBlt( HintergrundHdc , ModulRect.left, ModulRect.top , ModulRect.right - ModulRect.left, ModulRect.bottom - ModulRect.top , ZeichenflaechHdc , ModulDaten->xPosition, ModulDaten->yPosition , SRCAND ); ReleaseDC(info->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,&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->AnzEingaenge - 1)) + (RasterMass * 4))) ); SelectObject(hdcAbb , *ZBild); AbBild_rect.left = 0; AbBild_rect.top = 0; Hoch = AbBild_rect.bottom = INT(((RasterMass * 3 * (ModulDaten->AnzEingaenge - 1)) + (RasterMass * 4))); Breit = AbBild_rect.right = INT(RasterMass * 7); FillRect(hdcAbb,&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,&Kasten,HintergrungFarbe.Bloecke); // Die Eingangspins for(i=0; i < ModulDaten->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,&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,&hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH)); //Schrift wählen SelectObject (hdcAbb,info->Schrift.Schrift); SetBkMode(hdcAbb,TRANSPARENT); TextOut(hdcAbb,INT(RasterMass * 2) + 1,INT(RasterMass * 3),ModulDaten->Pin,3); DeleteDC(hdc); DeleteDC(hdcAbb); return TRUE; } bool TextEinfuegen(HDC *Abbhdc, HBITMAP *AbbBild, BlockSpeicherFeld *ModulDaten,ProgrammInformation *info) { KOORDINATE TextPos; BITMAP bmrect; switch(ModulDaten->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->Pin,strlen(ModulDaten->Pin)); // Den Zusaetzlichen Text ausgeben! if(ModulDaten->TextDarstellen) { RECT AbBild_rect; GetObject(*AbbBild,sizeof(BITMAP), &bmrect); //Mass bestimmen SelectObject (*Abbhdc,info->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,&AbBild_rect,(HBRUSH) GetStockObject (WHITE_BRUSH)); TextOut(*Abbhdc,0,INT(bmrect.bmHeight - 1.5 * RasterMass),ModulDaten->Bezeichnung,strlen(ModulDaten->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->handles.Zeichnenfenster); //Zeichenhandle fuers Bild erstellen *Abbhdc = CreateCompatibleDC(NULL); Bildhdc = CreateCompatibleDC(NULL); //Bitmap erstellen switch(ModulDaten->Bausteintyp) { //Zuerst die Festen Abbildungen case Eingang : { GetObject(info->Bilder.Eingang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Eingang); break; } case Ausgang : { GetObject(info->Bilder.Ausgang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Ausgang); break; } case Merker_Ausgang : { GetObject(info->Bilder.Merker_Ausgang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Merker_Ausgang); break; } case Merker_Eingang : { GetObject(info->Bilder.Merker_Eingang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Merker_Eingang); break; } case Register_Merker : { GetObject(info->Bilder.Register_Merker,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Register_Merker); break; } case Register_Ausgang : { GetObject(info->Bilder.Register_Ausgang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Register_Ausgang); break; } case Timer : { GetObject(info->Bilder.Timer,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Timer); break; } case High : { GetObject(info->Bilder.HIGH,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.HIGH); break; } case R_Ausgang : { GetObject(info->Bilder.R_Ausgang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.R_Ausgang); break; } case EA_Eingang : { GetObject(info->Bilder.EA_Eingang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.EA_Eingang); break; } case EA_Ausgang : { GetObject(info->Bilder.EA_Ausgang,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.EA_Ausgang); break; } //Makro case MAKRO : { GetObject(info->Bilder.MAKRO,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.MAKRO); break; } case POR : { GetObject(info->Bilder.POR,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.POR); break; } case Und : case Oder : case XOR : { erstelleStandardAbbildung(&ZBild,ModulDaten,info); GetObject(ZBild,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, ZBild); zBild_loeschen = TRUE; break; } default : { GetObject(info->Bilder.Leer,sizeof(BITMAP), &bm_size); SelectObject(Bildhdc, info->Bilder.Leer); break; } }; if(ModulDaten->TextDarstellen) bm_size.bmHeight += (2 * RasterMass); *Abbildung = CreateBitmapIndirect(&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,&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 < (*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 < (*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,&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 < (*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,&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->Bausteintyp) { case Oder : case XOR : case Und : case Register_Merker : case Register_Ausgang : case EA_Ausgang : { for (i = 0; i < ModulDaten->AnzEingaenge; i++) { if(ModulDaten->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->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->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->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->NegAusgang[0]) { GetObject(*AbbBild,sizeof(BITMAP), &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->NegAusgang[0]) { GetObject(*AbbBild,sizeof(BITMAP), &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->NegAusgang[0]) { GetObject(*AbbBild,sizeof(BITMAP), &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), &bm_size); // Oben links hilfsrect.top = 0; hilfsrect.left = 0; hilfsrect.right = groesse; hilfsrect.bottom = groesse; FillRect(*Abbhdc,&hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH)); // Oben rechts hilfsrect.left = bm_size.bmWidth - groesse; hilfsrect.right = bm_size.bmWidth; FillRect(*Abbhdc,&hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH)); // unten rechts hilfsrect.top = bm_size.bmHeight - groesse; hilfsrect.bottom = bm_size.bmHeight; FillRect(*Abbhdc,&hilfsrect,(HBRUSH) GetStockObject (BLACK_BRUSH)); // unten links hilfsrect.left = 0; hilfsrect.right = groesse; FillRect(*Abbhdc,&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 < 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; };
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
das programm wurde nicht mit mfc geschrieben sonderm mit c++ 6.0
warum wurde dieses verschoben.
-
Weil du offensichtlich kein Problem mit ANSI C++ hast (das hat gar keine Ahnung von Bildern ;)), sondern mit Visual Studio.
PS: Und ohne wenigstens ein paar Code-Segmente zu sehen, kann dir hier wohl niemand wirklich helfen. Deine Oberfläche sieht stark nach "selbstgebaut" aus, und meine Kristallkugel ist immer noch in Reparatur (die Werkstatt findet den Fehler einfach nicht), also hast DU höhere Chancen, die richtige Stelle zu erraten als jeder andere.
-
Außerdem sehen wir am Code, ob du eventuell im WinApi-Forum besser aufgehoben wärst.
Das vermute ich nämlich, wenn das Problem doch eher im Code als im Visual Studio steckt.
-
Das Posting ist zu lang. Die maximal erlaubte Länge ist 65000 Bytes.
was mach ich nun
der quellcode geht weiter
-
Such dir die Teile deines Quellcodes zusammen, die etwas mit dem Problem zu tun haben könnten

-
Und wenn du es eh nochmal bearbeiten musst, nimm bitte die cpp-Tags, nicht die code. Cpp ist bunter.
