LabWindow screenshot and save the picture

Save the screenshot, define a separate screenshot header file (wxpCapture)

 //==============================================================================
//
// Title:		wxpCapture.h
// Purpose:		A short description of the interface.
//
// Created on:	2021-1-21 at 10:09:07 by xt256.com.
// Copyright:	xt256.com. All Rights Reserved.
//
//==============================================================================

#ifndef __wxpCapture_H__
#define __wxpCapture_H__

#ifdef __cplusplus
    extern "C" {
#endif

//==============================================================================


#include "cvidef.h"
#include "stdio.h" 
#include "windows.h"
 
//=============================================================================
HBITMAP   GetCaptureBmp(int panelID)   
{
	//获取面板的左上角坐标、宽度和高度
	int xLeft=0;
	int yTop=0;
	int xWidth=0;
	int yHeight=0;
	
	GetPanelAttribute(panelID, ATTR_LEFT, &xLeft);
	GetPanelAttribute(panelID, ATTR_TOP, &yTop);
	GetPanelAttribute(panelID, ATTR_WIDTH, &xWidth);
	GetPanelAttribute(panelID, ATTR_HEIGHT, &yHeight);
	 
	//修正高度,本身没有包含标题栏,加35后包含标题栏
	yTop-=35;
	yHeight+=35;
	
	
    HDC     hDC;   
    HDC     MemDC;   
    BYTE*   Data;   
    HBITMAP   hBmp;   
    BITMAPINFO   bi;   
     
    memset(&bi,   0,   sizeof(bi));   
    bi.bmiHeader.biSize   =   sizeof(BITMAPINFO);
    bi.bmiHeader.biWidth   = xWidth;// GetSystemMetrics(SM_CXSCREEN)-500;   
    bi.bmiHeader.biHeight   =yHeight;// GetSystemMetrics(SM_CYSCREEN)-500;   
    bi.bmiHeader.biPlanes   =   1;   
    bi.bmiHeader.biBitCount   =   24;   
     
    hDC   =   GetDC(NULL);   
    MemDC   =   CreateCompatibleDC(hDC);   
    hBmp   =   CreateDIBSection(MemDC,   &bi, DIB_RGB_COLORS,   (void**)&Data,   NULL,   0);   
    SelectObject(MemDC,   hBmp);   						             //起点位置
    BitBlt(MemDC, 0, 0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight,hDC,xLeft,yTop,SRCCOPY);   
    ReleaseDC(NULL,   hDC);     
    DeleteDC(MemDC);   
    return   hBmp;   
}   
/************************************************************************/
/* hBitmap    为刚才的屏幕位图句柄                                                                   
/* lpFileName 为须要保存的位图文件名称
/************************************************************************/
int SaveBitmapToFile(int winID,LPSTR lpFileName) 
{  
	HBITMAP hBitmap;
	hBitmap   =   GetCaptureBmp(winID);
    HDC            hDC; 			//设备描写叙述表
    int            iBits;			//当前显示分辨率下每一个像素所占字节数
    WORD           wBitCount=1;		//位图中每一个像素所占字节数    
    DWORD          dwPaletteSize=0;	//定义调色板大小
    DWORD          dwBmBitsSize;	//位图中像素字节大小
    DWORD          dwDIBSize;		//位图文件大小
    DWORD          dwWritten;		//写入文件字节数
    BITMAP         Bitmap;			//位图结构
    BITMAPFILEHEADER   bmfHdr;   	//位图属性结构   
    BITMAPINFOHEADER   bi;       	//位图文件头结构
    LPBITMAPINFOHEADER lpbi;     	//位图信息头结构     指向位图信息头结构
    HANDLE          fh;				//定义文件句柄
    HANDLE            hDib;			//分配内存句柄
    HANDLE            hPal;			//分配内存句柄
    HANDLE          hOldPal=NULL;	//调色板句柄  
     
    //计算位图文件每一个像素所占字节数   
    hDC=GetDC((HWND)winID);
	iBits = 24;
	ReleaseDC((HWND)winID,hDC);
     
    if (iBits <= 1)       
        wBitCount = 1;   
    else if (iBits <= 4)       
        wBitCount = 4;   
    else if (iBits <= 8)       
        wBitCount = 8;   
    else if (iBits <= 24)
        wBitCount = 24;
    else if (iBits<=32)
        wBitCount = 24;
     
     
    //计算调色板大小   
    if (wBitCount <= 8)       
        dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);
  
    //设置位图信息头结构   
    GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);   
    bi.biSize            = sizeof(BITMAPINFOHEADER);   
    bi.biWidth           = Bitmap.bmWidth;   
    bi.biHeight          = Bitmap.bmHeight;   
    bi.biPlanes          = 1;   
    bi.biBitCount         = wBitCount;       
    bi.biCompression      = BI_RGB;   
    bi.biSizeImage        = 0;   
    bi.biXPelsPerMeter     =0;   
    bi.biYPelsPerMeter     =0;   
    bi.biClrUsed         = 0;   
    bi.biClrImportant      = 0;   
    dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;
     
    //为位图内容分配内存   
    hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));   
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    if (lpbi==NULL)
    {
        return 0;
    }
     
    *lpbi = bi;   
    // 处理调色板
    hPal = GetStockObject(DEFAULT_PALETTE);   
    if (hPal)
    {       
        hDC  = GetDC(NULL);       
        hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);       
        RealizePalette(hDC);       
    }   
    // 获取该调色板下新的像素值   
    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,       
        (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
        (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);   
    //恢复调色板      
    if (hOldPal)       
    {       
        SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);       
        RealizePalette(hDC);       
        ReleaseDC(NULL, hDC);       
    }   
    //创建位图文件       
    fh = CreateFile(lpFileName, GENERIC_WRITE,        
        0, NULL, CREATE_ALWAYS,       
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);   
 
    if (fh == INVALID_HANDLE_VALUE)       
        return FALSE;
     
    // 设置位图文件头   
    bmfHdr.bfType = 0x4D42;  // "BM"   
    dwDIBSize    = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize;     
    bmfHdr.bfSize = dwDIBSize;   
    bmfHdr.bfReserved1 = 0;   
    bmfHdr.bfReserved2 = 0;   
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
     
    // 写入位图文件头   
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
     
    // 写入位图文件其余内容   
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
     
    //清除      
    GlobalUnlock(hDib);   
    GlobalFree(hDib);   
    CloseHandle(fh);
     
    return 1;
} 

#ifdef __cplusplus
    }
#endif

#endif  /* ndef __wxpCapture_H__ */
  

Call example

#include "capturePic.h"
#include "wxpCapture.h"
#include <utility.h>

static int panelHandle;


int CVICALLBACK capturePic (int panel, int control, int event,
							void *callbackData, int eventData1, int eventData2)
{
	char filePath[500];
	switch (event)
	{
		case EVENT_COMMIT:

			FileSelectPopup ("c:\\Users\\Administrator\\Desktop", "*.bmp", "", "", VAL_SAVE_BUTTON, 0, 0, 1, 1, filePath);
			SetWaitCursor(1);
			Delay(0.1);

			SaveBitmapToFile(panelHandle,filePath);

			MessagePopup("提示","截图完成");
			SetWaitCursor(0);
			break;
	}
	return 0;
}

 

Guess you like

Origin blog.csdn.net/sichuanpb/article/details/112220652