📄 opam300cdlg.cpp
字号:
postSendEvent=NULL;
CloseHandle(read_os.hEvent);
read_os.hEvent=NULL;
CloseHandle(write_os.hEvent);
write_os.hEvent=NULL;
m_bConnected=false;
//Sleep(500);
m_pThread=NULL;
CloseHandle(hCommDev);
Sleep(100);
hCommDev=NULL;
}
}
//串口处理
UINT myThreadProc(LPVOID pParam)
{
DWORD dwEvtMask;//,dwTransfer;
OVERLAPPED os;
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ASSERT(os.hEvent);
//SetCommMask(postRecvEvent,
//EV_CTS|EV_DSR|EV_RXCHAR|EV_RXFLAG|EV_BREAK);
if(!SetCommMask(hCommDev,EV_RXCHAR|EV_TXEMPTY))
return FALSE;
while(m_bConnected)
{
dwEvtMask=0;
if(!WaitCommEvent(hCommDev,&dwEvtMask,&os))//WaitCommEvent (com->m_hCom, &dwCommModemStatus, NULL);
{
if(GetLastError()==ERROR_IO_PENDING)
{
TRACE0("Error io pending...");
// GetOverlappedResult(hCommDev,&os,&dwTransfer,TRUE);
}
}
if((dwEvtMask & EV_RXCHAR)==EV_RXCHAR)
{
WaitForSingleObject(postRecvEvent,0xffffffff);
ResetEvent(postRecvEvent);
::PostMessage(postRecvHwnd,WM_COMMRECVNOTIFY,(WPARAM)hCommDev,NULL);
}
if((dwEvtMask & EV_TXEMPTY)==EV_TXEMPTY)
{
WaitForSingleObject(postSendEvent,0xffffffff);
ResetEvent(postSendEvent);
::PostMessage(postSendHwnd,WM_COMMSENDNOTIFY,(WPARAM)hCommDev,NULL);
}
}
CloseHandle(os.hEvent);
AfxEndThread(1,true); ////?????
return TRUE;
}
void COpAm300cDlg::MyHandler(char *szData,int len)
{
static CString szTemp="";
char *buf=new char[len+1];
buf[len]=0;
memcpy(buf,szData,len);
for(int i=0;i<len;i++)
{
szTemp.Format(L"%02X ",(unsigned char)buf[i]);
m_Message+=szTemp;
if(m_nHexCount==15)
{
m_nHexCount=0;
m_Message+="\r\n";
}
else m_nHexCount++;
}
//szTemp+=buf;
UpdateData(false);
delete[] buf;
}
void COpAm300cDlg::OnButton3()
{
UpdateData();
CString szTemp=" ",szSendData=m_szSendData;
if(1)//m_bHexSend)
{
int index=0;
iSendLen=0;
szSendData+=" ";
while((index=szSendData.Find(L" "))!=-1)
{
szTemp=szSendData.Left(index);
szSendData.Delete(0,index);
szSendData.TrimLeft();
strSendData[iSendLen]=(char)wcstol(szTemp.LockBuffer(),NULL,16);
iSendLen++;
}
if(1)//m_bFlag1)//自动填入校验码
{
char ch=0;
for(int i=1;i<(int)iSendLen;i++) ch+=strSendData[i];
ch&=0x7f;
strSendData[iSendLen]=ch;
iSendLen++;
}
}
else
{
//strSendData=m_szSendData.LockBuffer(); //此处注释掉的是一个错误
iSendLen=m_szSendData.GetLength();
memcpy(strSendData,m_szSendData.LockBuffer(),iSendLen);
}
m_bSending=TRUE;
m_IsFile=FALSE; //下一行发送消息,必须用SendMessage
::SendMessage(postSendHwnd,WM_COMMSENDNOTIFY,(WPARAM)hCommDev,NULL);
}
void COpAm300cDlg::SendToCom(char *data)
{
int len = strlen(data);
char *buf = new char[len];
memcpy(buf,data,len);
//m_szSendData=buf;
UpdateEdit(buf);
//UpdateData(FALSE);
delete[] buf;
CString szTemp=" ",szSendData=m_szSendData;
if(1)//m_bHexSend)
{
int index=0;
iSendLen=0;
szSendData+=" ";
while((index=szSendData.Find(L" "))!=-1)
{
szTemp=szSendData.Left(index);
szSendData.Delete(0,index);
szSendData.TrimLeft();
strSendData[iSendLen]=(char)wcstol(szTemp.LockBuffer(),NULL,16);
iSendLen++;
}
if(1)//m_bFlag1)//自动填入校验码
{
char ch=0;
for(int i=1;i<(int)iSendLen;i++) ch+=strSendData[i];
ch&=0x7f;
strSendData[iSendLen]=ch;
iSendLen++;
}
}
else
{
//strSendData=m_szSendData.LockBuffer(); //此处注释掉的是一个错误
iSendLen=m_szSendData.GetLength();
memcpy(strSendData,m_szSendData.LockBuffer(),iSendLen);
}
m_bSending=TRUE;
m_IsFile=FALSE; //下一行发送消息,必须用SendMessage
::SendMessage(postSendHwnd,WM_COMMSENDNOTIFY,(WPARAM)hCommDev,NULL);
}
void COpAm300cDlg::Mute(CString sData)
{
CString szTemp=" ",szSendData=sData;
if(1)
{
int index=0;
iSendLen=0;
szSendData+=" ";
while((index=szSendData.Find(L" "))!=-1)
{
szTemp=szSendData.Left(index);
szSendData.Delete(0,index);
szSendData.TrimLeft();
strSendData[iSendLen]=(char)wcstol(szTemp.LockBuffer(),NULL,16);
iSendLen++;
}
if(1)
{
char ch=0;
for(int i=1;i<(int)iSendLen;i++) ch+=strSendData[i];
ch&=0x7f;
strSendData[iSendLen]=ch;
iSendLen++;
}
}
else
{
iSendLen=m_szSendData.GetLength();
memcpy(strSendData,m_szSendData.LockBuffer(),iSendLen);
}
m_bSending=TRUE;
m_IsFile=FALSE; //下一行发送消息,必须用SendMessage
::SendMessage(postSendHwnd,WM_COMMSENDNOTIFY,(WPARAM)hCommDev,NULL);
}
LPSTR COpAm300cDlg::FindDIBBits(LPSTR lpbi)
{
return ( lpbi + *(LPDWORD)lpbi + PaletteSize( lpbi ) );
}
WORD COpAm300cDlg::PaletteSize(LPSTR lpbi)
{
return ( DIBNumColors( lpbi ) * sizeof( RGBQUAD ) );
}
DWORD COpAm300cDlg::BytesPerLine(LPBITMAPINFOHEADER lpBMIH)
{
return WIDTHBYTES(lpBMIH->biWidth * lpBMIH->biPlanes
* lpBMIH->biBitCount);
}
WORD COpAm300cDlg::DIBNumColors(LPSTR lpbi)
{
WORD wBitCount;
DWORD dwClrUsed;
dwClrUsed = ((LPBITMAPINFOHEADER) lpbi)->biClrUsed;
if (dwClrUsed)
return (WORD) dwClrUsed;
wBitCount = ((LPBITMAPINFOHEADER) lpbi)->biBitCount;
switch (wBitCount)
{
case 8:return 256;
case 1: return 2;
case 2: return 4;
case 4: return 16;
default:return 0;
}
return 0;
}
HBITMAP COpAm300cDlg::CopyScreenToBitmap()
{
HDC hScrDC;
HDC hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap;
HBITMAP hOldBitmap;
// 位图宽度和高度
int nWidth, nHeight;
// 屏幕分辨率
int xScrn, yScrn;
//为屏幕创建设备描述表
hScrDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
nWidth=xScrn;
nHeight=yScrn;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY);
//得到屏幕位图的句柄
hBitmap=(HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}
LPSTR COpAm300cDlg::GettingBits(HBITMAP hSourceBitmap)
{
LPSTR lpDIB=NULL;
//1. Initialize source bitmap. For example load from resources.
//HBITMAP hSourceBitmap = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
//2. Getting bimap size.
BITMAP bm;
GetObject(hSourceBitmap, sizeof(BITMAP), &bm);
lpDIB=(LPSTR)LocalAlloc(LPTR,bm.bmHeight*WIDTHBYTES(bm.bmWidth*24)+40);
if(lpDIB==NULL)
{
return NULL;
}
//3. Creating new bitmap and receive pointer to it's bits.
HBITMAP hTargetBitmap;
void *pBuffer;
//3.1 Initilize DIBINFO structure
DIBINFO dibInfo;
dibInfo.bmiHeader.biBitCount = 24;
dibInfo.bmiHeader.biClrImportant = 0;
dibInfo.bmiHeader.biClrUsed = 0;
dibInfo.bmiHeader.biCompression = 0;
dibInfo.bmiHeader.biHeight = bm.bmHeight;
dibInfo.bmiHeader.biPlanes = 1;
dibInfo.bmiHeader.biSize = 40;
dibInfo.bmiHeader.biSizeImage = WIDTHBYTES(bm.bmWidth*24)*bm.bmHeight;
dibInfo.bmiHeader.biWidth = bm.bmWidth;
dibInfo.bmiHeader.biXPelsPerMeter = 3780;
dibInfo.bmiHeader.biYPelsPerMeter = 3780;
dibInfo.bmiColors[0].rgbBlue = 0;
dibInfo.bmiColors[0].rgbGreen = 0;
dibInfo.bmiColors[0].rgbRed = 0;
dibInfo.bmiColors[0].rgbReserved = 0;
//3.2 Create bitmap and receive pointer to points into pBuffer
HDC hDC = ::GetDC(NULL);
ASSERT(hDC);
hTargetBitmap = CreateDIBSection(
hDC,
(const BITMAPINFO*)dibInfo,
DIB_RGB_COLORS,
(void**)&pBuffer,
NULL,
0);
::ReleaseDC(NULL, hDC);
//4. Copy source bitmap into the target bitmap.
//4.1 Create 2 device contexts
HDC memDc;
memDc=CreateCompatibleDC(NULL);
ASSERT(memDc!=NULL);
HDC targetDc;
targetDc=CreateCompatibleDC(NULL);
ASSERT(targetDc!=NULL);
//4.2 Select source bitmap into one DC, target into another
HBITMAP hOldBitmap1 = (HBITMAP)::SelectObject(memDc, hSourceBitmap);
HBITMAP hOldBitmap2 = (HBITMAP)::SelectObject(targetDc, hTargetBitmap);
//4.3 Copy source bitmap into the target one
BitBlt(targetDc,0, 0, bm.bmWidth, bm.bmHeight, memDc, 0, 0, SRCCOPY);
//4.4 Restore device contexts
::SelectObject(memDc, hOldBitmap1);
::SelectObject(targetDc, hOldBitmap2);
DeleteDC(memDc);
DeleteDC(targetDc);
//Here we can bitmap bits: pBuffer. Note:
// 1. pBuffer contains 3 bytes per point
// 2. Lines ane from the bottom to the top!
// 3. Points in the line are from the left to the right
// 4. Bytes in one point are BGR (blue, green, red) not RGB
// 5. Don't delete pBuffer, it will be automatically deleted
// when delete hTargetBitmap
LPSTR lptmp=lpDIB;
CopyMemory(lptmp,&dibInfo.bmiHeader,40);
lptmp+=40;
CopyMemory(lptmp,pBuffer,dibInfo.bmiHeader.biSizeImage);
DeleteObject(hSourceBitmap);
DeleteObject(hTargetBitmap);
return lpDIB;
}
BOOL COpAm300cDlg::SaveDIBToFile(LPSTR hDib, LPCTSTR szFileName)
{
HANDLE ghFile=NULL;
BOOL bResult=FALSE;
// Bitmap文件头
BITMAPFILEHEADER bmfHdr;
// 指向BITMAPINFOHEADER的指针
LPBITMAPINFOHEADER lpBI=NULL;
// DIB大小
DWORD dwDIBSize=0;
DWORD dwBytes=0;
if (hDib == NULL)
{
return FALSE;
}
// 读取BITMAPINFO结构,并锁定
lpBI=(LPBITMAPINFOHEADER)hDib;
if (lpBI == NULL)
{
return FALSE;
}
// 判断是否是WIN3.0 DIB
if (!IS_WIN30_DIB(lpBI))
{
// 返回FALSE
return FALSE;
}
// 文件类型"BM"
bmfHdr.bfType = DIB_HEADER_MARKER;
// 文件头大小+颜色表大小
// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)
dwDIBSize = *(LPDWORD)lpBI + PaletteSize((LPSTR)lpBI);
// 计算图像大小
// 象素的大小
DWORD dwBmBitsSize;
// 大小为Width * Height
dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
// 计算出DIB真正的大小
dwDIBSize += dwBmBitsSize;
// 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)
lpBI->biSizeImage = dwBmBitsSize;
// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
// 两个保留字
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
// 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
+ PaletteSize((LPSTR)lpBI);
//打开文件
ghFile=CreateFile(szFileName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (ghFile==INVALID_HANDLE_VALUE)
{
NKDbgPrintfW(_T("save dib to file fail. \r\n"));
return FALSE;
}
//写文件头
bResult=WriteFile(ghFile,(LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER),&dwBytes,NULL);
ASSERT(bResult!=FALSE);
// 写DIB头和象素
bResult=WriteFile(ghFile,(LPSTR)lpBI,dwDIBSize,&dwBytes,NULL);
ASSERT(bResult!=FALSE);
CloseHandle(ghFile);
// 返回TRUE
return TRUE;
}
void COpAm300cDlg::StartupIsError()
{
HWND hwnd=::FindWindow(NULL,L"CEAm300");
if (hwnd==NULL)
{
StartupAm300c();
}
else
{
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -