搞事开始。

首先,我们先进行如下声明

#include #include #include #include HDC offscreen;

long double param;

COLORREF C_TRANSPARENT=RGB(1,2,3);

COLORREF C_RED=RGB(255,0,0);

这里并没有什么值得注意的地方。

offscreen是我们绘制心形的一个小的“画布”;而param则是绘制心形所用到的参数。

接下来,既然需要显示一个心,那么,我们需要一个绘制心形的“画布”。

因此,我们需要准备一个窗体。

HWND InitWindow(){

RECT rect;

HWND desktop=GetDesktopWindow();

GetWindowRect(desktop,&rect);

int width=rect.right-rect.left;

int height=rect.bottom-rect.top;

int mysize=(width

WNDCLASSEXW wndclass = { 0 };

wndclass.cbSize=sizeof(WNDCLASSEXW);

wndclass.lpfnWndProc = (WNDPROC)DefWindowProc;

wndclass.hInstance = GetModuleHandle(NULL);

wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

wndclass.lpszClassName = L"Heart";

if (RegisterClassExW(&wndclass) == NULL)

return NULL;

HWND hWnd = CreateWindowExW(

WS_EX_LAYERED|WS_EX_TOPMOST|WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW,

L"Heart", L"title",

WS_POPUP|WS_VISIBLE,

width/2-mysize/2,height/2-mysize/2,mysize,mysize,

NULL, NULL, GetModuleHandle(NULL), NULL

);

if (!hWnd)

return NULL;

SetLayeredWindowAttributes(hWnd,C_TRANSPARENT,200,LWA_ALPHA | LWA_COLORKEY);

return hWnd;

}

这里,我们将C_TRANSPARENT指定为“透明色”。这也是为了后期的效果。

再接下来,我们编写在窗体上绘制心形的函数。这一部分是简单的,因为只是把offscreen上的图形复制到窗体上。甚至可以直接从随便什么地方抄到。

void ShowImage(HWND hWnd,HDC offscreen){

RECT rect;

GetWindowRect(hWnd,&rect);

HDC dc=GetWindowDC(hWnd);

BitBlt(dc,0,0,rect.right-rect.left,rect.bottom-rect.top,offscreen,0,0,SRCCOPY);

}

然后,为整个窗体编写事件循环。

void RunWindow(HWND hWnd){

MSG msg;

while (1) {

while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE)

{

if (GetMessage(&msg, NULL, 0, 0))

{

if(msg.message==WM_PAINT){

ShowImage(msg.hwnd,offscreen);

continue;

}

TranslateMessage(&msg);

DispatchMessage(&msg);

}

else {

return;

}

}

if (!IsWindow(hWnd))break;

Sleep(50);

}

}

好了,废话说完,接下来我们进入正题,即心形的构造。

首先,因为“名字”这个东西并不是很适合数值化。因此,我们对名字进行哈希变换,并与内置的哈希值进行比对,从而得到某个value值。

这里我们用到了Windows内置的Hash算法

void CalcPara(void* data,size_t cbdata){

const BYTE key[]=

{0x95,0x34,0xf3,0x1b,0xde,0x49,0xd1,0x40,0x95,0x26,0x8b,0xd6,0xc1,0x38,0xc1,0x2e,0xef,0x2f,0x35,0xc1};

HCRYPTPROV prov;

CryptAcquireContextA(&prov,NULL,NULL,PROV_RSA_AES,CRYPT_SILENT|CRYPT_VERIFYCONTEXT);

HCRYPTHASH hash;

CryptCreateHash(prov,CALG_SHA1,0,0,&hash);

CryptHashData(hash,(BYTE*)data,cbdata,NULL);

DWORD hashsize;

DWORD tmp=sizeof(DWORD);

CryptGetHashParam(hash,HP_HASHSIZE,(BYTE*)&hashsize,&tmp,0);

BYTE* hval=(BYTE*)malloc(hashsize);

memset(hval,0,hashsize);

tmp=hashsize;

CryptGetHashParam(hash,HP_HASHVAL,(BYTE*)hval,&tmp,0);

if(tmp

int diff=hashsize<20?20-hashsize:hashsize-20;

for(int i=0;i<(hashsize<20?hashsize:20);i++)

if(hval[i]!=key[i])

diff++;

param=diff/2;

if(param>2)

param=2;

}

接下来,我们开始对图形进行绘制。

定义如下函数。

int GenFigure(long double x,long double y){

return 17*x*x+16*y*abs(x)+17*y*y +param/abs(10*x+sin(15*y))< 8;

}

有关此函数的内容会在文末的参考文献中予以列出。

接下来,我们用这样的函数对某个bitmap中的每一个像素进行初始化。

void InitBitmap(HWND hWnd,int (*figure)(long double,long double)){

RECT rect;

GetWindowRect(hWnd,&rect);

int width=rect.right-rect.left;

int height=rect.bottom-rect.top;

HDC dc=GetWindowDC(hWnd);

offscreen=CreateCompatibleDC(dc);

HBITMAP bitmap=CreateCompatibleBitmap(dc,width,height);

SelectObject(offscreen,bitmap);

for(int i=0;i

for(int j=0;j

if(figure((long double)(i)*2/width-1,(long double)(j)*2/height-1))

SetPixel(offscreen,i,j,C_RED);

else

SetPixel(offscreen,i,j,C_TRANSPARENT);

}

最后,把这一切整合起来,就得到了“绘制心型”的程序。

int main()

{

wchar_t name[64];

memset(name,0,64*sizeof(wchar_t));

scanf("%S",name);

HWND chwnd=GetConsoleWindow();

#ifndef _DEBUG

ShowWindow(chwnd,SW_HIDE);

#endif

CalcPara(name,64*sizeof(wchar_t));

HWND hwnd=InitWindow();

RECT rect;

int width,height;

InitBitmap(hwnd,&GenFigure);

RunWindow(hwnd);

}

这样,我们得到了一个“输入正确的名字则绘制心形”的程序。

运行效果如图。

输入错误的名字

输入正确的名字

至此,我该滚去写作业了。

python输入一个人的名字_怎样用c语言做到输入一个人的名字才会输出一个心?相关推荐

  1. Python编程语言学习:python语言中快速查询python自带模块函数的用法及其属性方法、如何查询某个函数关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略

    Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法.如何查询某个函数&关键词的用法.输出一个类或者实例化对象的所有属性和方法名之详细攻略 ...

  2. python跳回循环开始位置_如何将程序从用户输入循环回起始位置?

    我刚刚开始使用python.我做的第一个程序是一个提示计算器,我已经做了三个版本来重写和添加更多.我想编写的下一部分代码是一个循环,它提示一个是或否问题.当"是"时,我希望程序循环 ...

  3. wpf的tabcontrol获取当前选中的名字_技巧:ANSA中如何快速批量修改PID名字

     在ANSA软件中进行完前处理画网格后经常需要对PID的名字进行修改比如:在名字前面增加车型代码在名字后面增加零部件厚度在名字后面增加零件的材料名称对名字中的特殊字符进行替换...遇上只有一两个名称要 ...

  4. python编程计算1!+2!+...+10!_如何用C语言编程计算 1!+2!+3!+…+10!?

    解决这个问题,首先要明白阶乘. n!=n*(n-1)*(n-2)*--*1:就是自己乘以自己减一,一直乘到一. 循环实现 这个过程必定是一系连续相乘的过程,一直重复着"乘"这个动作 ...

  5. easyloging 获取日志文件名字_愉快地学Java语言:第十五章 断言与日志

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java核心技术基础知识卷I>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇 ...

  6. Python代码列主元消去法matlab编程_工业机器人用什么语言编程的?

    曾经有很多小伙伴一直问,工业机器人编程用的是什么语言啊?这次给大家总结一下机器人编程中常用的语言. 1.硬件描述语言(HDLs) 硬件描述语言一般是用来描述电气的编程方式.这些语言对于一些机器人专家来 ...

  7. css3禅密花园叫什么名字_新生儿起名:2021元旦出生男孩叫什么名字

    2021年元旦节又是新的一年开始,在这辞旧迎新的日子里出生的男孩,都带有极好的寓意兆头,父母们如果能顺借此时机,取一个具有出生纪念意义的名字,那必然能让男孩的成长有着不同与众的历程.2021元旦出生男 ...

  8. mysql中更改数据库名字_【实操篇】_MySQL如何更改数据库名字?

    [前言] 来了一需求,开发组前项目前期开发时创建了一个测试库,存储引擎使用的是innodb:此库DataBase/Schema存放了一些表和索引,并无存储过程.视图.触发器.函数等:因名字和生产库名称 ...

  9. python面向对象编程结题报告_中国大学 MOOC_Python语言程序设计_章节测验答案

    中国章节[单选题]一产妇临产10小时,肛查宫口已开全,先露为头,棘下4cm,此时产力组成是下列哪种情况 参考答案如下 大学答案[判断题]草船借箭说明周瑜鲁肃和曹操的才智远远不如诸葛亮.( )程序测验[ ...

最新文章

  1. java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁
  2. 一条简单的 SQL 执行超过1000ms,纳尼?
  3. 15个Google面试题以及答案~~~~你会几个?
  4. Spark _16 _SparkUIMaster HA
  5. php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]
  6. (转)从开发小白到音视频专家
  7. JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
  8. 适合做个人博客网站的一套静态页面模板,非常不错哦
  9. android GitLab使用教程
  10. umts是移动还是联通_网络模式中的UMTS是什么意思?
  11. 批量ping检测主机
  12. 5阶魔方阵c语言程序设计,五阶魔方阵源代码c语言时课程设计.docx
  13. 计算机组成与体系结构(一)
  14. 【数位板常见问题】压感笔为什么没有压感了
  15. 什么样的人适合做外贸?
  16. 往服务器上传文件的软件,上传云服务器文件的软件
  17. XMind导入Markdown(利用Typora导出opml)
  18. 运维工程师必须掌握的shell技术实战内容
  19. Mask rcnn 代码复现
  20. Linux拷贝U盘文件(命令行)

热门文章

  1. 设置背景图片模糊,内容不模糊
  2. (七)JS基础知识四(搞定异步)【三座大山之三,必考!!!】
  3. 怎么判断适合学java_如何知道自己是否适合学习java开发
  4. SAFE: Similarity-Aware Multi-Modal Fake News Detection-学习笔记
  5. Node.js 安装及配置
  6. elemet UI 中表格数据的排序操作
  7. vue项目和react项目中禁止eslint
  8. linux 添加开机自启动脚本
  9. JAVA爬虫Jsoup,抓取房价
  10. JS编写一个函数,实现传入一个不定长度字符串,查找出重复次数前n名的字符并分别统计其次数