Nu har jeg forsøgt at lege en lille smule med et simpelt windowsprogram. Et
sted har jeg linjen:
WindowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
Når jeg oversætter programmet med minGW-oversætteren (
http://www.mingw.org/)
sker følgende:
>g++ test.cpp -o test
C:\DOCUME~1\Jacob\LOCALS~1\Temp/ccyiaaaa.o(.text+0x74):test.cpp: undefined
reference to `GetStockObject@4'
C:\DOCUME~1\Jacob\LOCALS~1\Temp/ccyiaaaa.o(.text+0x1c1):test.cpp: undefined
reference to `SetBkMode@8'
Hvis jeg oversætter programmet med MS Visual C++ 6 virker det fint nok.
Kildekode:
#include <windows.h>
long WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
   WNDCLASS WindowClass;                 // Structure to hold our window's
attributes
   static char szAppName[] = "OFWin";    // Define window class name
   HWND hWnd;                            // Window handle
   MSG msg;                              // Windows message structure
   // Redraw the window if the size changes
   WindowClass.style   = CS_HREDRAW | CS_VREDRAW;
   // Define our procedure for message handling
   WindowClass.lpfnWndProc = WindowProc;
   WindowClass.cbClsExtra = 0;          // No extra bytes after the window
class
   WindowClass.cbWndExtra = 0;          // structure or the window instance
   WindowClass.hInstance = hInstance;   // Application instance handle
   // Set default application icon
   WindowClass.hIcon = LoadIcon(0, IDI_APPLICATION);
   // Set window cursor to be the standard arrow
   WindowClass.hCursor = LoadCursor(0, IDC_ARROW);
   // Set gray brush for background color
   WindowClass.hbrBackground =
static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
   WindowClass.lpszMenuName = 0;           // No menu, so no menu resource
name
   WindowClass.lpszClassName = szAppName;  // Set class name
   // Now register our window class
   RegisterClass(&WindowClass);
   //  Now we can create the window
   hWnd = CreateWindow(
          szAppName,                       // the window class name
          "A Basic Window the Hard Way",   // The window title
          WS_OVERLAPPEDWINDOW,             // Window style as overlapped
          CW_USEDEFAULT,         // Default screen position of upper left
          CW_USEDEFAULT,         // corner of our window as x,y...
          CW_USEDEFAULT,         // Default window size
          CW_USEDEFAULT,         // ....
          0,                     // No parent window
          0,                     // No menu
          hInstance,             // Program Instance handle
          0                      // No window creation data
        );
   ShowWindow(hWnd, nCmdShow);   // Display the window
   UpdateWindow(hWnd);           // Cause window client area to be drawn
   // The message loop
   while(GetMessage(&msg, 0, 0, 0) == TRUE)   // Get any messages
   {
      TranslateMessage(&msg);                 // Translate the message
      DispatchMessage(&msg);                  // Dispatch the message
   }
   return msg.wParam;                         // End so return to Windows
}
long WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam,
                       LPARAM lParam)
{
   HDC hDC;                       // Display context handle
   PAINTSTRUCT PaintSt;           // Structure defining area to be drawn
   RECT aRect;                    // A working rectangle
   switch(message)                // Process selected messages
   {
      case WM_PAINT:                       // Message is to redraw the
window
         hDC = BeginPaint(hWnd, &PaintSt); // Prepare to draw the window
         // Get upper left and lower right of client area
         GetClientRect(hWnd, &aRect);
         SetBkMode(hDC, TRANSPARENT);      // Set text background mode
         // Now draw the text in the window client area
         DrawText(
             hDC,                  // Device context handle
             "But, soft! What light through yonder window breaks?",
             -1,                   // Indicate null terminated string
             &aRect,               // Rectangle in which text is to be drawn
             DT_SINGLELINE|        // Text format - single line
             DT_CENTER|            //             - centered in the line
             DT_VCENTER);          //             - line centered in aRect
         EndPaint(hWnd, &PaintSt); // Terminate window redraw operation
         return 0;
      case WM_DESTROY:             // Window is being destroyed
         PostQuitMessage(0);
         return 0;
      default:             // Any other message - we don't want to know,
                           // so call default message processing
         return DefWindowProc(hWnd, message, wParam, lParam);
   }
}
Jacob