Autor Ivor Horton, ale niestety miałem problemy z tym kodem, ponieważ szanowny autor już od wersji swojej książki z 2005 pod tytułem "Beginning Visual C++ 2005" przez "Beginning Visaul C++ 2008" aż do "Beginning Visual C++ 2010" robi ten sam błąd. Kod programu umieszczam poniżej z komentarzami gdzie są błędy:
// Cw11_01.cpp Natywny program Windows, wyświetlający tekst w oknie.
#include
LRESULT WINAPI WindowProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
// Tutaj wstaw kod funkcji WinMain() (Listing OFWIN_1).
// Listing OFWIN_1
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX WindowClass; // Struktura przechowująca atrybuty okna.
static LPCTSTR szAppName = L"OFWin"; // Zdefiniuj nazwę klasy okna i tutaj pokazywany jest błąd przez kompilator Visual C++, aby to naprawić trzeba usunąć literkę "L" sprzed tekstu.
HWND hWnd; // Uchwyt okna.
MSG msg; // Struktura komunikatu Windowsa.
WindowClass.cbSize = sizeof(WNDCLASSEX); // Ustaw rozmiar struktury.
// Przerysuj okno, jeśli zostanie zmieniony jego rozmiar.
WindowClass.style = CS_HREDRAW | CS_VREDRAW;
// Zdefiniuj funkcję obsługującą komunikaty.
WindowClass.lpfnWndProc = WindowProc;
WindowClass.cbClsExtra = 0; // Nie ma dodatkowych bajtów po strukturze klasy okna
WindowClass.cbWndExtra = 0; // ani po instancji okna.
WindowClass.hInstance = hInstance; // Uchwyt instancji aplikacji.
// Ustaw domyślną ikonę aplikacji.
WindowClass.hIcon = LoadIcon(0, IDI_APPLICATION);
// Ustaw standardową strzałkę jako kursor.
WindowClass.hCursor = LoadCursor(0, IDC_ARROW);
// Ustaw szary pędzel dla koloru tła.
WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
WindowClass.lpszMenuName = 0; // Brak menu.
WindowClass.lpszClassName = szAppName; // Ustaw nazwę klasy.
WindowClass.hIconSm = 0; // Domyślna mała ikona.
// Zarejestruj klasę okna.
RegisterClassEx(&WindowClass);
// Teraz można utworzyć okno.
hWnd = CreateWindow(
szAppName, // Nazwa klasy okna.
L"Podstawowe okno – trudny sposób", // Tytuł okna i tutaj pokazywany jest błąd przez kompilator Visual C++, aby to naprawić trzeba usunąć literkę "L" sprzed tekstu.
WS_OVERLAPPEDWINDOW, // Styl okna (tu: nakładkowy).
CW_USEDEFAULT, // Domyślna pozycja lewego górnego...
CW_USEDEFAULT, // ...narożnika okna jako x, y...
CW_USEDEFAULT, // Domyślny rozmiar okna.
CW_USEDEFAULT, // ...
0, // Brak okna głównego (macierzystego).
0, // Brak menu.
hInstance, // Uchwyt instancji programu.
0 // Brak dodatkowych danych tworzenia okna.
);
ShowWindow(hWnd, nCmdShow); // Wyświetl okno.
UpdateWindow(hWnd); // Powoduje przerysowanie obszaru klienta.
// Pętla komunikatów.
while(GetMessage(&msg, 0, 0, 0) == TRUE) // Pobieraj komunikaty.
{
TranslateMessage(&msg); // Przetłumacz komunikat.
DispatchMessage(&msg); // Wyślij komunikat.
}
return static_cast<int>(msg.wParam); // Koniec, więc zwróć do Windowsa.
}
// Tutaj wstaw kod funkcji WindowProc() here (Listing OFWIN_2)
// Listing OFWIN_2
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC; // Uchwyt kontekstu wyświetlacza.
PAINTSTRUCT PaintSt; // Struktura definiująca obszar do przerysowania.
RECT aRect; // Prostokąt do odnowienia.
switch(message) // Przetwarzaj wybrane komunikaty.
{
case WM_PAINT: // Komunikat o przerysowaniu okna.
hDC = BeginPaint(hWnd, &PaintSt); // Przygotuj rysowanie okna.
// Pobierz koordynaty lewego górnego i prawego górnego narożnika obszaru klienta.
GetClientRect(hWnd, &aRect);
SetBkMode(hDC, TRANSPARENT); // Ustaw tryb tła tekstu.
// Rysuj w obszarze klienta.
DrawText(
hDC, // Uchwyt kontekstu urządzenia.
L" By dojść do źródła, trzeba płynąć pod prąd.", //i tutaj pokazywany jest błąd przez kompilator Visual C++, aby to naprawić trzeba usunąć literkę "L" sprzed tekstu
-1, // Oznacza łańcuch zakończony znakiem null.
&aRect, // Prostokąt, w którym ma zostać narysowany tekst.
DT_SINGLELINE| // Format tekstu — pojedyncza linia.
DT_CENTER| // — Wyśrodkowany w linii.
DT_VCENTER); // — Linia wyśrodkowana w aRect.
EndPaint(hWnd, &PaintSt); // Zakończ przerysowywanie.
return 0;
case WM_DESTROY: // Okno jest niszczone.
PostQuitMessage(0);
return 0;
default: // Każda inna wiadomość, o której nie chcemy wiedzieć, więc wywołaj domyślne przetwarzanie komunikatów.
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
Listing pobrałem ze strony helion.pl.
ile ten program ma po skompilowaniu?
OdpowiedzUsuńW Visual Studio 2010 zajmuje po kompilacji: 28,5 kB
OdpowiedzUsuń