Hoax Napisano Sierpień 19, 2019 Autor Zgłoś Udostępnij Napisano Sierpień 19, 2019 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Jarema Napisano Sierpień 20, 2019 Zgłoś Udostępnij Napisano Sierpień 20, 2019 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. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.