Added Demo for WM_ERASEBKGND

- Contributed by Damon Chandler Windows2000 Graphics API Backbook

svn path=/trunk/; revision=4287
This commit is contained in:
Steven Edwards 2003-03-11 19:50:30 +00:00
parent ab42b89f19
commit 3e669eed4d
3 changed files with 241 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -0,0 +1,175 @@
// ------------------------------------------------------------------
// Windows 2000 Graphics API Black Book
// Chapter 2 - CD-ROM (WM_ERASEBKGND Demo)
//
// Created by Damon Chandler <dmc27@ee.cornell.edu>
// Updates can be downloaded at: <www.coriolis.com>
//
// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
// if you have any questions about this code.
// ------------------------------------------------------------------
//*********************************************************//
// //
// SYNOPSIS: //
// This sample project demonstrates how to render //
// a background image in response to the WM_ERASEBKGND //
// message. It also shows how to create a transparent //
// static (text) control by handling the //
// WM_CTLCOLORSTATIC message. //
// //
//*********************************************************//
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include <windows.h>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
HINSTANCE HInst;
const char* WndClassName = "GMainWnd";
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam,
LPARAM LParam);
int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
HInst = HInstance;
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = MainWndProc;
wc.hInstance = HInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground =
reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1);
wc.lpszClassName = WndClassName;
if (RegisterClass(&wc))
{
HWND HWnd =
CreateWindow(WndClassName,
TEXT("WM_ERASEBKGND Demo"),
WS_OVERLAPPEDWINDOW | WS_CAPTION |
WS_VISIBLE | WS_CLIPSIBLINGS,
CW_USEDEFAULT, CW_USEDEFAULT, 205, 85,
NULL, NULL, HInstance, NULL);
if (HWnd)
{
ShowWindow(HWnd, nCmdShow);
UpdateWindow(HWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return 0;
}
//------------------------------------------------------------------
// static text and bitmap-related variables
HWND HStatic;
HDC HMemDC;
HBITMAP HBmp, HOldBmp;
const char* filename = "BACKBITMAP.BMP";
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam,
LPARAM LParam)
{
switch (Msg)
{
case WM_CREATE:
{
HStatic =
CreateWindow(TEXT("STATIC"), TEXT("Static Text"),
WS_CHILD | WS_VISIBLE | SS_CENTER,
10, 20, 175, 30,
HWnd, NULL, HInst, NULL);
// create a memory DC compatible with the screen
HMemDC = CreateCompatibleDC(NULL);
if (HMemDC)
{
// load a DDB from file
HBmp = static_cast<HBITMAP>(
LoadImage(HInst, filename, IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE)
);
if (HBmp)
{
// associate the DDB with the memory DC
HOldBmp = static_cast<HBITMAP>(
SelectObject(HMemDC, HBmp)
);
}
}
}
case WM_CTLCOLORSTATIC:
{
if (reinterpret_cast<HWND>(LParam) == HStatic)
{
HDC HStaticDC = reinterpret_cast<HDC>(WParam);
SetBkMode(HStaticDC, TRANSPARENT);
return reinterpret_cast<LRESULT>(
GetStockObject(NULL_BRUSH)
);
}
break;
}
case WM_ERASEBKGND:
{
BITMAP bmp;
if (GetObject(HBmp, sizeof(BITMAP), &bmp))
{
RECT RClient;
GetClientRect(HWnd, &RClient);
HDC Hdc = reinterpret_cast<HDC>(WParam);
SetStretchBltMode(Hdc, COLORONCOLOR);
//
// TODO: add palette handling code for
// palettized displays (see Chapter 9)...
//
// render the background image
StretchBlt(Hdc, 0, 0,
RClient.right - RClient.left,
RClient.bottom - RClient.top,
HMemDC, 0, 0, bmp.bmWidth, bmp.bmHeight,
SRCCOPY);
return TRUE;
}
break;
}
case WM_DESTROY:
{
if (HBmp)
{
// free the bitmap
DeleteObject(SelectObject(HMemDC, HOldBmp));
}
// free the memory DC
DeleteDC(HMemDC);
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(HWnd, Msg, WParam, LParam);
}
//------------------------------------------------------------------

View file

@ -0,0 +1,66 @@
# Makefile - Proj_Demo_WM_ERASEBKGND.dsp
ifndef CFG
CFG=Proj_Demo_WM_ERASEBKGND - Win32 Debug
endif
CC=gcc
CFLAGS=
CXX=g++
CXXFLAGS=$(CFLAGS)
RC=windres -O COFF
ifeq "$(CFG)" "Proj_Demo_WM_ERASEBKGND - Win32 Release"
CFLAGS+=-fexceptions -O2 -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -W
LD=$(CXX) $(CXXFLAGS)
LDFLAGS=
LDFLAGS+=-Wl,--subsystem,windows
LIBS+=-lkernel32 -luser32 -lgdi32
else
ifeq "$(CFG)" "Proj_Demo_WM_ERASEBKGND - Win32 Debug"
CFLAGS+=-fexceptions -g -O0 -DWIN32 -D_DEBUG -D_WINDOWS -D_MBCS -W
LD=$(CXX) $(CXXFLAGS)
LDFLAGS=
LDFLAGS+=-Wl,--subsystem,windows
LIBS+=-lkernel32 -luser32 -lgdi32
endif
endif
ifndef TARGET
TARGET=WM_ERASEBKGND.exe
endif
.PHONY: all
all: $(TARGET)
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ -c $<
%.o: %.cpp
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ -c $<
%.res: %.rc
$(RC) $(CPPFLAGS) -o $@ -i $<
SOURCE_FILES= \
Demo_WM_ERASEBKGND.cpp
HEADER_FILES=
RESOURCE_FILES=
SRCS=$(SOURCE_FILES) $(HEADER_FILES) $(RESOURCE_FILES)
OBJS=$(patsubst %.rc,%.res,$(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(filter %.c %.cpp %.rc,$(SRCS)))))
$(TARGET): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
.PHONY: clean
clean:
del $(OBJS) $(TARGET) Proj_Demo_WM_ERASEBKGND.dep
.PHONY: depends
depends:
-$(CXX) $(CXXFLAGS) $(CPPFLAGS) -MM $(filter %.c %.cpp,$(SRCS)) > Proj_Demo_WM_ERASEBKGND.dep
-include Proj_Demo_WM_ERASEBKGND.dep