Größe eines CDC festlegen
-
hallo,
ich habe mir ein koordinatensystem mittels eines CDCs angelegt, wenn ich die amplitude der darin enthaltenen daten vergrößere, zeichnet es den graphen ausserhalb des von mir definierten bereichs.
CDC* pDC = m_pWnd->GetDC();Gibt es eine möglichkeit den gültigkeitsbereich so zu definieren, dass man nicht darüber hinaus zeichnen kann, sprich die daten einfach abgeschnitten werden?
gruß cappaja
-
Entweder Du nutzt SelectClipRgn, wobei die Frage besteht warum dein CD größer als dein Außgabebereich ist, oder du benutzt eine MemDC und blittest dann den entsprechenden Ausschnitt.
Wobei ich eher davon aus gehe das du Direkt in einen Dialog Zeichnest aber dein eigentlicher Ausgabebereich nur ein Ausschnitt des Dialoges ist. Wenn das der Fall ist, dann Verwende doch ein Static und Zeichne darin. Das ist übersichtlicher und es wird nicht unnötig neu gezeichnet
-
ich lege einen CDC beliebiger größe an und weise die zeichenroutinen einem rectangle zu. durch einstellungen kann ich aber mein signal vergrößeren, und dann tritt es über mein definiertes rectangle heraus. bekomme es mit SelectClipRgn nicht hin.
Kann mir vielleicht jemand einen beispielcode für einen memDC geben? ich habe es ettliche male versucht weiß aber nie weiter:
void CGraph::DataTransfer(LPVOID pParam) { CDC* pDC = m_pWnd->GetDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap* pOldBitmap; m_pBitmap = new CBitmap(); m_pBitmap->CreateBitmap(m_nWidth, m_nHeight, 1, memDC.GetDeviceCaps(BITSPIXEL), NULL); pOldBitmap = memDC.SelectObject(m_pBitmap); CPen* pStandardPen; CPen MyPen; MyPen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pStandardPen = pDC->SelectObject(&MyPen); if(((CWiwoDlg*)AfxGetMainWnd())->pDP.d_dom != 0) { DoFT(pParam); DrawData(&memDC, pParam); } else { DrawData(&memDC, pParam); } pDC->BitBlt(InpRect.left, InpRect.top, m_nWidth, m_nHeight, &memDC, 0, 0, SRCCOPY); delete m_pBitmap; }zum code: in der if-else verzweigung erfolgen meine zeichenroutinen welche ich gerne in den memDC schreiben möchte und abschließend mittels bitblt() ausgeben möchte. aber ich muss hier wohl noch einen fehler drin haben denn es wird ein schwarzes rectangle gezeichnet wo ich nichts drin erkenne und dahinter flackert mein signal, kann mir bitte jemand weiterhelfen?
-
Ein DC kann nicht größer werden als das Fenster zu dem er gehört.
Was willst Du eigentlich?
Zoomen, Scrollen?
-
ich hole den DC mittels GetDC vom Ansichtsfenster, sprich mein gesamter dialog ist der dc, ich habe mehrere bereiche zum zeichnen, einen allerdings ganz speziellen für die daten die von der soundkarte über einen double buffer ausgelesen werden. mein signal hat 12 skalierungsstufen wovon stufe 6 exakt an das fenster angepasst ist, ab 7 sollte es darüber hinaus abgeschnitten werden, jedoch zeichnet er weiter über den bildschirm sogar durch meine kontrollelemente.
ich will lediglich wissen wie das mit dem memDC genau funktioniert. in den meisten beispielen wird mittels loadbitmap ein bild eingefügt, ich brauch jedoch die quantisierten abtastwerte der soundkarte um diese in einer bitmap abzulegen und später mittels bitblt darzustellen. jedoch bekomme ich ein schwarzes rechteck welches zumindest im richtigen bereich liegt, darunter versteckt sich irgendwo mein signal.
wo ist denn nun mein fehler?
gruß cappaja
-
Dann hollst Du Dir zum Zeicnen keinen Window DC bzw CPaintDC. Ich vermute auch, dass Du nicht in einem WM_PAINT Handler zeichnest, so wie ich diesen Code schon sehe.
-
das ist richtig, ich benutze keinen WM_PAINT handler obwohl das einfacher wäre. ich lege jedesmal einen neuen CDC an und gebe ihn danach wieder frei. diese funktion läuft in einem thread solange die wav-datei abgespielt wird. deswegen wäre ein memDC die beste lösung aufgrund der vielen komplexen datenmengen.
ich habe übersehen das ich den zeichenroutinen DrawData() zuerst den pDC übergab, das habe ich jetzt auf &memDC geändert da diese ja in den Speicher-DC schreiben sollen. mittels createbitmap erzeuge ich doch ein monochromes bild, weswegen alles schwarz sein könnte...
ist meine vorgehensweise überhaupt richtig?
-
habs jetzt selbst hinbekommen, das problem war die letzte konstante beim blitten: unter bitblt() darf es am ende keine source copy SRCCOPY sein sondern SRCPAINT:
Combines pixels of the destination and source bitmaps using the Boolean OR operator.gruß cappaja