In eine RichEditBox ohne MFC ein Icon ?
-
Du musst wohl diese Header in die Klassen-Header einbinden (und die lokale afx-irgendwas-Header rausschmeißen):
#include<olestd.h>
#include<Richedit.H>
#include<Richole.h>Diese Zeilen habe ich auch auskommentiert:
#ifdef DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE_;
#define new DEBUG_NEW
#endifdann kommen bei mir nur noch Fehler bei ASSERT, VERIFY und AfxThrowOleException() diese Makros und Funktionen brauchst du ja eigentlich nicht und kannst ja die Klasse ein wenig abändern. Dann kompiliert es schon mal ohne Fehler. Dieses komische RicheditInterface bekommst du ja über eine Message, wie im Link beschrieben und dann kannst du der Klasse doch schon ein HBITMAP zukommen lassen InsertBitmap(blablabla).
-
Das teste ich gleich morgen mal!
Danke so weit!
HBITMAP wird doch im normalfall aus einer Datei geladen,
gibts da auch nen weg es aus der Ressourcedatei zu laden?Evtl. per LoadIcon ?
-
's gibt doch eh LoadBitmap()

-
Hi,
ich hab das jetz mal ausprobiert...
Aber irgent wie funktioniert es bei mir nicht...
Mit einfach dem Assert usw rausnehmen ist es nicht getahn...
So bekomm ich jedes mal Speicherzugrifsfehler
Hat jemand ein kleines simples Code Sniplet für mich?
Vielen Dank soweit an alle!
-
Debugger - und dann zeig doch mal die betreffende Codestelle mit der Zugriffsverletzung

-
Also ich hab jetz nochmal
die Classe eingefügt, die Header declariert und die entsprechenden Zeilen auskommentiert...Dann habe ich mein Projekt mit debug gestartet und raus kahm:
Unbehandelte Ausnahme in Chat Client.exe:0xC0000005: Access Violation
Zum einfügen eines Icons hab ich dies gemacht:
void AddIcon( void ) { ::SendMessage( Edit_ChatText, EM_GETOLEINTERFACE, 0, (LPARAM)&m_pRichEditOle); HBITMAP hBitmap = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_BITMAP1 ) ); if (hBitmap) { CImageDataObject::InsertBitmap(m_pRichEditOle, hBitmap); } }Wobei pRichEditOle so declariert ist:
IRichEditOle *m_pRichEditOle;Das Edit_ChatText ist folgendermassen declariert:
HWND Edit_ChatText;
und wird in der Init des Proggys folgendermassen gefüllt:
Edit_ChatText = CreateWindowEx(WS_EX_CLIENTEDGE,RICHEDIT_CLASS,"", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_READONLY, 0, 0, 645, 529, hWnd, (HMENU)Edit_ChatTextID, hInst, NULL); SendMessage(Edit_ChatText, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);Dazu muss ich sagen, dass das Create der Rich Edit Box auf jeden fall vor dem Insert geschieht !
Ich hoffe ihr könnt mir helfen !
-
In welcher Zeile genau kommt denn die Zugriffsverletzung - Breakpoint setzen oder Schritt für Schritt ausführen lassen

-
Es scheint
CImageDataObject::InsertBitmap(m_pRichEditOle, hBitmap);
zu sein...Wenn ich die Zeile auskommentiere funzt es alles ordentlich!
-
Ist m_pRichEditOle dort gültig?
-
Ja ist es!
pRichEditOle declariere ich global!
So ist der gesamte code der add routine:
void AddIcon( void ) { ::SendMessage( Edit_ChatText, EM_GETOLEINTERFACE, 0, (LPARAM)&m_pRichEditOle); HBITMAP hBitmap = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_BITMAP1 ) ); if (hBitmap) { CImageDataObject::InsertBitmap(m_pRichEditOle, hBitmap); } }
-
Was liefert der SendMessage-Aufruf zurück?
-
Hallo,
ich habs jetz mal so getestet:
if ( SendMessage( Edit_ChatText, EM_GETOLEINTERFACE, 0, (LPARAM)&m_pRichEditOle) == 0 ) { MessageBox( NULL, "RichEdit Ole = 0", "", MB_OK ); }Die MessageBox kommt nicht hoch also geh ich mal davon aus, dass das Succeded ist...

-
Hast du mal geschaut, wo innerhalb von CImageDataObject::InsertBitmap der Fehler auftritt?
-
Erstmal Danke das du mir hilfst!
Der Fehler tritt hier auf:
sc = pOleObject->GetUserClassID(&clsid);Im InsertBitmap.
-
Und OleCreateStaticFromData in CImageDataObject::GetOleObject liefert S_OK zurück? Irgendwie ist das alles etwas merkwürdig

-
Ich hab das gerade noch mal weiter ausgetestet....
Ich denke das Problem liegt hier:
IOleObject *pOleObject; pOleObject = pods->GetOleObject(pOleClientSite, pStorage); OleSetContainedObject(pOleObject, TRUE);Danach ist pOleObject = 0x00000000
Was ja auf einen Fehler schliessen lässt...
pOleClientSite ist = 0x00159750
und pStorage = 0x00168e60Ich hoffe du kanst mir helfen !
-
Gleichzeitig drauf gekommen *G* Nu fehlt nur die Lösung

-
Kann dir da leider auch nicht weiterhelfen - du musst eben mal die CImageDataObject::GetOleObject Memberfunktion untersuchen

-
Also der Fehler liegt definitief hier:
IOleObject *CImageDataObject::GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage) { SCODE sc; IOleObject *pOleObject; sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT, &m_fromat, pOleClientSite, pStorage, (void **)&pOleObject); return pOleObject; }Kommentier ich den aufruf und:
sc = pOleObject->GetUserClassID(&clsid);aus, dann bekomme ich ein Blankes Transparentes Feld in der RicheditBox...
Kann es sein, dass es daran liegt, dass ich beim InsertBitmap evtl ein falsches oder fehlerhaftes bild übergebe ?
if ( SendMessage( Edit_ChatText, EM_GETOLEINTERFACE, 0, (LPARAM)&m_pRichEditOle) == 0 ) { MessageBox( NULL, "RichEdit Ole = 0", "", MB_OK ); } HBITMAP hBitmap = LoadBitmap( hInst, MAKEINTRESOURCE( IDB_BITMAP1 ) ); if (hBitmap) { CImageDataObject::InsertBitmap(m_pRichEditOle, hBitmap); }ist ein bild welches ich in der Ressource Datei habe!
Danke soweit !
-
Kann mir den wirklich keiner helfen ?