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

📄 main.cpp

📁 自己写的二进制编辑器.二进制阅读器.类似于ultra Edit. 功能:decimal,hexadecimal,char: 十进制显示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "hex_dec_read.h"

enum FINDMODE{CHAR_FIND,DECIMAL_FIND,HEXADECIMAL_FIND};
FINDMODE g_nFindMode=DECIMAL_FIND;

char g_szFileName[MAX_PATH]="";
char *g_p=NULL,*g_end;
char g_ch[200],g_chFind[200],g_chReplace[200];
BYTE g_pBy[200];

int g_nIndicate=0,g_nItem=0,g_nCount=0, g_nFileLen=0 ,g_nColor=0 ,
g_nPosFind=0,g_nTickTemp=0,g_nTickTotal=0,g_nCh,g_nChReplace;
HWND g_hWndList,g_hWndProgress;
HANDLE g_hFile=NULL,g_hMap=NULL;
SCROLLINFO g_si;
RECT g_rcInvalid={0,100,800,500};
LPNMLISTVIEW g_lpnmlv;
BOOL g_bDecimal=TRUE,g_bForeward=TRUE,g_bModified=FALSE,g_bTickTotal=TRUE;

//HWND g_hDlgFind=NULL;

BOOL __stdcall Dialog_Main(HWND ,UINT,WPARAM,LPARAM);
BOOL __stdcall Dialog_Modify(HWND ,UINT,WPARAM,LPARAM);
BOOL __stdcall Dialog_Find_Replace(HWND ,UINT,WPARAM,LPARAM);
BOOL __stdcall Dialog_Replace_All(HWND ,UINT,WPARAM,LPARAM);

void idc_btn_replaceall(HWND hDlg);
int idc_find_forebackward(HWND hDlg);
int idc_find_foreward(HWND hDlg);
int idc_find_backward(HWND hDlg);
void idc_find_char(HWND hDlg);
void idc_find_hexadecimal(HWND hDlg);
void idc_find_decimal(HWND hDlg);
void idc_tick_total(HWND hDlg);
int idc_btn_replace(HWND hDlg);
int idc_btn_replace_all(HWND hDlg);

DWORD WINAPI ThreadProc(LPVOID);
DWORD  idc_update(void);

int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
	::InitCommonControls();
	//::InitializeCriticalSection(&g_cs);
	::DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,Dialog_Main,NULL);
	return 0;
}

