这个程序实现一个圆心沿正弦曲线运动的圆   代码如下  
#include<windows.h>
#include<stdio.h>
#include<Wingdi.h>
#include<math.h>
#define SEGMENTS 500
#define PI 3.1415926
#define ID_TIMER 1LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
  WNDCLASS wndclass;
  wndclass.cbClsExtra=0;
  wndclass.cbWndExtra=0;
  wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
  wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  wndclass.hInstance=hInstance;
  wndclass.lpfnWndProc=WinProc;
  wndclass.lpszClassName="第四章";
  wndclass.lpszMenuName=NULL;
  wndclass.style=CS_HREDRAW|CS_VREDRAW;
   
  if(!RegisterClass(&wndclass))
  {
      MessageBeep(0);
  return FALSE;
  }
  HWND hwnd;
  hwnd=CreateWindow(
                 "第四章",
 "习题4—6",
 WS_OVERLAPPEDWINDOW,
 100,
 100,
 400,
 500,
 NULL,
 NULL,
 hInstance,
 NULL
               );  ShowWindow(hwnd,nCmdShow);
  UpdateWindow(hwnd);  MSG msg;
  while(GetMessage(&msg,NULL,0,0))
  {
    TranslateMessage(&msg);
DispatchMessage(&msg);
  }
  return 0;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
   HDC hdc;
   PAINTSTRUCT ps;
  
   HPEN pen;
   POINT po[SEGMENTS];
   int nWidth,nHeigh,i;
   static j=0;
   switch(message)
   {
      
   case  WM_CREATE:
        SetTimer (hwnd, ID_TIMER, 200000, NULL) ;
           return 0 ;      case  WM_TIMER :
           MessageBeep (-1) ;          
          
j++;
           InvalidateRect (hwnd, NULL, FALSE) ;
           return 0 ;
    
       case WM_PAINT:
        hdc=BeginPaint(hwnd,&ps);
    RECT rect;
        pen=CreatePen(PS_SOLID,10,RGB(255,0,0));  
         
        GetClientRect(hwnd,&rect);                //获得客户区的大小
         nWidth=rect.right-rect.left;
         nHeigh=rect.bottom-rect.top;
        for(i=0;i<SEGMENTS;i++)
{
         po[i].x=(i*nWidth)/SEGMENTS;
         po[i].y=(int)((nHeigh/2)*(1-(sin((2*PI*i)/SEGMENTS))));
}                      //绘制各个正弦曲线点
SelectObject(hdc,pen);
        Polyline(hdc,po,SEGMENTS);  //将各个孤立点连接起来
while(j<SEGMENTS)
        {
         for(i=0;i<SEGMENTS;i++)
 {
              SetROP2(hdc,R2_NOT);//当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图(自动擦除上次绘制的图形) 
  Ellipse(hdc,po[i].x-50,po[i].y-50,po[i].x+50,po[i].y+50);
 }
}    
EndPaint (hwnd, &ps) ;
      DeleteObject (pen) ;
break;
   case WM_DESTROY:
    KillTimer (hwnd, ID_TIMER) ;
   PostQuitMessage(0);
   break;
   default:
   return DefWindowProc(hwnd,message,wparam,lparam);
   }
   return 0;
}问题 :
程序运行后  窗口会出现(提示没有反应)(不知道怎么插入图片各位见谅)先在此谢谢了!

解决方案 »

  1.   

    我是初步接触API  望多指点指点   谢谢  
      

  2.   

    我不知道你这些代码要实现的功能是什么
    while(j<SEGMENTS)
      {
    for(i=0;i<SEGMENTS;i++)
    {
      SetROP2(hdc,R2_NOT);//当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图(自动擦除上次绘制的图形)  
    Ellipse(hdc,po[i].x-50,po[i].y-50,po[i].x+50,po[i].y+50);
    }
    }  
    这个循环应该是死循环吧。对J都没有处理,循环外面也做了对J的处理
      

  3.   


    我在贴下代码   
    #include<windows.h>
    #include<stdio.h>
    #include<Wingdi.h>
    #include<math.h>#define SEGMENTS 500
    #define PI 3.1415926
    #define ID_TIMER 1LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
    {
      WNDCLASS wndclass;
      wndclass.cbClsExtra=0;
      wndclass.cbWndExtra=0;
      wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
      wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
      wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
      wndclass.hInstance=hInstance;
      wndclass.lpfnWndProc=WinProc;
      wndclass.lpszClassName="第四章";
      wndclass.lpszMenuName=NULL;
      wndclass.style=CS_HREDRAW|CS_VREDRAW;
       
      if(!RegisterClass(&wndclass))
      {
          MessageBeep(0);
      return FALSE;
      }
      HWND hwnd;
      hwnd=CreateWindow(
                     "第四章",
     "习题4—6",
     WS_OVERLAPPEDWINDOW,
     100,
     100,
     400,
     500,
     NULL,
     NULL,
     hInstance,
     NULL
                   );  ShowWindow(hwnd,nCmdShow);
      UpdateWindow(hwnd);  MSG msg;
      while(GetMessage(&msg,NULL,0,0))
      {
        TranslateMessage(&msg);
    DispatchMessage(&msg);
      }
      return 0;
    }
    LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
    {
       HDC hdc;
       PAINTSTRUCT ps;
       HBRUSH hb;
       HPEN pen;
       POINT po[SEGMENTS];
      // CBITMAP m_Bmp;
       HDC m_dcMemory;
       int nWidth,nHeigh,i;
       static int j=0;
       switch(message)
       {
          
       case  WM_CREATE:
            SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
                   break;      case  WM_TIMER :
               MessageBeep (-1) ;          
    j++;
               InvalidateRect (hwnd, NULL, FALSE) ;

               break;  
           case WM_PAINT:
                    hdc=BeginPaint(hwnd,&ps);
                RECT rect;
                    pen=CreatePen(PS_SOLID,10,RGB(255,0,0));  
                    hb=CreateSolidBrush(RGB(0,255,0));
                    GetClientRect(hwnd,&rect);                //获得客户区的大小
                    nWidth=rect.right-rect.left;
                    nHeigh=rect.bottom-rect.top;
    CreateCompatibleDC(hdc) ;
    // if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory; {      ::PostQuitMessage(0); } 
               //     m_Bmp.CreateCompatibleBitmap(&m_dcMemory, nWidth, nHeigh);                for(i=0;i<SEGMENTS;i++)
    {
                     po[i].x=(i*nWidth)/SEGMENTS;
                     po[i].y=(int)((nHeigh/2)*(1-(sin((2*PI*i)/SEGMENTS))));
    }                      //绘制各个正弦曲线点
            SelectObject(hdc,pen);
                    Polyline(hdc,po,SEGMENTS);  //将各个孤立点连接起来
            
         
                         SetROP2(hdc,R2_XORPEN);//使用XORPEN在上次的位置重新画一次就是擦掉 
             SelectObject(hdc,hb);
             Ellipse(hdc,po[j].x-50,po[j].y-50,po[j].x+50,po[j].y+50);
     if(j>SEGMENTS)
     j=0;
       
              EndPaint (hwnd, &ps) ;
                  DeleteObject (pen) ;
            DeleteObject (hb) ;
             break;
                 case WM_DESTROY:
             KillTimer (hwnd, ID_TIMER) ;
                PostQuitMessage(0);
                break;
               default:
                return DefWindowProc(hwnd,message,wparam,lparam);
       }
       return 0;
    }