Zwalnianie kontekstu urządzania - dziwny problem

dział ogólny

Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Corvis » poniedziałek, 28 grudnia 2009, 22:06

Witam,

Mam taki problem:

1 ) Pobieram kontekst to Canvasa Bitmapy

Kod: Zaznacz cały
HDC hdc = bitmapa->Canvas->Handle;


2 ) Wykonuje wszystkie operacje

3) Próbuje go zwolnić

Kod: Zaznacz cały
ReleaseDC(bitmapa->Handle,hdc);


I tutaj mam problem bo w jednej wersji C++ Buildera 2010 to działa, natomiast w drugiej też wersji 2010 wywala błąd :

Kod: Zaznacz cały
[BCC32 Error] TWykres.cpp(178): E2034 Cannot convert 'HBITMAP__ *' to 'HWND__ *'
[BCC32 Error] TWykres.cpp(178): E2342 Type mismatch in parameter 'hWnd' (wanted 'HWND__ *', got 'HBITMAP__ *')



Ma ktoś może sposób jak zwolnić kontekst żeby nie otrzymywać tego błędu ??

Pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Cyfrowy Baron » poniedziałek, 28 grudnia 2009, 22:47

Z komunikatu wynika że bitmapa->Handle jest typu HBITMAP a powinno być HWND, ale z kodu jednoznacznie wynika, ze to jest HWND, więc błędu nie powinno być. Prawdopodobnie obydwa środowiska maja różną konfigurację, ale konfiguracja projektu powinna być zapisana w projekcie, więc po uruchomieniu w innym środowisku powinna być taka sama, no ale już nie wiem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez polymorphism » poniedziałek, 28 grudnia 2009, 22:50

ReleaseDC w pierwszym parametrze oczekuje uchwytu do okna, nie bitmapy! Tej funkcji używasz do zwalniania uchwytu pozyskanego funkcjami GetDC i GetWindowDC. Dziwne, że nie zajrzałeś do dokumentacji... No i dlaczego w ogóle zwalniasz ten kontekst, przecież to nie ty go bezpośrednio stworzyłeś?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Corvis » poniedziałek, 28 grudnia 2009, 23:43

1) Muszę go zwolnić bo inaczej rysunek jest malowany przerywanymi liniami, albo inne szopki się z nim dzieją.
2) Jeżeli podam do funkcji RelaseDc() uchwyt okna to nic mi to nie daje i dalej jest bład. Jeżeli podaj do bmp->Handle, rysunek wygląda dobrze.
3) Zajrzałem do dokumentacji.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Cyfrowy Baron » wtorek, 29 grudnia 2009, 10:01

Można podawać uchwyt do bitmapa->Handle i go zwalniać. W C++Builder działa to poprawnie i nie wywołuje, żadnych błędów. Nie to jest jednak problemem lecz, że w jednym środowisku C++Builder 2010 działa poprawnie a w drugim już nie:

I tutaj mam problem bo w jednej wersji C++ Buildera 2010 to działa, natomiast w drugiej też wersji 2010 wywala błąd :


Może wrzuć ten projekt w załączniku.
Jeżeli zdecydujesz się go udostępnić to usuń z niego pliki tymczasowe i plik EXE by zmniejszyć rozmiar archiwum.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez polymorphism » wtorek, 29 grudnia 2009, 10:56

Corvis napisał(a):1) Muszę go zwolnić bo inaczej rysunek jest malowany przerywanymi liniami, albo inne szopki się z nim dzieją.

Mało prawdopodobne, żeby to był powód tych szopek.
2) Jeżeli podam do funkcji RelaseDc() uchwyt okna to nic mi to nie daje i dalej jest bład. Jeżeli podaj do bmp->Handle, rysunek wygląda dobrze.

Oczywiście że nic nie daje, bo kontekst nie należy do okna, jest pamięciowy.

3) Zajrzałem do dokumentacji.

No chyba nie, masz jasno napisane:

    An application cannot use the ReleaseDC function to release a DC that was created by calling the CreateDC function; instead, it must use the DeleteDC function. ReleaseDC must be called from the same thread that called GetDC.