BOOL __stdcall Dialog_Main(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	static HMENU hMenu,hSubMenu;
	POINT point;
	switch(message)
	{
	case WM_INITDIALOG:
		{
			CheckDlgButton(hDlg,IDC_DECIMAL,BST_CHECKED);
			hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));
			hSubMenu=GetSubMenu(hMenu,0);
			
			g_si.cbSize=sizeof(g_si);
			g_si.fMask=SIF_RANGE | SIF_PAGE;
			g_si.nMin=0;
			g_si.nMax=0;
			g_si.nPage=0;
			SetScrollInfo(GetDlgItem(hDlg,IDC_SCROLLBAR1),SB_CTL,&g_si,TRUE);
			//InvalidateRect(hDlg,NULL,TRUE);
			//SetWindowIN
			
			PlaySound("logon.wav",NULL,SND_FILENAME |SND_ASYNC );
			SetClassLong(hDlg,GCL_HICON,
				(long)LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1)));
			::SetDlgItemText(hDlg,IDC_FILESIZE,"No File has been read");
			g_hWndProgress=GetDlgItem(hDlg,IDC_PROGRESS);
			::SendMessage(g_hWndProgress,PBM_SETRANGE,0,MAKELPARAM(0,30));
			::SendMessage(g_hWndProgress,PBM_SETSTEP,1,0);
			::SendMessage(g_hWndProgress,PBM_SETBKCOLOR,0,RGB(0,0,0xff));
			::SendMessage(g_hWndProgress,PBM_SETBARCOLOR,0,RGB(0xff,0xff,0));
			::ShowWindow(g_hWndProgress,SW_HIDE);
			
			g_hWndList=::GetDlgItem(hDlg,IDC_LIST);
			::SendMessage(g_hWndList,LVM_SETEXTENDEDLISTVIEWSTYLE,
				0,LVS_EX_GRIDLINES
				|LVS_EX_FULLROWSELECT
				|LVS_EX_ONECLICKACTIVATE
				|LVS_EX_TWOCLICKACTIVATE
				|LVS_EX_TRACKSELECT
				|LVS_EX_MULTIWORKAREAS
				/*|LVS_EX_UNDERLINECOLD*/);
				LVCOLUMN column;
			column.mask=LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
			column.fmt=LVCFMT_CENTER;
			column.cx=100;
			column.pszText="BytesCt";
			::SendMessage(g_hWndList,LVM_INSERTCOLUMN,0,(LPARAM)&column);
			char ch[20];
			memset(ch,0,20);
			for(int i=1;i<=10;i++)
			{
				wsprintf(ch,"%d",i);
				column.pszText=ch;
				column.cx=40;
				::SendMessage(g_hWndList,LVM_INSERTCOLUMN,i,(long)&column);
			}
			column.pszText="";
			column.cx=20;
			::SendMessage(g_hWndList,LVM_INSERTCOLUMN,11,(LPARAM)&column);
			for(int j=1;j<=10;j++)
			{
				wsprintf(ch,"c%d",j);
				column.pszText=ch;
				column.cx=32;
				::SendMessage(g_hWndList,LVM_INSERTCOLUMN,j+11,(long)&column);
			}
		}
		break;
		
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case IDOK:
				{
					if(g_hFile)
					{
						CloseHandle(g_hFile);
						g_hFile=NULL;
					}
					if(g_hMap)
					{
						UnmapViewOfFile(g_p);
						CloseHandle(g_hMap);
						g_hMap=NULL;
					}
					::EndDialog(hDlg,IDOK);
				}
				break;
			case IDCANCEL:
				if(g_hFile)
				{
					CloseHandle(g_hFile);
					g_hFile=NULL;
				}
				if(g_hMap)
				{
					UnmapViewOfFile(g_p);
					CloseHandle(g_hMap);
					g_hMap=NULL;
				}
				::EndDialog(hDlg,IDCANCEL);
				break;
			case IDC_BTN_REPLACE:
				{
					DialogBox(GetModuleHandle(NULL),LPCTSTR(IDD_DIALOG_REPLACE_ALL),
						hDlg,Dialog_Replace_All);
				}
				break;
			case IDC_BTN_READ:
				{
					g_nFileLen=g_nItem=g_nCount=0;
					::SendMessage(g_hWndList,LVM_DELETEALLITEMS,0,0);
					CreateListItems();
					//HANDLE h=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
					//CloseHandle(h);
				}
				break;
				/***************************************************************************************/
			case IDC_BTN_FIND:
				{
					//g_nFileLen=g_nItem=g_nCount=0;
					DialogBox(GetModuleHandle(NULL),LPCTSTR(IDD_DIALOG_FIND_REPLACE),
						hDlg,Dialog_Find_Replace);
					
				}
				break;
				/****************************************************************************************/
			case IDC_COPY:
				{
					MessageBox(hDlg,"hDlg copy menu","popup menu",MB_OK);
				}
				break;
			case IDC_CUT:
				{
					MessageBox(hDlg,"hDlg cut menu","popup menu",MB_OK);
				}
				break;
			case IDC_DECIMAL:
				{
					int nRet=::IsDlgButtonChecked(hDlg,IDC_DECIMAL);
					if(nRet==BST_CHECKED)
					{
						g_bDecimal=TRUE;
						g_nFindMode=DECIMAL_FIND;
					}
					InsertListItems();
				}
				break;
			case IDC_HEXADECIMAL:
				{
					int nRet=::IsDlgButtonChecked(hDlg,IDC_HEXADECIMAL);
					if(nRet==BST_CHECKED)
					{
						g_bDecimal=FALSE;
						g_nFindMode=HEXADECIMAL_FIND;
					}
					InsertListItems();
				}
				break;
			}
			break;			
		}
		break;
	case WM_NOTIFY:
		{
			LPNMHDR pnmh = (LPNMHDR) lParam; 
			LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam;
			switch(pnmh->code)
			{
			case NM_CLICK:
				{
					char ch[200];
					wsprintf(ch," id:%d subi %d",lpnmlv->iItem ,lpnmlv->iSubItem );
					//MessageBox(hDlg,ch,"notify",MB_OK);
					//ListView_SetItemState(g_hWndList,  lpnmlv->iItem, UINT state, UINT mask);	
					LVITEM lvi;
					lvi.mask=LVIF_TEXT ;//|LVIF_STATE ;
					lvi.state=LVIS_FOCUSED ;
					lvi.iItem=lpnmlv->iItem;
					lvi.iSubItem=lpnmlv->iSubItem;
					lvi.pszText=ch;
					SendMessage(g_hWndList,LVM_SETITEM,0,(long)&lvi);
				}
				return 0;
			case NM_RCLICK:
				{
					g_lpnmlv=lpnmlv;
					point=lpnmlv->ptAction;
					ClientToScreen(g_hWndList,&point);
					BOOL bIdRet=TrackPopupMenu(hSubMenu,TPM_RIGHTBUTTON|TPM_LEFTALIGN|TPM_RETURNCMD,
						point.x,point.y,0,hDlg,NULL);
					switch (bIdRet)
					{
					case IDC_CUT:
						MessageBox(g_hWndList,"g_hWndList cut","pop",MB_OK);
						break;
					case IDC_COPY:
						MessageBox(g_hWndList,"g_hWndList copy","pop",MB_OK);
						break;
					case IDC_MODIFY:
						DialogBox(GetModuleHandle(NULL),LPCTSTR(IDD_DIALOG_MODIFY),
							g_hWndList,Dialog_Modify);
						break;
					}
				}
				return 0;
			}
			
		}
		break;
	case WM_RBUTTONDOWN:
		{
			point.x=LOWORD(lParam);
			point.y=HIWORD(lParam);
			ClientToScreen(hDlg,&point);
			TrackPopupMenu(hSubMenu,TPM_RIGHTBUTTON|TPM_LEFTALIGN,//|TPM_RETURNCMD,
				point.x,point.y,0,hDlg,NULL);
			return 0;
		}
		break;
	case WM_KEYDOWN:
		{
			//	SetFocus(GetDlgItem(hDlg,IDC_SCROLLBAR1));
			switch(wParam)
			{
			case VK_HOME:
				SendMessage(hDlg,WM_VSCROLL,SB_TOP,0);
				break;
			case VK_END:
				SendMessage(hDlg,WM_VSCROLL,SB_BOTTOM,0);
				break;
			case VK_PRIOR:
				SendMessage(hDlg,WM_VSCROLL,SB_PAGEUP,0);
				break;
			case VK_NEXT:
				SendMessage(hDlg,WM_VSCROLL,SB_PAGEDOWN,0);
				break;
			case VK_UP:
				SendMessage(hDlg,WM_VSCROLL,SB_LINEUP,0);
				break;
			case VK_DOWN:
				SendMessage(hDlg,WM_VSCROLL,SB_LINEDOWN,0);
				break;
			}
			break;
		}
		break;
		
	case WM_VSCROLL:
		{	
			//SCROLLINFO si;
			g_si.cbSize=sizeof(g_si);
			g_si.fMask=SIF_ALL;
			GetScrollInfo(GetDlgItem(GetForegroundWindow(),IDC_SCROLLBAR1),SB_CTL,&g_si);
			/*if(si.nPos!=g_si.nPos)
			{
			SetScrollInfo(GetDlgItem(GetForegroundWindow(),IDC_SCROLLBAR1),SB_CTL,&g_si,TRUE);
		}*/
			switch(LOWORD(wParam))
			{
			case SB_THUMBPOSITION:
			case SB_THUMBTRACK:
				g_si.nPos=g_si.nTrackPos;
				break;
			case SB_PAGEDOWN:
				g_si.nPos+=g_si.nPage;
				break;
			case SB_LINEDOWN:
				g_si.nPos+=10;
				break;
			case SB_PAGEUP:
				g_si.nPos-=g_si.nPage;
				break;
			case SB_LINEUP:
				g_si.nPos-=10;
				break;
			case SB_TOP:
				g_si.nPos=g_si.nMin;
				break;
			case SB_BOTTOM:
				g_si.nPos=g_si.nMax;
				break;
			default:
				break;
			}
			g_si.fMask=SIF_POS;
			SetScrollInfo(GetDlgItem(GetForegroundWindow(),IDC_SCROLLBAR1),SB_CTL,&g_si,TRUE);
			GetScrollInfo(GetDlgItem(GetForegroundWindow(),IDC_SCROLLBAR1),SB_CTL,&g_si);
			SendMessage(hDlg,WM_PAINT,0,0);
			if(g_nFileLen>0)
			{
				//MessageBox(hDlg,"NO File read!","exclaming",MB_OK);
				g_nItem=g_si.nPos/10;
				InsertListItems();
				//g_nItem=0;
				break;
			}
			
		}
		break;
		}
		return 0;
}



