digitalmars.D - Win32 API: GetStockObject(), GetTextMetricsA(), TextOutA(), SetTextAlign()
Hello, can someone help me fix the following errors? Thanks. Kevin M D:\SYSMETS1>dmd sysmets1.d /C:\dmd\bin\..\..\dm\bin\link.exe sysmets2,,,user32+kernel32/noi; OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved sysmets1.obj(sysmets1) Error 42: Symbol Undefined _GetTextMetricsA 8 sysmets1.obj(sysmets1) Error 42: Symbol Undefined _TextOutA 20 sysmets1.obj(sysmets1) Error 42: Symbol Undefined _SetTextAlign 8 sysmets1.obj(sysmets1) Error 42: Symbol Undefined _GetStockObject 4 --- errorlevel 4 /*---------------------------------------------------- SYSMETS1.D -- System Metrics Display Program No. 1 (c) Charles Petzold, 1998 ----------------------------------------------------*/ import std.c.windows.windows; extern (C) void gc_init(); extern (C) void gc_term(); extern (C) void _minit(); extern (C) void _moduleCtor(); extern (C) void _moduleUnitTests(); extern (Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result; gc_init(); // initialize garbage collector _minit(); // initialize module constructor table try { _moduleCtor(); // call module constructors _moduleUnitTests(); // run unit tests (optional) result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } catch (Object o) // catch any uncaught exceptions { MessageBoxA(cast (HWND) null, cast(char *)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); result = 0; // failed } gc_term(); // run finalizers; terminate garbage collector return result; } // ************************************************************ int myWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR[] szAppName = "SysMets1"; HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = &WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIconA (cast(HINSTANCE) null, IDI_APPLICATION); wndclass.hCursor = LoadCursorA (cast(HINSTANCE) null, IDC_ARROW); //wndclass.hbrBackground = cast (HBRUSH) (GetStockObject (WHITE_BRUSH)); wndclass.hbrBackground = cast (HBRUSH) (COLOR_WINDOW + 1); wndclass.lpszMenuName = null; wndclass.lpszClassName = szAppName; if (!RegisterClassA (&wndclass)) { MessageBoxA (cast (HWND) null, "This program requires Windows NT!", szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindowA (szAppName, // window class name "Get System Metrics No. 1", // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size cast(HWND) null, // parent window handle cast(HMENU) null, // window menu handle hInstance, // program instance handle null); // creation parameters assert(hwnd); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); while (GetMessageA (&msg, cast (HWND) null, 0, 0)) { TranslateMessage (&msg); DispatchMessageA (&msg); } return msg.wParam; } struct SYSMETRIC { int iIndex; TCHAR[] szLabel; TCHAR[] szDesc ; } SYSMETRIC[] sysmetrics = [ {SM_CXSCREEN, "SM_CXSCREEN", "Screen width in pixels"}, {SM_CYSCREEN, "SM_CYSCREEN", "Screen height in pixels"} ]; extern (Windows) int WndProc (HWND hwnd, uint message, WPARAM wParam, LPARAM lParam) { static int cxChar, cxCaps, cyChar; HDC hdc; int i; PAINTSTRUCT ps; TCHAR szBuffer [10]; TEXTMETRICA tm; switch (message) { case WM_CREATE: hdc = GetDC (hwnd); GetTextMetricsA (hdc, &tm); cxChar = tm.tmAveCharWidth; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC (hwnd, hdc); break; case WM_PAINT : hdc = BeginPaint (hwnd, &ps); for (i = 0; i < sysmetrics.length; i++) { TextOutA (hdc, 0, cyChar * i, sysmetrics[i].szLabel, lstrlenA (sysmetrics[i].szLabel)); TextOutA (hdc, 22 * cxCaps, cyChar * i, sysmetrics[i].szDesc, lstrlenA (sysmetrics[i].szDesc)); SetTextAlign (hdc, TA_RIGHT | TA_TOP); TextOutA (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer, wsprintfA (szBuffer, "%5d", GetSystemMetrics (sysmetrics[i].iIndex))); SetTextAlign (hdc, TA_LEFT | TA_TOP); } EndPaint (hwnd, &ps); break; case WM_DESTROY : PostQuitMessage (0); break; default: break; } return DefWindowProcA (hwnd, message, wParam, lParam); } //Win32 API header entries missing in C:\dmd\src\phobos\std\c\windows\windows.d extern(Windows) int lstrlenA(LPCSTR); // Required, works extern(Windows) int GetSystemMetrics(int); // Required, works alias char TCHAR; enum { SM_CXSCREEN = 0, // Screen width in pixels SM_CYSCREEN = 1, // Screen height in pixels } //Win32 API header entries exist in C:\dmd\src\phobos\std\c\windows\windows.d extern(Windows) int wsprintfA(LPSTR, LPCSTR, ...); // Required, works extern(Windows) HGDIOBJ GetStockObject(int); // Doesn't work! extern(Windows) BOOL GetTextMetricsA(HDC, TEXTMETRICA*); // Doesn't work! extern(Windows) BOOL TextOutA(HDC, int, int, LPCSTR, int); // Doesn't work! extern(Windows) uint SetTextAlign(HDC, UINT); // Doesn't work!
Jan 25 2005
D:\SYSMETS1>dmd sysmets1.d /C:\dmd\bin\..\..\dm\bin\link.exe sysmets2,,,user32+kernel32/noi;why don't link gdi32? try: C:\dmd\bin\..\..\dm\bin\link.exe sysmets2,,,user32+kernel32+gdi32/noi;
Mar 04 2006