Screenshot des Inhalts eines Childfensters
-
GetActiveWindow, GetForegroundWindow
-
Danke.
Ich glaube, GetFocus() scheint meine Zwecke wohl besser zu erfüllen. Ich habe aber jetzt ein Problem mit folgender Zeile:
HDC hdc = ::GetDC(wnd->m_hWnd);
Wenn ich mir die Variable m_hWnd anschaue, dann steht dazu:
unused CXX0030: Error: expression cannot be evaluated
Ich glaube, dass ist der Grund, warum mein Programm in der Zeile
CBitmap * oldbm = memDC.SelectObject(&bm);
mit einem Debug Assertion Failed abbricht.
Hast du ne gute Idee für mich, dass zu ändern?
H.W.
-
Solange DU dem CWnd Pointer keinen vernünftigen Wert zuweist fliegt Dir das Dingimmer um die Ohren.
-
Hi.
Ich dachte, die Zuordnung erfolgt über 'GetFocus()'? Habe ich da was nicht verstanden?
Grüsse,
STEFAN.
-
Ja machst Du denn auch wirklich:
CWnd *wnd = GetFocus();
?
-
Naja, bei mir siehts halt so aus:
CWnd *wnd; wnd = GetFocus();
Müsste doch das gleiche sein ?!?!
-
void CopyWndToClipboard(CWnd * wnd, bool fullWnd = true) { ASSERT(wnd); CDC dc; HDC hdc = fullWnd ? ::GetWindowDC(wnd->m_hWnd) : ::GetDC(wnd->m_hWnd); dc.Attach(hdc); CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap bm; CRect rect; if (fullWnd) wnd->GetWindowRect(&rect); else wnd->GetClientRect(&rect); CString str; wnd->GetWindowText(str); // abweichend vom Original!!! CSize sz(rect.Width(), rect.Height()); bm.CreateCompatibleBitmap(&dc, sz.cx, sz.cy); CBitmap * oldbm = memDC.SelectObject(&bm); memDC.BitBlt(0, 0, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY); wnd->OpenClipboard(); ::EmptyClipboard(); ::SetClipboardData(CF_BITMAP, bm.m_hObject); CloseClipboard(); memDC.SelectObject(oldbm); bm.Detach(); } void MyDlg::OnMakeScreenShot() { CopyWndToClipBoard(this); }
Bei mir läuft dieser Code einwandfrei in einem Dialog. Da CView und Konsorten ebenfalls von CWnd abgeleitet sind, sollte dieser Code auch bei Dir funktionieren.
-
Hi. Danke für das Posting. Aber kommt bei dir nicht folgende Fehlermeldung:
error C2660: 'CopyWndToClipBoard' : function does not take 1 arguments
Danke.
H.W.
-
Und wo hast Du die Funktion hingepackt? Über den ersten Aufruf? Wenn nicht hast Du die Funktion deklariert? Wie rufst Du die Funktion auf?
Offensichtlich hast Du den Default Parameter nicht berücksichtigt!
-
Pack das hier in Dein .h File:
void CopyWndToClipboard(CWnd * wnd, bool fullWnd = true);
und ändere im .cpp File in:
void CopyWndToClipboard(CWnd * wnd, bool fullWnd /*= true*/)
Meine Variante steht direkt im .cpp File, da ich das in meinen ganzen Projekten wirklich nur an der einen Stelle brauche.