这个程序实现一个圆心沿正弦曲线运动的圆 代码如下
#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;
}问题 :
程序运行后 窗口会出现(提示没有反应)(不知道怎么插入图片各位见谅)先在此谢谢了!
#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;
}问题 :
程序运行后 窗口会出现(提示没有反应)(不知道怎么插入图片各位见谅)先在此谢谢了!
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的处理
我在贴下代码
#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;
}