📄 desdemo.cpp
字号:
#include "resource.h"
#include <stdio.h>
#include <windowsx.h>
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>
#include <Shlobj.h>
#include "DES.h"
#pragma comment(lib,"comctl32.lib")
#define WM_WRITETEXT WM_USER+100
#define WM_PARENTMOVED WM_USER+101
FILE *fPlainFile,*fCipherFile,*fDecryptedFile;
TCHAR pszPlainText[128];//明文缓冲,未初始化,在.bss段中
PTSTR pszTitle=(PTSTR)HeapAlloc(GetProcessHeap(),0,128);//窗口标题,位于堆中
PTSTR pszFullName=(PTSTR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);//文件名
PTSTR pszCipherName=(PTSTR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);//密文文件名
PTSTR pszRecoveredName=(PTSTR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);//恢复明文文件名
char pszPathName[MAX_PATH];//恢复明文文件名
BOOL bSaved;//保存状态
BOOL bEdited;//编辑状态
PTSTR pszExtend="txt";//保存文件的默认扩展名
HMENU hMenu;//窗口菜单句柄
MENUITEMINFO mii;//菜单项结构
HWND hStatusBar;//主窗口状态栏
HWND hCipherStatusBar;
HWND hDecryptedStatusBar;
HWND hCipherDlg;//密文显示对话框
HWND hDecryptedDlg;//解密对话框
HWND hParent;//父窗口
HWND hAbout;
RECT rect;//窗口矩形
int cx,cy;//窗口位置
bool bCipherShow=false;//密文窗口显示状态
bool bDecryptedShow=false;
bool bSource=false;//密文源设置.false:文件,true:文本输入
void OnAbout_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
switch(id)
{
case IDCANCEL:
EndDialog(hWnd,id);
break;
}
}
BOOL OnAbout_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
RECT rect1;
GetWindowRect(GetParent(hWnd),&rect);
GetWindowRect(hWnd,&rect1);
SetWindowPos(hWnd,NULL,rect.left+(rect.right-rect.left-rect1.right+rect1.left)/2,rect.top+(rect.bottom-rect.top-rect1.bottom+rect1.top)/2,0,0,SWP_NOSIZE);
return false;
}
INT_PTR WINAPI About_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{//消息处理分支
case WM_COMMAND://处理命令消息
OnAbout_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_DECRYPTED),HIWORD(wParam));
break;
case WM_INITDIALOG://处理对话框初始化消息
OnAbout_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
break;
}
return 0;
}
void OnKey_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
switch(id)
{
case IDCANCEL:
EndDialog(hWnd,id);
break;
case IDOK:
char key[16];
GetDlgItemText(hWnd,IDC_KEY,key,16);
if(strlen(key)>8)
{
MessageBox(hWnd,"Too long key,you should input 8 bytes!","Key error",MB_OK);
HWND hEdit=GetDlgItem(hWnd,IDC_KEY);
SetFocus(hEdit);
SendMessage(hEdit,EM_SETSEL,0,-1);
}
else
{
memcpy(uKey,key,8);
GenerateSubkey(uKey,uSubkeys);//生成子密钥表
AntiSubkey(uSubkeys,uAntiSubkeys);//生成逆子密钥表
SendMessage(GetParent(hWnd),WM_PAINT,0,0);
//MessageBox(hWnd,(PTSTR)uKey,"here",MB_OK);
EndDialog(hWnd,id);
}
break;
}
}
BOOL OnKey_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
char key[9];
memcpy(key,uKey,8);
key[8]='\0';
SetWindowText(GetDlgItem(hWnd,IDC_KEY),(LPSTR)key);
return false;
}
INT_PTR WINAPI Key_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{//消息处理分支
case WM_COMMAND://处理命令消息
OnKey_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_DECRYPTED),HIWORD(wParam));
break;
case WM_INITDIALOG://处理对话框初始化消息
OnKey_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
break;
case WM_PAINT:
HDC hdc=GetDC(hWnd);
SetBkMode(hdc,TRANSPARENT);
TextOut(hdc,12,-2,"Set key:",8);
break;
}
return 0;
}
void OnDecrypted_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
switch(id)
{
case IDCANCEL:
bDecryptedShow=false;
EndDialog(hWnd,id);
break;
}
}
BOOL OnDecrypted_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
hDecryptedStatusBar=CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_BORDER,"解密明文:",hWnd,0);
SendMessage(hDecryptedStatusBar,SB_SETMINHEIGHT,25,0);
return false;
}
INT_PTR WINAPI Decrypted_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{//窗口处理函数
switch(uMsg)
{//消息处理分支
case WM_COMMAND://处理命令消息
OnDecrypted_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_DECRYPTED),HIWORD(wParam));
break;
case WM_INITDIALOG://处理对话框初始化消息
OnDecrypted_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
break;
case WM_PARENTMOVED:
RECT rect1;
hParent=GetParent(hWnd);
GetWindowRect(hParent,&rect);
GetWindowRect(hWnd,&rect1);
if(bCipherShow==true)
SetWindowPos(hWnd,NULL,rect.right,rect.top+rect1.bottom-rect1.top,0,0,SWP_NOSIZE);
else
SetWindowPos(hWnd,NULL,rect.right,rect.top,0,0,SWP_NOSIZE);
break;
case WM_WRITETEXT:
HWND hDecrypted=GetDlgItem(hWnd,IDC_DECRYPTED);
SetWindowText(hDecrypted,"");
fDecryptedFile=fopen((PTSTR)lParam,"rb");
while(!feof(fDecryptedFile))
{
fgets(pszPlainText,128,fDecryptedFile);//读一行
SendMessage(hDecrypted,EM_SETSEL, -1,-1);//选择文本框末尾
SendMessage(hDecrypted,EM_REPLACESEL,0, (LPARAM)pszPlainText);//用读到的一行字符串替换末尾的空字符
memset(pszPlainText,0,128); //清缓冲
}
char szStatusText[MAX_PATH]="解密明文:";
strcat(szStatusText,(PTSTR)lParam);
SendMessage(hDecryptedStatusBar,SB_SETTEXT,0,(LPARAM)(LPSTR)szStatusText);
fclose(fDecryptedFile);
break;
}
return 0;
}
void OnCipher_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
switch(id)
{
case IDCANCEL:
bCipherShow=false;
if(IsWindow(hDecryptedDlg))
SendMessage(hDecryptedDlg,WM_PARENTMOVED,(WPARAM)GetParent(hWnd),0);
EndDialog(hWnd,id);
break;
}
}
BOOL OnCipher_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
hCipherStatusBar=CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_BORDER,"密文:",hWnd,0);
SendMessage(hCipherStatusBar,SB_SETMINHEIGHT,25,0);
return false;
}
INT_PTR WINAPI CipherDlg_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{//窗口处理函数
switch(uMsg)
{//消息处理分支
case WM_COMMAND://处理命令消息
OnCipher_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),HIWORD(wParam));
break;
case WM_INITDIALOG://处理对话框初始化消息
OnCipher_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
break;
case WM_PARENTMOVED:
hParent=(HWND)wParam;
rect;
GetWindowRect(hParent,&rect);
SetWindowPos(hWnd,NULL,rect.right,rect.top,0,0,SWP_NOSIZE);
break;
case WM_WRITETEXT:
HWND hCipherEdit=GetDlgItem(hWnd,IDC_CIPHERTEXT);
SetWindowText(hCipherEdit,"");
fCipherFile=fopen((PTSTR)lParam,"rb");
while(!feof(fCipherFile))
{
fgets(pszPlainText,128,fCipherFile);//读一行
SendMessage(hCipherEdit,EM_SETSEL, -1,-1);//选择文本框末尾
SendMessage(hCipherEdit,EM_REPLACESEL,0, (LPARAM)pszPlainText);//用读到的一行字符串替换末尾的空字符
memset(pszPlainText,0,128); //清缓冲
}
char szStatusText[MAX_PATH]="密文:";
strcat(szStatusText,(PTSTR)lParam);
SendMessage(hCipherStatusBar,SB_SETTEXT,0,(LPARAM)(LPSTR)szStatusText);
fclose(fCipherFile);
break;
}
return 0;
}
void On_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
HWND hEdit=(HWND)GetDlgItem(hWnd,IDC_PLAINTEXT);//得到窗口文本框的句柄
switch(id)
{
case IDC_PLAINTEXT://EN_CHANGE通知消息,当某编辑框文本被改变时候发送,其父窗口将收到
if(nCodeNotify==EN_CHANGE)//WM_COMMAND消息,WPARAM高字为EN_CHANGE通知消息,低字为
bEdited=true; //控件ID,LPARAM参数为编辑框的句柄
break;
case IDCANCEL:
if(bSaved==FALSE && bEdited==TRUE)
{//如果被保存过并且未保存则询问是否要保存
if((MessageBox(hWnd,"File hasn't been saved,save it? (Y/N)","Query",MB_OKCANCEL))==IDOK)
{
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDF_SAVE_AS,nCodeNotify),lParam);
}
}
EndDialog(hWnd,id);
break;
case IDF_EXIT:
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDCANCEL,nCodeNotify),lParam);
break;
case IDF_NEW:
EnableWindow(hEdit,true);
pszTitle="Untitled";
SetWindowText(hWnd,pszTitle);
SetDlgItemText(hWnd,IDC_PLAINTEXT,"");
break;
case IDF_CLOSE:
EnableWindow(hEdit,false);
SetDlgItemText(hWnd,IDC_PLAINTEXT,"");
pszTitle="DES Demo";
SetWindowText(hWnd,pszTitle);
break;
case IDF_OPEN:
if(bSource==true)
{
MessageBox(hWnd,"The source has been selected to input,please set in set menu","Error",MB_OK);
break;
}
hMenu=GetMenu(hWnd);//得到窗口
mii.cbSize=sizeof(mii);
GetMenuItemInfo(hMenu,false,IDD_DECRYPT,&mii);
mii.fMask=MIIM_STATE;
mii.fState=MFS_DISABLED;
SetMenuItemInfo(hMenu,IDD_DECRYPT,false,&mii);//设置解密菜单项变灰
if(IsWindow(hCipherDlg))
{
ShowWindow(hCipherDlg,0);
hCipherDlg=NULL;
}
if(IsWindow(hDecryptedDlg))
{
ShowWindow(hDecryptedDlg,0);
hDecryptedDlg=NULL;
}
EnableWindow(hEdit,true);
OPENFILENAME ofn; //文件打开对话框结构
char pszFileName[256];//文件名缓冲
memset(&ofn,0,sizeof(ofn));//为结构开辟空间
ofn.lStructSize=sizeof(ofn);//设置结构大小成员
ofn.hwndOwner=hWnd;//设置文件打开对话框的父窗口
ofn.lpstrFilter="Text files\0*.txt\0All files\0*.*\0";//设置过滤字符串,每两个字符串一组,
//以NULL作为间隔,最后的字符串后有两个NULL
ofn.lpstrFile=pszFileName;//设置文件名缓冲
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -