same.c

来自「minigui PDA系统 可实现手机功能」· C语言 代码 · 共 659 行 · 第 1/2 页

C
659
字号
        sync_stones = 0;
}


static void load_scenario (const char *fname)
{
    UnloadBitmap (&stones);
    if (LoadBitmap (HDC_SCREEN, &stones, fname)) {
        exit (1);
    }

    configure_sync (fname);

    nstones = stones.bmWidth / STONE_SIZE;
    ncolors = 3;
}

static void create_same_board (const char *fname)
{
    load_scenario (fname);
    fill_board ();
}

static void sel_scenario (HWND hwnd, int sel)
{
    MENUBUTTONITEM mbi;

    mbi.which = MB_WHICH_TEXT;
    if (sel != cur_sel_scen) {
        SendMessage (hwnd_menu, MBM_GETITEMDATA, sel, (LPARAM)&mbi);
        load_scenario (mbi.text);
        new_game (hwnd);
        cur_sel_scen = sel;
    }
}

static int fill_menu (HWND hwnd_menu)
{
    int i = 0;
    MENUBUTTONITEM mbi;
    struct dirent *e;
    char *dname = "image/same/";
    DIR *dir;
    char buff [30];
    
    dir = opendir (dname);

    if (!dir)
        return -1;
    
    while ((e = readdir (dir)) != NULL){
        if (!strstr (e->d_name, ".gif")) {
            continue;
        }

        strcpy (buff, "image/same/");
        strcat (buff, e->d_name);
        mbi.text = buff;
        mbi.bmp = NULL;
        mbi.data = 0;
        SendMessage (hwnd_menu, MBM_ADDITEM, -1, (LPARAM) &mbi);
        i ++;
    }
    closedir (dir);

    return i;
}

static HMENU createpmenugame (void)
{
    HMENU hmnu;
    MENUITEMINFO mii;
    memset (&mii, 0, sizeof(MENUITEMINFO));
    mii.type        = MFT_STRING;
    mii.id          = 0;
    mii.typedata    = (DWORD)"Game";
    hmnu = CreatePopupMenu (&mii);
    
    memset (&mii, 0, sizeof(MENUITEMINFO));
    mii.type        = MFT_STRING;
    mii.state       = 0;
    mii.id          = IDM_NEW;
    mii.typedata    = (DWORD)"新游戏";
    InsertMenuItem(hmnu, 0, TRUE, &mii);   
  
    mii.type        = MFT_STRING;
    mii.state       = 0;
    mii.id          = IDM_EXIT;
    mii.typedata    = (DWORD)"退出";
    InsertMenuItem(hmnu, 1, TRUE, &mii);

	hmnu = StripPopupHead(hmnu);
    
    return hmnu;
}


static HMENU createpmenuabout (void)
{
    HMENU hmnu;
    MENUITEMINFO mii;
    memset (&mii, 0, sizeof(MENUITEMINFO));
    mii.type        = MFT_STRING;
    mii.id          = 0;
    mii.typedata    = (DWORD)"关于";
    hmnu = CreatePopupMenu (&mii);
	
	
    memset (&mii, 0, sizeof(MENUITEMINFO));
    mii.type        = MFT_STRING ;
    mii.state       = 0;
    mii.id          = IDM_ABOUT;
    mii.typedata    = (DWORD)"关于";
    InsertMenuItem(hmnu, 0, TRUE, &mii);

	hmnu = StripPopupHead(hmnu);
	
    return hmnu;
}

static HMENU createmenu (void)
{
    HMENU hmnu;
    MENUITEMINFO mii;

    hmnu = CreateMenu();

    memset (&mii, 0, sizeof(MENUITEMINFO));
    mii.type        = MFT_STRING;
    mii.id          = 100;
    mii.typedata    = (DWORD)"游戏";
    mii.hsubmenu    = createpmenugame ();

    InsertMenuItem(hmnu, 0, TRUE, &mii);
   
    mii.type        = MFT_STRING;
    mii.id          = 120;
    mii.typedata    = (DWORD)"关于";
    mii.hsubmenu    = createpmenuabout ();
    InsertMenuItem(hmnu, 1, TRUE, &mii);
                 
    return hmnu;
}

int SameGameProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    switch (message) {
    case MSG_CREATE:
    {
        RECT rcClient;
        MENUBUTTONITEM mbi;

        GetClientRect (hWnd, &rcClient);

        CreateWindow (CTRL_STATIC, "游戏皮肤: ", 
                    WS_CHILD | WS_VISIBLE | SS_RIGHT, 0,
                    0, rcClient.bottom - GetSysCharHeight () - 4,
                    100, GetSysCharHeight () + 4, hWnd, 0);

        hwnd_menu = CreateWindow ("menubutton",
                    "<游戏皮肤>",
                     WS_CHILD | WS_VISIBLE, 100,
                     100, rcClient.bottom - GetSysCharHeight () - 4, 
                     100, GetSysCharHeight () + 4, hWnd, 0);
        if (fill_menu (hwnd_menu) <= 0) {
            fprintf (stderr, "Can not find scenario.\n");
            return -1;
        }

        SendMessage (hwnd_menu, MBM_SETCURITEM, 0, 0);

        hwnd_score = CreateWindow (CTRL_STATIC, "成绩:", 
                    WS_CHILD | WS_VISIBLE | SS_RIGHT, 0,
                    200, rcClient.bottom - GetSysCharHeight () - 4,
                    rcClient.right - 200, GetSysCharHeight () + 4, hWnd, 0);

        mbi.which = MB_WHICH_TEXT;
        SendMessage (hwnd_menu, MBM_GETITEMDATA, 0, (LPARAM)&mbi);
        create_same_board (mbi.text);
        new_game (hWnd);
    }
    break;
        
    case MSG_COMMAND:
        if (LOWORD(wParam) == 100 && HIWORD (wParam) == MBN_CHANGED) {
            int sel = SendMessage (hwnd_menu, MBM_GETCURITEM, 0, 0);
            if (sel >= 0)
                sel_scenario (hWnd, sel);
            break;
        }

        switch (wParam) {
        case IDM_NEW:
            new_game (hWnd);
        break;
            
        case IDM_EXIT:
            SendMessage (hWnd, MSG_CLOSE, 0, 0L);
        break;
            
        case IDM_ABOUT:
			MessageBox(hWnd, "快准很 游戏 V1.0\n2007/11/10", "关于", MB_OK);
			break;
        break;
    }
    break;

    case MSG_ERASEBKGND:
    return 0;

    case MSG_PAINT:
    {
        HDC hdc;
        hdc = BeginPaint (hWnd);
        paint (hWnd, hdc);
        EndPaint (hWnd, hdc);
        return 0;
    }

    case MSG_LBUTTONDOWN:
    {
        int x = LOWORD (lParam);
        int y = HIWORD (lParam);

        kill_balls (hWnd, x / STONE_SIZE, y / STONE_SIZE);
        old_x = -1;
        old_y = -1;
    }
    break;

    case MSG_MOUSEMOVE:
    {
        int x = LOWORD (lParam);
        int y = HIWORD (lParam);
        
        if (PtInRect (&rcBoard, x, y))
            mark_balls (hWnd, x / STONE_SIZE, y / STONE_SIZE);
        else
            unmark_balls (hWnd);
    }
    break;

    case MSG_NCMOUSEMOVE:
        if (wParam != HT_CLIENT)
            unmark_balls (hWnd);
    break;

    case MSG_MOUSEMOVEIN:
        if (!wParam)
            unmark_balls (hWnd);
        break;

    case MSG_TIMER:
        if (wParam == ID_TIMER) {
            HDC hdc = GetClientDC (hWnd);
            move_tagged_balls (hdc);
            ReleaseDC (hdc);
        }
        break;

    case MSG_CLOSE:
        if (MessageBox (hWnd,"你确认要退出?", "快准很", MB_YESNO | MB_ICONQUESTION | MB_BASEDONPARENT) != IDYES)
            return 0;

        DestroyAllControls (hWnd);
        DestroyMainWindow (hWnd);
        PostQuitMessage (hWnd);
        return 0;
    }

    return DefaultMainWinProc (hWnd, message, wParam, lParam);
}

static void InitCreateInfo (PMAINWINCREATE pCreateInfo)
{
    rcBoard.left = 0;
    rcBoard.top = 0;
    rcBoard.right = STONE_COLS * STONE_SIZE;
    rcBoard.bottom = STONE_LINES * STONE_SIZE;
    
    pCreateInfo->dwStyle = WS_CAPTION | WS_BORDER;
    pCreateInfo->dwExStyle = WS_EX_NONE;
    pCreateInfo->spCaption = "快准很";
    pCreateInfo->hMenu = createmenu ();
    pCreateInfo->hCursor = GetSystemCursor(0);
    pCreateInfo->hIcon = 0;
    pCreateInfo->MainWindowProc = SameGameProc;
    pCreateInfo->lx = 0;
    pCreateInfo->ty = 0;
    pCreateInfo->rx = pCreateInfo->lx + 
            ClientWidthToWindowWidth (WS_CAPTION | WS_BORDER, 
                            STONE_COLS * STONE_SIZE);
    pCreateInfo->by = pCreateInfo->ty + 
            ClientHeightToWindowHeight (WS_CAPTION | WS_BORDER, 
                            STONE_LINES * STONE_SIZE, TRUE);
    pCreateInfo->by += GetSysCharHeight () + 4;
    pCreateInfo->iBkColor = PIXEL_black;
    pCreateInfo->dwAddData = 0;
    pCreateInfo->hHosting = HWND_DESKTOP;
}

int sameGame ( HWND hWnd )
{
    HWND hMainWnd;
    MSG Msg;
    MAINWINCREATE CreateInfo;

    const char* layer = NULL;
    RECT max_rect = {0, 0, 0, 0};

    InitCreateInfo (&CreateInfo);
    hMainWnd = CreateMainWindow (&CreateInfo);
    if (hMainWnd == HWND_INVALID)
        return 0;

    srand (time (NULL));

    ShowWindow (hMainWnd, SW_SHOWNORMAL);

    while( GetMessage (&Msg, hMainWnd) ) {
        TranslateMessage (&Msg);
        DispatchMessage (&Msg);
    }

    MainWindowThreadCleanup (hMainWnd);
    return 0;
}

⌨️ 快捷键说明

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