界面叠加处理

①当我们一个界面在另外一个界面的上方,或者当我们鼠标移动到一个界面的上方,那么我们处于下面的界面必定会被覆盖,那么当上面的东西,移动走了以后,需要将下面的在修改回去
②如何区分界面谁在下,谁在上?
设定一个height,即高度权重,权重越大,则越高,越高则最后描绘他的图像,不就可以达到覆盖下面界面的效果了吗?
③那么可想而知,鼠标肯定是最上面的那个图层,桌面肯定是最下面的图层,其余窗口的话,height肯定需要上下浮动

一个图层的构成

//透明图层的结构体
struct SHEET
{unsigned char * pu8Buf;//记录图层上 所描绘画内容的地址int nBxSize;    //图层的整体大小 由 Bx * By 来表示int nBySize;int nVx0;//VX VY 表示图层在画面上 位置的坐标int nVy0;int nColInv;//透明色色号int nHeight;//图层高度int nFlags;//存放图层的 各种设定信息
};

Sheet.h

#ifndef __SHEET_H__
#define __SHEET_H__#include "Memory.h"
//图层的处理函数//最多256个 图层
#define MAX_SHEETS 256
//使用该图层
#define SHEET_USE 1//透明图层的结构体
struct SHEET
{unsigned char * pu8Buf;//记录图层上 所描绘画内容的地址int nBxSize;    //图层的整体大小 由 Bx * By 来表示int nBySize;int nVx0;//VX VY 表示图层在画面上 位置的坐标int nVy0;int nColInv;//透明色色号int nHeight;//图层高度int nFlags;//存放图层的 各种设定信息
};struct SHEET_CONTROL
{unsigned char *pu8Vram;//Video Ram 的地址int nXsize;//X Y 代表画面的大小int nYsize;int nTop;//代表 最上面 图层的高度struct SHEET *sheets[MAX_SHEETS];//SHEET的指针数组struct SHEET sheets0[MAX_SHEETS];//指向 下面的结构体的地址
};//初始化 透明图层 控制的结构体
struct SHEET_CONTROL * SheetControlInit(struct MEMORY_MAN *pTemp,unsigned char *pu8Vram, int nXsize, int nYsize);//取得新生成的 未使用图层
struct SHEET_CONTROL * GetSheet(struct SHEET_CONTROL *pCTL);//设置图层的缓冲区大小 和 透明色的函数
void SheetSetBuf(struct SHEET *pSheet, unsigned char *u8Buf,
int nXsize, int nYsize, int nColInv);//设定底板的高度
void SheetUpDown(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet,
int Height);//移动图层 不改变 图层高度
void SheetSlide(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet,
int Vx0, int Vy0);//释放 已使用图层的内存
void SheetFree(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet);//刷新图层显示
void SheetRefreshSub(struct SHEET_CONTROL *pCTL, int Vx0, int Vy0,
int Vx1, int Vy1);//刷新图层显示
void SheetRefresh(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet,
int Vx0, int Vy0, int Vx1, int Vy1);#endif

sheet.c

