📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "Bel.h"
#include "MainFrm.h"
#include "..\..\inc\DvcSeapi.h"
#include "..\..\inc\dsp100.h"
#include "..\..\inc\reg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MAX_WIDTH 1280
#define MAX_HEIGHT 256
#define OPD_NONE 0
#define OPD_SNAP_ONE 1
#define OPD_SNAP_CONTINUE 2
#define OPD_SNAP_NUMBER 3
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_DECODE, OnDecode)
ON_UPDATE_COMMAND_UI(ID_DECODE, OnUpdateDecode)
ON_COMMAND(ID_LOAD, OnLoad)
ON_COMMAND(ID_CLEAR, OnClear)
ON_COMMAND(ID_FLIP, OnFlip)
ON_UPDATE_COMMAND_UI(ID_FLIP, OnUpdateFlip)
ON_COMMAND(ID_SNAP_NUMBER, OnSnappingNumber)
ON_COMMAND(ID_SNAP_CONTINUE, OnSnapContinue)
ON_UPDATE_COMMAND_UI(ID_SNAP_CONTINUE, OnUpdateSnapContinue)
ON_COMMAND(ID_SNAP_ONE, OnSnapOne)
ON_WM_CLOSE()
ON_UPDATE_COMMAND_UI(ID_SNAP_ONE, OnUpdateSnapOne)
ON_UPDATE_COMMAND_UI(ID_SNAP_NUMBER, OnUpdateSnapNumber)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_pBmpInfo = NULL;
m_hPalette = NULL;
m_hOldPal = NULL;
m_pImageBuffer = NULL;
m_pSrcData = NULL;
m_bDecode = TRUE;
m_bFlip = TRUE;
m_nXDelay = 0;
m_nYDelay = 1;
}
CMainFrame::~CMainFrame()
{
if (m_pImageBuffer) {
delete []m_pImageBuffer;
}
if (m_pSrcData) {
delete []m_pSrcData;
}
if (m_hPalette) {
DeleteObject(m_hPalette);
}
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
/*
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
*/
InitSystemInfo();
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::InitSystemInfo()
{
CDC *pDC = NULL;
CView *pView = NULL;
LOGPALETTE *pLGPal = NULL;
BYTE Palbuf[2048];
int i = 0;
pDC = GetDC();
if (pDC != NULL) {
pLGPal = (LOGPALETTE *)Palbuf;
pLGPal->palVersion = 0x300;
pLGPal->palNumEntries = 256;
for (i = 0; i < pLGPal->palNumEntries; i++){
pLGPal->palPalEntry[i].peRed = (BYTE)i + 10;
pLGPal->palPalEntry[i].peGreen = (BYTE)i + 10;
pLGPal->palPalEntry[i].peBlue = (BYTE)i + 10;
pLGPal->palPalEntry[i].peFlags = 0;//PC_NOCOLLAPSE;
}
m_hPalette = ::CreatePalette(pLGPal);
ReleaseDC(pDC);
pDC = NULL;
}
m_pBmpInfo = (BITMAPINFO *)m_chBmpBuf;
m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBmpInfo->bmiHeader.biWidth = 0;
m_pBmpInfo->bmiHeader.biHeight = 0;
m_pBmpInfo->bmiHeader.biPlanes = 1;
m_pBmpInfo->bmiHeader.biBitCount = 0;
m_pBmpInfo->bmiHeader.biCompression = BI_RGB;
m_pBmpInfo->bmiHeader.biSizeImage = 0;
m_pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
m_pBmpInfo->bmiHeader.biClrUsed = 0;
m_pBmpInfo->bmiHeader.biClrImportant = 0;
for (i = 0; i < 256; i++){
m_pBmpInfo->bmiColors[i].rgbBlue = (BYTE)i;
m_pBmpInfo->bmiColors[i].rgbGreen = (BYTE)i;
m_pBmpInfo->bmiColors[i].rgbRed = (BYTE)i;
m_pBmpInfo->bmiColors[i].rgbReserved = 0;
}
m_pImageBuffer = new BYTE[MAX_WIDTH * MAX_HEIGHT * 4];
if (m_pImageBuffer) {
FillMemory(m_pImageBuffer, MAX_WIDTH * MAX_HEIGHT * 4, 0xff);
}
m_pSrcData = new BYTE[MAX_WIDTH * MAX_HEIGHT];
if (m_pSrcData) {
FillMemory(m_pSrcData, MAX_WIDTH * MAX_HEIGHT, 0xff);
}
}
void CMainFrame::DecodeImage(BYTE *pDest, BYTE *pSrce, DWORD dwWidth, DWORD dwHeight)
{
DWORD dwBeLnSrc = 0, dwCuLnSrc = 0, dwAfLnSrc = 0;
DWORD dwDestOft = 0;
DWORD dwDestPixBytes = 3;
WORD wSum = 0, wAvg = 0;
int nx = 0, ny = 0;
for(ny = 1; ny < (int)dwHeight - 1; ny++){
for(nx = 1; nx < (int)dwWidth - 1; nx++){
dwBeLnSrc = (DWORD)(ny - 1) * dwWidth + nx;
dwCuLnSrc = (DWORD)ny * dwWidth + nx;
dwAfLnSrc = (DWORD)(ny + 1) * dwWidth + nx;
dwDestOft = (DWORD)(ny - 1) * dwWidth * dwDestPixBytes + (DWORD)(nx - 1) * dwDestPixBytes;
if( ny % 2){
if( nx % 2 ){
//Blue
wSum = WORD(*(pSrce + dwBeLnSrc - 1)) + WORD(*(pSrce + dwBeLnSrc + 1)) +
WORD(*(pSrce + dwAfLnSrc - 1)) + WORD(*(pSrce + dwAfLnSrc + 1));
wAvg = wSum / 4;
*(pDest + dwDestOft) = BYTE(wAvg);
//Green
wSum = WORD(*(pSrce + dwBeLnSrc)) +
WORD(*(pSrce + dwCuLnSrc - 1)) + WORD(*(pSrce + dwCuLnSrc + 1)) +
WORD(*(pSrce + dwAfLnSrc));
wAvg = wSum / 4;
*(pDest + dwDestOft + 1) = BYTE(wAvg);
//Red
*(pDest + dwDestOft + 2) = *(pSrce + dwCuLnSrc);
}
else{
//Blue
wSum = WORD(*(pSrce + dwBeLnSrc)) + WORD(*(pSrce + dwAfLnSrc));
wAvg = wSum / 2;
*(pDest + dwDestOft) = BYTE(wAvg);
//Green
*(pDest + dwDestOft + 1) = *(pSrce + dwCuLnSrc);
//Red
wSum = WORD(*(pSrce + dwCuLnSrc - 1)) + WORD(*(pSrce + dwCuLnSrc + 1));
wAvg = wSum / 2;
*(pDest + dwDestOft + 2) = BYTE(wAvg);
}
}
else{
if( nx % 2 ){
//Blue
wSum = WORD(*(pSrce + dwCuLnSrc - 1)) + WORD(*(pSrce + dwCuLnSrc + 1));
wAvg = wSum / 2;
*(pDest + dwDestOft) = BYTE(wAvg);
//Green
*(pDest + dwDestOft + 1) = *(pSrce + dwCuLnSrc);
//Red
wSum = WORD(*(pSrce + dwBeLnSrc)) + WORD(*(pSrce + dwAfLnSrc));
wAvg = wSum / 2;
*(pDest + dwDestOft + 2) = BYTE(wAvg);
}
else{
//Blue
*(pDest + dwDestOft) = *(pSrce + dwCuLnSrc);
//Green
wSum = WORD(*(pSrce + dwBeLnSrc)) +
WORD(*(pSrce + dwCuLnSrc - 1)) + WORD(*(pSrce + dwCuLnSrc + 1)) +
WORD(*(pSrce + dwAfLnSrc));
wAvg = wSum / 4;
*(pDest + dwDestOft + 1) = BYTE(wAvg);
//Red
wSum = WORD(*(pSrce + dwBeLnSrc - 1)) + WORD(*(pSrce + dwBeLnSrc + 1)) +
WORD(*(pSrce + dwAfLnSrc - 1)) + WORD(*(pSrce + dwAfLnSrc + 1));
wAvg = wSum / 4;
*(pDest + dwDestOft + 2) = BYTE(wAvg);
}
}
}
}
}
BOOL CMainFrame::ReadImage(BYTE *pDest, DWORD dwOffset, int nXDelay, int nYDelay, DWORD dwWidth, DWORD dwHeight)
{
BOOL bRVal = FALSE;
SECTION_MAP_INFO info;
int nWidth = 0, nHeight = 0;
info.dwStartOffset = dwOffset;
info.dwLength = dwWidth * dwHeight;
if (DvcStaticMemLock(&info) && info.pLinearAddress) {
if (m_bFlip) {
nWidth = dwWidth - nXDelay;
nWidth = nWidth - nWidth % 4;
nHeight = dwHeight - nYDelay;
nHeight = nHeight - nHeight % 2;
for (int i = 0; i < nHeight; i++){
CopyMemory((pDest + ((nHeight - i - 1) * nWidth)),
((BYTE *)(info.pLinearAddress) + ((i + nYDelay) * dwWidth) + nXDelay), nWidth);
}
}
else{
CopyMemory(pDest, info.pLinearAddress, dwWidth * dwHeight);
}
DvcStaticMemUnlock(&info);
bRVal = TRUE;
}
return bRVal;
}
void CMainFrame::ShowImage(CDC *pDC)
{
if (m_hPalette && (m_pBmpInfo->bmiHeader.biBitCount == 8)) {
m_hOldPal = ::SelectPalette(pDC->GetSafeHdc(), m_hPalette, FALSE);
::RealizePalette(pDC->GetSafeHdc());
}
StretchDIBits(pDC->GetSafeHdc(),
0,
0,
m_pBmpInfo->bmiHeader.biWidth,
m_pBmpInfo->bmiHeader.biHeight,
0,
0,
m_pBmpInfo->bmiHeader.biWidth,
m_pBmpInfo->bmiHeader.biHeight,
m_pImageBuffer,
m_pBmpInfo,
DIB_RGB_COLORS,
SRCCOPY
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -