Narf! Geschrieben 18. Februar 2010 Geschrieben 18. Februar 2010 Hallo an alle, ich möchte einen kleinen Etiketten-Editor erstellen. Habe dazu einen Dialog mit einem CStatic-Feld in welches ich auch schon das grundlegende Bitmap geladen habe. Jetzt möchte ich in Eingabefeldern die Daten erfassen und gleich auf dem CStatic an die richtige Stelle zeichnen. Wie komme ich an den DC ran? Zitieren
Narf! Geschrieben 22. Februar 2010 Autor Geschrieben 22. Februar 2010 Tja, ganz einfach: NICHT CDC dc; SONDERN CDC *dc; Und dann dc=[steuerelement].GetDC(); Und los gehts. Zitieren
Narf! Geschrieben 24. Februar 2010 Autor Geschrieben 24. Februar 2010 Tja, doch nicht so einfach. Der Text verschwindet, wenn ich ein anderes Fenster anzeigen lasse und wird erst wieder gezeichnet, wenn ich in dem Eingabefeld wieder eine Eingabe mache. Wie kann ich den "alten" Inhalt behalten? CDC *dc_label=m_cSt_Label.GetDC(); CFont font; LOGFONTW lFont; CBrush pBrush(RGB(255, 255, 255)); ZeroMemory(&lFont, sizeof(LOGFONT)); lFont.lfHeight=hoehe; lFont.lfWeight=fett; lFont.lfItalic=italic; wcscpy(lFont.lfFaceName, L"Arial"); VERIFY(font.CreateFontIndirect(&lFont)); CFont* def_font=dc_label->SelectObject(&font); dc_label->FillRect(&rect, &pBrush); //löscht den Inhalt dc_label->DrawText(Text, rect, TextFormat); //TextFormat wie DT_VCENTER font.DeleteObject(); ReleaseDC(dc_label); Zitieren
Hexagon Geschrieben 24. Februar 2010 Geschrieben 24. Februar 2010 Moin. Wie kann ich den "alten" Inhalt behalten? Eventuell wäre es einfacher eine eigene Klasse vom CStatic abzuleiten und die OnPaint() Methode zu überschreiben? Zitieren
Narf! Geschrieben 25. Februar 2010 Autor Geschrieben 25. Februar 2010 Ich kann von dem Static-Feld nur Dialog-Klassen als Basis angeben. Ist das OK? Was muss in OnPaint() genau rein? Zitieren
Klotzkopp Geschrieben 25. Februar 2010 Geschrieben 25. Februar 2010 Ich kann von dem Static-Feld nur Dialog-Klassen als Basis angeben. Ist das OK?Was machst du denn da? Du sollst eine neue MFC-Klasse anlegen, und CStatic als Basisklasse benutzen. Zitieren
Narf! Geschrieben 1. März 2010 Autor Geschrieben 1. März 2010 Ich habe eine andere Lösung gefunden: Ich schreibe in die OnPaint() des Dialoges ein SetTimer([x], 100, 0) und bei OnTimer() rufe ich die OnChange-Funktionen nacheinander auf. Geht auch. Zitieren
Klotzkopp Geschrieben 1. März 2010 Geschrieben 1. März 2010 Das ist eine sehr unsaubere "Lösung". Zitieren
Bubble Geschrieben 1. März 2010 Geschrieben 1. März 2010 10 mal pro Sekunde ohne sinnvollen Grund neu zeichnen? Ich hoffe, solche Programme nie benutzen zu müssen... Die richtige Vorgehensweise ist es, aufgrund einer WM_PAINT Nachricht den zu erneuernden Bereich neu zu zeichnen. Zitieren
Narf! Geschrieben 3. Mai 2011 Autor Geschrieben 3. Mai 2011 Ein weiteres Problem: Habe einen neuen Monitor und eine höhere Auflösung 1680x1050 und DPI 120. Jetzt ist alles verschoben. Wenn ich über GetDC()->GetDeviceCaps(HORZRES/VERTRES) den Druckbereich vom Static-Feld abfrage, bekomme ich die Auflösung des Desktops. Ich möchte mich aber nur im Zeichenbereich des Static-Feldes rumtreiben. Wie komme ich an diesen Zeichenbereich? Zitieren
Klotzkopp Geschrieben 3. Mai 2011 Geschrieben 3. Mai 2011 Wenn ich über GetDC()->GetDeviceCaps(HORZRES/VERTRES) den Druckbereich vom Static-Feld abfrageMit HORZRES/VERTRES bekommst du nie den "Druckbereich" eines einzelnen Steuerelements, siehe Doku. Wie komme ich an diesen Zeichenbereich?GetClientRect. Zitieren
Narf! Geschrieben 3. Mai 2011 Autor Geschrieben 3. Mai 2011 Oje. Eigentlich möchte ich das Static-Feld so nutzen wie den Drucker, auf dem das Etikett gedruckt wird. Kann ich das Drucker-DC irgendwie dem Static-Feld beibringen? Zitieren
Klotzkopp Geschrieben 3. Mai 2011 Geschrieben 3. Mai 2011 Eigentlich möchte ich das Static-Feld so nutzen wie den Drucker, auf dem das Etikett gedruckt wird. Kannst du doch. Was ist denn genau das Problem? Ist die Schriftart nicht in der erwarteten Größe? Ist der Code da oben noch aktuell? Dann solltest du beim Erstellen des Fonts vielleicht eine Größe angeben. Zitieren
Narf! Geschrieben 4. Mai 2011 Autor Geschrieben 4. Mai 2011 Zuerst möchte ich, das Basis-BMP in das Static-Feld laden, aber es wird nicht angezeigt. Ich habe in den Eigenschaften des Static-Feldes das "Bild" IDB_BITMAP1, was die BMP-Datei enthält entfernt, weil es sich nicht an den Fensterbereich anpasst. Jetzt möchte ich die BMP-Datei in den DC des Static-Feldes so reinsetzen, dass es sich an den Fensterbereich anpasst, dann sollten auch die Textfelder an der richtigen Stelle sein. Für das Drucken habe ich ein Code-Beispiel genommen, und ehrlich gesagt verstehe ich nur die Hälft von dem, was da steht, was nicht gut ist, denn man sollte schließlich verstehen, was man da macht. Und einfach das DC des Druckers mit dem des Static-Feldes zu tauschen geht auch nicht einfach so. Zitieren
Klotzkopp Geschrieben 4. Mai 2011 Geschrieben 4. Mai 2011 Was meinst du mit "an den Fensterbereich anpassen"? Zitieren
Narf! Geschrieben 4. Mai 2011 Autor Geschrieben 4. Mai 2011 Das Bild soll sich der Größe des Fensters anpassen. Beim Drucker ist das so: CDC prt_DC; double druckBreite_mm=0.0; double druckHoehe_mm=0.0; CPrintDialog prtDlg(FALSE); //Eigenschaften des Standard-Druckers abfragen prtDlg.GetDefaults(); if(prt_DC.Attach(prtDlg.GetPrinterDC())) { prt_DC.m_bPrinting=TRUE; //ermitteln des tatsächlichen Druckbereiches druckBreite_mm=((float) prt_DC.GetDeviceCaps(HORZRES)/(float) prt_DC.GetDeviceCaps(LOGPIXELSX))*25.4; druckHoehe_mm=((float) prt_DC.GetDeviceCaps(VERTRES)/(float) prt_DC.GetDeviceCaps(LOGPIXELSY))*25.4; DOCINFO di; ZeroMemory(&di, sizeof(DOCINFO)); di.cbSize=sizeof(DOCINFO); //eine vorgegebene Label-Datei if(LabelDatei.Right(4).CompareNoCase(L".bmp")==0) { di.lpszDocName=LabelDatei; //*.bmp Label=LabelDatei; }//end if(LabelDatei.Right(4).CompareNoCase(L".bmp")==0) //oder das Basis-Label else { di.lpszDocName=Label; //basis.bmp }//end else by if(LabelDatei.Right(4).CompareNoCase(L".bmp")==0) BOOL bPrintingOK=prt_DC.StartDoc(&di); CPrintInfo Info; Info.SetMaxPage(1); //Maximale Druckgröße des Druckers ermitteln int maxw=prt_DC.GetDeviceCaps(HORZRES); int maxh=prt_DC.GetDeviceCaps(VERTRES); //Seitengröße für Dokument setzen Info.m_rectDraw.SetRect(0, 0, maxw, maxh); for(UINT page=Info.GetMinPage(); page<=Info.GetMaxPage() && bPrintingOK; page++) { //Starte neue Seite prt_DC.StartPage(); Info.m_nCurPage=page; CBitmap bitmap; if(bitmap.Attach(::LoadImage(::GetModuleHandle(NULL), Label, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE))) { BITMAP bm; bitmap.GetBitmap(&bm); int w=bm.bmWidth; int h=bm.bmHeight; // create memory device context; [B]Wozu?[/B] CDC mem_DC; mem_DC.CreateCompatibleDC(&prt_DC); CBitmap *pBmp=mem_DC.SelectObject(&bitmap); mem_DC.SetMapMode(prt_DC.GetMapMode()); prt_DC.SetStretchBltMode(BLACKONWHITE); // now stretchblt to maximum width on page prt_DC.StretchBlt(0, 0, maxw, maxh, &mem_DC, 0, 0, w, h, SRCCOPY); /*** Hier kommen jetzt die Texte für die Felder dazu ***/ // clean up mem_DC.SelectObject(pBmp); prt_DC.Detach(); }//end if(Attach) Zitieren
Klotzkopp Geschrieben 5. Mai 2011 Geschrieben 5. Mai 2011 Du wirst nicht drumherum kommen, dich ein wenig mit Bitmaps und DCs zu beschäftigen. StretchBlt ist hier die entscheidende Methode. Beispiele dafür sollten sich finden lassen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.