鱼C论坛

 找回密码
 立即注册
查看: 2039|回复: 1

windows程序设计一个小球弹撞问题

[复制链接]
发表于 2014-10-18 20:49:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 RSNrsn 于 2014-10-18 20:51 编辑

代码如下:
// Bounce.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;                                                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                                                                // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                                                                // The title bar text

// Foward declarations of functions included in this code module:
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK        About(HWND, UINT, WPARAM, LPARAM);
static int cxClient,cyClient,xCenter,yCenter,xTotal,yTotal,xR,yR,xMove,yMove;
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
         // TODO: Place code here.
        MSG msg;
        HACCEL hAccelTable;

        // Initialize global strings
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_BOUNCE, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);

        // Perform application initialization:
        if (!InitInstance (hInstance, nCmdShow)) 
        {
                return FALSE;
        }

        hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_BOUNCE);

        // Main message loop:
        while (GetMessage(&msg, NULL, 0, 0)) 
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }

        return msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX); 

        wcex.style                        = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc        = (WNDPROC)WndProc;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = hInstance;
        wcex.hIcon                        = LoadIcon(hInstance, (LPCTSTR)IDI_BOUNCE);
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName        = (LPCSTR)IDC_BOUNCE;
        wcex.lpszClassName        = szWindowClass;
        wcex.hIconSm                = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

        return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND        - process the application menu
//  WM_PAINT        - Paint the main window
//  WM_DESTROY        - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc,hdcMem;
        static int i=0;
        static HBITMAP bitmap;
        HBRUSH brush;
        switch (message) 
        {
                case WM_CREATE:
                        SetTimer(hWnd,1,100,NULL);
                        break;
                case WM_SIZE:
                        
                        xCenter = (cxClient = LOWORD(lParam))/2;
                        yCenter = (cyClient = HIWORD(lParam))/2;
                        xR = 20;
                        yR = 20;
                        xMove = xR/2;
                        yMove = yR/2;
                        xTotal = 2*(xR + xMove);
                        yTotal = 2*(yR + yMove);
                        hdc = GetDC(hWnd);
                        bitmap = CreateCompatibleBitmap(hdc,xTotal,yTotal);
                        hdcMem = CreateCompatibleDC(NULL);
                        ReleaseDC(hWnd,hdc);
                        SelectObject(hdcMem,bitmap);
                        Rectangle( hdcMem,-1,-1,xTotal+1,yTotal+1);
                        brush = CreateHatchBrush(HS_DIAGCROSS,0L);
                        SelectObject(hdcMem,brush);
                        SetBkColor(hdcMem, RGB(255,0,255));
                        Ellipse(hdcMem,xMove,yMove,xTotal-xMove,yTotal-yMove);
                        DeleteObject(hdcMem);
                
                        break;
                case WM_COMMAND:
                        wmId    = LOWORD(wParam); 
                        wmEvent = HIWORD(wParam); 
                        // Parse the menu selections:
                        switch (wmId)
                        {
                                case IDM_ABOUT:
                                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                                   break;
                                case IDM_EXIT:
                                   DestroyWindow(hWnd);
                                   break;
                                default:
                                   return DefWindowProc(hWnd, message, wParam, lParam);
                        }
                        break;
                case WM_TIMER:
                        hdc = GetDC(hWnd);
                        if(!bitmap)
                                break;
                        hdcMem = CreateCompatibleDC(hdc);
                        SelectObject(hdcMem, bitmap);
                        BitBlt(hdc, xCenter - xTotal / 2, yCenter - yTotal / 2, xTotal, yTotal,
                                hdcMem, 0,0,SRCCOPY);
                        
                        xCenter += xMove;
                        yCenter += yMove;
                        if (((xCenter+xR/2) >= cxClient)||((xCenter-xR/2) <= 0))
                        {
                                xMove = -xMove;
                        }
                        if ((yCenter+yR/2 >=cyClient)||(yCenter-yR/2 <= 0))
                        {
                                yMove = -yMove;
                        }
                        //这行代码删掉就不行为啥呢?
                        DeleteObject(hdcMem);

                        ReleaseDC(hWnd,hdc);

                                break;
                case WM_PAINT:
                        hdc = BeginPaint(hWnd, &ps);
                        // TODO: Add any drawing code here...
                        
                        EndPaint(hWnd, &ps);
                        break;
                case WM_DESTROY:
                        PostQuitMessage(0);
                        break;
                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
                case WM_INITDIALOG:
                                return TRUE;

                case WM_COMMAND:
                        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
                        {
                                EndDialog(hDlg, LOWORD(wParam));
                                return TRUE;
                        }
                        break;
        }
    return FALSE;
}

为啥注释这一行就运行不出效果。
如图C:\Users\Administrator\Desktop
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-14 08:35:46 | 显示全部楼层
把问题求助顶起来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 19:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表