#include "Sheet.h"
#include "Memory.h"//初始化 透明图层 控制的结构体
struct SHEET_CONTROL * SheetControlInit(struct MEMORY_MAN *pTemp,unsigned char *pu8Vram, int nXsize, int nYsize)
{struct SHEET_CONTROL *pCTL;int i;//为结构体分配内存空间pCTL = (struct SHEET_CONTROL *)MemoryManagerMalloc4K(pTemp, sizeof(pCTL));//如果分配失败的话if(0 == pCTL){goto err;}//分配成功pCTL->pu8Vram = pu8Vram;pCTL->nXsize = nXsize;pCTL->nYsize = nYsize;pCTL->nTop = -1; //代表 一个图层都没有for(i = 0; i < MAX_SHEETS; i++){pCTL->sheets0[i].nFlags = 0;//代表 没有使用过}err:return pCTL;}//取得新生成的 未使用图层
struct SHEET_CONTROL * GetSheet(struct SHEET_CONTROL *pCTL)
{struct SHEET *pSheet;int i;for(i = 0; i < MAX_SHEETS; i++){//该图层 未被使用if(0 == pCTL->sheets0[i].nFlags){pSheet = &(pCTL->sheets0[i]);//标记为使用过了pSheet->nFlags = SHEET_USE;pSheet->nHeight = -1;//表示隐藏 图层高度还未设置return pSheet;}}return 0;
}//设置图层的缓冲区大小 和 透明色的函数
void SheetSetBuf(struct SHEET *pSheet, unsigned char *pu8Buf,int nXsize, int nYsize, int nColInv)
{pSheet->pu8Buf = pu8Buf;pSheet->nBxSize = nXsize;pSheet->nBySize = nYsize;pSheet->nColInv = nColInv;return ;
}void SheetUpDown(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet,int Height)
{int h;int nOldHeight = pSheet->nHeight;pSheet->nHeight = Height;//如果指定的高度 太高 或者 过低 则 进行修正if(Height > (pCTL->nTop + 1)){Height = pCTL->nTop + 1;}if(Height < -1){Height = -1;}//进行sheets的重新排列 //如果新设置的高度 比从前 低的话if(nOldHeight > Height){if(Height >= 0){//向后 搬迁for(h = nOldHeight; h > Height; h--){pCTL->sheets[h] = pCTL->sheets[h-1];pCTL->sheets[h]->nHeight = h;}pCTL->sheets[Height] = pSheet;}//就是要隐藏图层了else{if(pCTL->nTop > nOldHeight){for(h = nOldHeight; h < pCTL->nTop; h++){pCTL->sheets[h] = pCTL->sheets[h+1];pCTL->sheets[h]->nHeight = h;}}pCTL->nTop--;}//按新图层的信息 重新描绘画面SheetRefresh(pCTL, pSheet, pSheet->nVx0, pSheet->nVy0,pSheet->nVx0+pSheet->nBxSize, pSheet->nVy0+pSheet->nBySize);}else if(nOldHeight < Height)//比以前高{if(nOldHeight >= 0)//以前 就是显示状态{for(h = nOldHeight; h < Height; h++){pCTL->sheets[h] = pCTL->sheets[h+1];pCTL->sheets[h]->nHeight = h;}pCTL->sheets[h] = pSheet;}else//由隐藏状态 转变为 显示状态{for(h = pCTL->nTop; h >= Height; h--){pCTL->sheets[h+1] = pCTL->sheets[h];pCTL->sheets[h+1]->nHeight = h+1;}pCTL->sheets[Height] = pSheet;pCTL->nTop++;}//按新图层的信息 重新描绘画面SheetRefresh(pCTL, pSheet,pSheet->nVx0, pSheet->nVy0,pSheet->nVx0+pSheet->nBxSize, pSheet->nVy0+pSheet->nBySize);}return ;
}//移动图层 不改变 图层高度
void SheetSlide(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet,int Vx0, int Vy0)
{int nOldVx0 = pSheet->nVx0;int nOldVy0 = pSheet->nVy0;pSheet->nVx0 = Vx0;pSheet->nVy0 = Vy0;//如果该图层 正在被使用if(0 <= pSheet->nHeight){//按新图层的信息 重新描绘画面SheetRefreshSub(pCTL, nOldVx0, nOldVy0, pSheet->nBxSize + nOldVx0, pSheet->nBySize + nOldVy0);SheetRefreshSub(pCTL, Vx0, Vy0, pSheet->nBxSize + Vx0, pSheet->nBySize + Vy0);}return ;
}//释放 已使用图层的内存
void SheetFree(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet)
{if(0 <= pSheet->nHeight){SheetUpDown(pCTL, pSheet, -1);}//未被使用pSheet->nFlags = 0;return;
}//刷新图层显示
void SheetRefresh(struct SHEET_CONTROL *pCTL, struct SHEET *pSheet,int Bx0, int By0, int Bx1, int By1)
{//如果正在显示的话if (pSheet->nHeight >= 0){SheetRefreshSub(pCTL, pSheet->nVx0+Bx0, pSheet->nVy0+By0, pSheet->nVx0+Bx1, pSheet->nVy0+By1);}}//刷新图层显示
void SheetRefreshSub(struct SHEET_CONTROL *pCTL, int Vx0, int Vy0,
int Vx1, int Vy1)
{int nHeight;int nBx, nBy;int nVx, nVy;int Bx0, By0, Bx1, By1;unsigned char * pu8Buf;unsigned char ucChar;unsigned char *Vram = pCTL->pu8Vram;struct SHEET *pSheet;if(0 > Vx0) {Vx0 = 0;}if(0 > Vy0) {Vy0 = 0;}if(Vx1 > pCTL->nXsize) {Vx1 = pCTL->nXsize;}if(Vy1 > pCTL->nYsize)  {Vy1 = pCTL->nYsize;}//描绘出全部的图层for(nHeight = 0; nHeight <= pCTL->nTop; nHeight++){pSheet = pCTL->sheets[nHeight];pu8Buf = pSheet->pu8Buf;Bx0 = Vx0 - pSheet->nVx0;By0 = Vy0 - pSheet->nVy0;Bx1 = Vx1 - pSheet->nVx0;By1 = Vy1 - pSheet->nVy0;if(Bx0 < 0) {Bx0 = 0;}if(By0 < 0) {By0 = 0;}if(Bx1 > pSheet->nBxSize) {Bx1 = pSheet->nBxSize;}if(By1 > pSheet->nBySize) {By1 = pSheet->nBySize;}for(nBy = By0; nBy < By1; nBy++){nVy = pSheet->nVy0 + nBy;for(nBx = Bx0; nBx < Bx1; nBx++){nVx = pSheet->nVx0 + nBx;if(Vx0 <= nVx && nVx < Vx1 && Vy0 <= nVy && nVy < Vy1){ucChar = pu8Buf[nBy * pSheet->nBxSize + nBx];if(ucChar != pSheet->nColInv){Vram[nVy * pCTL->nXsize + nVx] = ucChar;}}}}}return ;
}

main.c

 struct SHEET_CONTROL *pSheetCtl;//图层控制结构体struct SHEET *pSheetBack;//背景struct SHEET *pSheetMouse;//鼠标unsigned char *pBufBack;//背景缓冲区unsigned char MouseColor[256];//鼠标的大小是16*16的//为图层控制器 分配空间 并且初始化 图层控制器pSheetCtl = SheetControlInit(MenMan, pAdd, nXsize, nYsize);//为背景分配图层pSheetBack = GetSheet(pSheetCtl);//为鼠标分配图层pSheetMouse = GetSheet(pSheetCtl);//为背景缓存分配缓冲区pBufBack = (unsigned char *)MemoryManagerMalloc4K(MenMan, nXsize*nYsize);//背景 没有透明色SheetSetBuf(pSheetBack, pBufBack, nXsize, nYsize, -1);//鼠标 透明色号 99 鼠标缓存在MouseColorSheetSetBuf(pSheetMouse, MouseColor, 16, 16, 99);//设置背景从0 0 开始SheetSlide(pSheetCtl, pSheetBack, 0 , 0);//设置鼠标从中间 开始SheetSlide(pSheetCtl, pSheetMouse, mx , my);//设定图层高度SheetUpDown(pSheetCtl, pSheetBack, 0);SheetUpDown(pSheetCtl, pSheetMouse, 1);

Day10_界面叠加处理相关推荐

  1. Skia4Dephi 的 Demo 程序界面架构分析

    前言 Skia 是一个高效率的 2D 画图引擎,由 Google 开源出来.目前可以运行在 Android, iOS 和 Win32 上面. Skia4Delphi 是一个开源的 Delphi 控件, ...

  2. 视频编辑SDK---我们只提供API,任你自由设计炫酷的功能

    面对相对复杂的视频编辑处理技术,你是否束手无策? 在短视频应用中,有一定技术难度的视频编辑技术中,我们提出了一种全新的解决方法:画板和画笔. 短视频处理,用画板和画笔,就够了! 我们设计了极其简单易懂 ...

  3. 大厂项目实战,让你面试被问到项目时不再哑口无言!

    2020已经到了尾声,还有多少小伙伴还没有上岸呢?如果你也错过了秋招与提前批,那明年的春招就得好好准备一下了.对于校招的小伙伴来说,面试遇到最大的问题是什么? 很多朋友和我说是缺乏实战的项目,基础技术 ...

  4. Flyme-Substratum主题

    Flyme-Substratum主题 版本:oreo-180709 下载 应用截图 历史版本 安卓O主题 Flyme-sub-oreo-180702 下载 Flyme-sub-oreo-180603 ...

  5. 计算机中英文术语对照表

    win: Windows 操作系统:mac: macOS(操作系统). 英文(English) 中文一(港台地区) 中文二 Abstract 摘要:抽象的 摘要:抽象的 Abstraction 抽象 ...

  6. 计算机中常见英文术语对照表

    win: Windows 操作系统:mac: macOS(操作系统). 英文(English) 中文一(港台地区) 中文二 Abstract 摘要:抽象的 摘要:抽象的 Abstraction 抽象 ...

  7. 【技术分享】Windows平台低延迟RTMP、RTSP播放器接口设计探讨

    背景 我们看过了太多介绍RTSP.RTMP播放相关的技术资料,大多接口设计简约,延迟和扩展能力也受到一定的局限,好多开发者希望我们能从接口设计的角度,大概介绍下大牛直播SDK关于RTMP.RTSP播放 ...

  8. 蓝松短视频SDK使用说明.

    一:集成 android端 我们的SDK以module的形式提供, 在你的项目中点击File/import midule导入,并在您主module中的build.gradle中增加implementa ...

  9. HTC VIVE开发教程(三)

    在这一节,我介绍的主要内容有 [CameraRig]预制体 [SteamVR]预制体 [Status]预制体 在SteamVR插件的Prefabs文件夹下面有三个预制体,CameraRig是相机预制体 ...

  10. msm8916 MDP(mobile display processor) 简介

    硬件上面,Msm8916只有一个mipi-dsi接口用于连接LCM,由MDP(mobile display processor)进行管理,大概硬件结构图如下: mdp提供图片格式转换,旋转,overl ...

最新文章

  1. Science组合图表解读
  2. SAP WMSD集成之Copy WM Quantity – Not Copy WM qty as delivery qty into delivery But PGI
  3. 指针06 - 零基础入门学习C语言46
  4. Python计算防蓝光眼镜加权阻隔率
  5. LZW压缩算法解码器实现
  6. (48)System Verilog数组定位
  7. 不要再被Python洗脑了,来看看这个吧......
  8. 遵循Java EE标准体系的开源GIS服务平台之二:平台部署
  9. python读音播报-基于python GUI开发的点名小程序(语音播报)
  10. CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景
  11. oracle排序去重,Oracle中去重复+排序
  12. Word题库转成Excel题库的方法
  13. winpe进入linux系统,制作U盘Linux 与WinPE启动
  14. 中文如何翻译成英文?手机中英文一键翻译超简单
  15. gprs java_GPRS类型一览
  16. C#——lambda表达式和反射
  17. 电脑上网速度慢?这样设置后网速飞起来!
  18. Request header field x-xsrf-token is not allowed by Access-Control-Allow-Headers in preflight respon
  19. Basler相机Sdk采图的演示例程(C#)
  20. 苹果xr如何关机_iPhone XR 的实际体验如何?

热门文章

  1. Why hash maps in Java 8 use binary tree instead of linked list?
  2. 为了云计算的安全需要自己控制加密密钥
  3. 京东金融移动安全体系
  4. linux kernel source code analysis
  5. hibernate(二)annotation第一个示例
  6. 【leetcode】Copy List with Random Pointer (hard)
  7. makefile--编译出现,未定义的字符
  8. 泛型类型(Generic Type)
  9. Flutter BottomAppBar
  10. SpringBoot+zk+dubbo架构实践(二):SpringBoot 集成 zookeeper