#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 之间的内容就可以得到以下效果 :
作者:chaoyuan899 发表于2013-2-6 10:22:33 原文链接
阅读:65 评论:0 查看评论