⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 picdemo.c

📁 一个类windows的GUI.目前已有一些基本的控件和基本的图形图像处理能力.
💻 C
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------------
// Copyright (c) Haisoft 2006-9-1
// Copyright jinhailiao 2008-2010
// E-mail:   jinhailiao@163.com
// Project:			HGui
// File:			picdemo.c
// Description:		
//-------------------------------------------------------------
// Reversion Histroy:
//-------------------------------------------------------------
// Version		date		operations				by who
// 1.0.0		2006-09-01	Create					Kingsea
// 3.0.0		2008-03-01	update					Kingsea
//---------------------------------------------------------------------------------

#include "schedule.h"
#include "haievent.h"
#include "stdio.h"
#include "haigdi.h"
#include "haitime.h"
#include "haihandle.h"
#include "bmpicon.h"
#include "virkey.h"
#include "haicaret.h"
#include "haimem.h"
#include "AppIDs.h"
#include "haictrl.h"
#include "haigui.h"
#include "haiscene.h"
#include "dialog.h"


DEFINESCENE(SID_PICALPHA)
MSGMAPBEGIN
	ONCREAT(PicAlphaCreat)
	ONMSG(EVT_PAINT, PicAlphaPaint)
	ONUSERMSG(EVT_TIMER, PicAlphaTimer)
	ONKEYUP(PicAlphaKey)
	ONMSG(EVT_EXIT, PicAlphaExit)
	ONDESTROY(PicAlphaDestroy)
MSGMAPEND

//
//
typedef struct tagPicAData
{
	S_SHORT valA, valX1, valY1, valX2, valY2;
	S_SHORT alpha, x1, y1, x2, y2;
	SH_BITMAP hBK, hPic1, hPic2;
}
S_PICADATA, *SP_PICADATA;

#define PICA_PIC_W	86
#define PICA_PIC_H	176


static S_VOID PicAlphaCreat(SP_EVT pEvent)
{
	SP_PICADATA pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));

	if (!pSceneDat)
	{
		hai_PostEvent(EVT_DESTROY, 0, 0);
		return;
	}
	memset(pSceneDat, 0x00, sizeof(*pSceneDat));
	pSceneDat->hBK   = hai_LoadBitmap(WINOS_RES_PATH"backgrund.bmp");
	pSceneDat->hPic1 = hai_LoadBitmap(WINOS_RES_PATH"dict3.bmp");
	pSceneDat->hPic2 = hai_LoadBitmap(WINOS_RES_PATH"tool.bmp");
	if (!pSceneDat->hBK || !pSceneDat->hPic1 || !pSceneDat->hPic2)
	{
		hai_PostEvent(EVT_DESTROY, 0, 0);
		return;
	}
	pSceneDat->alpha = 255;
	pSceneDat->x1 = 0;
	pSceneDat->y1 = 0;
	pSceneDat->x2 = LCD_WIDTH-PICA_PIC_W;
	pSceneDat->y2 = LCD_HEIGHT-PICA_PIC_H;
	pSceneDat->valA = -2;
	pSceneDat->valX1 = 2;
	pSceneDat->valY1 = 1;
	pSceneDat->valX2 = -2;
	pSceneDat->valY2 = -1;
}

static S_VOID PicAlphaPaint(SP_EVT pEvent)
{
	SP_PICADATA pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));
	S_PAINTSTRUCT Paint;
	SH_DC hDC, hDCmem;

	hDC = hai_BeginPaint(&Paint);
	hDCmem = hai_CreateCompatibleDC(hDC);
	hai_SelectObject(hDCmem, (SH_GDIOBJ)pSceneDat->hBK);
	hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, hDCmem, 0, 0, SRCCOPY);
	hai_SetAlphaVal(hDCmem, (S_BYTE)pSceneDat->alpha);
	hai_SelectObject(hDCmem, (SH_GDIOBJ)pSceneDat->hPic1);
	hai_BitBlt(hDC, pSceneDat->x1, pSceneDat->y1, PICA_PIC_W, PICA_PIC_H, hDCmem, 0, 0, ALPHACOPY);
	hai_SelectObject(hDCmem, (SH_GDIOBJ)pSceneDat->hPic2);
	hai_BitBlt(hDC, pSceneDat->x2, pSceneDat->y2, PICA_PIC_W, PICA_PIC_H, hDCmem, 0, 0, ALPHACOPY);
	hai_DeleteDC(hDCmem);
	hai_EndPaint(&Paint);
}

static S_VOID PicAlphaTimer(SP_EVT pEvent)
{
	SP_PICADATA pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));

	pSceneDat->alpha += pSceneDat->valA;
	if (pSceneDat->alpha < 0)
	{
		pSceneDat->alpha = 0;
		pSceneDat->valA = -pSceneDat->valA;
	}
	else if (pSceneDat->alpha > 255)
	{
		pSceneDat->alpha = 255;
		pSceneDat->valA = -pSceneDat->valA;
	}
	pSceneDat->x1 += pSceneDat->valX1;
	if (pSceneDat->x1 < 0)
	{
		pSceneDat->x1 = 0;
		pSceneDat->valX1 = -pSceneDat->valX1;
	}
	else if (pSceneDat->x1 > LCD_WIDTH-PICA_PIC_W)
	{
		pSceneDat->x1 = LCD_WIDTH-PICA_PIC_W;
		pSceneDat->valX1 = -pSceneDat->valX1;
	}
	pSceneDat->x2 += pSceneDat->valX2;
	if (pSceneDat->x2 < 0)
	{
		pSceneDat->x2 = 0;
		pSceneDat->valX2 = -pSceneDat->valX2;
	}
	else if (pSceneDat->x2 > LCD_WIDTH-PICA_PIC_W)
	{
		pSceneDat->x2 = LCD_WIDTH-PICA_PIC_W;
		pSceneDat->valX2 = -pSceneDat->valX2;
	}
	pSceneDat->y1 += pSceneDat->valY1;
	if (pSceneDat->y1 < 0)
	{
		pSceneDat->y1 = 0;
		pSceneDat->valY1 = -pSceneDat->valY1;
	}
	else if (pSceneDat->y1 > LCD_HEIGHT-PICA_PIC_H)
	{
		pSceneDat->y1 = LCD_HEIGHT-PICA_PIC_H;
		pSceneDat->valY1 = -pSceneDat->valY1;
	}
	pSceneDat->y2 += pSceneDat->valY2;
	if (pSceneDat->y2 < 0)
	{
		pSceneDat->y2 = 0;
		pSceneDat->valY2 = -pSceneDat->valY2;
	}
	else if (pSceneDat->y2 > LCD_HEIGHT-PICA_PIC_H)
	{
		pSceneDat->y2 = LCD_HEIGHT-PICA_PIC_H;
		pSceneDat->valY2 = -pSceneDat->valY2;
	}
	hai_InvalidRect(S_NULL);
}

S_VOID GetNameDlgProc(SP_EVT pEvt);

static S_VOID PicAlphaKey(SP_EVT pEvent)
{
	if (pEvent->wParam == VK_ESCAPE)
		hai_PostEvent(EVT_DESTROY, 0, 0);
	else if (pEvent->wParam == '3')
		HG_DialogBox(140, 90, 180, 90, GetNameDlgProc);
}

static S_VOID PicAlphaExit(SP_EVT pEvent)
{
	SP_PICADATA pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));

	if (pSceneDat->hBK)
		hai_DeleteObject((SH_GDIOBJ)pSceneDat->hBK);
	if (pSceneDat->hPic1)
		hai_DeleteObject((SH_GDIOBJ)pSceneDat->hPic1);
	if (pSceneDat->hPic2)
		hai_DeleteObject((SH_GDIOBJ)pSceneDat->hPic2);

	hai_ReleaseSceneData();
}

static S_VOID PicAlphaDestroy(SP_EVT pEvent)
{
	PicAlphaExit(pEvent);
	RETURNSCENE(0, 0);
}

DEFINESCENE(SID_PICPARALL)
MSGMAPBEGIN
	ONCREAT(ParallCreat)
	ONMSG(EVT_PAINT, ParallPaint)
	ONUSERMSG(EVT_TIMER, ParallTimer)
	ONKEYUP(ParallKey)
	ONMSG(EVT_EXIT, ParallExit)
	ONDESTROY(ParallDestroy)
MSGMAPEND

#define	TILE_W		48
#define	TILE_H		48
#define	MAP_W		16
#define	MAP_H		16

static const S_BYTE fgmap[MAP_H][MAP_W] = {
//	 0123456789ABCDEF
	"3333333333333333",
	"3   2   3      3",
	"3   222 3  222 3",
	"3333 22     22 3",
	"3       222    3",
	"3   222 2 2  333",
	"3   2 2 222    3",
	"3   222      223",
	"3        333   3",
	"3  22 23 323  23",
	"3  22 32 333  23",
	"3            333",
	"3 3  22 33     3",
	"3    222  2  3 3",
	"3  3     3   3 3",
	"3333333333333333"
};

static const S_BYTE midmap[MAP_H][MAP_W] = {
//	 0123456789ABCDEF
	"   1    1       ",
	"           1   1",
	"  1             ",
	"     1  1    1  ",
	"   1            ",
	"         1      ",
	" 1            1 ",
	"    1   1       ",
	"          1     ",
	"   1            ",
	"        1    1  ",
	" 1          1   ",
	"     1          ",
	"        1       ",
	"  1        1    ",
	"                "
};

static const S_BYTE bgmap[MAP_H][MAP_W] = {
//	 0123456789ABCDEF
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000",
	"0000000000000000"
};

typedef struct tagParallData
{
	S_SHORT fx, fy, mx, my, bx, by;
	S_SHORT fxval, fyval, mxval, myval, bxval, byval;
	SH_BITMAP htile;
}
S_PARALLDATA, *SP_PARALLDATA;

S_VOID hai_DrawTiles(SH_DC hDst, SH_DC hSrc, S_SHORT x, S_SHORT y, S_BYTE (*map)[MAP_W], S_DWORD rop)
{
	S_BYTE flag;
	S_SHORT m, n;
	S_SHORT w, h;
	S_SHORT i, j;
	S_SHORT xb;

	for (i = 0; i < LCD_HEIGHT; i += h)
	{
		xb = x;
		n = y % TILE_H;
		h = TILE_H - n;
		for (j = 0; j < LCD_WIDTH; j += w)
		{
			flag = map[y/TILE_H][xb/TILE_W];
			m = xb % TILE_W;
			w = TILE_W - m;
			xb += w;
			if (flag != ' ')
				hai_BitBlt(hDst, j, i, w, h, hSrc, m, (S_SHORT)(((flag-'0')*TILE_H)+n), rop);
		}
		y += h;
	}
}


static S_VOID ParallCreat(SP_EVT pEvent)
{
	SP_PARALLDATA pDat = hai_GetSceneData(sizeof(*pDat));
	
	if (!pDat)
	{
		hai_PostEvent(EVT_DESTROY, 0, 0);
		return;
	}
	memset(pDat, 0x00, sizeof(*pDat));
	pDat->htile = hai_LoadBitmap(WINOS_RES_PATH"tiles.bmp");
	if (pDat->htile == S_NULL)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -