#include "Control.h"
#include "Global.h"
#include <algorithm>
using namespace std;
//_MY16RGB565(r,g,b)中r/g/b的范围都是(0~255)
#define _MY16RGB565(r,g,b) ( ((b)>>3) + (((g)>>2)<< 5) + (((r)>>3)<<11) )
#define _MY32RGB8888(a,r,g,b) ( (b) + ((g) << 8) + ((r) << 16) + ((a) << 24) )
#define SAFE_RELEASE(x) if(x) { x->Release(); x = NULL; }
#define SAFE_DELETE(x) if(x) {delete x; x = NULL; }
extern Gstd2D::Global global;
void DrawBackGround(const LPDIRECTDRAWSURFACE7& lpdds,bool pressed)
{
DDSURFACEDESC2 ddsd;
::ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
if (ddsd.ddpfPixelFormat.dwRGBBitCount==16) //16位颜色
{
int size=ddsd.lPitch/2;
USHORT *back_buffer = (USHORT *)ddsd.lpSurface;
USHORT color = _MY16RGB565(198,211,239);
if( pressed ) color = _MY16RGB565(156,182,231);
USHORT frame_color = _MY16RGB565(49,105,198);
for(int Y = 0;Y<ddsd.dwHeight;Y++)
{
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[Y*size+X] = color;
}
}
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[X] = frame_color;
back_buffer[(ddsd.dwHeight-1)*size+X] = frame_color;
}
for(int Y = 1;Y<ddsd.dwHeight-1;Y++)
{
back_buffer[Y*size] = frame_color;
back_buffer[Y*size+ddsd.dwWidth-1] = frame_color;
}
}
else if( ddsd.ddpfPixelFormat.dwRGBBitCount==32 ) //32位颜色
{
int size=ddsd.lPitch>>2;
UINT *back_buffer = (UINT *)ddsd.lpSurface;
UINT color = _MY32RGB8888(0,198,211,239);
if( pressed ) color = _MY32RGB8888(0,156,182,231);
UINT frame_color =_MY32RGB8888(0,49,105,198);
for(int Y = 0;Y<ddsd.dwHeight;Y++)
{
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[Y*size+X] = color;
}
}
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[X] = frame_color;
back_buffer[(ddsd.dwHeight-1)*size+X] = frame_color;
}
for(int Y = 0+1;Y<ddsd.dwHeight-1;Y++)
{
back_buffer[Y*size] = frame_color;
back_buffer[Y*size+ddsd.dwWidth-1] = frame_color;
}
}
lpdds->Unlock(NULL);
}
void DrawPlane(const LPDIRECTDRAWSURFACE7& lpdds,bool frame,bool shade,
COLORREF color=RGB(247,247,239),//起始行颜色
int sub_num = 1, //如果渐变,渐变的快慢
COLORREF frame_color = RGB(165,162,123) ) //边框的颜色
{
int r = GetRValue(color),
b = GetBValue(color),
g = GetGValue(color);
int r1 = GetRValue(frame_color),
b1 = GetBValue(frame_color),
g1 = GetGValue(frame_color);
if( shade==false )
{
DDBLTFX ddbltfx;
::ZeroMemory(&ddbltfx,sizeof(ddbltfx));
ddbltfx.dwSize = sizeof(ddbltfx);
if ( Gstd2D::global.GetSystemScreenBPP()==16)
ddbltfx.dwFillColor = _MY16RGB565(r,g,b);
else if( Gstd2D::global.GetSystemScreenBPP()==32 )
ddbltfx.dwFillColor = _MY32RGB8888(0,r,g,b);
lpdds->Blt( NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx );
}
DDSURFACEDESC2 ddsd;
::ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
if (ddsd.ddpfPixelFormat.dwRGBBitCount==16) //16位颜色
{
int size=ddsd.lPitch/2;
USHORT *back_buffer = (USHORT *)ddsd.lpSurface;
//绘制底色
if( shade )
{
for(int Y =0;Y<ddsd.dwHeight;Y++)
{
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[Y*size+X] = _MY16RGB565(r,g,b);
}
r -=sub_num; b-=sub_num; g-=sub_num;
}
}
//绘制边框
if( frame )
{
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[X] = _MY16RGB565(r1,g1,b1);
back_buffer[(ddsd.dwHeight-1)*size+X] = _MY16RGB565(r1,g1,b1);
}
for(int Y = 1;Y<ddsd.dwHeight;Y++)
{
back_buffer[Y*size] = _MY16RGB565(r1,g1,b1);
back_buffer[Y*size+ddsd.dwWidth-1] = _MY16RGB565(r1,g1,b1);
}
}
}
else if( ddsd.ddpfPixelFormat.dwRGBBitCount==32 ) //32位颜色
{
int size=ddsd.lPitch>>2;
UINT *back_buffer = (UINT *)ddsd.lpSurface;
//绘制底色
if( shade )
{
for(int Y =0;Y<ddsd.dwHeight;Y++)
{
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[Y*size+X] = _MY32RGB8888(0,r,g,b);
}
r -=sub_num; b-=sub_num; g-=sub_num;
}
}
//绘制边框
if( frame )
{
for(int X = 0;X<ddsd.dwWidth;X++)
{
back_buffer[X] = _MY32RGB8888(0,r1,g1,b1);
back_buffer[(ddsd.dwHeight-1)*size+X] = _MY32RGB8888(0,r1,g1,b1);
}
for(int Y = 1;Y<ddsd.dwHeight;Y++)
{
back_buffer[Y*size] = _MY32RGB8888(0,r1,g1,b1);
back_buffer[Y*size+ddsd.dwWidth-1] = _MY32RGB8888(0,r1,g1,b1);
}
}
}
lpdds->Unlock(NULL);
}
void DrawRuler(const LPDIRECTDRAWSURFACE7& lpdds,int mouse,
int unit,bool small_ruler,int num,bool horizontal)
{
int small_unit = unit/num;
if(small_unit<=0) small_unit = 1;
DDSURFACEDESC2 ddsd;
::ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
if (ddsd.ddpfPixelFormat.dwRGBBitCount==16) //16位颜色
{
int size=ddsd.lPitch/2;
USHORT *back_buffer = (USHORT *)ddsd.lpSurface;
if( horizontal )
{
int width = ddsd.dwHeight;
for(int y=0,dir=0;y<ddsd.dwHeight;y++,dir++)
{
for(int x=0,num=0;x<ddsd.dwWidth;x++,num++)
{
if( (num-width)%unit==0 || //大单位竖线 下行是小单位竖线
(small_ruler && num>width &&(num-width)%small_unit==0 && dir>(width/2)) ||
(mouse==num && num>width ) ) //绘制鼠标所在的竖线
{
back_buffer[y*size+x] = 0x0;
}
else back_buffer[y*size+x] = 0xffff;
}
}
}
else
{
int width = ddsd.dwWidth;
for(int x=0,dir=0;x<ddsd.dwWidth;x++,dir++)
{
for(int y=0,num=0;y<ddsd.dwHeight;y++,num++)
{
if( (num-width)%unit==0 ||
(small_ruler && num>width && (num-width)%small_unit==0 && dir>(width/2)) ||
(mouse==num && num>width) )
{
back_buffer[y*size+x] = 0x0;
}
else back_buffer[y*size+x] = 0xffff;
}
}
}
}
else if( ddsd.ddpfPixelFormat.dwRGBBitCount==32 ) //32位颜色
{
int size=ddsd.lPitch>>2;
UINT *back_buffer = (UINT *)ddsd.lpSurface;
if( horizontal )
{
int width = ddsd.dwHeight;
for(int y=0,dir=0;y<ddsd.dwHeight;y++,dir++)
{
for(int x=0,num=0;x<ddsd.dwWidth;x++,num++)
{
if( (num-width)%unit==0 || //大单位竖线 下行是小单位竖线
(small_ruler && num>width &&(num-width)%small_unit==0 && dir>(width/2)) ||
(mouse==num && num>width ) ) //绘制鼠标所在的竖线
{
back_buffer[y*size+x] = 0x0;
}
else back_buffer[y*size+x] = 0xffffffff;
}
}
}
else
{
int width = ddsd.dwWidth;
for(int x=0,dir=0;x<ddsd.dwWidth;x++,dir++)
{
for(int y=0,num=0;y<ddsd.dwHeight;y++,num++)
{
if( (num-width)%unit==0 ||
(small_ruler && num>width && (num-width)%small_unit==0 && dir>(width/2)) ||
(mouse==num && num>width) )
{
back_buffer[y*size+x] = 0x0;
}
else back_buffer[y*size+x] = 0xffffffff;
}
}
}
}
lpdds->Unlock(NULL);
}
void DrawDialog(const LPDIRECTDRAWSURFACE7& lpdds,RECT rect,
COLORREF frame=RGB(123,158,189),
COLORREF color=RGB(247,247,239))
{
int r = GetRValue(frame),
b = GetBValue(frame),
g = GetGValue(frame);
int r1 = GetRValue(color),
b1 = GetBValue(color),
g1 = GetGValue(color);
DDBLTFX ddbltfx;
::ZeroMemory(&ddbltfx,sizeof(ddbltfx));
ddbltfx.dwSize = sizeof(ddbltfx);
if ( Gstd2D::global.GetSystemScreenBPP()==16)
ddbltfx.dwFillColor = _MY16RGB565(r1,g1,b1);
else if( Gstd2D::global.GetSystemScreenBPP()==32 )
ddbltfx.dwFillColor = _MY32RGB8888(0,r1,g1,b1);
lpdds->Blt( &rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx );
DDSURFACEDESC2 ddsd;
::ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
lpdds->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
if (ddsd.ddp
一个地图编辑器的代码
3星 · 超过75%的资源 需积分: 9 36 浏览量
2008-05-21
11:46:50
上传
评论
收藏 103KB RAR 举报
GoAssemblyNow
- 粉丝: 1
- 资源: 9
最新资源
- 基于c++的个人收支管理系统设计
- docker一键安装包
- Screenshot_20240430_144340_com.ss.android.ugc.live.jpg
- 回到山沟沟.mp3
- 基于matlab实现自适应波束形成RLS及LMS算法仿真源程序1.rar
- 基于matlab实现自己编写的基于卡尔曼滤波的利用加速度传感器的计步器,测试数据是传感器放在腰部和手臂 .rar
- 基于matlab实现阵列信号处理,波束形成.rar
- 111111111111111111
- 基于matlab实现计步器编程;对当前的计步器装置的数值算法模拟 .rar
- Mdb学习查看PW;access;mdb;pw;password;patch
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