BOOL __stdcall Dialog_Modify(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	//LPNMLISTVIEW lpnmlv;
	char ch[200];
	LVITEM lvi;			
	lvi.mask=LVIF_TEXT ;//|LVIF_STATE ;
	lvi.iItem=g_lpnmlv->iItem;
	lvi.iSubItem=g_lpnmlv->iSubItem;
	lvi.pszText=ch;
	lvi.cchTextMax=200;
	switch(message)
	{
	case WM_INITDIALOG:
		{
			// lpnmlv = (LPNMLISTVIEW) lParam;
			char pTemp[200];
			char psz[200];
			if(!SendMessage(g_hWndList,LVM_GETITEM,0,(long)&lvi)) 
				MessageBox(NULL,"failed to get item text","failure",MB_OK);
			wsprintf(pTemp," id:%d subi %d",g_lpnmlv->iItem ,g_lpnmlv->iSubItem );
			wsprintf(psz,"%s : %s",pTemp,ch);
			SetDlgItemText(hDlg,IDC_OLDDATA,psz);
		}
		break;
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case IDOK:
				GetDlgItemText(hDlg,IDC_NEWDATA,ch,200);
				if(strlen(ch)>=4 || strlen (ch)==0)
				{
					MessageBox(hDlg,"You input a data is more than 255,or a NULL ","Illegel data",
						MB_OK);
					//EndDialog(hDlg,IDOK);
					return 0;
				}
				BYTE byNew;
				switch (strlen(ch))
				{
				case 1:
					{
						if(ISNUM(ch[0]))
						{
							byNew=CHARTONUM(ch[0]);
						}
						else
						{
							MessageBox(hDlg,"You input a illegel number ","Illegel data",
								MB_OK);
							//EndDialog(hDlg,IDOK);
							return 0;
						}
					}
					break;
				case 2:
					if(ISNUM(ch[0]) && ISNUM(ch[1]))
					{
						byNew=CHARTONUM(ch[0])*10+CHARTONUM(ch[1]);
					}
					else
					{
						MessageBox(hDlg,"You input a illegel number ","Illegel data",
							MB_OK);
						//EndDialog(hDlg,IDOK);
						return 0;
					}
					break;
				case 3:
					if(ISNUM(ch[0]) && ISNUM(ch[1]) && ISNUM(ch[2]))
					{
						byNew=CHARTONUM(ch[0])*100+CHARTONUM(ch[1])*10+CHARTONUM(ch[2]);
					}
					else
					{
						MessageBox(hDlg,"You input a illegel number ","Illegel data",
							MB_OK);
						//EndDialog(hDlg,IDOK);
						return 0;
					}
					
				}
				int iRet;
				iRet=MessageBox(hDlg,"Your MODIFICATION will be written to the file,select OK if you want to ,otherwise select CANCEL to prevent it ","Modify or not?",
					MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2);
				if(IDOK==iRet)
				{
					*(BYTE*)(g_p+(g_nItem+g_lpnmlv->iItem)*10+g_lpnmlv->iSubItem-1)=byNew;
					lvi.pszText=ch;
					SendMessage(g_hWndList,LVM_SETITEM,0,(long)&lvi);
				}
				EndDialog(hDlg,IDOK);
				break;
				case IDCANCEL:
					EndDialog(hDlg,IDCANCEL);
					break;
			}
		}
		break;
	}
	return 0;
}

