⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opam300cdlg.cpp

📁 wince下接受网络控制命令进行相应操作,远程控制的东西
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -