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

📄 collage.cpp

📁 WindowsCE上的一个拼图小游戏代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/***********************************************************
        
		              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 + -