Skocz do zawartości

Program orientowny obiektowo


Hoax

Recommended Posts

Właśnie jestem w trakcie pisania edytoru tekstowego, ale chcę go całokowicie napisać jako program orientowany obiektowo. Przez to pojawił mi się mały (albo duży) problem. Otóż mam m.in. takie dwa pliki (przedstawię tylko fragmnety):
<code> ### class.h ###
#include <windows.h>
class edytor
{
private:
HWND *hWnd, *hEdit;
public:
edytor(HWND*, HWND*);
bool WczytajPlik(bool text);
DWORD CALLBACK StreamInProc(DWORD dwCookie, LPBYTE lpBuffer, LONG lSize, LONG * plRead);
};
</code>
<code> ### class.cpp ###
#include "class.h"
#include <richedit.h>
edytor:: edytor(HWND* UchwytOkna, HWND* UchwytEdita)
{
hWnd = UchwytOkna;
hEdit = UchwytEdita;
}
DWORD CALLBACK edytor:: StreamInProc(DWORD dwCookie, LPBYTE lpBuffer, LONG lSize, LONG * plRead)
{
if(!lSize)
return(1) ;

*plRead = 0 ;

ReadFile((HANDLE) dwCookie, lpBuffer, lSize, (DWORD *) plRead, NULL ) ;
return(0) ;
}
bool edytor:: WczytajPlik(bool text)
{
HANDLE hPlik ;
EDITSTREAM es ;
LONG lOut ;

hPlik = CreateFile("c:/tekst.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ) ;

if(hPlik == INVALID_HANDLE_VALUE)
return(FALSE) ;

es.dwCookie = (DWORD) hPlik ;
es.dwError = 0 ;
es.pfnCallback = (EDITSTREAMCALLBACK)StreamInProc ;

if(text)
lOut = SendMessage(*hEdit, EM_STREAMIN, SF_TEXT, (LPARAM) &es) ;
else
lOut = SendMessage(*hEdit, EM_STREAMIN, SF_RTF, (LPARAM) &es) ;

CloseHandle(hPlik) ;
}
</code>

Każdy na pewno się domyślił, że w pierwszym jest deklaracja klasy (tzn. w class.h), a w drugim (tzn. class.cpp) zamieszczone są definicje funkcji składowych tej klasy. I właśnie z jedną z funkcji składowych mam problem, a mianowicie z funkcją (chyba tak to się nazywa) zwrotną - 'DWORD CALLBACK edytor:: StreamInProc(DWORD dwCookie, LPBYTE lpBuffer, LONG lSize, LONG * plRead)'. Gdy nie jest funkcją składową klasy 'edytor', to wszysko działa, ale gdy ją włączam do tej klasy wychodzi mi błąd "d:C++edytor2class.cpp(34) : error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'EDITSTREAMCALLBACK' None of the functions with this name in scope match the target type" - to chyba chodzi o to że nie wie jak rzutować to funkcję na EDITSTREAMCALLBACK, ale przedtem przecież wiedział. Jak to zrobić żeby działało??

PS. Podziękowania dla wytrwałych, którzy dotarli do końca tego przydługawego art'u. Z góry dzięki za wszelkie odpowiedzi.

Link do komentarza
Udostępnij na innych stronach

Miałem to samo u siebie. Szczerze mówiąc to też chciałem w obiektach 100% ale nie udało mi się tego do klasy zamieścić centralnie. Ale poradziłem sobie w inny sposób. Zadeklarowałem tą funkcję jako funkcję zaprzyjaźnioną tej klasy (pamiętaj że to klasa deklaruje przyjaźń a nie funkcja), dzięki temu moja funkcja mogła operować na danych składowych mojej klasy. Pewnie będziesz wiedział o co chodzi. Jeśli uda Ci się to inaczej rozwiązać to daj znać bo sam jestem ciekawy.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...