Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: CreateFontIndirect - problem

Witam.
Od niedawna walczę z okienkami, moje "źródło wiedzy" okazuje się jednak dość lipne, gdyż kody źródłowe zamieszczone w książce nie działają. Prosiłbym o pomoc w usunięciu problemu (Środowisko DEV-C++) :)

#include <windows.h>

/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"program 03", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
408, /* The programs width */
134, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);

/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}

/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message) /* handle the messages */
{
case WM_PAINT:
static LOGFONT lf;

hdc=BeginPaint(hwnd, &ps);
Ellipse(hdc,210,20,270,80);

SetBkColor(hdc,0);
SetTextColor(hdc,0xFFFFFF);

lf.lfHeight=30;
lf.lfWidth=0;
lf.lfEscapement=0;
lf.lfOrientation=0,
lf.lfWeight=0;
lf.lfItalic=0;
lf.lfUnderline=0;
lf.lfStrikeOut=0;
lf.lfCharSet=0;
lf.lfCharSet=0;
lf.lfOutPrecision=0;
lf.lfClipPrecision=0;
lf.lfQuality=0;
lf.lfPitchAndFamily=0;
lstrcpy(lf.lfFaceName,TEXT("Times New Roman CE"));

hFont=CreateFontIndirect(&lf); //<---zonk -_-
SelectObject(hdc,hFont);
TextOut(hdc,120,38,"wspaniale jest to kolo!",23);
DeleteObject(hFont);
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}

konto usunięte

Temat: CreateFontIndirect - problem

Napisałeś gdzie jest problem ale nie napisałeś na czym polega...
Tomasz M.

Tomasz M. never go full
retard!

Temat: CreateFontIndirect - problem

Tylko strzał, ale spróbuj strcpy / strcpy_s (?!)
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: CreateFontIndirect - problem

Piotr L.:
Napisałeś gdzie jest problem ale nie napisałeś na czym polega...

Twierdzi, że nie wie, co to jest "hFont".Marcin Barańczak edytował(a) ten post dnia 04.07.11 o godzinie 11:04

konto usunięte

Temat: CreateFontIndirect - problem

Marcin Barańczak:
Twierdzi, że nie wie, co to jest "hFont".
No bo nie jest zadeklarowane. Dopisz HFONT hFont; gdzieś przed switch'em lub przy pierwszym użuciu i weź cały case w {}
Maciej R.

Maciej R. Developer on foot,
onFoot IT

Temat: CreateFontIndirect - problem

I też przy okazji dobrym zachowaniem by było oddanie z powrotem do HDC tego, co otrzymałeś z funkcji SelectObject(hdc, hFont), szczególnie że nie selectujesz obiektu GDI typu "stock", tylko własny.

Czyli mniej więcej:


HFONT hFont = CreateFontIndirect(&lf);
HFONT oldFont = (HFONT)SelectObject(hdc,hFont);

TextOut(hdc,120,38,"wspaniale jest to kolo!",23);

SelectObject(hdc, oldFont);
DeleteObject(hFont);

Maciej Rutkowski edytował(a) ten post dnia 04.07.11 o godzinie 14:04
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: CreateFontIndirect - problem

Krzysztof Kawa:
No bo nie jest zadeklarowane. Dopisz HFONT hFont; gdzieś przed switch'em lub przy pierwszym użuciu i weź cały case w {}
po takiej modyfikacji wywala 7 problemów z linkerem (Linker error),

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

HFONT hFont = CreateFontIndirect(&lf);
HFONT oldFont = (HFONT)SelectObject(hdc,hFont);

TextOut(hdc,120,38,"wspaniale jest to kolo!",23);

SelectObject(hdc, oldFont);
DeleteObject(hFont);

Po przeklejeniu tego fragmentu kodu (oczywiście starsza wersja wyłączona) kompletnie się posypało;
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
strcpy -wywala problemy z linkerem,
strcpy_s - twierdzi, że tego nie zna,Marcin Barańczak edytował(a) ten post dnia 04.07.11 o godzinie 17:24

konto usunięte

Temat: CreateFontIndirect - problem

Marcin Barańczak:
po takiej modyfikacji wywala 7 problemów z linkerem (Linker error),
Twoje "źródło wiedzy" rzeczywiście wygląda na dość lipne bo to są bardzo podstawowe rzeczy. Proponuję najpierw podszkolić się z c++ i ogólnej obsługi środowiska programistycznego (ustawienia projektu, linkera, jak dodawać parametry i ścieżki itp.), będzie po prostu łatwiej uczyć się bardziej zaawansowanych tematów takich jak programowanie okienek ;)

Rzeczy takie jak CreateFontIndirect czy Ellipse pochodzą z biblioteki GDI, więc trzeba ją dołaczyć. Nie pamiętam gdzie dokładnie w DevC++ się to robiło bo dawno go widziałem(swoją drogą ten edytor jest w tej chwili wręcz antyczny), ale musisz dodać do parametrów linkera -lgdi32

konto usunięte

Temat: CreateFontIndirect - problem

