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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 3dmax建模前景_3d建模师未来发展前景

    3dmax建模前景_3d建模师未来发展前景简单来说,没前途。本来不想说这个话题的,但是想了好久,觉得还是来说两句。我本人是从事建筑表现效果图行业的,主要用的软件就是3DMAX+VRay+PS。正式从业到现在已经三年了,半路出家。3DMAX这个软件深入很多个行业,广告、影视、工业设计、建筑设计、三维动画、多媒体制作、游戏、以及工程可视化等。但其实没有哪个行业是只用这一款软件的,在不少行业3DMAX也逐步被更新的软件替代。MAX强大在它是一个平台,所以他的上限很高,比一般的软件都要高很多,但是下限也很高,不是那么容易上手。.

  • Unity学习笔记 之 发射小球碰撞物体的代码记录

    Unity学习笔记 之 发射小球碰撞物体的代码记录

  • 测试用例和缺陷报告的区别_测试用例怎么写 实例

    测试用例和缺陷报告的区别_测试用例怎么写 实例测试用例和缺陷报告模板对于测试工程师,必备技能之一便是测试用例的编写和软件缺陷报告的编写啦~下面提供一些模板还有项目实战样例供大家参考参考,通过Excel表格编写测试用例缺陷报告模板下面来个实战案例在线课程作业管理系统项目测试用例(部分)缺陷报告实例…

  • js 数组删除指定元素「建议收藏」

    js 数组删除指定元素「建议收藏」js数组删除指定元素,js数组并没有提供直接删除某一指定元素的方法,因此需要我们稍作处理思路:首先找到要删除的元素的位置,然后使用splice方法进行删除示例代码删除数组s中的‘dd’元素vars=[‘s’,’dd’,’re’]s.splice(s.indexOf(‘dd’),1)console.log(s)运行效果至此完…

  • 机器学习 之 Haar特征

    机器学习 之 Haar特征Haar特征Haar特征原理综述Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用黑色矩形像素和减去白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一

  • 固态硬盘不能恢复吗_固态硬盘资料能恢复吗

    固态硬盘不能恢复吗_固态硬盘资料能恢复吗固态硬盘(SSD)凭借超高速的读写速度在高端玩家中颇受欢迎,但是SSD硬盘也暴露出一些不成熟的表现,之前已有过固件门、性能下降等例子。Techgage网站最新的测试显示SSD硬盘在数据恢复方面遇到了新的挑战,这一问题在支持TRIM指令的固态硬盘上尤为严重。有鉴于此,编辑将这篇文章编译过来希望能引起玩家的重视。目前这一问题还没有别的评测加以佐证,笔者手头也没有固态硬盘可重复验证,希望正在使用固态硬盘

发表回复

您的电子邮箱地址不会被公开。

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