/
danglewindow_hex.cpp
230 lines (214 loc) · 5.69 KB
/
danglewindow_hex.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include "danglewindow_hex.h"
#include "application.h"
//êîëè÷åñòâî áàéò â ñòðîêå
#define LINE_COUNT 0x10
CDangleWindowHex::CDangleWindowHex(CEditedFile* pEditedFile)
{
//çàïîìíèòü óêàçàòåëü ôàéëà
mpEditedFile=pEditedFile;
mpEditedFile->AddRef();
//èíèöèàëèçàöèÿ
mWindowOffset=0;
mSelectionOffset=0;
mSelectionLength=0;
mWindowLinesCount=0;
//ñôîðìèðîâàòü èìÿ îêíà
LPCTSTR szFileName=mpEditedFile->GetFileName();
//ïîëó÷èòü èìÿ áåç ïóòè
TCHAR szFileTitle[MAX_PATH];
GetFileTitle(szFileName,szFileTitle,MAX_PATH);
//åñëè îíî ñëèøêîì äëèííîå
if(_tcslen(szFileTitle)>MAX_DANGLE_NAME_LENGTH)
{
//îáðåçàòü åãî
CopyMemory(mszNameBuffer,szFileTitle,MAX_DANGLE_NAME_LENGTH*sizeof(TCHAR));
mszNameBuffer[MAX_DANGLE_NAME_LENGTH]=0;
}
//èíà÷å âçÿòü öåëèêîì
else
_tcscpy(mszNameBuffer,szFileTitle);
//óñòàíîâèòü óêàçàòåëü íà èìÿ
mszName=mszNameBuffer;
}
CDangleWindowHex::~CDangleWindowHex()
{
SafeRelease(mpEditedFile);
}
VOID CDangleWindowHex::OnKey(UINT Key)
{
//âûáîð ïî êëàâèøå
switch(Key)
{
case VK_DOWN:
{
//ñäâèíóòü êóðñîð âíèç
mSelectionOffset+=LINE_COUNT;
UINT FileSize=mpEditedFile->GetSize();
if(mSelectionOffset>=FileSize) mSelectionOffset=FileSize-1;
//åñëè êóðñîð íå ïîìåùàåòñÿ â îêíå, ñäâèíóòü îêíî
if((mSelectionOffset-mWindowOffset)/LINE_COUNT>=mWindowLinesCount)
mWindowOffset+=LINE_COUNT;
//îáíîâèòü îêíî
InvalidateRect(mhWindow,NULL,FALSE);
}
break;
case VK_UP:
{
//ñäâèíóòü êóðñîð ââåðõ
if(mSelectionOffset<LINE_COUNT) mSelectionOffset=0;
else mSelectionOffset-=LINE_COUNT;
//åñëè êóðñîð íå ïîìåùàåòñÿ â îêíå, ñäâèíóòü îêíî
if(mSelectionOffset<mWindowOffset)
if(mWindowOffset<LINE_COUNT) mWindowOffset=0;
else mWindowOffset-=LINE_COUNT;
//îáíîâèòü îêíî
InvalidateRect(mhWindow,NULL,FALSE);
}
break;
case VK_RIGHT:
{
//ñäâèíóòü êóðñîð âïðàâî
UINT FileSize=mpEditedFile->GetSize();
if(mSelectionOffset<FileSize-1) mSelectionOffset++;
//åñëè êóðñîð íå ïîìåùàåòñÿ â îêíå, ñäâèíóòü îêíî
if((mSelectionOffset-mWindowOffset)/LINE_COUNT>=mWindowLinesCount)
mWindowOffset+=LINE_COUNT;
//îáíîâèòü îêíî
InvalidateRect(mhWindow,NULL,FALSE);
}
break;
case VK_LEFT:
{
//ñäâèíóòü êóðñîð âëåâî
if(mSelectionOffset>=1) mSelectionOffset--;
//åñëè êóðñîð íå ïîìåùàåòñÿ â îêíå, ñäâèíóòü îêíî
if(mSelectionOffset<mWindowOffset)
if(mWindowOffset<LINE_COUNT) mWindowOffset=0;
else mWindowOffset-=LINE_COUNT;
//îáíîâèòü îêíî
InvalidateRect(mhWindow,NULL,FALSE);
}
break;
case VK_NEXT:
{
for(UINT i=0;i<mWindowLinesCount;++i)
OnKey(VK_DOWN);
}
break;
case VK_PRIOR:
{
for(UINT i=0;i<mWindowLinesCount;++i)
OnKey(VK_UP);
}
break;
case VK_HOME:
{
mSelectionOffset=0;
mWindowOffset=0;
InvalidateRect(mhWindow,NULL,FALSE);
}
break;
case VK_END:
{
mSelectionOffset=mpEditedFile->GetSize()-1;
mWindowOffset=mSelectionOffset/LINE_COUNT*LINE_COUNT;
InvalidateRect(mhWindow,NULL,FALSE);
}
break;
}
}
VOID CDangleWindowHex::OnCommand(UINT CommandID,UINT Code,HWND hControl)
{
}
VOID CDangleWindowHex::OnMouseWheel(INT Delta,UINT Keys)
{
}
LRESULT CDangleWindowHex::DangleProc(UINT Msg,WPARAM wParam,LPARAM lParam)
{
//âûáîð ïî ñîîáùåíèþ
switch(Msg)
{
case WM_KEYDOWN:
return OnKey(wParam),0;
case WM_COMMAND:
return OnCommand(LOWORD(wParam),HIWORD(wParam),(HWND)lParam),0;
case WM_MOUSEWHEEL:
return OnMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam)/WHEEL_DELTA,GET_KEYSTATE_WPARAM(wParam)),0;
default:
return DefWindowProc(mhWindow,Msg,wParam,lParam);
}
}
VOID CDangleWindowHex::Paint(HDC hdc)
{
//ïîëó÷èòü ïðÿìîóãîëüíèê îêíà
RECT rect;
GetClientRect(mhWindow,&rect);
//óêàçàòü êîíòåêñò äëÿ ëèñòèíãà
LISTING_DEVICE_CONTEXT Context;
Context.hdc=hdc;
Context.Rect=rect;
mListing.SetContext(Context);
//ïîëó÷èòü ðàçìåð ôàéëà
UINT FileSize=mpEditedFile->GetSize();
PBYTE pFile=(PBYTE)mpEditedFile->GetMemory();
UINT k=mWindowOffset;
//âûäåëèòü êèñòü
SelectBrush(hdc,GetStockBrush(WHITE_BRUSH));
//î÷èñòèòü îêíî
PatBlt(hdc,rect.left,rect.top,rect.right,rect.bottom,PATCOPY);
//âûäåëèòü øðèôò
SelectFont(hdc,gApplication.mhFontCode);
//âû÷èñëèòü êîëè÷åñòâî ïîìåùÿþùèõñÿ ñòðîê
mWindowLinesCount=(rect.bottom-rect.top)/gApplication.mFontCodeHeight;
//íàðèñîâàòü âûäåëåíèå, åñëè îíî åñòü
if(mSelectionLength)
{
}
else if(mSelectionOffset>=mWindowOffset && mSelectionOffset<mWindowOffset+(mWindowLinesCount+1)*LINE_COUNT)
{
//âûäåëèòü âûäåëåííûé áàéò
SelectBrush(hdc,gApplication.mhBrushSelect);
SelectPen(hdc,gApplication.mhPenSelect);
//ïîëó÷èòü øèðèíó îäíîãî ñèìâîëà
SIZE CharSize;
GetTextExtentPoint32(hdc,TEXT("W"),1,&CharSize);
INT x=(0x10+(mSelectionOffset-mWindowOffset)%LINE_COUNT*3)*CharSize.cx;
INT y=(mSelectionOffset-mWindowOffset)/LINE_COUNT*CharSize.cy;
Rectangle(hdc,x,y,x+CharSize.cx*2,y+CharSize.cy);
x=(0x10+LINE_COUNT*3+0x8+(mSelectionOffset-mWindowOffset)%LINE_COUNT)*CharSize.cx;
Rectangle(hdc,x,y,x+CharSize.cx,y+CharSize.cy);
}
//öèêë âûâîäà ñòðîê
TCHAR s[3];
for(UINT i=mWindowOffset;i<FileSize;i+=LINE_COUNT)
{
//óêàçàòü àäðåñ äëÿ ëèñòèíãà
mListing.SetAddress(i);
//íà÷àòü ñòðîêó
mListing.BeginLine();
//âû÷èñëèòü êîëè÷åñòâî îñòàâøèõñÿ ñèìâîëîâ
UINT Count=FileSize-i;
if(Count>LINE_COUNT) Count=LINE_COUNT;
//âûâåñòè ñèìâîëû
for(UINT j=0;j<Count;++j)
{
_stprintf(s,TEXT("%02X"),pFile[i+j]);
mListing.Print(0x10+j*3,s);
#ifdef UNICODE
WCHAR ws[2];
MultiByteToWideChar(CP_ACP,0,(LPCSTR)(pFile+i+j),1,ws,1);
ws[1]=0;
mListing.Print(0x10+LINE_COUNT*3+0x8+j,ws);
#else
CHAR s[2];
s[0]=pFile[i+j];
s[1]=0;
mListing.Print(0x10+LINE_COUNT*3+0x8+j,s);
#endif
}
//çàêîí÷èòü ñòðîêó
mListing.EndLine();
//åñëè îêíî çàêîí÷èëîñü, çàêîí÷èòü
if(mListing.IsOverflow()) break;
}
}