Programiranje grafike za okolje Windows je zahtevno, vendar je za osnovno risanje slikic dovolj ze enostaven program, ki ga lahko prevedemo s prevajalnikom za Windows. Obstaja tudi brezplacen prevajalnik Cygnus, ki zna prevajati win32 kodo. Prevajalnik je mozno dobiti tudi na nasem strezniku ftp.lecad.fs.uni-lj.si na podrocju /pub/vaje/install.
Program prevedemo z ukazom: gcc primer.c -o primer.exe -lgdi32 -luser32
#include <windows.h>
LRESULT FAR PASCAL AppWndProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam);
HWND hAppWnd;
int WINAPI
WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{
MSG msg;
static const char
szWndClassName[] = {"MYWNDCLASS"};
if (hPrevInstance == NULL) {
WNDCLASS wc;
wc.lpszClassName = szWndClassName;
wc.hInstance = hInstance;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = AppWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
if (!RegisterClass(&wc))
return FALSE;
}
// Create our Main Application Window
hAppWnd = CreateWindow(szWndClassName, "Test Application",
WS_OVERLAPPEDWINDOW, // Style of Window
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
NULL, NULL, hInstance,
NULL);
ShowWindow(hAppWnd, nCmdShow);
UpdateWindow(hAppWnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg); /* translates virtual key codes */
DispatchMessage(&msg); /* dispatches message to window */
}
return (int) msg.wParam; /* return value of PostQuitMessage */
}
LRESULT FAR PASCAL
AppWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// this is where we receive all message concerning this window
// we can either process a message or pass it on to the default
// message handler of windows
switch (msg) {
case WM_CREATE:
// Initialize Window
// this message is received before the window is displayed
break;
case WM_PAINT:
{
static LOGPEN lpBlack =
{PS_SOLID, 1, 1, RGB(0, 0, 0)}, lpWhite =
{PS_SOLID, 1, 1, RGB(255, 255, 255)};
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
HPEN hPenBlack, hPenWhite;
int i;
// Get the handle to the Windows's Display Context
hdc = BeginPaint(hWnd, &ps);
// Now Paint the Windows's contents
// PaintAppWindow(hWnd,hdc,iPaintCount);
// Call EndPaint to release the DC and validate
hPenBlack = CreatePenIndirect(&lpBlack);
hPenWhite = CreatePenIndirect(&lpWhite);
// SetMapMode (hdc, MM_ANISOTROPIC);
GetClientRect(hWnd, &rect);
// SetViewportExtEx (hdc, rect.right, rect.bottom, NULL);
// SetWindowExtEx(hdc, 10, 4, NULL);
// Tu ri\v{s}emo \v{c}rto
SelectObject(hdc, hPenBlack);
MoveToEx(hdc, 1, 1, NULL);
LineTo(hdc, 9, 1);
DrawText(hdc, "Hello, Windows", -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0); // Terminate Application
break;
default:
// We didn't process the message so let Windows do it
return DefWindowProc(hWnd, msg, wParam, lParam);
}
// We processed the message and there
// is no processing by Windows necessary
return 0L;
}