Dev C++ to dinozaur z 2005 roku, nierozwijany od tamtej pory. Po co tracić czas na uczenie się czegoś takiego?
Maurycy Mikulski

Maurycy Mikulski programista
C++(MS,QT),C#-MVC,SO
AP,AJAX-REST,SQL

Temat: CreateFontIndirect - problem

Generalnie się nie dziwię.
Jeśli czegoś linker nie widzi to znaczy że nie ma dostępu do definicji tego czegoś. Należy sprawdzić gdzie to jest zdefiniowane i to dodać.
Marcin Barańczak:
Krzysztof Kawa:
No bo nie jest zadeklarowane. Dopisz HFONT hFont; gdzieś przed switch'em lub przy pierwszym użuciu i weź cały case w {}
po takiej modyfikacji wywala 7 problemów z linkerem (Linker error),

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

HFONT hFont = CreateFontIndirect(&lf);
HFONT oldFont = (HFONT)SelectObject(hdc,hFont);

TextOut(hdc,120,38,"wspaniale jest to kolo!",23);

SelectObject(hdc, oldFont);
DeleteObject(hFont);

Po przeklejeniu tego fragmentu kodu (oczywiście starsza wersja wyłączona) kompletnie się posypało;
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
strcpy -wywala problemy z linkerem,
strcpy_s - twierdzi, że tego nie zna,
Adam Michalski:
Dev C++ to dinozaur z 2005 roku, nierozwijany od tamtej pory. Po co tracić czas na uczenie się czegoś takiego?
Może się kolega uczy? Ja zaczynałem od bardziej pieskiego kodu. Ja mam siwą brodę a to co napisałem to 10 razy dłuższą (kod się starzeje szybciej od ludzi).

konto usunięte

Temat: CreateFontIndirect - problem

Maurycy Mikulski:
Dev C++ to dinozaur z 2005 roku, nierozwijany od tamtej pory. Po co tracić czas na uczenie się czegoś takiego?
Może się kolega uczy? Ja zaczynałem od bardziej pieskiego kodu. Ja mam siwą brodę a to co napisałem to 10 razy dłuższą (kod się starzeje szybciej od ludzi).

Nie chodzi o poziom kodu. Ale po co się uczyć sztuczek konfiguracyjnych kompilatora, który nie jest rozwijany? Strata czasu, zwłaszcza jeśli robi to z UI a nie z opcji konsolowych...

konto usunięte

Temat: CreateFontIndirect - problem

Adam - DevC++ używa zdaje się mingw(gcc), który jest rozwijany bardzo aktywnie. To dołączona wersja jest stara, ale pewnie można ją sobie uaktualnić. Linkowanie nie jest tutaj żadną sztuczką, wygląda tak samo jak we współcześniejszych narzędziach.

Zaczynając naukę warto jednak rozpocząć od dobrej(bez błędów jak tu) i aktualnej książki/dokumentacji. Do tego najlepiej w środowisku, które ma jakąkolwiek przyszłość. Do wyboru jest cała masa - QtCreator, VC Express, Eclipse i czego tam się na linuksie nie używa ;)

Co do DevC++ to niestety widzę, że na wielu uczelniach jest to nadal "zalecany" edytor dla windowsa na start. Ciekawe z czego wynika taka zaszłość.
Maurycy Mikulski

Maurycy Mikulski programista
C++(MS,QT),C#-MVC,SO
AP,AJAX-REST,SQL

Temat: CreateFontIndirect - problem

Czy wystarczy że zaznaczyłem wartościową wypowiedz?
Ten kod co zobaczyłem przypomina mi coś z przed prawie 20 lat, może mniej. Pierwsze kontakty z okienkami. Cy nie jest wartościowe by młodsze pokolenie uczyło się "jak to jest zrobione"? Ja kodowałem bezpośrednio kody procesora, coś co podejrzewam nie jest nawet wspominane na wykładach. Ale czy dla świadomości nie powinno się pokazywać jak to się robi. Ja znam elektroniczną reprezentację starych komputerów,która jest podstawą obecnych. Mi łatwiej zrozumieć obecną architekturę a zwłaszcza tych "małych" które masowo zaczynają funkcjonować.

konto usunięte

Temat: CreateFontIndirect - problem

Tutaj nie ma absolutnie dyskusji. Programiści C(++)zawsze byli "blisko metalu", tym się szczycimy i tak ma pozostać ;) Przedstawiony kod to oczywiście standardowy starter okienkowy, chodzi mi jedynie o jego jakość i używane narzędzia.
Kod ma błędy (brak deklaracji HFONT), co nie powinno być cechą materiałów do nauki, no ale może to jednorazowa literówka czy coś, więc nie będę się czepiał.
Dobra książka powinna też opisywać czym jest linker i jak się go używa. Może nie w szczegółach, bo to się różni między zestawami narzędzi, ale przynajmniej "jak to działa i po co to jest".
No i na koniec sam edytor. Nikt nie prowadzi współczesnych projektów w DevC++ tak jak nikt nie prowadzi ich w TurboPascalu (a może się mylę?:P), więc naukę lepiej zacząć w czymś czego się potem będzie potencjalnie używało w pracy.
Znajomość implementacji czy podstaw architektury jest oczywiście potrzebna, chodzi o zwykła wygodę jej zgłębiania.Krzysztof Kawa edytował(a) ten post dnia 04.07.11 o godzinie 21:34
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: CreateFontIndirect - problem

