windows窗口创建的过程(具体步骤,都是固定的)。在回调函数中画了一个图案,但这不是本程序的重点。重点在于创建窗口的过程,下面是代码
这是非常重要的一步,对于理解有windowsAPI架设的框架是非常必要的,例如MFC框架
//
// Win32 Application
//
//
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define Pi 3.1415926
/*
1.定义WNDCLASS对象并初始化;
2.将WNDCLASS注册到windows系统中;
3.创建WNDCLASS对象模样的窗口并显示;
4.进入消息回环;
*/
BOOL InitWindowsClass(HINSTANCE hInstance);
unsigned short InitWindowsRegister(const WNDCLASS *lpWndClass);
BOOL InitWindowsCreate(HINSTANCE HInstance,int nCmdShow);
long __stdcall WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindowsCreate(hInstance,nCmdShow))
return FALSE;
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
BOOL InitWindowsCreate(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow("Polygon","五边形", // lpClassName lpWindowName
WS_OVERLAPPEDWINDOW, // dwStyle
CW_USEDEFAULT,0,CW_USEDEFAULT,0, // x y nWidth nHeight
NULL, // hWndParent
NULL, // hMenu
hInstance, // hInstance
NULL); // lpParam
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
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 =WndProc;
WndClass.lpszClassName ="Polygon";
WndClass.lpszMenuName =NULL;
WndClass.style =0;
return InitWindowsRegister(&WndClass);
}
unsigned short InitWindowsRegister(const WNDCLASS *lpWndClass)
{
return RegisterClass(lpWndClass);
}
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
HDC hDC;
HPEN hPen;
HBRUSH hBrush;
PAINTSTRUCT PtStr; // 绘图信息结构体
POINT lpTriangle[3];// 三角形点结构数组
double dfOuterRadious=200.0,dfInnerRadious;// 外部、内部正五边形外接圆半径
POINT lpOuterPoints[5], lpInnerPoints[5];// 外部、内部正五边形点结构数组
dfInnerRadious=dfOuterRadious*sin(0.1*Pi)/sin(126.0/180*Pi);
// 计算内外正五边形坐标点
for(int i=0;i<5;i++)
{
lpOuterPoints[i].x=(long)(dfOuterRadious*cos(i*72.0/180*Pi));
lpOuterPoints[i].y=(long)(dfOuterRadious*sin(i*72.0/180*Pi));
lpInnerPoints[i].x=(long)(dfInnerRadious*cos(i*72.0/180*Pi+36.0/180*Pi));
lpInnerPoints[i].y=(long)(dfInnerRadious*sin(i*72.0/180*Pi+36.0/180*Pi));
}
switch(iMessage)
{
case WM_PAINT:
{
hDC=BeginPaint(hWnd,&PtStr); // 得到设备环境句柄
SetMapMode(hDC,MM_ANISOTROPIC); // 设置映射模式
SetWindowOrgEx(hDC,-200,-200,NULL); // 设置坐标原点
// 绘制正五边形
hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));// red
SelectObject(hDC,hPen);
Polygon(hDC,lpOuterPoints,5);
// 绘制 5+5个三角形
for(i=0;i<5;i++)
{
lpTriangle[0]=lpOuterPoints[i%5];
lpTriangle[1]=lpInnerPoints[i%5];
lpTriangle[2]=lpOuterPoints[(i+1)%5];
hBrush=CreateSolidBrush(RGB(0,255,0));// green
SelectObject(hDC,hBrush);
Polygon(hDC,lpTriangle,3);
lpTriangle[2]=lpInnerPoints[(i+4)%5];
hBrush=CreateSolidBrush(RGB(0,0,255));// blue
SelectObject(hDC,hBrush);
Polygon(hDC,lpTriangle,3);
}
// 绘制内五边形
hBrush=CreateSolidBrush(RGB(012,123,234));
SelectObject(hDC,hBrush);
Polygon(hDC,lpInnerPoints,5);
// 将五角星的五个顶点连接(呵呵 算的不对)
MoveToEx(hDC,lpOuterPoints[0].x,lpOuterPoints[0].y,NULL);
for (i=1;i<3;i++)
{
hPen=CreatePen(PS_SOLID,5,RGB(0,44,0));
SelectObject(hDC,hPen);
LineTo(hDC,lpOuterPoints[(i+2)%5].x,lpOuterPoints[(i+2)%5].y);
}
hPen=(HPEN)(GetStockObject(PS_NULL));//
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hWnd,&PtStr);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
default:
{
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
}
程序运行的结果
呵呵