SOL9 Sample: SolHexViewer
|
1 Screenshot
2 Source code
/*
* SolHexViewer.cpp
* Copyright (c) 2015 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// SOL9
// 2008/09/05
// 2008/09/16 Modified to use restoreFileFolder/saveFileFolder.
// 2008/12/18 Modified to show FileVersion.
#define COMMONCONTROLS_V6
#include <sol\ApplicationView.h>
#include <sol\StatusBar.h>
#include <sol\FileDialog.h>
#include <sol\HexView.h>
#include <sol\FileVersionDialog.h>
#include <sol/DropTarget.h>
#include "resource.h"
namespace SOL {
/**
* HexViewer class is a sample Appplication program to display hex data of a file
* by using SOL::HexView class
*/
class SolHexViewer :public ApplicationView {
private:
HexView hexv;
StatusBar statusbar;
FileDialog fileDialog;
FileVersionDialog fileVersion;
CDropTarget dropTarget;
public:
/**
* Constructor
*/
SolHexViewer(Application& applet, const TCHAR* name, Args& args)
:ApplicationView(applet, name,
args.set(XmNbackground, (ulong)(COLOR_BTNFACE+1)))
{
//Create a window of SOL::HexView.
Args ar;
ar.reset();
ar.set(XmNexStyle, (ulong)WS_EX_CLIENTEDGE);
hexv.create(this, NULL, ar);
ar.reset();
statusbar.create(this, NULL, ar);
ar.reset();
ar.set(XmNaccessMode, FileDialog::OPEN);
fileDialog.create(this, NULL, ar);
fileVersion.create(this);
//2009/11/01
HWND hlistv = hexv.getWindow();
dropTarget.setTarget(hlistv);
dropTarget.setEventReceiver(getWindow());
//
addCallback(XmNmenuCallback, IDM_OPEN, this,
(Callback)&SolHexViewer::open, NULL);
addCallback(XmNmenuCallback, IDM_EXIT, this,
(Callback)&SolHexViewer::exit, NULL);
addCallback(XmNmenuCallback, IDM_VERSION, this,
(Callback)&SolHexViewer::version, NULL);
addEventHandler(WM_SIZE, this,
(Handler)&SolHexViewer::size, NULL);
addEventHandler(WM_CLOSE, this,
(Handler)&SolHexViewer::close, NULL);
addEventHandler(WM_SOL_DROPFILES, this,
(Handler)&SolHexViewer::dropFiles, NULL);
restorePlacement();
}
public:
long size(Event& event)
{
LPARAM l = event.getLParam();
statusbar.send(WM_SIZE, event.getWParam(), event.getLParam());
int w, h;
statusbar.getSize(w, h);
hexv.reshape(0, 0, w, HIWORD(l) - h);
return 0;
}
public:
/**
* WM_SOL_DROPFILES eventhandler.
*/
long dropFiles(Event& event)
{
WPARAM wParam = event.getWParam();
HDROP hDrop = (HDROP)wParam;
if (hDrop) {
int n = DragQueryFile(hDrop, 0xffffffff, NULL, 0);
if (n >0) {
//Get the first file only
int i = 0;
TCHAR path[_MAX_PATH];
DragQueryFile(hDrop, i, path, CountOf(path));
DWORD attr = GetFileAttributes(path);
if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) {
display(path);
}
}
}
return 0;
}
public:
long close(Event& event)
{
savePlacement();
return defaultProc(event);
}
public:
void open(Action& action)
{
TCHAR dir[_MAX_PATH];
if (restoreFileFolder(dir, CountOf(dir))) {
Args ar;
ar.set(XmNdirectory, dir);
fileDialog.setValues(ar);
}
int rc = fileDialog.open();
if (rc == IDOK) {
const TCHAR* fileName = fileDialog.getFileName();
display(fileName);
saveFileFolder(fileName);
}
}
public:
void version(Action& action)
{
fileVersion.popupAt(action);
}
private:
bool display(const TCHAR* fileName)
{
bool rc = false;
hexv.clear();
//Disable redrawing of HexView
hexv.setRedraw(FALSE);
FILE* fp = fopen(fileName, _T("rb"));
if (fp) {
TCHAR caption[1024];
_stprintf_s(caption, CountOf(caption), _T("%s - SolHexViewer"), fileName);
this->setText(caption);
//GetFileLength
int rest = _filelength(_fileno(fp));
int kb = rest/1024;
int remain = rest%1024;
if (remain>0) {
kb++;
}
TCHAR text[1024];
_stprintf_s(text, CountOf(text), _T("%s : %d(KB)"),
fileName, kb);
statusbar.setText(text);
const int MAX_BUFF = 1024*64;
char* buff = new char[MAX_BUFF+1];
int id = 0;
while (rest>0) {
int len = MAX_BUFF;
if (rest<=MAX_BUFF) {
len = rest;
}
int fileIn = fread(buff, 1, len, fp);
if (fileIn<=0) {
break;
}
hexv.addHexData(id, (unsigned char*)buff, fileIn);
rest -= fileIn;
}
delete [] buff;
fclose(fp);
rc = true;
}
//Redrawing of HexView
hexv.setRedraw(TRUE);
return rc;
}
};
}
// Program entry point.
void Main(int argc, TCHAR** argv)
{
//The following is for the OLE dragdrop.
OleInitialize(NULL);
ModuleFileName module(argv[0]);
const TCHAR* name = module.getFileName();
try {
Application applet(name, argc, argv);
Args args;
SolHexViewer viewer(applet, name, args);
viewer.realize();
applet.run();
} catch (Exception& ex) {
caught(ex);
} catch (...) {
caught(UnknownException());
}
OleUninitialize();
}
Last modified: 1 Feb 2017
Copyright (c) 2017 Antillia.com ALL RIGHTS RESERVED.