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

📄 picdemo.c

📁 一个类windows的GUI.目前已有一些基本的控件和基本的图形图像处理能力.
💻 C
📖 第 1 页 / 共 2 页
字号:
		hai_PostEvent(EVT_DESTROY, 0, 0);
		return;
	}
	pDat->bxval = 1;
	pDat->byval = 1;
	pDat->mxval = 2;
	pDat->myval = 1;
	pDat->fxval = 3;
	pDat->fyval = 2;
}

static S_VOID ParallPaint(SP_EVT pEvent)
{
	SP_PARALLDATA 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->htile);
	hai_SetColorKey(hDCmem, 0xFF00FF);
	hai_DrawTiles(hDC, hDCmem, pSceneDat->bx, pSceneDat->by, (S_BYTE(*)[MAP_W])bgmap, SRCCOPY);
	hai_DrawTiles(hDC, hDCmem, pSceneDat->mx, pSceneDat->my, (S_BYTE(*)[MAP_W])midmap, TRANSCOPY);
	hai_DrawTiles(hDC, hDCmem, pSceneDat->fx, pSceneDat->fy, (S_BYTE(*)[MAP_W])fgmap, SRCCOPY);
	hai_BitBlt(hDC, 0, 0, TILE_W, TILE_H, hDCmem, 0, (S_SHORT)(4*TILE_H), TRANSCOPY);
	hai_DeleteDC(hDCmem);
	hai_EndPaint(&Paint);
}

static S_VOID ParallTimer(SP_EVT pEvent)
{
	SP_PARALLDATA pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));
	S_SHORT totalw = TILE_W*MAP_W, totalh = TILE_H*MAP_H;

	pSceneDat->bx += pSceneDat->bxval;
	if (pSceneDat->bx < 0)
	{
		pSceneDat->bx = 1;
		pSceneDat->bxval = -pSceneDat->bxval;
	}
	else if (pSceneDat->bx > totalw-LCD_WIDTH)
	{
		pSceneDat->bx = totalw-LCD_WIDTH-1;
		pSceneDat->bxval = -pSceneDat->bxval;
	}
	pSceneDat->by += pSceneDat->byval;
	if (pSceneDat->by < 0)
	{
		pSceneDat->by = 1;
		pSceneDat->byval = -pSceneDat->byval;
	}
	else if (pSceneDat->by > totalh-LCD_HEIGHT)
	{
		pSceneDat->by = totalh-LCD_HEIGHT-1;
		pSceneDat->byval = -pSceneDat->byval;
	}
	pSceneDat->mx += pSceneDat->mxval;
	if (pSceneDat->mx < 0)
	{
		pSceneDat->mx = 1;
		pSceneDat->mxval = -pSceneDat->mxval;
	}
	else if (pSceneDat->mx > totalw-LCD_WIDTH)
	{
		pSceneDat->mx = totalw-LCD_WIDTH-1;
		pSceneDat->mxval = -pSceneDat->mxval;
	}
	pSceneDat->my += pSceneDat->myval;
	if (pSceneDat->my < 0)
	{
		pSceneDat->my = 1;
		pSceneDat->myval = -pSceneDat->myval;
	}
	else if (pSceneDat->my > totalh-LCD_HEIGHT)
	{
		pSceneDat->my = totalh-LCD_HEIGHT-1;
		pSceneDat->myval = -pSceneDat->myval;
	}
	pSceneDat->fx += pSceneDat->fxval;
	if (pSceneDat->fx < 0)
	{
		pSceneDat->fx = 1;
		pSceneDat->fxval = -pSceneDat->fxval;
	}
	else if (pSceneDat->fx > totalw-LCD_WIDTH)
	{
		pSceneDat->fx = totalw-LCD_WIDTH-1;
		pSceneDat->fxval = -pSceneDat->fxval;
	}
	pSceneDat->fy += pSceneDat->fyval;
	if (pSceneDat->fy < 0)
	{
		pSceneDat->fy = 1;
		pSceneDat->fyval = -pSceneDat->fyval;
	}
	else if (pSceneDat->fy > totalh-LCD_HEIGHT)
	{
		pSceneDat->fy = totalh-LCD_HEIGHT-1;
		pSceneDat->fyval = -pSceneDat->fyval;
	}
	hai_InvalidRect(S_NULL);
}

static S_VOID ParallKey(SP_EVT pEvent)
{
	if (pEvent->wParam == VK_ESCAPE)
		hai_PostEvent(EVT_DESTROY, 0, 0);
}

static S_VOID ParallExit(SP_EVT pEvent)
{
	SP_PARALLDATA pDat = hai_GetSceneData(sizeof(*pDat));

	hai_DeleteObject((SH_GDIOBJ)pDat->htile);
	hai_ReleaseSceneData();
}

static S_VOID ParallDestroy(SP_EVT pEvent)
{
	ParallExit(pEvent);
	RETURNSCENE(0, 0);
}


DEFINESCENE(SID_PICSTRETCH)
MSGMAPBEGIN
	ONCREAT(stretchCreat)
	ONMSG(EVT_PAINT, stretchPaint)
	ONUSERMSG(EVT_TIMER, stretchTimer)
	ONKEYUP(stretchKey)
	ONMSG(EVT_EXIT, stretchExit)
	ONDESTROY(stretchDestroy)
MSGMAPEND

#define PS_MSGBOX_W		200
#define PS_MSGBOX_H		100

typedef struct tagPicStretch
{
	S_BYTE FirstPaint;
	S_BYTE ArtBox;
	SH_BITMAP hbk, hbox;
}
S_PICSTRETCH, *SP_PICSTRETCH;

static S_VOID stretchCreat(SP_EVT pEvent)
{
	SP_PICSTRETCH pDat = hai_GetSceneData(sizeof(*pDat));
	
	if (!pDat)
	{
		hai_PostEvent(EVT_DESTROY, 0, 0);
		return;
	}
	memset(pDat, 0x00, sizeof(*pDat));
	pDat->hbk  = hai_LoadBitmap(WINOS_RES_PATH"aquaria.bmp");
	pDat->hbox = hai_LoadBitmap(WINOS_RES_PATH"artbox.bmp");
	if (pDat->hbk == S_NULL || pDat->hbox == S_NULL)
	{
		hai_PostEvent(EVT_DESTROY, 0, 0);
		return;
	}
	pDat->FirstPaint = 1;
	pDat->ArtBox = 0;
}

static S_VOID stretchPaint(SP_EVT pEvent)
{
	S_WORD i;
	SP_PICSTRETCH 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);
	if (pSceneDat->FirstPaint)
	{
		pSceneDat->FirstPaint = 0;
		for (i = 15; i < 256; i += 20)
		{
			hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, S_NULL, 0, 0, BLACKNESS);
			hai_SetAlphaVal(hDCmem, (S_BYTE)i);
			hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, hDCmem, 0, 0, ALPHACOPY);
			hai_UpdateWindow(0, 0, LCD_WIDTH, LCD_HEIGHT);
			hai_Delay(1);
		}
	}
	else
	{
		hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, hDCmem, 0, 0, SRCCOPY);
		if (pSceneDat->ArtBox)
		{
			hai_SelectObject(hDCmem, (SH_GDIOBJ)pSceneDat->hbox);
			hai_SetColorKey(hDCmem, 0xFFFFFF);
			hai_BitBlt(hDC, (LCD_WIDTH-260)>>1, ((LCD_HEIGHT-110)>>1)-20, 260, 110, hDCmem, 0, 0, TRANSCOPY);
		}
	}
	hai_DeleteDC(hDCmem);
	hai_EndPaint(&Paint);
}

static S_VOID stretchTimer(SP_EVT pEvent)
{
}

static S_VOID stretchKey(SP_EVT pEvent)
{
	S_WORD i;
	SH_DC hDC, hDst, hSrc;
	SH_BITMAP hBmp;
	SP_PICSTRETCH pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));

	switch (pEvent->wParam)
	{
	case VK_ESCAPE:
		if (pSceneDat->ArtBox)
			hai_SendEvent(EVT_KEYUP, 'n', 0);
		else
		{
			hDC = hai_GetSceneDC();
			hDst = hai_CreateCompatibleDC(hDC);
			hSrc = hai_CreateCompatibleDC(hDC);
			hBmp = hai_CreateCompatibleBitmap(hDC);
			hai_SelectObject(hSrc, (SH_GDIOBJ)pSceneDat->hbox);
			hai_SelectObject(hDst, (SH_GDIOBJ)hBmp);
			hai_SetColorKey(hDst, 0xFFFFFF);
			for (i = 1; i < 6; i++)
			{
				hai_StretchBlit(hDst, 0, 0, (S_SHORT)(i*52), (S_SHORT)(i*22), hSrc, 0, 0, 0, 0);
				hai_BitBlt(hDC, (S_SHORT)((LCD_WIDTH-i*52)>>1), (S_SHORT)(((LCD_HEIGHT-i*22)>>1)-20), (S_SHORT)(i*52), (S_SHORT)(i*22), hDst, 0, 0, TRANSCOPY);
				hai_UpdateWindow((S_SHORT)((LCD_WIDTH-i*52)>>1), (S_SHORT)(((LCD_HEIGHT-i*22)>>1)-20), (S_SHORT)(i*52), (S_SHORT)(i*22));
				hai_Delay(1);
			}
			hai_ReleaseDC(hDC);
			hai_DeleteDC(hDst);
			hai_DeleteDC(hSrc);
			hai_DeleteObject((SH_GDIOBJ)hBmp);
			pSceneDat->ArtBox = 1;
		}
		break;
	case 'y':
	case 'Y':
		if (pSceneDat->ArtBox)
			hai_PostEvent(EVT_DESTROY, 0, 0);
		break;
	case 'n':
	case 'N':
		if (pSceneDat->ArtBox)
		{
			hDC = hai_GetSceneDC();
			hDst = hai_CreateCompatibleDC(hDC);
			hSrc = hai_CreateCompatibleDC(hDC);
			hBmp = hai_CreateCompatibleBitmap(hDC);
			hai_SelectObject(hDst, (SH_GDIOBJ)hBmp);
			hai_SetColorKey(hDst, 0xFFFFFF);
			for (i = 4; i > 0; i--)
			{
				hai_SelectObject(hSrc, (SH_GDIOBJ)pSceneDat->hbk);
				hai_BitBlt(hDC, (S_SHORT)((LCD_WIDTH-(i+1)*52)>>1), (S_SHORT)(((LCD_HEIGHT-(i+1)*22)>>1)-20), (S_SHORT)((i+1)*52), (S_SHORT)((i+1)*22), hSrc, (S_SHORT)((LCD_WIDTH-(i+1)*52)>>1), (S_SHORT)(((LCD_HEIGHT-(i+1)*22)>>1)-20), SRCCOPY);
				hai_SelectObject(hSrc, (SH_GDIOBJ)pSceneDat->hbox);
				hai_StretchBlit(hDst, 0, 0, (S_SHORT)(i*52), (S_SHORT)(i*22), hSrc, 0, 0, 0, 0);
				hai_BitBlt(hDC, (S_SHORT)((LCD_WIDTH-i*52)>>1), (S_SHORT)(((LCD_HEIGHT-i*22)>>1)-20), (S_SHORT)(i*52), (S_SHORT)(i*22), hDst, 0, 0, TRANSCOPY);
				hai_UpdateWindow((S_SHORT)((LCD_WIDTH-(i+1)*52)>>1), (S_SHORT)(((LCD_HEIGHT-(i+1)*22)>>1)-20), (S_SHORT)((i+1)*52), (S_SHORT)((i+1)*22));
				hai_Delay(1);
			}
			hai_SelectObject(hSrc, (SH_GDIOBJ)pSceneDat->hbk);
			hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, hSrc, 0, 0, SRCCOPY);
			hai_UpdateWindow((LCD_WIDTH-52)>>1, ((LCD_HEIGHT-22)>>1)-20, 52, 22);
			hai_ReleaseDC(hDC);
			hai_DeleteDC(hDst);
			hai_DeleteDC(hSrc);
			hai_DeleteObject((SH_GDIOBJ)hBmp);
			pSceneDat->ArtBox = 0;
		}
		break;
	default:
		break;
	}
}

static S_VOID stretchExit(SP_EVT pEvent)
{
	SP_PICSTRETCH pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));

	hai_DeleteObject((SH_GDIOBJ)pSceneDat->hbk);
	hai_DeleteObject((SH_GDIOBJ)pSceneDat->hbox);
	hai_ReleaseSceneData();
}

static S_VOID stretchDestroy(SP_EVT pEvent)
{
	S_WORD i;
	SH_DC hDC, hDCmem;
	SP_PICSTRETCH pSceneDat = hai_GetSceneData(sizeof(*pSceneDat));

	hai_SendEvent(EVT_KEYUP, 'n', 0);//msgbox
	hDC = hai_GetSceneDC();
	hDCmem = hai_CreateCompatibleDC(hDC);
	hai_SelectObject(hDCmem, (SH_GDIOBJ)pSceneDat->hbk);
	for (i = 255; i > 20; i -= 20)
	{
		hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, S_NULL, 0, 0, BLACKNESS);
		hai_SetAlphaVal(hDCmem, (S_BYTE)i);
		hai_BitBlt(hDC, 0, 0, LCD_WIDTH, LCD_HEIGHT, hDCmem, 0, 0, ALPHACOPY);
		hai_UpdateWindow(0, 0, LCD_WIDTH, LCD_HEIGHT);
		hai_Delay(1);
	}
	hai_ReleaseDC(hDC);
	hai_DeleteDC(hDCmem);
	hai_DeleteObject((SH_GDIOBJ)pSceneDat->hbk);
	hai_DeleteObject((SH_GDIOBJ)pSceneDat->hbox);
	hai_ReleaseSceneData();
	RETURNSCENE(0, 0);
}



⌨️ 快捷键说明

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