📄 wintest.cpp
字号:
///////////////////////////////////////////////////////////////
//ccy 2004.9修改,支持if then else ;repeat until;及数组
///////////////////////////////////////////////////////////////
#include <windows.h>
#include <commdlg.h>
#include"zCompile.h"
#include "resource.h"
HINSTANCE hinst; //Recent Instance
OPENFILENAME ofn; //For Open File Dialog
FILE *fp; //For Open File
zCompile *cp; //编译器对象指针
int asmnum=0; //目标代码数量
int errnum=0; //错误数量
char buf[65536]; //I/O Buffer
char str[512]; //File Name Buffer
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK Mydialog(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hinst=hInstance;
DialogBox(hInstance, (LPCTSTR)IDD_MYDIALOG, 0, (DLGPROC)Mydialog);
return 0;
}
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
LRESULT CALLBACK Mydialog(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lParam)
{
int i;
switch(msg)
{
case WM_INITDIALOG:
buf[65535]=0; //结尾清0防止溢出
//str[0]=0; //Clear str[]
//Set Window Text Font
SendDlgItemMessage(hdlg,IDC_INPUT,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
SendDlgItemMessage(hdlg,IDC_ASM,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
SendDlgItemMessage(hdlg,IDC_ERR,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
//填充OPENFILENAME结构体
memset(&ofn,0,sizeof(OPENFILENAME)); //Clear it First
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hwndOwner=hdlg;
ofn.hInstance=hinst;
ofn.lpstrFilter="所有文件(*.*)\0*.*\0";
ofn.nMaxFile=511; //最大文件名缓冲区长度
ofn.lpstrFile=str; //使用临时字符串
ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
ofn.lpstrTitle="PL/0文件";
DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),0,(DLGPROC)About);
return 1;
case WM_COMMAND:
switch(LOWORD(wparam))
{
case ID_COMPILE:
SetCursor(LoadCursor(0,IDC_WAIT)); //Please wait...
GetDlgItemText(hdlg,IDC_INPUT,buf,65535); //Get PL/0 Text
cp=new zCompile; //Let's begin to compile...
cp->compile(buf); //Do the most complex part
errnum=cp->geterr(buf); //Get Error Text
SetDlgItemText(hdlg,IDC_ERR,buf); //Display it
asmnum=cp->getasm(buf); //Get ASM Text
SetDlgItemText(hdlg,IDC_ASM,buf); //Display it
delete cp; //The end of Compiling
SetCursor(LoadCursor(0,IDC_ARROW));
//Completed
break;
case ID_RUN:
if(!asmnum)
MessageBox(hdlg,"请先编译后再运行!","错误",MB_ICONERROR);
else
if(errnum)
MessageBox(hdlg,"请先改正错误后再运行!","错误",MB_ICONERROR);
else
{
fp=fopen("temp.pl0","wb"); //Write to temp file
fprintf(fp,"%u\r\n",asmnum);
fwrite(buf,1,strlen(buf),fp);
fclose(fp);
WinExec("pl0run",1); //Call PL/0 Interpreter
}
break;
case ID_OPEN:
if(!GetOpenFileName(&ofn)) break;
//str[512]=0; //防止溢出
if(!(fp=fopen(ofn.lpstrFile,"rb")))
MessageBox(hdlg,str,"无法打开文件!",MB_ICONERROR);
else
{
fseek(fp,0,SEEK_END);
if((i=ftell(fp))>65535)
MessageBox(hdlg,"文件过长(>=64K)!","错误",MB_ICONERROR);
else
{
fseek(fp,0,SEEK_SET);
fread(buf,1,i,fp);
buf[i]=0; //防止溢出
SetDlgItemText(hdlg,IDC_INPUT,buf);
}
fclose(fp);
}
break;
case ID_NEW:
memset(buf,0,sizeof(buf));
SetDlgItemText(hdlg,IDC_INPUT,buf);
break;
case ID_SAVE:
if(!GetSaveFileName(&ofn))break;
str[512]=0;
if(!(fp=fopen(ofn.lpstrFile,"wb")))
MessageBox(hdlg,str,"无法创建文件!",MB_ICONERROR);
else
{
GetDlgItemText(hdlg,IDC_INPUT,buf,65535);
fprintf(fp,"%s",buf);
}
fclose(fp);
break;
case ID_ABOUT:
DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),0,(DLGPROC)About);
}
return 1;
case WM_CLOSE:
EndDialog(hdlg,0);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -