admin 管理员组

文章数量: 887018

目录

一、实验环境

二、黑白圣诞树

三、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.运行

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

本文标签: 圣诞树 彩色 语言 Windows