117上位机VC MFC图片上下左右交错效果显示
117上位机VC MFC图片上下左右交错效果显示
功能展示
图片的显示有各种效果,如积木,百叶窗,各种方向交错展示等等,我们当前例程实现交错展示效果,在程序系统菜单点交错,可以看到效果,如果程序启动界面用到此效果,会很有视觉感,具体效果如图; 要点提示 图片的几种特效可以应用设备上下文件的函数BitBlt()来实现,函数原形为BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ); 它的参数很多,能够灵活应用,会有不一样的效果,参数含义为 X,Y:目标矩形的左上角坐标, nWidth, nHeight目标矩形要显示的长与宽, pSrcDC被复制的设备上下文指针, xSrc , ySrc要被复制的矩形左上角坐标, nSrcWidth ,nSrcHeight要被复制在矩形长与宽, dwRop 为光栅操作类型,类型众多,我们当前例程用到复制类型SRCCOPY ; 实现功能 1.新建基于对话框的应用程序 2.在主对话框中添加变量HBITMAP m_hBitmap;并在对话框的OnInitDialog()中初始化 m_hBitmap = (HBITMAP)LoadImage(NULL,"res/1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE |LR_CREATEDIBSECTION);//加载位图 BITMAP bm;GetObject(m_hBitmap,sizeof(bm),&bm); SetWindowPos(&wndTop,0,0,bm.bmWidth,bm.bmHeight,SWP_NOMOVE);//窗口大小与位图同大 GetSystemMenu(FALSE)->InsertMenu(IDM_ABOUTBOX,MF_BYCOMMAND|MF_STRING,999,“图片交错");//系统菜单添加按钮 3.在OnPaint()中显示图片 CDC *pDC = GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(m_hBitmap); BITMAP bm;GetObject(m_hBitmap,sizeof(bm),&bm);
pDC->BitBlt(0,0, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY); 4.实现交错展示函数InterBmp ()及在OnSysCommand()函数中调用函数 - void CGkbc8Dlg::InterBmp(BOOL bVerHor)
- {
- if(m_hBitmap==NULL) return;
- //><准备设备上下文
- CDC *pDC = GetDC();
- CDC MemDC;
- MemDC.CreateCompatibleDC(pDC);
- MemDC.SelectObject(m_hBitmap);
- BITMAP bm;
- GetObject(m_hBitmap,sizeof(bm),&bm);
- //><
- CRect rc;
- GetClientRect(rc);
- pDC->FillRect(rc,NULL);//先擦除背景
- //><
- int nIntervalTime = 40;//间隔时间
- int i, j;
- if(bVerHor)//水平
- {
- for (i = 0; i <= bm.bmWidth; i += 30)
- {
- for (j = i; j > 0; j -= 30)
- {
- // 奇数列 从左往右
- pDC->BitBlt(j - 10, 0, 10, bm.bmHeight, &MemDC, bm.bmWidth - (i - j - 10), 0, SRCCOPY);
- // 偶数行 从右往左
- pDC->BitBlt(bm.bmWidth - j, 0, 10, bm.bmHeight, &MemDC, i - j, 0, SRCCOPY);
- }
- Sleep(nIntervalTime);
- }
- }
- else//垂直
- {
- for (i = 0;i <= bm.bmHeight; i += 40)
- {
- for (j = i; j > 0; j -= 40)
- {
- // 奇数行 从上往下
- pDC->BitBlt(0, j - 20, bm.bmWidth, 20, &MemDC, 0, bm.bmHeight - (i - j - 20), SRCCOPY);
- // 偶数行 从下往上
- pDC->BitBlt(0, bm.bmHeight - j, bm.bmWidth, 20, &MemDC, 0, i - j, SRCCOPY);
- }
-
复制代码- Sleep(nIntervalTime);
- }
- }
- pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY);
- ReleaseDC(pDC);
- }
- else if(nID == 999)
- {
- // InterBmp(TRUE);
- InterBmp(FALSE);
- }
复制代码最后保证在根目录下res文件夹有位图1.bmp
我们来演示功能实现过程
|