#include LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); char szClassName[] = "MainWnd"; HINSTANCE hInstance; HBITMAP CreateBitmapMask (HBITMAP hbmColour, COLORREF crTransparent) { HDC hdcMem, hdcMem2; HBITMAP hbmMask; BITMAP bm; /* Create monochrome (1 bit) mask bitmap. */ GetObject(hbmColour, sizeof (BITMAP), &bm); hbmMask = CreateBitmap (bm.bmWidth, bm.bmHeight, 1, 1, NULL); /* Get some HDCs that are compatible with the display driver */ hdcMem = CreateCompatibleDC (0); hdcMem2 = CreateCompatibleDC (0); /* SelectBitmap (hdcMem, hbmColour); SelectBitmap (hdcMem2, hbmMask); */ /* Set the background colour of the colour image to the colour you want to be transparent. */ SetBkColor (hdcMem, crTransparent); /* Copy the bits from the colour image to the B+W mask... everything with the background colour ends up white while everythig else ends up black...Just what we wanted. */ BitBlt (hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); /* Take our new mask and use it to turn the transparent colour in our original colour image to black so the transparency effect will work right. */ BitBlt (hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT); /* Clean up. */ DeleteDC (hdcMem); DeleteDC (hdcMem2); return hbmMask; } int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASSEX wincl; hInstance = hInst; wincl.cbSize = sizeof (WNDCLASSEX); wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.style = 0; wincl.hInstance = hInstance; wincl.lpszClassName = szClassName; wincl.lpszMenuName = NULL; //No menu wincl.lpfnWndProc = WindowProcedure; wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW); //Color of the window wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); //EXE icon wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //Small program icon wincl.hCursor = LoadCursor (NULL, IDC_ARROW); //Cursor if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx (/* No extended window styles */ 0, /* Class name */ szClassName, /* Window caption */ "", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, /* Let Windows decide the left and top positions of the window */ CW_USEDEFAULT, CW_USEDEFAULT, /* Width and height of the window */ 400, 400, NULL, NULL, hInstance, NULL); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop */ while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; HBITMAP bitmap = NULL; switch (message) { case WM_CREATE: { HICON hIcon, hIconSm; /* get a drawing context */ hdc = GetDC (hwnd); /* load the small icon */ hIcon = LoadImage (NULL, "aver.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE); if (hIcon != 0) SendMessage (hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); else { hIconSm = LoadImage (NULL, "aver.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); if (hIconSm != 0) SendMessage (hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm); else MessageBox (hwnd, "Could not load either big or small icon!", "Error", MB_OK | MB_ICONERROR); } /* load the bitmap */ bitmap = LoadImage (NULL, "test.bmp", IMAGE_BITMAP, 161, 161, LR_LOADFROMFILE); if (bitmap != 0) GetObject (bitmap, sizeof (bitmap), &bitmap); else MessageBox (hwnd, "Could not load Bitmap!", "Error", MB_OK | MB_ICONEXCLAMATION); /* g_hbmMask = CreateBitmapMask (g_hbmBall, RGB (0, 0, 0)); if (g_hbmMask == NULL) MessageBox (hwnd, "Could not create mask!", "Error", MB_OK | MB_ICONEXCLAMATION); */ } break; case WM_PAINT: { BITMAP bm; PAINTSTRUCT ps; HDC hdc = BeginPaint (hwnd, &ps); HDC hdcMem = CreateCompatibleDC (hdc); HBITMAP hbmOld = SelectObject (hdcMem, bitmap); GetObject (bitmap, sizeof (bm), &bm); /* BitBlt (hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); */ SelectObject (hdcMem, hbmOld); DeleteDC (hdcMem); TextOut (hdc, 15, 3, "Hello, world!", 13); EndPaint (hwnd, &ps); } break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }