Windows编程画太极图

用Windows API 画太极图

重要的API函数

Ellipse() : 画椭圆
API原型
 BOOL Ellipse(
      HDC hdc,
      int xLeft,
      int yTop,
      int xRight,
      int yBottom,
 );

 
Arc() : 画圆弧
API原型
 BOOL Arc(
      HDC hdc,
      int xLeft,
      int yTop,
      int xRight,
      int yBottom,
      int xStart,
      int yStart,
      int xEnd,
      int yEnd,
 );

 
Chord() : 画圆弧将两个端点并连线
 BOOL Chord(
      HDC hdc,
      int xLeft,
      int yTop,
      int xRight,
      int yBottom,
      int xStart,
      int yStart,
      int xEnd,
      int yEnd,
 );

代码

#include<windows.h>
#include<math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("MyWindows");
	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("这个程序需要在Windows NT才能运行!"),szAppName,MB_ICONERROR);
		return 0;
	}

	hwnd = CreateWindow(szAppName,
		TEXT("太极图"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		600,
		600,
		NULL,
		NULL,
		hInstance,
		NULL);
	ShowWindow(hwnd,iCmdShow);
	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)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	HBRUSH hBrush;
	HBRUSH hOldBrush;
	HPEN hPen;

	switch(message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd,&ps);
		GetClientRect(hwnd,&rect);

		hBrush = CreateSolidBrush(RGB(255, 255, 255));   
		hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);  
		Chord(hdc,100,100,500,500,300,500,300,100);     
		SelectObject(hdc, hOldBrush);
		DeleteObject(hBrush);//画右边半圆(白色)

		hBrush = CreateSolidBrush(RGB(0, 0, 0));   
		hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);
		Chord(hdc,100,100,500,500,300,100,300,500);    
		SelectObject(hdc, hOldBrush);
		DeleteObject(hBrush);//画左边半圆(黑色)

		hBrush = CreateSolidBrush(RGB(0, 0, 0));   
		hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);   
		Ellipse(hdc,200,100,400,300);       
		SelectObject(hdc, hOldBrush);
		DeleteObject(hBrush);//画太极图阴块大头

		hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
		SelectObject(hdc, hPen);
		hBrush = CreateSolidBrush(RGB(255, 255, 255));   
		hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);
		Chord(hdc,200,300,400,500,300,300,300,500);    
		SelectObject(hdc, hOldBrush);
		DeleteObject(hBrush);//画太极图阳块大头

		hPen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
		SelectObject(hdc, hPen);
		Arc(hdc,200,300,400,500,300,300,300,500);//描边
		
		hBrush = CreateSolidBrush(RGB(0, 0, 0));   
		hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);   
		Ellipse(hdc,270,370,330,430);       
		SelectObject(hdc, hOldBrush);
		DeleteObject(hBrush);//阴小点

		hBrush = CreateSolidBrush(RGB(255, 255, 255));   
		hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);   
		Ellipse(hdc,270,170,330,230);       
		SelectObject(hdc, hOldBrush);
		DeleteObject(hBrush);//阳小点

		EndPaint(hwnd,&ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}
知识点:

给形状上色

hBrush = CreateSolidBrush(RGB(0, 0, 0));  //设置画刷的RGB颜色值为(0,0,0)---黑色;
hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);   
/*画形状,填充的颜色是黑色*/ 
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush);

改变形状线条颜色

hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255));   //设置画笔的RGB颜色值为(255,255,255)---白色
SelectObject(hdc, hPen);
/*画形状,线条的颜色是白色*/ 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用OpenGL绘制太极图的代码示例: ```cpp #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex2f(-0.7, 0.7); glVertex2f(0.7, 0.7); glVertex2f(0.7, -0.7); glVertex2f(-0.7, -0.7); glEnd(); glPushMatrix(); glTranslatef(-0.35, 0.35, 0.0); glColor3f(0.0, 0.0, 0.0); glBegin(GL_POLYGON); glVertex2f(-0.35, 0.35); glVertex2f(0.35, 0.35); glVertex2f(0.35, -0.35); glVertex2f(-0.35, -0.35); glEnd(); glPopMatrix(); glPushMatrix(); glTranslatef(0.35, -0.35, 0.0); glColor3f(1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex2f(-0.35, 0.35); glVertex2f(0.35, 0.35); glVertex2f(0.35, -0.35); glVertex2f(-0.35, -0.35); glEnd(); glPopMatrix(); glPushMatrix(); glTranslatef(-0.35, -0.35, 0.0); glColor3f(1.0,1.0, 1.0); glBegin(GL_POLYGON); for (float angle = 0.0; angle < 360.0; angle += 0.1) { float x = 0.15 * cos(angle * 3.1415926 / 180.0); float y = 0.15 * sin(angle * 3.1415926 / 180.0); glVertex2f(x, y); } glEnd(); glPopMatrix(); glPushMatrix(); glTranslatef(0.35, 0.35, 0.0); glColor3f(0.0, 0.0, 0.0); glBegin(GL_POLYGON); for (float angle = 0.0; angle < 360.0; angle += 0.1) { float x = 0.15 * cos(angle * 3.1415926 / 180.0); float y = 0.15 * sin(angle * 3.1415926 / 180.0); glVertex2f(x, y); } glEnd(); glPopMatrix(); glFlush(); } void init() { glClearColor(0.0, 0.0, 0.0, 1.0); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("Yin Yang"); glutDisplayFunc(display); init(); glutMainLoop(); return 0; } ``` 请确保已安装OpenGL的开发环境,例如使用FreeGLUT库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值