Problem mit Timer



  • Hi,
    ich habe ein Problem mit einem Timer. Beim Kompilieren erscheint immer folgender Fehler:
    fatal error C1001: INTERNER COMPILER- FEHLER
    Voran könnte dies liegen?
    Ohne den Timer funktioniert das Kompilieren fehlerlos.
    Ich will in einem Zeitabstand von 2 Sekunden mehrere Bilder auf einer Hintergrundbitmap anzeigen lassen.
    Der Quellcode sieht so aus:

    /////////////////////////////////////////////////////////////////////////////
    void CMeinDlg::OnPaint()
    {
    Bild[0].LoadBitmap(IDB_BITMAP2); //CBitmap-Objekt

    CPaintDC dc(this); // Gerätekontext für Zeichnen
    CPaintDC* pDC = &dc;
    BITMAP bmBackground; //BITMAP-Struktur bm deklarieren
    Bild[0].GetObject(sizeof(bmBackground),&bmBackground); //Größe und Adresse von CBitmap Bild[0] --> BITMAP bm
    CDC memDC;
    memDC.CreateCompatibleDC(pDC); //SpeicherDC initialisieren
    memDC.SelectObject(&Bild[0]); //Hintergrundbild --> Speicher
    RECT Rect;
    GetClientRect(&Rect);
    pDC->StretchBlt(0,0,Rect.right,Rect.bottom,&memDC,0,0,
    bmBackground.bmWidth,bmBackground.bmHeight,SRCCOPY);
    CDialog::OnPaint();

    Bild[1].LoadBitmap(IDB_BITMAP3); //CBitmap-Objekt
    Bild[2].LoadBitmap(IDB_BITMAP4); //CBitmap-Objekt

    int nXDest=0;
    int nYDest=0;
    int b=1; // Variable für Bild[zahl]
    int c=0;
    int e=1;
    int f=0; //Variable für bm
    int s=0; //Variable für CDC SpeicherDC

    //////////////////////////////////////TIMEREINSATZ///////////////////////////////////////////////////////////////////////

    SetTimer(ID_TIMER, 2000, NULL); // Timer wird nach 2 Sek ausgelöst

    void CMeinDlg::OnTimer(UINT nIDEvent)
    {
    if (nIDEvent == ID_TIMER)
    {

    for(c=0;c<=30;c++) {

    if(e==1) {

    b=1;
    e+=1;
    f+=1;
    s+=1;
    nXDest+=2;
    nYDest+=2;
    }
    else {
    b=2;
    e-=1;
    f+=1;
    s+=1;
    nXDest+=5;
    nYDest+=5;

    }

    BITMAP bm[100];
    Bild[b].GetObject( sizeof( bm[f] ), &bm[f] );
    CDC SpeicherDC[100];
    SpeicherDC[s].CreateCompatibleDC( &dc );
    SpeicherDC[s].SelectObject( &Bild[b] );
    CRect Rect2;
    GetClientRect( &Rect2 );

    dc.BitBlt(nXDest,nYDest, bm[f].bmWidth, bm[f].bmHeight,
    &SpeicherDC[s],0,0,SRCAND);

    CDialog::OnPaint();

    }

    KillTimer(ID_TIMER);
    }
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Bitte helft mir!
    Schon einmal Danke im Vorraus!
    Gruß Crabbe



  • Ich bin mir ja nicht sicher aber ich würde mal tippen du hast was geändert in den mitgelieferten cpp's von Microsoft. Oder heist dein Basisdialog wirklich auch CDialog??. Wenn du was geändert hast mach das schnell wieder rückgängig und kill den Timer beim zerstören deiner eigenen Klasse.

    Der Compilerfehler, so ich das richtig sehe, rührt daher, daß ID_TIMER in der Klasse von Microsoft wohl unbekannt ist



  • Hi,
    erst einmal Danke, aber ich habe in den cpp's nichts verändert und wäre ID_TIMER der Klasse von Microsoft unbekannt, so hätte dies der Kompiler doch angezeigt etwa mit "ID_TIMER" nicht deklarierter Bezeichner.
    Oder nicht?

    Gru? Crabbe



  • Du kannst deine OnTimer nicht in die OnInitDialog reinschreiben!



  • CDialog ist eindeutig eine Klasse von Microsoft. Wenn du deine Klasse genauso genannt hast, dann änder den Namen. Sowas führt immer zu Komplikationen. Mach den Killtimer rein in void CMeinDlg::~CMeinDlg() oder in Destroy von CMeinDlg. Grundsätzlich ist es ratsam Objekte die du angelegt hast (und ein Timer ist ein Objekt) auch in der selben Klasse wieder zu zerstören.



  • Suchthaufen:
    Was laberst du da für nen Quatsch? Seine Klasse heisst CMeinDlg!



  • [quote="dEUs"]Du kannst deine OnTimer nicht in die OnInitDialog reinschreiben![/quote]
    Wo dann?
    Wie müsste der Quellcode aussehen?

    Gruß Crabbe



  • Du kannst keine Funktion in eine andere reinschreiben. Die muss ausserhalb stehen. Geh mal auf www.mut.de -> Leseecke -> VC++ 6.0 in 21 Tagen und lies dir das durch.


Anmelden zum Antworten