Tu masz o CreateCompatibleDC, czyli kontekście pamięciowym:

    When you no longer need the memory DC, call the DeleteDC function.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Cyfrowy Baron » wtorek, 29 grudnia 2009, 11:09

To co piszesz jest prawdą, cytujesz zresztą dokumentację, ale to nie zmienia faktu, że możesz tego używać podając uchwyt nie do okna lecz do Handle bitmapy. To działa niezależnie od tego co piszą na ten temat w dokumentacji, a może dlatego, że nie o wszystkim tam piszą.

Mamy tutaj tylko kawałek kodu, w zasadzie dwie linie, nie wiadomo co się dzieje pomiędzy nimi i to prawdopodobnie wywołuje problem, czyli nie to co podałeś, lecz to czego tutaj nie napisałeś.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez polymorphism » wtorek, 29 grudnia 2009, 11:29

ale to nie zmienia faktu, że możesz tego używać podając uchwyt nie do okna lecz do Handle bitmapy.

Równie dobrze mogę tam podać uchwyt do pliku i efekt będzie taki sam. Co oczywiście nie znaczy, że to działa. Zresztą kto powiedział że to działa? Sprawdzałeś co zwraca ReleaseDC? U mnie takie użycie powoduje, że funkcja zwraca błąd ERROR_DC_NOT_FOUND. To, że coś się kompiluje nie znaczy, że jest to poprawna konstrukcja.

[...] a może dlatego, że nie o wszystkim tam piszą.

Błędne myślenie. Piszą wystarczająco dużo, żebyś mógł napisać poprawnie działającą aplikację.

Mamy tutaj tylko kawałek kodu, w zasadzie dwie linie, nie wiadomo co się dzieje pomiędzy nimi

To, co się dzieje pomiędzy nimi, to inna sprawa. Jedna z tych linii ma błąd.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Cyfrowy Baron » wtorek, 29 grudnia 2009, 11:39

Mnie jednak zastanawia czemu ma to służyć. Nakładaniu jednej bitmapy na drugą? Czy nie powinieneś posłużyć się tutaj funkcjami odrysowującymi?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez Corvis » czwartek, 31 grudnia 2009, 10:45

Mnie jednak zastanawia czemu ma to służyć. Nakładaniu jednej bitmapy na drugą? Czy nie powinieneś posłużyć się tutaj funkcjami odrysowującymi ?


viewtopic.php?f=4&t=752

Tutaj założyłem wątek odnośnie 3 poziomowego gradientu i użycia funkcji GradientFill. Musiałem ten gradient przenieść na bmp, i stąd takie dziwne zabiegi.

Równie dobrze mogę tam podać uchwyt do pliku i efekt będzie taki sam. Co oczywiście nie znaczy, że to działa. Zresztą kto powiedział że to działa? Sprawdzałeś co zwraca ReleaseDC? U mnie takie użycie powoduje, że funkcja zwraca błąd ERROR_DC_NOT_FOUND. To, że coś się kompiluje nie znaczy, że jest to poprawna konstrukcja.


Czepiasz się, przeglądałem mase programów pisanych w api, i w większości jak ktoś podbiera kontekst do jakiegoś urządzenia to go zwalnia. Może i to jest jakies "drażnienie tygrysa" ale w moim przypadku powoduje to prawidłowy wygląd wykresu i działanie programu.


Kodu nie mogę udostępnić niestety.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie kontekstu urządzania - dziwny problem

Nowy postprzez polymorphism » czwartek, 31 grudnia 2009, 12:00

Czepiasz się, przeglądałem mase programów pisanych w api, i w większości jak ktoś podbiera kontekst do jakiegoś urządzenia to go zwalnia.

Owszem zwalnia go, ale odpowiednią do tego funkcją. Też widziałem dużo kodu, sam niemało napisałem, włączając w to miks VCL + WinAPI, ale nigdzie nie widziałem, żeby ktoś zwalniał kontekst pamięciowy funkcją ReleaseDC. Od tego masz funkcję DeleteDC. Zresztą sprawdzałeś co zwraca ReleaseDC?

No i to nie ja się czepiam, tylko twój kompilator... słusznie zresztą 8-)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości