📄 collage.cpp
字号:
/***********************************************************
collage.cpp
***********************************************************/
#include <windows.h>
#include <windowsx.h>
#include <Commctrl.h>
#include <Winuser.h>
#include "collage.h"
#include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK AboutCollage(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK HappyShow(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
BOOL InitApplication(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
void ImageInit(HDC hdc);
void ImageFlash(HDC hdc);
void ImageUpdate(HDC hdc);
void ImageJudge(HDC hdc);
void MoveImage(HWND hwnd);
void DownImage(HWND hwnd,HDC hdc);
void UpImage(HWND hwnd,HDC hdc);
void ZoomIn(HDC hdc);
void ZoomOut(HDC hdc);
void ClearBuffer();
int HappyJudge();
HINSTANCE hInst=NULL;
HWND hwndMain = NULL, hwndCB = NULL;
HWND hwinStep=NULL, hwinRoom=NULL;
TCHAR szAppName[9];
TCHAR szTitle[40];
HBITMAP hTDesktop;
HBITMAP hStep;
HBITMAP hNull,hN;
HBITMAP element[6][9]={0};
int xPos,yPos; //the current cursor position;
int last_x,last_y; //the last cursor position;
unsigned char level_num = 0;
unsigned char image_idb = 0;
unsigned char temp_num = 0; //record the moved image num;
unsigned char temp_pos = 0; //record the moved image positon;
unsigned char move_num = 0;
unsigned char init_flag = 0;
unsigned char down_flag = 0;
unsigned char move_flag = 0;
unsigned char up_flag = 0;
unsigned char happy_flag = 0;
unsigned char num_buf1[9]={0};
unsigned char temp_buf1[9]={0};
unsigned char temp_buf2[9]={0};
UINT flash_time = 0; //because the number is large;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nCmdShow)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
MSG msg;
InitCommonControls(); //common dll load
if (!hPrevInstance) {
if (!InitApplication(hInstance)) {
return FALSE;
}
}
if (!InitInstance(hInstance, nCmdShow)) {
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0)) {
if (!IsCommandBarMessage(hwndCB, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
} /* WinMain()
*/
BOOL InitApplication(HINSTANCE hInstance)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
WNDCLASS wc;
LoadString(hInstance, IDS_APPNAME, szAppName, sizeof(szAppName));
LoadString(hInstance, IDS_DESCRIPTION, szTitle, sizeof(szTitle));
wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s).
wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure
wc.cbClsExtra = 0; // No per-class extra data.
wc.cbWndExtra = 0; // No per-window extra data.
wc.hInstance = hInstance; // Owner of this class
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL; // Menu name from .RC
wc.lpszClassName = szAppName; // Name to register as
return RegisterClass(&wc);
} /* InitApplication()
*/
BOOL CreateCommandBar(HWND hwnd)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
HICON hIcon;
HWND hwndCB;
// register the 16x16 icon for displaying on the taskbar.
hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON1),
IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
SendMessage(hwnd, WM_SETICON, FALSE, (WPARAM)hIcon);
// create the command bar firstly.
if (hwndCB = CommandBar_Create(hInst, hwnd, 1))
{
CommandBar_InsertMenubar(hwndCB, hInst, IDM_MAIN_MENU, 0);
// Finally add the exit and help button adornments
CommandBar_AddAdornments(hwndCB, /*STD_HELP*/0, IDM_EXIT);
}
return (hwndCB != NULL);
} /* CreateCommandBar()
*/
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
hInst = hInstance;
#ifdef _WIN32_WCE_EMULATION
hwndMain = CreateWindow(szAppName, szTitle,
WS_POPUP,
0, 0,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hInstance, NULL);
#else
hwndMain = CreateWindow(szAppName, szTitle,
WS_VISIBLE,
0, 0,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hInstance, NULL);
#endif
if (!hwndMain) {
return FALSE;
}
ShowWindow(hwndMain, nCmdShow);
UpdateWindow(hwndMain);
return TRUE;
} /* InitInstance()
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
/*---------------------------------------------------------------------------*\
*
\*---------------------------------------------------------------------------*/
{
int i,j;
unsigned char idb_temp;
unsigned char pass_flag = 0;
PAINTSTRUCT ps;
HDC hdc;
switch (msg) {
case WM_CREATE:
CreateCommandBar(hwnd);
hdc=GetDC(hwnd);
hTDesktop=CreateCompatibleBitmap(hdc,640,440);
idb_temp = IDB_AMAP11;
for(i=0;i<6;i++)
{
for(j=0;j<9;j++)
{
element[i][j]=LoadBitmap(hInst,MAKEINTRESOURCE(idb_temp+j));
}
idb_temp+=10;
}
hNull=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_NULL));
hN=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_N));
ReleaseDC(hwnd,hdc);
flash_time = 2000;
SetTimer(hwnd,IDT_TIMER1,flash_time,NULL);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
ImageInit(hdc);
if((init_flag == 1)&&(happy_flag ==0))
ImageUpdate(hdc);
EndPaint(hwnd, &ps);
return 0;
case WM_TIMER:
if((init_flag == 1)&&(level_num != 0))
{
hdc=GetDC(hwnd);
ImageFlash(hdc);
ReleaseDC(hwnd,hdc);
}
return 0;
case WM_LBUTTONDOWN:
if(happy_flag == 0)
{
xPos = LOWORD(lp); // horizontal position of cursor
yPos = HIWORD(lp); // vertical position of cursor
if(((xPos>=SCREEN_X)&&(xPos<=(SCREEN_X+WIDTH*3))
&&(yPos>=SCREEN_Y)&&(yPos<=(SCREEN_Y+WIDTH*3)))
||((xPos>=SC_X)&&(xPos<=(SC_X+WI*3)))
&&((yPos>=SC_Y)&&(yPos<=(SC_Y+WI*3))))
{
hdc=GetDC(hwnd);
DownImage(hwnd,hdc);
up_flag = 0;
ReleaseDC(hwnd,hdc);
last_x = xPos;
last_y = yPos;
}
}
return 0;
case WM_MOUSEMOVE:
if((down_flag == 1)&&(happy_flag == 0))
{
xPos = LOWORD(lp); // horizontal position of cursor
yPos = HIWORD(lp); // vertical position of cursor
MoveImage(hwnd);
last_x = xPos;
last_y = yPos;
}
return 0;
case WM_LBUTTONUP:
if(down_flag == 1)
{
hdc=GetDC(hwnd);
UpImage(hwnd,hdc);
down_flag = 0;
ReleaseDC(hwnd,hdc);
if((HappyJudge()==TRUE)&&(pass_flag==0))
{
happy_flag = 1;
pass_flag = 1;
DialogBox(hInst,MAKEINTRESOURCE(IDD_HAPPY),hwndMain,(DLGPROC)HappyShow);
}
}
return 0;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wp,lp))
{
case IDC_START:
happy_flag = 0;
init_flag = 0;
hdc=GetDC(hwnd);
PatBlt(hdc,0,MENUTOP,480,200,WHITENESS);
ClearBuffer();
ImageInit(hdc);
ReleaseDC(hwnd,hdc);
SetFocus(hwnd);
break;
case IDC_EASY:
happy_flag=0;
level_num = 0;
init_flag = 0;
hdc=GetDC(hwnd);
PatBlt(hdc,0,MENUTOP,480,200,WHITENESS);
ClearBuffer();
ImageInit(hdc);
ReleaseDC(hwnd,hdc);
SetFocus(hwnd);
break;
case IDC_HARDER:
happy_flag=0;
level_num = 1;
init_flag = 0;
hdc=GetDC(hwnd);
PatBlt(hdc,0,MENUTOP,480,200,WHITENESS);
ClearBuffer();
ImageInit(hdc);
ReleaseDC(hwnd,hdc);
SetFocus(hwnd);
break;
case IDC_HARDEST:
happy_flag=0;
level_num = 2;
init_flag = 0;
hdc=GetDC(hwnd);
PatBlt(hdc,0,MENUTOP,480,200,WHITENESS);
ClearBuffer();
ImageInit(hdc);
ReleaseDC(hwnd,hdc);
SetFocus(hwnd);
break;
case IDC_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUT),hwndMain,(DLGPROC)AboutCollage);
break;
case IDM_EXIT:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
default:
return DefWindowProc(hwnd, msg, wp, lp);
}
return 0;
case WM_CLOSE:
DestroyWindow(hwnd);
for(i=0;i<6;i++)
{
for(j=0;j<9;j++)
{
DeleteObject(element[i][j]);
}
}
DeleteObject(hTDesktop);
// return(DefWindowProc(hwnd, msg, wp, lp));
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
} /* WndProc()
*/
void ImageInit(HDC hdc)
{
int i,j;
HDC hMemDC;
BITMAP bm;
if(init_flag == 0)
{
image_idb = 0;
for(i=0;i<9;i++)
{
while(num_buf1[i] == 0)
{
num_buf1[i] = Random()%9 + 1;
for(j = 0; j < i; j++)
{
if(num_buf1[i] == num_buf1[j])
{
num_buf1[i] = 0;
break;
}
}
}
temp_buf1[i] = num_buf1[i];
}
init_flag = 1;
}
hMemDC=CreateCompatibleDC(hdc);
for(i = 0; i < 9; i++)
{
switch(temp_buf1[i])
{
case 0:
hStep=hNull;
break;
case 1:
hStep=element[image_idb][0];
break;
case 2:
hStep=element[image_idb][1];
break;
case 3:
hStep=element[image_idb][2];
break;
case 4:
hStep=element[image_idb][3];
break;
case 5:
hStep=element[image_idb][4];
break;
case 6:
hStep=element[image_idb][5];
break;
case 7:
hStep=element[image_idb][6];
break;
case 8:
hStep=element[image_idb][7];
break;
case 9:
hStep=element[image_idb][8];
break;
}
SelectObject(hMemDC,hStep);
GetObject(hStep,sizeof(BITMAP),(LPSTR)&bm);
if(i < 3)
StretchBlt(hdc,WIDTH*i+SCREEN_X,SCREEN_Y,bm.bmWidth,bm.bmHeight,
hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
if((i>=3)&&(i<6))
StretchBlt(hdc,WIDTH*(i-3)+SCREEN_X,WIDTH+SCREEN_Y,bm.bmWidth,bm.bmHeight,
hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
if((i>=6)&&(i<9))
StretchBlt(hdc,WIDTH*(i-6)+SCREEN_X,WIDTH*2+SCREEN_Y,bm.bmWidth,bm.bmHeight,
hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
DeleteDC(hMemDC);
/* drawing the target space*/
hMemDC=CreateCompatibleDC(hdc);
for(i = 0; i < 9; i++)
{
switch(temp_buf2[i])
{
case 0:
hStep=hN;
break;
case 1:
hStep=element[image_idb+3][0];
break;
case 2:
hStep=element[image_idb+3][1];
break;
case 3:
hStep=element[image_idb+3][2];
break;
case 4:
hStep=element[image_idb+3][3];
break;
case 5:
hStep=element[image_idb+3][4];
break;
case 6:
hStep=element[image_idb+3][5];
break;
case 7:
hStep=element[image_idb+3][6];
break;
case 8:
hStep=element[image_idb+3][7];
break;
case 9:
hStep=element[image_idb+3][8];
break;
}
SelectObject(hMemDC,hStep);
GetObject(hStep,sizeof(BITMAP),(LPSTR)&bm);
if(i < 3)
StretchBlt(hdc,WI*i+SC_X,SC_Y,bm.bmWidth,bm.bmHeight,
hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
if((i>=3)&&(i<6))
StretchBlt(hdc,WI*(i-3)+SC_X,WI+SC_Y,bm.bmWidth,bm.bmHeight,
hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
if((i>=6)&&(i<9))
StretchBlt(hdc,WI*(i-6)+SC_X,WI*2+SC_Y,bm.bmWidth,bm.bmHeight,
hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
DeleteDC(hMemDC);
}
void ImageFlash(HDC hdc)
{
int i;
HDC hMemDC;
BITMAP bm;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -