Woher bekomme ich CWnd eines Fensters
-
Ich möchte eine Funktion WriteWindowToDIB( LPTSTR szFile, CWnd *pWnd )
benutzen die als Eingabe ein CWnd erwartet.
Mir ist jedoch unklar woher ich diesen Wert bekomme.
Konkret habe ich ein Überladenes CStatic Fenster dessen Inhalt ich mit dieser Funktion abspeichern möchte.Matthias
-
Du suchst vermutlich FindWindow.
-
Dito schrieb:
Du suchst vermutlich FindWindow.
Ich habe mal danach in MSDN gesucht, aber das Beispiel bringt mich nicht soweit, dass ich daraus erkennen könnte wie ich von einem CStatic Window in einem Dialog das CWnd ermittle.
Matthias
-
Dann schau mal unter GetDlgItem in der MSDN nach. Damit sollte es doch
auch gehen.
-
Ich weiss nicht, wo Dein Problem liegt. CStatic ist doch von CWnd abgeleitet.
-
jencas schrieb:
Ich weiss nicht, wo Dein Problem liegt. CStatic ist doch von CWnd abgeleitet.
Ich habe folgende Funktion
BOOL CBitmapPicture::WriteWindowToDIB( LPTSTR szFile, CWnd *pWnd ) { CBitmap bitmap; CWindowDC dc(pWnd); CDC memDC; CRect rect; memDC.CreateCompatibleDC(&dc); pWnd->GetWindowRect(rect); bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() ); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY); memDC.SelectObject(pOldBitmap); // Convert the bitmap to a DIB HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal ); if( hDIB == NULL ) return FALSE; // Write it to file WriteDIBToFile( szFile, hDIB ); // Free the memory allocated by DDBToDIB for the DIB GlobalFree( hDIB ); return TRUE; }die als Eingabe ein CWnd *pWnd für das zu speichernde Fenster erwartet und mir ist unklar wie ich für den Inhalt meiner Cstatic Klasse an diesen Wert herankomme.
Unabhängig davon ist mir der Unterschied zuwischen
CWindowDC dc(pWnd);und
CDC dc;nicht klar.
Wie ich mit GetDlgItem oder FindWindow daran komme ist mir auch unklar, da mir ein entsprechendes Beispiel fehlt.
Matthias
-
Verpasse Deinem CStatic im Resourceeditor eine eindeutige Resource-ID, z.B. IDC_STATIC_FOOBAR. Mit GetDlgItem(IDC_STATIC_FOOBAR) bekommst Du im Dialog den gewünschten Pointer auf ein CWnd.
Und nur mal so am Rande: Du solltest Dir aber zumindestens Grundkenntnisse in C++ und den MFC aneignen.
-
jencas schrieb:
Verpasse Deinem CStatic im Resourceeditor eine eindeutige Resource-ID, z.B. IDC_STATIC_FOOBAR. Mit GetDlgItem(IDC_STATIC_FOOBAR) bekommst Du im Dialog den gewünschten Pointer auf ein CWnd.
Ich habe es probiert mit
BOOL CGraphCtrl::SaveBitmap(CString csFileName) { CWnd pWnd = GetDlgItem(IDC_PLOT); BOOL Result = BitmapOperations.WriteWindowToDIB((LPCTSTR)csFileName, &pWnd);was mir nur ein
error C2065: 'IDC_PLOT': nichtdeklarierter Bezeichner
liefert. Das Window hat aber definitiv diese ID.
Was mich daran noch irritiert ist die Tatsache das ich ja eine Instanz dieses Window habe, und erartet hätte darüber an den CWnd Wert heranzukommen.
jencas schrieb:
Und nur mal so am Rande: Du solltest Dir aber zumindestens Grundkenntnisse in C++ und den MFC aneignen.
Ich denke meine Grundkenntnisse in C++ sind zum verstehen meiner Fragen und eurer Antworten ausreichend. Was MFC angeht - es ist schwer zu lernen. Ich besitze 3 Bücher - ein neues das mir fast nichts gebracht hat, ein MFC in 21 Tagen was aber VS6 behandelt und deshalb der Code haufig nicht kompiliert und das Buch 'Microsoft Press - Programming Windows with MFC, 2nd Edition' was aber auch nicht detailiert genug ist. Die MSDN ist häufig so geschrieben das ich den Zusammenhang mit meinen Problemen nicht erkennen kann.
Daher bleiben viele Fragen offen, die ich versuche unter anderem hier gelöst zu bekommen. Sollte ich mich dabei allzu dumm anstellen tut mir das leid.
Was mir definitiv fehlt ist der Erfahrungshorizont von mehreren Jahren Arbeit mit der MFC API, so dass mir Zusammenhänge einfach nicht offensichtlich klar sind.Matthias
-
Unter der Annahme, dass du ein Static-Control hast, das manuell(!!!)
umgetextet wurde von IDC_STATIC auf IDC_STATICB:CWnd *pWnd = GetDlgItem(IDC_STATICB); pWnd->SendMessage(WM_SETTEXT, 0, (LPARAM) "www.google.de");Ok ok, nur als einfaches Beispiel...man hätte auch gleich sagen können
GetDlgItem(IDC_STATICB)->SetWindowText("www.google.de");
-
pospiech schrieb:
Ich habe es probiert mit
BOOL CGraphCtrl::SaveBitmap(CString csFileName) { CWnd pWnd = GetDlgItem(IDC_PLOT); BOOL Result = BitmapOperations.WriteWindowToDIB((LPCTSTR)csFileName, &pWnd);was mir nur ein
error C2065: 'IDC_PLOT': nichtdeklarierter Bezeichner
liefert. Das Window hat aber definitiv diese ID.
Ist das von CStatic abgeleitete Control zufälligerweise das CGraphCtrl? Wenn ja, dann:
BOOL CGraphCtrl::SaveBitmap(CString csFileName) { BOOL Result = BitmapOperations.WriteWindowToDIB((LPCTSTR)csFileName, this);