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 Parameter

    Ich 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. 😉


Anmelden zum Antworten