f(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; int i; hWnd = CreateWindow("canvas", "绘图窗口" , WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } MoveWindow(hWnd,10,10,640,480,true); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); bufdc = CreateCompatibleDC(hdc); bmp = CreateCompatibleBitmap(hdc,640,480); //建立一个空位图并放入mdc中 SelectObject(mdc,bmp); //加载各张恐龙跑动图及背景图,这里以0,1,2,3来代表恐龙的上,下,左,右移动 draPic[0] = (HBITMAP)LoadImage(NULL,"dra0.bmp",IMAGE_BITMAP,528,188,LR_LOADFROMFILE); draPic[1] = (HBITMAP)LoadImage(NULL,"dra1.bmp",IMAGE_BITMAP,544,164,LR_LOADFROMFILE); draPic[2] = (HBITMAP)LoadImage(NULL,"dra2.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE); draPic[3] = (HBITMAP)LoadImage(NULL,"dra3.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE); bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE); //设定所有恐龙初始的贴图坐标都为(200,200),初始的移动方向都为向左。 for(i=0;i { dra[i].dir = 3; //起始方向 dra[i].x = 200; //贴图的起始X坐标 dra[i].y = 200; //贴图的起始Y坐标 } MyPaint(hdc); return TRUE; } //气泡排序 void BubSort(int n) { int i,j; bool f; dragon tmp; for(i=0;i { f = false; for(j=0;j { if(dra[j+1].y < dra[j].y) { tmp = dra[j+1]; dra[j+1] = dra[j]; dra[j] = tmp; f = true; } } if(!f) break; } } //****自定义绘图函数********************************* // 1.对窗口中跑动的恐龙进行排序贴图 // 2.恐龙贴图坐标修正 void MyPaint(HDC hdc) { int w,h,i; if(picNum == 8) picNum = 0; //在mdc中先贴上背景图 SelectObject(bufdc,bg); BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY); BubSort(draNum); //贴上恐龙图之前调用BubSort()函数进行排序 //下面这个for循环,按照目前恐龙的移动方向dra[i].dir,选取对应的位图到bufdc中,并设定截切的大小。每一张要在窗口上出现的恐龙图案依次先在mdc上进行透明贴图的操作。 for(i=0;i { SelectObject(bufdc,draPic[dra[i].dir]); switch(dra[i].dir) { case 0: w = 66; h = 94; break; case 1: w = 68; h = 82; break; case 2: w = 95; h = 99; break; case 3: w = 95; h = 99; break; } BitBlt(mdc,dra[i].x,dra[i].y,w,h,bufdc,picNum*w,h,SRCAND); BitBlt(mdc, |