Krzysztof Kawa:
musisz dodać do parametrów linkera -lgdi32

Po dodaniu tego parametru program zadziałał.

Programowania w c++ uczę się „na własną rękę”. Do tej pory bazowałem na książce uczącej podstaw. Tak się po drodze złożyło, że to co robię musiało zacząć „wyglądać”. Jako, że zawsze zaczyna się od rzeczy małych tak samo i moje programy do takowych należą. Do tej pory dłubałem w devie, także „okienkowe szaleństwo” w tym samym środowisku wydało się dobrym pomysłem. Zaletą „źródła wiedzy” z którego korzystam jest łopatologia. Autor nie zakłada „oczywistych oczywistości” tylko jedzie krok po kroku. Niestety nie jest to na razie na zasadzie objaśnienia wszystkiego a modyfikacji. Niestety jak widać kody źródłowe są… jak by to ująć… zawierają pewne elementy wprowadzające dyskomfort psychiczny po wciśnięciu opcji kompiluj.

Dziękuję wszystkim za zainteresowanie i pomoc. :)Marcin Barańczak edytował(a) ten post dnia 04.07.11 o godzinie 22:16

konto usunięte

Temat: CreateFontIndirect - problem

Marcin Barańczak:
Dziękuję wszystkim za zainteresowanie i pomoc. :)

To z czym się bawisz tutaj jest strasznie niskopoziomowe, łatwiej by Ci było użyć jakiejś obudowy do Win32 - wxWidgets, Qt lub GTK+.

konto usunięte

Temat: CreateFontIndirect - problem

Maurycy Mikulski:
Ten kod co zobaczyłem przypomina mi coś z przed prawie 20 lat, może mniej. Pierwsze kontakty z okienkami. Cy nie jest wartościowe by młodsze pokolenie uczyło się "jak to jest zrobione"?

I super! Niech się bawi Windows API, ja miałem WinApi na wykładach i sporo zaliczeń z tego. Wspomina się to z łezką w oku. Warto rozumieć jak takie rzeczy działają. Ale jeśli chodzi o IDE to używaliśmy najnowszych rzeczy, jak np. Visual Studio. Nie mówię, że akurat autor wątku ma używać kompilatorów i narzędzi MS, ale niech nie używa IDE, które jest od 5 lat nierozwijane, bo to trochę bez sensu. Kompilator gcc - jak najbardziej, sam go używam :)
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: CreateFontIndirect - problem

Ażeby kolejnego wątku nie tworzyć zadam kolejne pytanie tutaj. Okazało się, że moje "źródło wiedzy" posiada zbyt wiele błędów w zamieszczanych kodach i niedomówień w instrukcjach. Wróciłem więc do poziomu wyjściowego.

Chciałbym nauczyć się programować okienka. Prosiłbym o polecenie jakiejś dobrej knigi. :)

konto usunięte

Temat: CreateFontIndirect - problem

Marcin Barańczak:
Ażeby kolejnego wątku nie tworzyć zadam kolejne pytanie tutaj. Okazało się, że moje "źródło wiedzy" posiada zbyt wiele błędów w zamieszczanych kodach i niedomówień w instrukcjach. Wróciłem więc do poziomu wyjściowego.

Chciałbym nauczyć się programować okienka. Prosiłbym o polecenie jakiejś dobrej knigi. :)

Jaki system i jaka biblioteka? Jeśli Windows i Windows API to biblią programisty okienek jest nieśmiertelna książka Charlesa Petzolda pt. "Programowanie Windows". Nic lepszego i bardziej obszernego nie znajdziesz.
Maciej R.

Maciej R. Developer on foot,
onFoot IT

Temat: CreateFontIndirect - problem

Petzold jest nieśmiertelny i do uzyskania solidnych podstaw wystarczy. Potem warto zabrać się za porządną lekturę bloga Raymonda Chena, The Old New Thing ( http://blogs.msdn.com/oldnewthing ), zaczynając od wpisów nawet z 2002 roku - niesamowita skarbnica wiedzy na temat tego, jak prawidłowo programować okienka i shell Windows.

Do tego jeszcze można zahaczyć o "Network Programming for Microsoft Windows" autorstwa Jima Ohlunda i równie nie do zdarcia "Programming Applications for Microsoft Windows" Jeffreya Richtera. Ta ostatnia już obejmuje API dostępne w Windows 2000 i jest już dla osób lepiej zapoznanych z Win32 API. Windows to wielka kobyła do oprogramowania i nawet jeśli ostatecznie się będzie programować za pomocą Qt, wxWidgets lub innych obrzydlistw ;) , to warto wiedzieć co się dzieje pod spodem.

Następna dyskusja:

Problem z dynamicznym przyd...




Wyślij zaproszenie do