c语言gdi绘图_程序设计的基本步骤是

c语言gdi绘图_程序设计的基本步骤是本文将实现对基本图形的绘制:windows程序画图,大体上有3种方法:(1)你告诉系统点的坐标和颜色,系统通过SetPixel来画。类似的,通过GetPixel来获取某一点像素值。(2)使用MoveToEx、LineTo来划线,MoveToEx设置起点坐标,LineTo设置终点坐标,或者使用Polyline函数,这个函数接受一个POINT类型的数组,通过数组里的点连线。(3)windows…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文将实现对基本图形的绘制:

windows程序画图,大体上有3种方法:

(1)你告诉系统点的坐标和颜色,系统通过SetPixel来画。类似的,通过GetPixel来获取某一点像素值。

(2)使用MoveToEx、LineTo来划线,MoveToEx设置起点坐标,LineTo设置终点坐标,或者使用Polyline函数,这个函数接受一个POINT类型的数组,通过数组里的点连线。

(3)windows提供了一些基本图形绘制的函数供我们直接调用,比如Rectangle绘制矩形,Ellipse绘制椭圆,RoundRect绘制圆角椭圆。

有几点需要特别注意:

(1)实际上画椭圆也是先画矩形,然后计算内接椭圆得出的。

(2)画矩形(椭圆)时都是指定左上角和右下角画图,这与我们平时使用的画图软件(画图、visio)里是同样的,可以想象,他们实现的画图的方法应该与这里相同。

(3)程序运行的结果,使得对角线被椭圆遮挡住了。如果改变顺序,最后画对角线,就没有遮挡发生。这说明,画出的图,是“实心的”,不能简单的理解为只有轮廓。

对以上基本功能实现的代码如下:

#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,		//当前实例句柄
	HINSTANCE hPrevInstance, //先前实例句柄
	LPSTR lpCmdLine,			//命令行
	int iCmdShow)			//显示状态
{ 
   
	static TCHAR szAppName[] = TEXT("画图");
	//窗口句柄
	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))
	{ 
   
		return -1;
	}

	//创建窗口
	hwnd = CreateWindow(
		szAppName,				//窗口类的名称,必须是已经注册的
		TEXT("我的画图"),		//窗口标题
		WS_OVERLAPPEDWINDOW,	//窗口风格
		CW_USEDEFAULT,			//X坐标
		CW_USEDEFAULT,			//Y坐标
		CW_USEDEFAULT,			//宽度
		CW_USEDEFAULT,			//高度
		NULL,					//父窗口句柄
		NULL,					//菜单窗口句柄
		hInstance,				//高级版本的windos忽略
		NULL);

	//显示窗口
	//ShowWindow(hwnd,SW_SHOWNA);
	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;
	int i, j;
	static int cxClient, cyClient;
	POINT apt[NUM];


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


		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
	
		//画出渐变的颜色
		for(i = 0;i < 500;i++)
		{ 
   
			for(j = 0; j < 26;j++)
			{ 
   
				SetPixel(hdc,200+i,200+j,RGB(i,j*10,0));
			}
		}
		Sleep(5000);

		//划线
	
		//用点划线
		for(i = 0; i < 500;i++)
		{ 
   
			for (int j = 0; j < 500; j++)
			{ 
   
				if (j % 50 == 0)
				{ 
   
					SetPixel(hdc, i, j, RGB(0, 0, 0));
				}
				
			}
		}
		Sleep(5000);

		//用函数划线
		MoveToEx	(hdc,0,			cyClient/2,NULL);
		LineTo		(hdc,cxClient,	cyClient/2);
		for(int i = 0;  i< NUM;i++)
		{ 
   
			//把x轴等分成1000份
			apt[i].x = i * cxClient / NUM;
			apt[i].y = (int) (cyClient / 2 * (1-sin(TWOPI * i /NUM)));
			//LineTo(hdc,apt[i].x,apt[i].y);
		}

		//Polyline绘制,速度快于在for循环内LineTo
		Polyline(hdc,apt,NUM);
		Sleep(5000);

		//绘制矩形
		Rectangle(hdc, cxClient / 8, cyClient / 8,
			7 * cxClient / 8, 7 * cyClient / 8);
		Sleep(5000);

		//绘制对角线
		MoveToEx(hdc, 0, 0, NULL);
		LineTo(hdc, cxClient, cyClient);
		MoveToEx(hdc, 0, cyClient, NULL);
		LineTo(hdc, cxClient, 0);
		Sleep(5000);

		//绘制椭圆
		Ellipse(hdc, cxClient / 8, cyClient / 8,
			7 * cxClient / 8, 7 * cyClient / 8);
		Sleep(5000);

		//绘制圆角矩形
		RoundRect(hdc, cxClient / 4, cyClient / 4,
			3 * cxClient / 4, 3 * cyClient / 4,
			//最后两个参数是圆角矩形的圆角形成的椭圆的长和宽
			cxClient / 4, cyClient / 4);
		Sleep(5000);

		EndPaint(hwnd, &ps);
		return 0;


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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170969.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • class.getclassloader()_javaassist

    class.getclassloader()_javaassist全屏java.lang.Class.getClassLoader()方法返回的类加载器的类。一些实现可能使用null表示引导类加载器。如果这个类是由引导类加载器加载的方法在这样的实现将返回null。声明以下是java.lang.Class.getClassLoader()方法的声明publicClassLoadergetClassLoader()参数NA返回值此方法返回加载此对象所表示的类或接…

    2022年5月3日
    61
  • 均匀分布的均值及方差

    均匀分布的均值及方差

    2022年9月18日
    0
  • tar 打包隐藏文件[通俗易懂]

    tar 打包隐藏文件[通俗易懂]前言:先说一下遇到的场景:前段时间在配合做DevOps,组内有块代码是php的,需要用tar命令打包归档上传到nexus库,后来发现解压出来的包居然缺失了隐藏文件(配置文件),查了一下资料解决了,这里记录一下。1.tar命令常规用法-c 创建新的档案文件-C 指定到要解压到的目录。注意:该目录必须存在-f 指定打包的文件名。在f之后要立即接打包文件名!不能再加参数!-x 解压-O 将文件解压到标准输出-p 使用原文件的原来属性-P 创建归档文件,使用绝对路径-t 列出档

    2022年5月31日
    59
  • cnpm安装和使用[通俗易懂]

    cnpm安装和使用[通俗易懂]在已经安装node.js基础上,利用npm来安装cnpm。cnpm是利用淘宝镜像来安装依赖包!优点:会比npm安装来的速度更快  操作:1、全局安装cnpm,打开cmd输入:npmi-gcnpm 2、验证是否安装成功,可以通过查看版本:cnpmversion当出现如下版本号,表示安装成功 …

    2022年10月10日
    0
  • MVC三层架构详细图

    MVC三层架构详细图Model业务处理:业务逻辑(Service) 数据持久层:CRUD(Dao)View展示数据 提供链接发起Servlet请求Controller接收用户的请求:(req:请求参数、Session信息) 交给业务层处理对应的代码 控制视图的跳转…

    2022年6月25日
    30
  • Redis雪崩效应的解决方案(转)[通俗易懂]

    Redis雪崩效应的解决方案(转)[通俗易懂]1、可以使用分布式锁单机版的话本地锁当突然有大量请求到数据库服务器时候,进行请求限制。使用所的机制,保证只有一个线程(请求)操作。否则进行排队等待(集群分布式锁,单机本地锁)。减少服务器吞吐量,效率低。保证只能有一个线程进入实际上只能有一个请求在执行查询操作也可以在此处进行使用限流的策略~2、缓存标记publicobjectGetProductListNew()…

    2022年9月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号