BOOL __stdcall Dialog_Find_Replace(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	
	switch(message)
	{
	case WM_INITDIALOG:
		{			
			switch(g_nFindMode)
			{
			case DECIMAL_FIND:
				{
					CheckDlgButton(hDlg,IDC_FIND_DECIMAL,BST_CHECKED);
				}
				break;
			case HEXADECIMAL_FIND:
				{
					CheckDlgButton(hDlg,IDC_FIND_HEXADECIMAL,BST_CHECKED);
				}
				break;
			case CHAR_FIND:
				{
					CheckDlgButton(hDlg,IDC_FIND_CHAR,BST_CHECKED);
				}
				break;
			}
			g_bModified=g_bTickTotal=TRUE;
			g_nTickTemp=g_nTickTotal=g_nPosFind=0;
			
			
//			MoveWindow(hDlg,100,400,750,200,TRUE);//2008.4.12
			SetWindowText(GetDlgItem(hDlg,IDC_STR_FIND),g_ch);
			GetDlgItemText(hDlg,IDC_STR_FIND,g_ch,sizeof(g_ch));
			char ch[200];
			wsprintf(ch,"g_nPosFind IS : %012d bytes,%08d K,%04d M,      g_nTickTemp  IS : %05d",
				g_nPosFind,g_nPosFind/1024,g_nPosFind/(1024*1024),g_nTickTemp);
			SetDlgItemText(GetParent(hDlg),IDC_POS_FIND,ch);
			wsprintf(ch,"g_nFileLen  IS : %012d bytes,%08d K,%04d M,      g_nTickTotal   IS : %05d",
				g_nFileLen,g_nFileLen/1024,g_nFileLen/(1024*1024),g_nTickTotal);
			
			SetDlgItemText(GetParent(hDlg),IDC_FILESIZE,ch);
		}
		break;
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case IDOK:
				{
					GetDlgItemText(hDlg,IDC_STR_FIND,g_ch,sizeof(g_ch));
					EndDialog(hDlg,IDOK);
				}
				break;
			case IDCANCEL:
				{
					EndDialog(hDlg,IDCANCEL);
				}
				break;
			case IDC_TICK_TOTAL:
				{
					idc_tick_total(hDlg);
				}
				break;
			case IDC_UPDATE:
				{
					idc_update();
				}
				break;
			case IDC_FIND_DECIMAL:
				{
					idc_find_decimal(hDlg);
				}
				break;
			case IDC_FIND_HEXADECIMAL:
				{

					idc_find_hexadecimal(hDlg);
				}
				break;
			case IDC_FIND_CHAR:
				{
					idc_find_char(hDlg);
				}
				break;
			case IDC_BTN_REPLACE://2008.4.12
				{
					idc_btn_replace(hDlg);
				}
				break;
			case IDC_FIND_FOREWARD:
				{
					idc_find_foreward(hDlg);
				}
				break;
				
			case IDC_FIND_BACKWARD:	
				{
					idc_find_backward(hDlg);
				}
				break;
			}
		}
		break;
	}
	return FALSE;
}


DWORD WINAPI ThreadProc(LPVOID lpStart)
{
	
	SendMessage(g_hWndProgress,PBM_SETPOS,0,0);
	ShowWindow(g_hWndProgress,SW_SHOW);
	CreateListItems();
	ShowWindow(g_hWndProgress,SW_HIDE);
	return 0;
}
DWORD  idc_update()
{
	//MessageBox(NULL,g_ch,"TEXT_g_ch",MB_OK);

⌨️ 快捷键说明

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