目录

一、实验环境

二、黑白圣诞树

三、windows.h简介

四、windows.h实现彩色圣诞树

1.设置用户窗口

2.移动光标

3.修改字体颜色

4.绘制圣诞树

5.绘制雪景

6.完整代码

7.运行


一、实验环境

  • 编译环境:  vc++6.0、codeblocks(gcc/g++)
  • 操作系统:  windows7
  • 字符编码:  GBK

如何修改运行窗口的字符编码?

1.单击右键->默认值

2.选项->默认代码页->简体中文GBK,确认之后重启运行窗口

我们知道ASCII编码中一个字符占1个字节;而在GBK编码中,一个字符占2字节

二、黑白圣诞树

#include<stdio.h>
int main(){int height=10,i=0,j=0;//画五角星for(j=height-1;j>0;j--){printf(" ");}printf("%c%c\n",161,239);//GBK中五角星对应的编码为A1EF,换成十进制就是161 239//画叶子for(i=1;i<height;i++){for(j=height-i-1;j>0;j--){printf(" ");}for(j=2*i+2;j>0;j--){printf("*");}printf("\n");}//画树干for(j=height-1;j>0;j--){printf(" ");}printf("||");printf("\n");return 0;
}

实心五角星在GBK中的编码为A1EF,占两个字节;而C语言中字符类型只占一个字节,所以我们把A1EF拆成两个字节输出,十进制数161、239分别对应十六进制数A1、EF

三、windows.h简介

我们先思考一个问题,如何用C程序输出不同颜色的字体?一般来说,只靠应用程序本身很难达到这个目的,因为运行窗口的管理属于操作系统资源,而应用程序想要使用这些资源就必须通过操作系统提供的接口来实现。

为了解决这类问题,微软提供了丰富的Windows API(Application Programming Interface),这些API并不会直接在应用程序中展开,而是以动态链接的形式存在着,在应用程序需要API实现某些功能的时候,才调用相应的动态链接库。通过调用各种Windows API函数,应用程序可以管理它的用户界面、显示各种图形和文字、播放音乐等等。

windows.h是微软操作系统中非常重要的一个头文件,它包含了多个头文件以及多种API函数接口,比如Winbase.h(Windows内核函数等)、Winuser.h(Windows用户界面管理函数等)、Wingdi.h(Windows图形设备接口函数等)

四、windows.h实现彩色圣诞树

1.设置用户窗口

system("title 圣诞快乐!");//修改运行窗口的名称
system("mode con cols=50 lines=15");//设置窗口大小为50*15
/*
system("color 7C");//修改运行界面背景和字体的颜色,7:白色背景,C:淡红色字体
0 = 黑色    8 = 灰色
1 = 蓝色    9 = 淡蓝色
2 = 绿色    A = 淡绿色
3 = 湖蓝    B = 浅淡绿色
4 = 红色    C = 淡红色
5 = 紫色    D = 淡紫色
6 = 黄色    E = 淡黄色
7 = 白色    F = 亮白色system("pause");//暂停,按下任意键后程序继续运行
system("cls");//清屏
*/

2.移动光标

/*定位光标位置到指定坐标*/
void goto_xy(int x, int y){HANDLE hout;hout=GetStdHandle(STD_OUTPUT_HANDLE);COORD pos={x,y};SetConsoleCursorPosition(hout,pos);
}

Windwos是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本,这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,Windwos引入了实例句柄。Windows使用句柄(HANDLE)来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

你可以把句柄理解为指向指针的指针。我们知道,操作系统使用了虚拟内存技术,使得进程在逻辑上占有连续的地址空间(实际上这些虚拟地址映射的是物理空间碎片)。很多时候进程的代码和数据并不全部装入内存,在运行过程中,同一对象的地址可能会发生变化,为了准确访问到这些对象,Windows引入了句柄。系统会为每个进程在内存中分配一块空间,用来存储句柄,一个句柄指向内存中的一块区域,而这一块区域中存储了某个对象的地址。

3.修改字体颜色

/*根据参数改变字体颜色*/
void color(const unsigned short textColor)
{if(textColor>=0&&textColor<=15){//参数在0-15的范围颜色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),textColor);}else{//默认的字体颜色是白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);}
}

textColor = 0为黑色

4.绘制圣诞树

/*画圣诞树*/
void tree(int height,int colorOfLeaves){//画五角星if(colorOfLeaves==10){color(3);}else{color(11);}goto_xy(24,3);printf("%c%c\n",161,239);//GBK中五角星对应的编码为A1EF,换成十进制就是161 239//画叶子color(colorOfLeaves);for(int i=1;i<height;i++){if(colorOfLeaves==14){Sleep(60);}goto_xy(25-i-1,i+3);for(int j=2*i+2;j>0;j--){printf("*");}printf("\n");}//画树干goto_xy(25-1,height+3);color(4);printf("||");printf("\n");
}

5.绘制雪景

/*绘制雪景*/
void snow(int n){srand(time(0));for(int i=0;i<n;i++){int x=rand()%50;int y=rand()%15;goto_xy(x,y);color(7);if(i<n-5){printf("·");}else{printf("*");}}
}

在绘制雪景图的过程中,我们使用随机数生成每一片雪花的位置。其中srand(time(0));根据系统时间生成随机数种子,rand()%50;生成了[0,49]范围的随机数。

6.完整代码

#include<windows.h>
#include<stdio.h>
#include<time.h>void color(const unsigned short textColor);
void goto_xy(int x, int y);
void tree(int height,int colorOfLeaves);
void snow(int n);/*根据参数改变字体颜色*/
void color(const unsigned short textColor)
{if(textColor>=0&&textColor<=15){//参数在0-15的范围颜色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),textColor);}else{//默认的字体颜色是白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);}
}
/*定位光标位置到指定坐标*/
void goto_xy(int x, int y){HANDLE hout;hout=GetStdHandle(STD_OUTPUT_HANDLE);COORD pos={x,y};SetConsoleCursorPosition(hout,pos);
}
/*画圣诞树*/
void tree(int height,int colorOfLeaves){//画五角星if(colorOfLeaves==10){color(3);}else{color(11);}goto_xy(24,3);printf("%c%c\n",161,239);//GBK中五角星对应的编码为A1EF,换成十进制就是161 239//画叶子color(colorOfLeaves);for(int i=1;i<height;i++){if(colorOfLeaves==14){Sleep(60);}goto_xy(25-i-1,i+3);for(int j=2*i+2;j>0;j--){printf("*");}printf("\n");}//画树干goto_xy(25-1,height+3);color(4);printf("||");printf("\n");
}
/*绘制雪景*/
void snow(int n){srand(time(0));for(int i=0;i<n;i++){int x=rand()%50;int y=rand()%15;goto_xy(x,y);color(7);if(i<n-5){printf("·");}else{printf("*");}}
}
int main(){system("title 圣诞快乐!");system("mode con cols=50 lines=15");//设置窗口大小while(1){snow(30);tree(10,10);Sleep(1000);//延迟1000毫秒tree(10,14);Sleep(1000);//延迟1000毫秒system("cls");//清屏}return 0;
}

7.运行

最后提前祝各位读者朋友圣诞快乐啦!!!

C语言 | windows.h实现彩色圣诞树相关推荐

  1. C语言windows.h库的常用函数(三)

    SetCursorPos函数 用途 SetCursorPos函数是windows.h库中用来设置指针位置的函数,使用该函数鼠标指针将会直接跳至指定坐标位置 参数 SetCursorPos函数拥有x和y ...

  2. c语言windows.h头文件详解

    如果c语言库里没有某个头文件 只需要将下好的头文件放入下面的路径即可 windows.h头文件包含的函数及其用法 1.GetAsyncKeyState()()//通过函数来判断按键按下的状态 主要用法 ...

  3. C语言windows.h库的常用函数(二)

    GetCursorPos函数 在上一篇中的WindowFromPoint函数的示例代码中就已经用到了GetCursorPos函数,这是一个用于获取鼠标指针位置的函数. #include<stdi ...

  4. C语言windows.h库的常用函数(一)

    1:FindWindow函数 该函数可以通过窗口类名或者窗口标题名来查找特定窗口句柄,返回值是窗口的句柄(在Windows中,句柄是一个系统内部数据结构的引用.例如当你操作一个窗口,或说是一个Delp ...

  5. C语言windows.h库的常用函数(四)

    CopyFile函数 用途 CopyFile函数可以用来复制文件到指定目录. 参数 CopyFile("文件源目录","文件目标目录",TRUE or FALS ...

  6. c语言windows.h file not found,XCode里遇到 #include XXX.hfile not found的解决方案

    最近在学习如何在C++里调用Java方法,遇到提示 #include file  not  found 的问题.也google了好久都没有找到合适的解决方案. 认真的研究了下xcode导入h头文件的的 ...

  7. windows.h有哪些函数

    C语言windows.h库的常用函数 1:FindWindow函数 该函数可以通过窗口类名或者窗口标题名来查找特定窗口句柄,返回值是窗口的句柄(在Windows中,句柄是一个系统内部数据结构的引用.例 ...

  8. c语言库的学习——windows.h

    1.http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindW ...

  9. c语言windows头文件包含,不包含windows.h和window.h内的任何头文件,弹框 “Hello, world!”...

    本帖最后由 天上飞来一只 于 2020-10-22 15:36 编辑 前言:在windows应用程序下,不包含windows.h和window.h内的任何头文件,弹框 "Hello, wor ...

最新文章

  1. 转 sessionid如何产生?由谁产生?保存在哪里?
  2. 解决Subquery returns more than 1 rowsql查询错误
  3. vscode多个光标_21 个VSCode 快捷键,让代码更快,更有趣
  4. 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
  5. 字符串校验器 ExcelValidator.java
  6. Android Binder通信数据结构介绍
  7. 瀑布、V、W、快速原型模型、增量、螺旋模型
  8. 计算机cpu的型号与参数,怎么查看CPU型号和CPU核数
  9. 用c语言实现动态优先权调度,实验四使用动态优先权的进程调度算法的模拟..doc...
  10. 小米总监汇总的几点软件测试方法~
  11. EDM营销存在的六大问题
  12. 【Elastic Search权威指南 读书小记3】ES之数据操作
  13. VS code 设置中文后还显示英文问题解决办法,亲测有效!
  14. 软件加密系统Themida应用程序保护指南(四):虚拟机的选择
  15. 感谢一起合作的小伙伴
  16. vc MSChart的使用
  17. pancakeswap 抢币
  18. stripes spring annotation
  19. Python自动化——pytest常用插件详解
  20. Linux + resources

热门文章

  1. 【华为OD机试真题 C++】 勾股数元组【2022 Q4 | 100分】
  2. Java---->强烈安利0_0详解注解和反射机制
  3. mysql查询5周数据_第五周:MySQL数据库
  4. CTF相关网站收集(自用)
  5. 你的项目刚刚启动?是时候考虑Globalization了! 1
  6. 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
  7. 常见异常的原因分析和解决方法
  8. python能做word和excel吗_Python 操作Word(Excel、PPT等通用)
  9. 专升本管理学知识点总结——组织
  10. 2022年全球市场金属陶瓷基板总体规模、主要生产商、主要地区、产品和应用细分研究报告