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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python可视化图表(python 显示图片)

    目录一、fig,ax=plt.subplots()的作用?二、参数的含义?三、怎么在一个图上排列多个子图?四、怎么把多个子图一起合并到一个图上?《PythonforDataAnalysis》2ndEdition一、fig,ax=plt.subplots()的作用?它是用来创建总画布/figure“窗口”的,有figure就可以在上边(或其中一个子…

    2022年4月17日
    241
  • atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl窗体身份验证规则

    atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl窗体身份验证规则

    2022年1月8日
    55
  • ctf-web:关于文件上传漏洞的深入研究[通俗易懂]

    ctf-web:关于文件上传漏洞的深入研究[通俗易懂]上次我们研究了关于文件上传的漏洞,这次我们研究的内容属于上节课的补充内容,关于文件上传的绕过与防御.怎么说呢,算是一种锻炼吧.因为下个月有个awd的比赛,因此最近会经常发一些关于web的内容.其实我还是挺慌的,因为以前参加的都是ctf线上赛,而且我做的都是逆向这个方面的,然而这次突然来了个web,搞得我有点懵.web也是最近才开始研究的,所以写的可能不尽人意,希望各位大佬看看就好,不喜勿喷.一.实验环境我们这次的实验依然用的是上次的网站和phpstudy.我发在了下面.1.upload-f.

    2022年7月15日
    14
  • 用注册机注册Keil

    用注册机注册Keil注册前需用管理员权限打开软件,不然会提示ERRORR206:NOREGISTRYACCESS,ADMINISTRATIONRIGHTSREQUIRED。截至到2032年的最新注册机链接:https://pan.baidu.com/s/1kfVnA6FL_ZvHGpQPtZprTw提取码:tu2m

    2022年5月7日
    38
  • C# 通过 HtmlDocument 操作HTML节点

    C# 通过 HtmlDocument 操作HTML节点C#通过HtmlDocument操作HTML节点时,会发生不停地刷新的情况,在对html文档操作后加以判断即可解决这种问题。   PublicSubsetMainUlr(ByValWebBrowser1AsWebBrowser)           DimpElemAsHtmlElement=Nothing           即时信息页面          

    2022年7月19日
    15
  • python encode和decode函数说明_python中文处理之encode/decode函数「建议收藏」

    python encode和decode函数说明_python中文处理之encode/decode函数「建议收藏」python中文处理相信迷惑过不少同学。下面说说python2/3的encode和decode函数。python2中,使用decode()和encode()来进行解码和编码,以unicode类型作为中间类型。即decode  encodestr———>unicode———>str示例(注意encode和decode的编码必须保持一致)…

    2022年9月25日
    4

发表回复

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

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