纯C语言用Windows api写画函数图像

!!!如有转载 请注明出处!!!

主要功能介绍:
1、输入函数的解析式,可以在窗口中画出解析式的函数图像。
2、解析式只能以x为自变量。
3、解析式目前只能写数字、括号、加减乘除四则运算(±*/),不能写乘方、开方、各种函数(三角函数、对数等等)。
4、输入解析式时,程序禁用中文输入法,也不能输入中文括号。.
5、输入解析式语法错误时,程序弹出对话框并告知哪里有错误,允许重新输入。
6、输入解析式的窗口在任务栏不显示。
7、输入解析式的窗口一旦打开,主窗口就不响应任何操作,直到输入解析式的窗口关闭。关闭以后,主窗口重画所有函数图像和x、y轴。
8、x、y轴为黑色,图像红色。

环境:
Windows10 64位,MinGW-POSIX-64位。

注:
1、若为32位系统,据说需要将SetWindowLongPtr换为SetWindowLong,里面参数GWLP_WNDPROC需要换为GWL_WNDPROC(我也没试过,所以不能那么肯定。大家可以自己试一试)

2、如果编译不通过,在makefile.bat中编译可执行文件的一行手动链接pthread库。

3、如果报错不支持WinMain函数入口,可以百度下载msys64(大概就是这么一个东西)来支持win32应用程序,至于如何安装百度都有,这里不赘述。

截图:






代码如下:

//libtranslateexpression.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>

#define SGR_MAX_EXPR 1024

#define CHECKFUNC_NO_ERROR				0x00
#define CHECKFUNC_FOUND_TIMEADDBR		0x01
#define CHECKFUNC_FOUND_TIMESUBBR		0x02
#define CHECKFUNC_FOUND_DIVADDBR		0x03
#define CHECKFUNC_FOUND_DIVSUBBR		0x04
#define CHECKFUNC_BRACKET_ERROR			0x05
#define CHECKFUNC_NONUMBERAFTERSIGN		0x06
#define CHECKFUNC_NONUMBERBEFORESIGN	0x07
#define CHECKFUNC_DECIMALPOINT_ERROR	0x08
#define CHECKFUNC_VARIBLEHASNOSIGN		0x09

BOOL CheckFuncExpr(const char* expr)
{
   
	if(strstr(expr,"*+(")!=NULL)	return CHECKFUNC_FOUND_TIMEADDBR;
    if(strstr(expr,"*-(")!=NULL)	return CHECKFUNC_FOUND_TIMESUBBR;
    if(strstr(expr,"/+(")!=NULL)	return CHECKFUNC_FOUND_DIVADDBR;
    if(strstr(expr,"/-(")!=NULL)	return CHECKFUNC_FOUND_DIVSUBBR;
    
	int i=0,bracket=0;
    for(;expr[i]!='\0';i++)
    {
   
		if(expr[i]=='(')	bracket++;
        if(expr[i]==')')	bracket--;
        if(bracket<0)		return CHECKFUNC_BRACKET_ERROR;
        if(expr[i]=='+' || expr[i]=='-')
        {
   
			if(expr[i+1]!='(' && expr[i+1]>'9' && expr[i+1]<'0' && expr[i+1]!='x')	return CHECKFUNC_NONUMBERAFTERSIGN;
        }
        if(expr[i]=='*' || expr[i]=='/')
        {
   
			if(i==0)																return CHECKFUNC_NONUMBERBEFORESIGN;
			if(expr[i+1]!='(' && expr[i+1]>'9' && expr[i+1]<'0' && expr[i+1]!='x')	return CHECKFUNC_NONUMBERAFTERSIGN;
            if(expr[i-1]!='(' && expr[i-1]>'9' && expr[i-1]<'0' && expr[i-1]!='x')	return CHECKFUNC_NONUMBERBEFORESIGN;
        }
        if(expr[i]=='.')
        {
   
			if(expr[i+1]<'0' && expr[i+1]>'9') return CHECKFUNC_DECIMALPOINT_ERROR;
            if(expr[i-1]<'0' && expr[i-1]>'9') return CHECKFUNC_DECIMALPOINT_ERROR;
        }
        if(expr[i]=='x')
        {
   
			if((expr[i+1]>'0' && expr[i+1]<'9') || expr[i+1]=='.') return CHECKFUNC_VARIBLEHASNOSIGN;
            if(i!=0)
				if((expr[i-1]>'0' && expr[i-1]<'9') || expr[i-1]=='.') return CHECKFUNC_VARIBLEHASNOSIGN;
        }
    }
    if(bracket!=0)
		return CHECKFUNC_BRACKET_ERROR;
    return CHECKFUNC_NO_ERROR;
}

BOOL CheckNum(double x)
{
   
	switch(fpclassify(x))
    {
   
	case FP_ZERO:return TRUE;
    case FP_NORMAL:return TRUE;
    default:return FALSE;
    }
}

void ReplaceAddSign(char* expr,char*out)
{
   
	memset(out,0,sizeof(char)*SGR_MAX_EXPR);
	char *k=expr;
	char *p=out;

	if(*expr!='+' && *expr!='-')
    {
   
		*p='+';p++;
        *p=*k;
    }

    while(*k!='\0')
    {
   
		if(*k!='+' && *k!='-')
        {
   
			*p=*k;p++;k++;
        }
        else
        {
   
			if(*(k-1)!='+' && *(k-1)!='-')*p=*k;
            if(*k=='-' && (*(k-1)=='+' || *(k-1)=='-'))*p=(*p=='+')?'-':'+';
            if(*(k+1)!='+' && *(k+1)!='-')p++;
            k++;
        }
    }
    p=out;
    while(*p!='\0')
    {
   
		if(*p>='9' && *p<='0' 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值