main.c
来自「一个类似windows」· C语言 代码 · 共 1,055 行 · 第 1/3 页
C
1,055 行
/*
* WineMine (main.c)
*
* Copyright 2000 Joshua Thielen <jt85296@ltu.edu>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include "main.h"
#include "dialog.h"
#include "resource.h"
/* Work around a Wine bug which defines handles as UINT rather than LPVOID */
#ifdef WINE_STRICT
#define NULL_HANDLE NULL
#else
#define NULL_HANDLE 0
#endif
#ifdef DUMB_DEBUG
#include <stdio.h>
#define DEBUG(x) fprintf(stderr,x)
#else
#define DEBUG(x)
#endif
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow )
{
MSG msg;
WNDCLASS wc;
HWND hWnd;
HACCEL haccel;
char appname[9];
LoadString( hInst, IDS_APPNAME, appname, sizeof(appname));
wc.style = 0;
wc.lpfnWndProc = MainProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon( hInst, appname );
wc.hCursor = LoadCursor( NULL_HANDLE, (LPCTSTR)IDI_APPLICATION );
wc.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = "MENU_WINEMINE";
wc.lpszClassName = appname;
if (!RegisterClass(&wc)) exit(1);
hWnd = CreateWindow( appname, appname,
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL_HANDLE, NULL_HANDLE, hInst, NULL );
if (!hWnd) exit(1);
ShowWindow( hWnd, cmdshow );
UpdateWindow( hWnd );
haccel = LoadAccelerators( hInst, appname );
SetTimer( hWnd, ID_TIMER, 1000, NULL );
while( GetMessage(&msg, NULL_HANDLE, 0, 0) ) {
if (!TranslateAccelerator( hWnd, haccel, &msg ))
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;
}
LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HMENU hMenu;
static BOARD board;
switch( msg ) {
case WM_CREATE:
board.hInst = ((LPCREATESTRUCT) lParam)->hInstance;
board.hWnd = hWnd;
InitBoard( &board );
CreateBoard( &board );
return 0;
case WM_PAINT:
{
HDC hMemDC;
DEBUG("WM_PAINT\n");
hdc = BeginPaint( hWnd, &ps );
hMemDC = CreateCompatibleDC( hdc );
DrawBoard( hdc, hMemDC, &ps, &board );
DeleteDC( hMemDC );
EndPaint( hWnd, &ps );
return 0;
}
case WM_MOVE:
DEBUG("WM_MOVE\n");
board.pos.x = (unsigned) LOWORD(lParam);
board.pos.y = (unsigned) HIWORD(lParam);
return 0;
case WM_DESTROY:
SaveBoard( &board );
DestroyBoard( &board );
PostQuitMessage( 0 );
return 0;
case WM_TIMER:
if( board.status == PLAYING ) {
board.time++;
RedrawWindow( hWnd, &board.timer_rect, NULL_HANDLE,
RDW_INVALIDATE | RDW_UPDATENOW );
}
return 0;
case WM_LBUTTONDOWN:
DEBUG("WM_LBUTTONDOWN\n");
if( wParam & MK_RBUTTON )
msg = WM_MBUTTONDOWN;
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
SetCapture( hWnd );
return 0;
case WM_LBUTTONUP:
DEBUG("WM_LBUTTONUP\n");
if( wParam & MK_RBUTTON )
msg = WM_MBUTTONUP;
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
ReleaseCapture();
return 0;
case WM_RBUTTONDOWN:
DEBUG("WM_RBUTTONDOWN\n");
if( wParam & MK_LBUTTON ) {
board.press.x = 0;
board.press.y = 0;
msg = WM_MBUTTONDOWN;
}
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
return 0;
case WM_RBUTTONUP:
DEBUG("WM_RBUTTONUP\n");
if( wParam & MK_LBUTTON )
msg = WM_MBUTTONUP;
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
return 0;
case WM_MBUTTONDOWN:
DEBUG("WM_MBUTTONDOWN\n");
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
return 0;
case WM_MBUTTONUP:
DEBUG("WM_MBUTTONUP\n");
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
return 0;
case WM_MOUSEMOVE:
{
if( (wParam & MK_LBUTTON) && (wParam & MK_RBUTTON) ) {
msg = WM_MBUTTONDOWN;
}
else if( wParam & MK_LBUTTON ) {
msg = WM_LBUTTONDOWN;
}
else {
return 0;
}
TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg );
return 0;
}
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDM_NEW:
CreateBoard( &board );
return 0;
case IDM_MARKQ:
hMenu = GetMenu( hWnd );
board.IsMarkQ = !board.IsMarkQ;
if( board.IsMarkQ )
CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED );
else
CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED );
return 0;
case IDM_BEGINNER:
SetDifficulty( &board, BEGINNER );
CreateBoard( &board );
return 0;
case IDM_ADVANCED:
SetDifficulty( &board, ADVANCED );
CreateBoard( &board );
return 0;
case IDM_EXPERT:
SetDifficulty( &board, EXPERT );
CreateBoard( &board );
return 0;
case IDM_CUSTOM:
SetDifficulty( &board, CUSTOM );
CreateBoard( &board );
return 0;
case IDM_EXIT:
SendMessage( hWnd, WM_CLOSE, 0, 0);
return 0;
case IDM_TIMES:
DialogBoxParam( board.hInst, "DLG_TIMES", hWnd,
TimesDlgProc, (LPARAM) &board);
return 0;
case IDM_ABOUT:
DialogBox( board.hInst, "DLG_ABOUT", hWnd, AboutDlgProc );
return 0;
default:
DEBUG("Unknown WM_COMMAND command message received\n");
break;
}
}
return( DefWindowProc( hWnd, msg, wParam, lParam ));
}
void InitBoard( BOARD *p_board )
{
HMENU hMenu;
p_board->hMinesBMP = LoadBitmap( p_board->hInst, (LPCSTR) IDB_MINES);
p_board->hFacesBMP = LoadBitmap( p_board->hInst, (LPCSTR) IDB_FACES);
p_board->hLedsBMP = LoadBitmap( p_board->hInst, (LPCSTR) IDB_LEDS);
LoadBoard( p_board );
if( p_board->pos.x < (unsigned) GetSystemMetrics( SM_CXFIXEDFRAME ))
p_board->pos.x = GetSystemMetrics( SM_CXFIXEDFRAME );
if( p_board->pos.x > (unsigned) (GetSystemMetrics( SM_CXSCREEN )
- GetSystemMetrics( SM_CXFIXEDFRAME ))) {
p_board->pos.x = GetSystemMetrics( SM_CXSCREEN )
- GetSystemMetrics( SM_CXFIXEDFRAME );
}
if( p_board->pos.y < (unsigned) (GetSystemMetrics( SM_CYMENU )
+ GetSystemMetrics( SM_CYCAPTION )
+ GetSystemMetrics( SM_CYFIXEDFRAME ))) {
p_board->pos.y = GetSystemMetrics( SM_CYMENU ) +
GetSystemMetrics( SM_CYCAPTION ) +
GetSystemMetrics( SM_CYFIXEDFRAME );
}
if( p_board->pos.y > (unsigned) (GetSystemMetrics( SM_CYSCREEN )
- GetSystemMetrics( SM_CYFIXEDFRAME ))) {
p_board->pos.y = GetSystemMetrics( SM_CYSCREEN )
- GetSystemMetrics( SM_CYFIXEDFRAME );
}
hMenu = GetMenu( p_board->hWnd );
CheckMenuItem( hMenu, IDM_BEGINNER + (unsigned) p_board->difficulty,
MF_CHECKED );
if( p_board->IsMarkQ )
CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED );
else
CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED );
CheckLevel( p_board );
}
void LoadBoard( BOARD *p_board )
{
DWORD size;
DWORD type;
HKEY hkey;
char data[16];
char key_name[8];
unsigned i;
RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Wine\\WineMine",
0, KEY_QUERY_VALUE, &hkey );
size = sizeof( data );
if( RegQueryValueEx( hkey, "Xpos", NULL, (LPDWORD) &type,
(LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS ) {
p_board->pos.x = atoi( data );
}
else
p_board->pos.x = GetSystemMetrics( SM_CXFIXEDFRAME );
size = sizeof( data );
if( RegQueryValueEx( hkey, "Ypos", NULL, (LPDWORD) &type,
(LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
p_board->pos.y = atoi( data );
else
p_board->pos.y = GetSystemMetrics( SM_CYMENU )
+ GetSystemMetrics( SM_CYCAPTION )
+ GetSystemMetrics( SM_CYFIXEDFRAME );
size = sizeof( data );
if( RegQueryValueEx( hkey, "Rows", NULL, (LPDWORD) &type,
(LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
p_board->rows = atoi( data );
else
p_board->rows = BEGINNER_ROWS;
size = sizeof( data );
if( RegQueryValueEx( hkey, "Cols", NULL, (LPDWORD) &type,
(LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
p_board->cols = atoi( data );
else
p_board->cols = BEGINNER_COLS;
size = sizeof( data );
if( RegQueryValueEx( hkey, "Mines", NULL, (LPDWORD) &type,
(LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
p_board->mines = atoi( data );
else
p_board->rows = BEGINNER_ROWS;
size = sizeof( data );
if( RegQueryValueEx( hkey, "Difficulty", NULL, (LPDWORD) &type,
(LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS )
p_board->difficulty = (DIFFICULTY) atoi( data );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?