niedziela, 29 sierpnia 2010

Prosty program w WinAPI

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.

2 komentarze: