Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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);

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

  • 1 Jahr später...
Geschrieben

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?

Geschrieben
Wenn ich über GetDC()->GetDeviceCaps(HORZRES/VERTRES) den Druckbereich vom Static-Feld abfrage
Mit HORZRES/VERTRES bekommst du nie den "Druckbereich" eines einzelnen Steuerelements, siehe Doku.

Wie komme ich an diesen Zeichenbereich?
GetClientRect.
Geschrieben

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?

Geschrieben
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.

Geschrieben

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.

Geschrieben

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)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...