First, the basic idea
1. There are three background: sky and grass, mountains, houses;
2. In the most distant sky, followed by meadows and mountains (because of mountains on the grass), and finally the house;
3. Background circulation speed of the slowest of the sky, and then the mountains, meadows and finally the house;
4. dinosaur running it in situ to FIG num record number, each number to the end, then start from No. 0;
Second, the circulation background texture
1. In the sky, for example, arranged from left to right in FIG x0 represents the background to be cut to the right width of the rolling, the initial value is 0;
2. Background disposed upper-left coordinates in FIG width 640, right clipping region is: (640-x0,0), the coordinates of the region to the area attached to mdc (0,0) as a starting point;
3. FIG sky then affixed to the rest of mdc to (x0,0) as a starting point coordinates;
4. x0 is assumed that each increase by 5, each mapping to achieve the movement of the background, until the 640 x =, then reset to 0;
5. Note that, in addition to achieving circulation mountains and buildings, but also transparent processing;
Three, as follows
#include "stdafx.h"
HINSTANCE hInst;
HBITMAP dra,bg[3];
HDC hdc,mdc,bufdc;
HWND hWnd;
DWORD tPre,tNow;
int x0=0,x1=0,x2=0,num=0;//x0、x1、x2三张背景图由左向右移动时所要切割的宽度;num表示图号
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
tNow = GetTickCount();
if(tNow-tPre >= 100)
MyPaint(hdc);
}
}
return msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HBITMAP bmp;
hInst = hInstance;
hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,10,10,640,520,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
bufdc = CreateCompatibleDC(hdc);
bmp = CreateCompatibleBitmap(hdc,640,480);
SelectObject(mdc,bmp);
bg[0] = (HBITMAP)LoadImage(NULL,"bg0.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
bg[1] = (HBITMAP)LoadImage(NULL,"bg1.bmp",IMAGE_BITMAP,640,600,LR_LOADFROMFILE);
bg[2] = (HBITMAP)LoadImage(NULL,"bg2.bmp",IMAGE_BITMAP,640,600,LR_LOADFROMFILE);
dra = (HBITMAP)LoadImage(NULL,"dra.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE);
MyPaint(hdc);
return TRUE;
}
void MyPaint(HDC hdc)
{
//贴上天空背景图
SelectObject(bufdc,bg[0]);
BitBlt(mdc,0,0,x0,300,bufdc,640-x0,0,SRCCOPY);
BitBlt(mdc,x0,0,640-x0,300,bufdc,0,0,SRCCOPY);
//贴上草地图
BitBlt(mdc,0,300,x2,180,bufdc,640-x2,300,SRCCOPY);
BitBlt(mdc,x2,300,640-x2,180,bufdc,0,300,SRCCOPY);
//贴上山峦并透明
SelectObject(bufdc,bg[1]);
BitBlt(mdc,0,0,x1,300,bufdc,640-x1,300,SRCAND);
BitBlt(mdc,x1,0,640-x1,300,bufdc,0,300,SRCAND);
BitBlt(mdc,0,0,x1,300,bufdc,640-x1,0,SRCPAINT);
BitBlt(mdc,x1,0,640-x1,300,bufdc,0,0,SRCPAINT);
//贴上房屋并透明
SelectObject(bufdc,bg[2]);
BitBlt(mdc,0,250,x2,300,bufdc,640-x2,300,SRCAND);
BitBlt(mdc,x2,250,640-x2,300,bufdc,0,300,SRCAND);
BitBlt(mdc,0,250,x2,300,bufdc,640-x2,0,SRCPAINT);
BitBlt(mdc,x2,250,640-x2,300,bufdc,0,0,SRCPAINT);
SelectObject(bufdc,dra);
BitBlt(mdc,250,350,95,99,bufdc,num*95,99,SRCAND);
BitBlt(mdc,250,350,95,99,bufdc,num*95,0,SRCPAINT);
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
tPre = GetTickCount();
//控制各个背景图的循环速度
x0 += 5;
if(x0==640)
x0 = 0;
x1 += 8;
if(x1==640)
x1 = 0;
x2 += 16;
if(x2==640)
x2 = 0;
num++;
if(num == 8)
num = 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
DeleteDC(mdc);
DeleteDC(bufdc);
DeleteObject(bg[0]);
DeleteObject(bg[1]);
DeleteObject(bg[2]);
DeleteObject(dra);
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Fourth, the effect