windows程序窗体创建流程模型A--利用基本数据类型

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));
		}
		
	}
}

程序运行的结果


呵呵

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值