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

📄 solitaire.cpp

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
    PCARDBACK pCardBack = (PCARDBACK)GetWindowLongPtr(hwnd,
                                                      GWL_USERDATA);
    static WNDPROC hOldProc = NULL;

    if (!hOldProc && pCardBack)
        hOldProc = pCardBack->hOldProc;

    switch (msg)
    {
    case WM_PAINT:
    {
        HDC hdc;
        PAINTSTRUCT ps;
        HPEN hPen, hOldPen;
        HBRUSH hBrush, hOldBrush;
        RECT rc;

        hdc = BeginPaint(hwnd, &ps);

        if (pCardBack->bSelected)
        {
            hPen = CreatePen(PS_SOLID, 2, RGB(0,0,0));
        }
        else
        {
            DWORD Face = GetSysColor(COLOR_3DFACE);
            hPen = CreatePen(PS_SOLID, 2, Face);
        }

        GetClientRect(hwnd, &rc);
        hBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
        hOldPen = (HPEN)SelectObject(hdc, hPen);
        hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

        Rectangle(hdc,
                  rc.left+1,
                  rc.top+1,
                  rc.right,
                  rc.bottom);

        BitBlt(hdc,
               2,
               2,
               __cardwidth,
               __cardheight,
               __hdcCardBitmaps,
               pCardBack->hdcNum * __cardwidth,
               0,
               SRCCOPY);

        SelectObject(hdc, hOldPen);
        SelectObject(hdc, hOldBrush);

        EndPaint(hwnd, &ps);

        break;
    }

    case WM_LBUTTONDOWN:
        pCardBack->bSelected = pCardBack->bSelected ? FALSE : TRUE;
        break;
    }

    return CallWindowProc(hOldProc,
                          hwnd,
                          msg,
                          wParam,
                          lParam);
}


BOOL CALLBACK CardBackDlgProc(HWND hDlg,
                              UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam)
{
    static PCARDBACK pCardBacks = NULL;

    switch (uMsg)
    {
    case WM_INITDIALOG:
    {
        INT i, c;
        SIZE_T size = sizeof(CARDBACK) * NUM_CARDBACKS;

        pCardBacks = (PCARDBACK)HeapAlloc(GetProcessHeap(),
                                          0,
                                          size);

        for (i = 0, c = CARDBACK_START; c <= CARDBACK_END; i++, c++)
        {
            pCardBacks[i].hSelf = GetDlgItem(hDlg, c);
            pCardBacks[i].bSelected = FALSE;
            pCardBacks[i].hdcNum = CARDBACK_RES_START + i;
            pCardBacks[i].imgNum = i + 1;
            pCardBacks[i].hOldProc = (WNDPROC)SetWindowLongPtr(pCardBacks[i].hSelf,
                                                               GWLP_WNDPROC,
                                                               (LONG_PTR)CardImageWndProc);

            SetWindowLongPtr(pCardBacks[i].hSelf,
                             GWL_USERDATA,
                             (LONG_PTR)&pCardBacks[i]);
        }

        return TRUE;
    }

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            INT i, num = 0;
            for (i = 0; i < NUM_CARDBACKS; i++)
            {
                if (pCardBacks[i].bSelected)
                {
                    num = pCardBacks[i].imgNum;
                }
            }

            EndDialog(hDlg, LOWORD(wParam) == IDOK ? num : FALSE);
            HeapFree(GetProcessHeap(), 0, pCardBacks);
            return TRUE;
        }

        if (HIWORD(wParam) == STN_CLICKED)
        {
            INT i;
            RECT rc;
            for (i = 0; i < NUM_CARDBACKS; i++)
            {
                if (pCardBacks[i].hSelf == (HWND)lParam)
                {
                    pCardBacks[i].bSelected = TRUE;
                }
                else
                    pCardBacks[i].bSelected = FALSE;

                GetClientRect(pCardBacks[i].hSelf, &rc);
                InvalidateRect(pCardBacks[i].hSelf, &rc, TRUE);
            }

            break;
        }
    }

    return FALSE;
}


VOID ShowDeckOptionsDlg(HWND hwnd)
{
    INT cardBack;

    if ((cardBack = DialogBox(hInstance,
                              MAKEINTRESOURCE(IDD_CARDBACK),
                              hwnd,
                              CardBackDlgProc)))
    {
        SolWnd.SetBackCardIdx(CARDBACK_RES_START + (cardBack - 1));
        SolWnd.Redraw();
    }
}

//-----------------------------------------------------------------------------
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    static int nWidth, nHeight;
    int parts[] = { 100, -1 };
    int ret;
    RECT rc;
    int nStatusHeight = 0;

    MINMAXINFO *mmi;

    switch(iMsg)
    {
    case WM_CREATE:
        hwndStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, _T("Ready"), hwnd, 0);

        //SendMessage(hwndStatus, SB_SIMPLE, (WPARAM)TRUE, 0);

        SendMessage(hwndStatus, SB_SETPARTS, 2, (LPARAM)parts); 
        SendMessage(hwndStatus, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)"");

        SolWnd.Create(hwnd, WS_EX_CLIENTEDGE, WS_CHILD|WS_VISIBLE, 0, 0, 0, 0);

        CreateSol();

        NewGame();

        dwAppStartTime = GetTickCount();

        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_SIZE:
        nWidth  = LOWORD(lParam);
        nHeight = HIWORD(lParam);

        if (dwOptions & OPTION_SHOW_STATUS)
        {
            GetWindowRect(hwndStatus, &rc);
            nStatusHeight = rc.bottom - rc.top;
            MoveWindow(SolWnd, 0, 0, nWidth, nHeight-nStatusHeight, TRUE);
            MoveWindow(hwndStatus, 0, nHeight-nStatusHeight, nWidth, nHeight, TRUE);
        }
        else
        {
            MoveWindow(SolWnd, 0, 0, nWidth, nHeight, TRUE);
        }
        //parts[0] = nWidth - 256;
        //SendMessage(hwndStatus, SB_SETPARTS, 2, (LPARAM)parts); 
        return 0;

    case WM_GETMINMAXINFO:
        mmi = (MINMAXINFO *)lParam;
        mmi->ptMinTrackSize.x = 600;
        mmi->ptMinTrackSize.y = 400;
        return 0;

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDM_GAME_NEW:
            //simulate a button click on the new button..
            NewGame();
            return 0;

        case IDM_GAME_DECK:
            ShowDeckOptionsDlg(hwnd);
            return 0;

        case IDM_GAME_OPTIONS:
            ShowGameOptionsDlg(hwnd);
            return 0;

        case IDM_HELP_CONTENTS:
            WinHelp(hwnd, szHelpPath, HELP_CONTENTS, 0);//HELP_KEY, (DWORD)"How to play");
            return 0;

        case IDM_HELP_ABOUT:
            MessageBox(hwnd, MsgAbout, szAppName, MB_OK|MB_ICONINFORMATION);
            return 0;

        case IDM_GAME_EXIT:
            PostMessage(hwnd, WM_CLOSE, 0, 0);
            return 0;
        }

        return 0;

    case WM_CLOSE:
        if (fGameStarted == false)
        {
            DestroyWindow(hwnd);
            return 0;
        }
        else
        {
            ret = MessageBox(hwnd, MsgQuit, szAppName, MB_OKCANCEL|MB_ICONQUESTION);
            if (ret == IDOK)
            {
                WinHelp(hwnd, szHelpPath, HELP_QUIT, 0);
                DestroyWindow(hwnd);
            }
        }
        return 0;
    }

    return DefWindowProc (hwnd, iMsg, wParam, lParam);
}


⌨️ 快捷键说明

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