本文配套程序下载地址为:
转载请标明出处,原文地址:
欢迎关注微博:
Windows界面编程之位图显示特效系列目录:
1. 《Windows界面编程第九篇位图显示特效交错效果》
2. 《Windows界面编程第十篇位图显示特效百叶窗效果》
3. 《Windows界面编程第十一篇位图显示特效随机积木效果》
4. 《Windows界面编程第十二篇位图显示特效飞入效果与伸展效果》
5. 《Windows界面编程第十三篇位图显示特效合集》
前面的四篇已经介绍了位图的、、、。下面用一个程序将展示这些效果。这里给出主要代码(下载地址见:)。代码中的DragAcceptFiles可以参考《Windows界面编程第七篇文件拖拽(文件拖放)》(),主要是为了能将位图文件拖入到窗口中。
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); } // 位图HDC HDC 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 DragQueryFile case 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); //释放hDrop DeleteDC(s_hdcMem); // 加载位图 HBITMAP hBitmap; hBitmap = (HBITMAP)LoadImage(NULL, strFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); // 位图HDC HDC 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);}
下面是程序所展示的一种显示效果(图片不能打开,请访问)。
更多显示效果可以参考前面的、、、博客中的示例。
本文配套程序下载地址为:
转载请标明出处,原文地址:
欢迎关注微博: