📄 picdemo.c
字号:
//---------------------------------------------------------------------------------
// 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 + -