GetWindowDC akzeptiert keine 1 Parameter - Warum ?
-
Servs,
wenn ich eine Funktion zu einer Klasse hinzufüge und dann das Programm erstellen will erscheint das:D:\eigenes\Know How\Thermische Simulation\Versim\Version 1\Simulation.cpp(638) : error C2660: 'GetWindowDC' : Funktion akzeptiert keine 1 Parameter
D:\eigenes\Know How\Thermische Simulation\Versim\Version 1\Simulation.cpp(641) : error C2660: 'GetWindowRect' : Funktion akzeptiert keine 2 Parameter
D:\eigenes\Know How\Thermische Simulation\Versim\Version 1\Simulation.cpp(758) : error C2660: 'ReleaseDC' : Funktion akzeptiert keine 2 ParameterIch hab diese Funktion bereits ausprobiert, Sie funktioniert. Was mache ich falsch.
int CSimulation::GetScreen(CDC* pDC, HWND hWnd,char* pszfilename) { // Hilfsvariablen festlegen void *pBits; CBitmap Bitmap; RECT rct; HDC memDC, hDC; BITMAPINFO bmpinfo; HBITMAP hbmp; BITMAPFILEHEADER fileheader; DWORD dwBytes, dwNumColors; RGBQUAD colors[256]; HGDIOBJ hret; // Fenster + Attribute ermitteln hDC = GetWindowDC(hWnd); if(!hDC) return 1; GetWindowRect(hWnd,&rct); if(!(memDC = CreateCompatibleDC(hDC))) return 1; rct.bottom -= rct.top; rct.right -= rct.left; // BMP Info festlegen rct.top = GetDeviceCaps(hDC, BITSPIXEL); if(rct.top <= 8) dwNumColors = 256; // Farbe Bit-Tiefe else dwNumColors = 0; if(!(memDC = CreateCompatibleDC(hDC))) return 1; bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpinfo.bmiHeader.biWidth = rct.right; bmpinfo.bmiHeader.biHeight = rct.bottom; bmpinfo.bmiHeader.biPlanes = 1; bmpinfo.bmiHeader.biBitCount = (WORD) rct.top; bmpinfo.bmiHeader.biCompression = BI_RGB; bmpinfo.bmiHeader.biSizeImage = 0; bmpinfo.bmiHeader.biXPelsPerMeter = 0; bmpinfo.bmiHeader.biYPelsPerMeter = 0; bmpinfo.bmiHeader.biClrUsed = dwNumColors; bmpinfo.bmiHeader.biClrImportant = dwNumColors; // Erstelle device-independent bitmap (DIB) um direkt zu schreiben hbmp = CreateDIBSection(hDC, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0); if(!hbmp) return 1; // zu kopierende Fläche im Fenster festlegen hret = SelectObject(memDC, hbmp); if(!hret || (hret == HGDI_ERROR)) return 1; // wenn hret nicht vorhanden oder ERROR Rückgabe if(!BitBlt( memDC, // HANDLE auf Device Context 0, // x-Koord Ziel oben links 0, // y-Koord Ziel oben links rct.right, // Breite rct.bottom, // Höhe hDC, // HANDLE auf Source Device Context 0, // x-Koord Quelle oben links 0, // y-Koord Quelle oben links SRCCOPY)) return 1; // kopiert Inhalt direkt von Quelle zu Ziel fileheader.bfType = 0x4D42; rct.left = dwNumColors * sizeof(RGBQUAD); fileheader.bfSize = ((rct.right * rct.bottom * rct.top) >> 3) // Fenstergröße * Tiefe + rct.left // Absatz + sizeof(BITMAPFILEHEADER) // Größe FILE Header + sizeof(BITMAPINFOHEADER); // Größe INFO Header fileheader.bfReserved1 = 0; // muss NULL sein fileheader.bfReserved2 = 0; // muss NULL sein fileheader.bfOffBits = // Offset in bytes zwischen BITMAPFILEHEADER rct.left // und Bildanfang + sizeof(BITMAPFILEHEADER) // entspricht Größe Header + sizeof(BITMAPINFOHEADER); bmpinfo.bmiHeader.biClrImportant = 0; // Alle Farben bmpinfo.bmiHeader.biClrUsed = dwNumColors; // Farbtiefe // Datei zur Ausgabe erstellen HANDLE hfl; hfl = CreateFile( pszfilename, // Dateiname GENERIC_WRITE, // es wird nur geschrieben, nicht gelesen 0, 0, CREATE_ALWAYS, // immer neu erstellen FILE_ATTRIBUTE_NORMAL, // ohne Schreibschutz, Versteckt,etc. 0 ); // Wenn File nicht erstellt wird if(hfl == INVALID_HANDLE_VALUE) { DeleteObject(hbmp); return 1; } // Schreibe FILE Header WriteFile( hfl, // Ziel zum schreiben &fileheader, // Zeiger auf Daten die geschrieben werden sollen sizeof(BITMAPFILEHEADER), // Größe in Bytes die geschrieben werden sollen &dwBytes, // Zeiger auf Anzahl Bytes, die geschrieben worden sind 0 ); // WriteFile startet bei der aktuellen Position im File // und springt NICHT zurück bis der Vorgang beendet ist // Schreibe BMP-INFO Header WriteFile( hfl, &bmpinfo.bmiHeader, sizeof(BITMAPINFOHEADER), &dwBytes, 0 ); if(!dwNumColors) { WriteFile( hfl, colors, rct.left, &dwBytes, 0 ); }; WriteFile( hfl, pBits, (rct.right * rct.bottom * rct.top) >> 3, &dwBytes, 0 ); // Speicher frei räumen CloseHandle(hfl); DeleteObject(hbmp); ReleaseDC(hWnd, hDC); DeleteDC(memDC); return 0; }
-
Mach mal jeweils :: vor die angemahnten Funktionen.
-
Dann begründe es ihm auch ... CSimulation scheint von CWnd abgeleitet zu sein ... d.h. du musst auf den global namespace zugreifen um einen HWND bei der Funktion anzugehen ... und das macht man wie connan schon sagte mit ::
-
mit :: funktioniert es nicht. Es gibt zwar keine Fehlermeldung, es wird aber auch nicht mehr ausgeführt. Dafür gibts jetzt ständig memory leak meldungen.
Und bei
hDC = GetWindowDC(hWnd);
if(!hDC) return 1;
wird immer 1 zurückgegeben.class CSimulation : public CView { CString xAxisText, yAxisText; int flag; int flagZoom; bool lButton1; // flag for left mouse button down 1st time bool lButton2; // flag for left mouse button down 2nd time CPoint P1, P2; // Begin and End of Zoom Window bool flag_Temp_UI_Curve; // saves the latest view (temperature-curves or UI-curves) // if a change occurs, the curve selection will be reset int m_Curve_Check[10]; // maximum number of curves public: CSimulation(); // Dynamische Erstellung verwendet geschützten Konstruktor int GetScreen(CDC* pDC, HWND hWnd,char* pszfilename); DECLARE_DYNCREATE(CSimulation) // Attribute private: public: CVerSimDoc* GetDocument(); // Operationen public: // Überschreibungen // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(CSimulation) protected: virtual void OnDraw(CDC* pDC); // Überschrieben zum Zeichnen dieser Ansicht virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL // Implementierung protected: virtual ~CSimulation(); void GetGraphAdjustment(short int flag); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif // Generierte Nachrichtenzuordnungsfunktionen protected: //{{AFX_MSG(CSimulation) afx_msg void OnSimulationLastspiel(); afx_msg void OnSimulationSimulationLastspiel(); afx_msg void OnSimulationEinstellungenDiagrammfarbe(); afx_msg void OnSimulationEinstellungenHintergrundfarbe(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnSimulationDiagrammAuswahl(); afx_msg void OnSimViPlotsCalc(); afx_msg void OnSimViPlotsSel(); afx_msg void OnSimulationUiEinst(); afx_msg void OnSimulationUiverlufeTest(); afx_msg int OnBildspeichern(CDC* pDC, HWND hWnd, char* lpszFilename); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
-
Wenn das eine Fensterklasse ist, kannst du das hwnd-Kram einfach weglassen, dann wird das aktuelle Fenster genommen.
