绘制正弦函数曲线

来源:互联网 发布:手风琴软件 编辑:程序博客网 时间:2024/04/29 22:53


#include<windows.h>

#include<math.h>


#define NUM 1000
#define TWOPI (2*3.14159)


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);


int WINAPI WinMain(  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
  )
{
static TCHAR szAppName[] = TEXT("SineWave");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;


wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance;
wndclass.hIcon  = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;


if (!RegisterClass (&wndclass))
{
MessageBox(NULL,TEXT("Program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
}

hwnd = CreateWindow(szAppName,TEXT("Sine Wave Using polyline"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);


while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


return msg.wParam;
}




LRESULT CALLBACK WndProc (HWND hwnd, UINT message ,WPARAM wParam,LPARAM lParam)
{
static int cxClient, cyClient;
HDC hdc;
int i;
PAINTSTRUCT ps;
POINT apt[NUM];


switch(message)
{
case WM_SIZE:
cxClient = LOWORD (lParam);
cyClient = HIWORD (lParam);
return 0;


case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);


MoveToEx(hdc,0,cyClient/2,NULL);
LineTo(hdc,cxClient,cyClient/2);


for(i=0; i < NUM; i++)
{
apt[i].x = i * cxClient/NUM;
apt[i].y = (int)(cyClient/2 * (1-sin(TWOPI*i/NUM)));
}


Polyline(hdc,apt,NUM);
EndPaint(hwnd,&ps);
return 0;


case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hwnd, message ,wParam ,lParam);


}


运行结果如下:




下面的代码从窗口的左上角开始,在客户区画一个网格,线与线之间相距100个像素。变量 hwnd 是一个窗口句柄,hdc 是一个设备环境句柄, x 和 y 都是整数 :

GetClientRect(hwnd,&rect);
for(x=0; x<rect.right; x+=100)
{
MoveToEx(hdc,x,0,NULL);
LineTo(hdc,x,rect.bottom);
}


for(y=0; y<rect.bottom; y+=100)
{
MoveToEx(hdc,0,y,NULL);
LineTo(hdc,rect.right,y);
}

用以上的代码替换 BeginPaint 和 EndPaint 之间的内容就可以得到以下效果 :