⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ec.c

📁 表达式计算器
💻 C
字号:
# include <windows.h>
# include "resource.h"
# include "expc.c"
BOOL CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmd,int nShowCmd)
{
	DialogBox(hInst,MAKEINTRESOURCE(IDD_MAINDIALOG),NULL,(DLGPROC)WndProc);
   return 0;
}

BOOL CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
//	UINT i=0,j=0;
	static char buff[MAXLEN];
	int len;
	double result;
	static HWND hWndeditcontent;
	static HWND hWndeditexp;
	static HWND hWndTopMost;
	static int TopMostFlag=0;
	


	DWORD i,j,lPos=0;
		   DWORD lRowCnt;
//		   DWORD lColCnt;
		   LPBYTE lpClip,lpGlobalMemory;
		   DWORD dwLength;
           HANDLE hClipMemory,hGlobalMemory;
    DWORD m,n;
    DWORD dwPos[5000],dwPrePos[5000];

	switch(uMsg)
	{
	case WM_INITDIALOG:
		hWndeditcontent=GetDlgItem(hWnd,IDC_EDITCONTENT);
		hWndeditexp=GetDlgItem(hWnd,IDC_EDITEXP);
        hWndTopMost=GetDlgItem(hWnd,IDTOPMOST);
		return TRUE;

	case WM_COMMAND:
    
		switch(LOWORD(wParam))
		{
		case IDCALC:
			len=GetDlgItemText(hWnd,IDC_EDITEXP,buff,MAXLEN);
			if (len>0)
			{
                if (lstrcmpi(buff,"help")==0)
				{
					SendMessage(hWndeditcontent,
				                EM_REPLACESEL,
				                FALSE,
				                (LPARAM)"运算符:加+ ,减 - ,乘 * ,除/ ,幂 ^ ,取模% 。\r\n支持的函数:\r\n abs,acos,asin,atan,cos,\r\ncosh,exp,log,log10,sin,\r\nsinh,tan,tanh,sqrt,ceil,floor\r\n");
					return TRUE;
				}
                
				if (lstrcmpi(buff,"clear")==0)
				{
					SendMessage(hWndeditcontent,
				                EM_REPLACESEL,
				                FALSE,
				                (LPARAM)"");
					return TRUE;
				}

				
				buff[len]='\0';
				result=calcExp(buff);
				buff[len]='=';
				if (expcerr!=0)
				{
					buff[len+1]='\0';
					SendMessage(hWndeditcontent,EM_REPLACESEL,TRUE,(LPARAM)(LPCTSTR)buff);	
					SendMessage(hWndeditcontent,EM_REPLACESEL,FALSE,(LPARAM)expcerrmsg[expcerr]);
					SendMessage(hWndeditcontent,EM_REPLACESEL,FALSE,(LPARAM)"\r\n");
					return TRUE; 
				}
							
				sprintf(&buff[len+1],"%.12g",result);

				for(i=0;i<250;i++)
					SendMessage(hWndeditcontent,WM_KEYDOWN,(WPARAM)(VK_DOWN),(LPARAM)0);	
				SendMessage(hWndeditcontent,EM_REPLACESEL,TRUE,(LPARAM)(LPCTSTR)buff);	
				SendMessage(hWndeditcontent,EM_REPLACESEL,FALSE,(LPARAM)"\r\n");

			}
			return TRUE;
			
		case IDTOPMOST:
			if (TopMostFlag)
			{
			    SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
			    SetWindowText(hWndTopMost,"总在最前面");
				TopMostFlag=0;
			}
			else
			{
			    SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
			    SetWindowText(hWndTopMost,"不在最前面");
			    TopMostFlag=1;
			}
			return TRUE;

	   	case IDROWTOCOL:  /*剪贴板内容行列互置*/

           if (!OpenClipboard(hWnd))
		   {
			   MessageBox(hWnd,"不能打开剪粘板!","提示",MB_OK);
			   return TRUE;
		   }
           
		   hClipMemory=GetClipboardData(CF_TEXT);
           if(hClipMemory==NULL)
		   {
		       CloseClipboard();
			   MessageBox(hWnd,"不能获得剪切板数据!","提示",MB_OK);
               return TRUE;
		   }
		   
		   lpClip=(LPBYTE)GlobalLock(hClipMemory);
           dwLength=GlobalSize(hClipMemory);
           
           /*计算行数*/
		   j=0;
		   dwPrePos[0]=0;
		   for(i=0;i<dwLength && i<5000;i++)
		   {
               if (lpClip[i]==10)
			   {
				   if (j>0)
				   {
				     dwPrePos[j]=dwPos[j - 1]+1;
				   }
				   dwPos[j]= i;
				   j++;
			   }
			   if (j>=5000)
			   {
		            CloseClipboard();
				    MessageBox(hWnd,"行数过多!","提示",MB_OK);
                    return TRUE;
			   }
		   }
		   lRowCnt =j;

		   hGlobalMemory=GlobalAlloc(GHND|GMEM_DDESHARE,dwLength+lRowCnt*2);
	       if (hGlobalMemory==NULL)
		   {
		       
			   CloseClipboard();
			   MessageBox(hWnd,"不能分配内存!","提示",MB_OK);
               return TRUE;
		   }

           // 锁定内存,获得内存指针
           lpGlobalMemory=(LPBYTE)GlobalLock(hGlobalMemory);
		   
		   m=0;
		   i=0;
		   while (dwPrePos[i]<dwPos[i])
		   {
               for(i=0;i<lRowCnt;i++)
    		   {
    		      for(n=dwPrePos[i];n<dwPos[i];n++)
    			  {
 
					 if (lpClip[n]=='\t' || lpClip[n]=='\r')
    				 {
    					 if (i < lRowCnt -1)
						 {
						    lpGlobalMemory[m]='\t';
    			            m++;
						 }
						 break;
    				 }
    				 lpGlobalMemory[m]=lpClip[n];
    				 m++;
    			  }
    			  dwPrePos[i]=n+1;
    
    		   }
    		   i=0;
    		   lpGlobalMemory[m]='\r';
    		   m++;
    		   lpGlobalMemory[m]='\n';
    		   m++;
           }


		  GlobalUnlock(hClipMemory);
    
          if(EmptyClipboard()==0)
		  {
			  CloseClipboard();
			  GlobalFree(hGlobalMemory);
			  MessageBox(hWnd,"清空剪切板数据出错!","提示",MB_OK);
              return TRUE;
			  
		  }

          GlobalUnlock(hGlobalMemory);
          if(SetClipboardData(CF_TEXT,hGlobalMemory)==NULL)
		  {
			  CloseClipboard();
			  GlobalFree(hGlobalMemory);
			  MessageBox(hWnd,"设置剪切板数据出错!","提示",MB_OK);
			  return TRUE;
		  }
          CloseClipboard();
		  GlobalFree(hGlobalMemory);
		  return TRUE;
	

   		}
		break;

    case WM_CLOSE:
		EndDialog(hWnd,0);
		return TRUE;

	case WM_DESTROY:
		PostQuitMessage(0);
		return TRUE;
	}
return FALSE;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -