Welcome

首页 / 软件开发 / VC.NET / Windows界面编程(13) 位图显示特效合集

Windows界面编程(13) 位图显示特效合集2014-01-09前面的四篇已经介绍了位图的交错效果、百叶窗效果、随机积木效果、飞入效果与伸展效果。下面用一个程序将展示这些效果。这里给出主要代码(下载地址见:http://download.csdn.net/detail/morewindows/5177047)。代码中的DragAcceptFiles可以参考《Windows界面编程第七篇文件拖拽(文件拖放)》(http://blog.csdn.net/morewindows/article/details/8634451),主要是为了能将位图文件拖入到窗口中。

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){static int s_nShow;static HDC s_hdcMem;static int s_nWidth, s_nHeight;switch (message){case WM_CREATE:{DragAcceptFiles(hwnd, TRUE); // 加载位图HBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL, "107.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);if (hBitmap == NULL){MessageBox(hwnd, "LoadImage failed", "Error", MB_ICONERROR);exit(0);}// 位图HDCHDC hdc = GetDC(hwnd);s_hdcMem = CreateCompatibleDC(hdc);SelectObject(s_hdcMem, hBitmap);ReleaseDC(hwnd, hdc);// 计算位图宽高BITMAP bm;GetObject(hBitmap, sizeof(bm), &bm);s_nWidth = bm.bmWidth;s_nHeight = bm.bmHeight;s_nShow = 0;}return 0;case WM_KEYDOWN: switch (wParam){case VK_ESCAPE: //按下Esc键时退出 SendMessage(hwnd, WM_DESTROY, 0, 0);return 0;}break; case WM_PAINT:{HDC hdc;PAINTSTRUCT ps;hdc = BeginPaint(hwnd, &ps);switch (s_nShow){case 0:BitBlt(hdc, 0, 0, s_nWidth, s_nHeight, s_hdcMem, 0, 0, SRCCOPY);break;// 水平交错case 1:AnimateDraw_StaggeredHorizontal(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 垂直交错case 2:AnimateDraw_StaggeredVertical(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 水平百叶窗case 3:AnimateDraw_JalousieHorizontal(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 垂直百叶窗case 4:AnimateDraw_JalousieVertical(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 随机积木case 5:AnimateDraw_RandomBlocks(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 飞入 从上往下case 6:AnimateDraw_FlyingTopToBottom(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);break;// 飞入 从下往上case 7:AnimateDraw_FlyingBottomToTop(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);break;// 飞入 从左往右case 8:AnimateDraw_FlyingLeftToRight(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);break;// 飞入 从右往左case 9:AnimateDraw_FlyingRightToLeft(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);break;// 伸展 从上往下case 10:AnimateDraw_FlyingTopToBottom(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 伸展 从下往上case 11:AnimateDraw_FlyingBottomToTop(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 伸展 从左往右case 12:AnimateDraw_FlyingLeftToRight(hdc, s_hdcMem, s_nWidth, s_nHeight);break;// 伸展 从右往左case 13:AnimateDraw_FlyingRightToLeft(hdc, s_hdcMem, s_nWidth, s_nHeight);break;}if (s_nShow != 0){s_nShow = 0;InvalidateRect(hwnd, NULL, FALSE);}EndPaint(hwnd, &ps);}return 0;case WM_COMMAND:if (LOWORD(wParam) >= 40001 && LOWORD(wParam) <= 40013){s_nShow = LOWORD(wParam) - 40000;InvalidateRect(hwnd, NULL, TRUE);return 0;}break;// 文件拖拽第三步 DragQueryFile and DragQueryFilecase WM_DROPFILES:{HDROP hDrop = (HDROP)wParam;UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); // 拖拽文件个数char strFileName[MAX_PATH];DragQueryFile(hDrop, 0, strFileName, MAX_PATH);//获得拖曳的文件名DragFinish(hDrop);//释放hDropDeleteDC(s_hdcMem);// 加载位图HBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL, strFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);// 位图HDCHDC hdc = GetDC(hwnd);s_hdcMem = CreateCompatibleDC(hdc);SelectObject(s_hdcMem, hBitmap);ReleaseDC(hwnd, hdc);// 计算位图宽高BITMAP bm;GetObject(hBitmap, sizeof(bm), &bm);s_nWidth = bm.bmWidth;s_nHeight = bm.bmHeight;InvalidateRect(hwnd, NULL, TRUE);}return 0; case WM_DESTROY:DeleteDC(s_hdcMem);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);}