Type error in argument 1 to `SetDIBitsToDevice';

yardloun 2011-02-22 10:23:41
错误提示:
Type error in argument 1 to `SetDIBitsToDevice'; found 'HWND' expected 'HDC'.

前面声明为:
BITMAPINFO info;
unsigned char *pData;

出错部分函数代码:
memset(&info,0,sizeof(info));
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = W;
info.bmiHeader.biHeight = -H;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biCompression = BI_RGB;


*pData = NULL ;
if(mIndex >=0 && mIndex <5 || NULL == mImgData)
pData = mImgData + (mIndex-1)*W*H*4 ;
SetDIBitsToDevice((HWND)imghandle,0,0,704,576,0,0,0,576,pData,&info,DIB_RGB_COLORS);//这里出错了。


所有的这个文件的代码为:

#include <cvirte.h>
#include <userint.h>
#include <stdio.h>
#include "windows.h"
#include "niimaq.h"
#include "nivision.h"
#include "formatio.h"
#include <utility.h>
#include <ansi_c.h>
#include "serial.h"
#include <stdlib.h>
#include <string.h>
#include "asynctmr.h"
#include <formatio.h>
#include <math.h>


BOOL __stdcall PlayM4_OpenStream(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize);
BOOL __stdcall PlayM4_SetDisplayCallBack(LONG nPort,void (CALLBACK* DisplayCBFun)(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReserved));
BOOL __stdcall PlayM4_Play(LONG nPort, HWND hWnd);
VOID __stdcall PlayM4_YV12toRGB32(unsigned char* yv12, int width, int height, unsigned char* rgb);
BOOL __stdcall PlayM4_InputData(LONG nPort,PBYTE pBuf,DWORD nSize);



#define WINDOW_TO_USE 0
#define MAX_THREADS 60

HMODULE objDll;

BOOL re=FALSE;
unsigned char *mImgData = NULL ;
unsigned char mTempData[720*576*4] ;
unsigned char mTempDataSwap[720*576*4] ;
HWND mHand ;

Image *h264image;
//Image *CopyTo_Image(unsigned char * ImagePtr, int LineWidth, int Width, int Height);



int mIndex = 0 ;
int W = 0 ;
int H = 0 ;
int Band = 0 ;
long nWidth;
long nHeight;
long nType;
FILE * fp;


//void IMAQ_CALLBACK ExtractImage (WindowEventType event, int windowNumber, Tool tool, Rect rect);
void CALLBACK DisplayCallBackFunc(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReserved);
typedef long int (*objFun_OpenStream)(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize); //定义函数指针
typedef long int (*objFun_SetDisplayCallBack)(LONG nPort,void (CALLBACK* DisplayCBFun)(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReserved)); //定义函数指针
typedef long int (*objFun_Play)(LONG nPort, HWND hWnd); //定义函数指针
typedef long int (*objFun_YV12toRGB32)(unsigned char* yv12, int width, int height, unsigned char* rgb); //定义函数指针
typedef long int (*objFun_InputData)(LONG nPort,PBYTE pBuf,DWORD nSize); //定义函数指针
typedef long int (*objFun_CloseStream)(LONG nPort);
typedef long int (*objFun_RefreshPlay)(LONG nPort);

objFun_OpenStream objOpenStreamAddress;
objFun_SetDisplayCallBack objSetDisplayCallBackAddress;
objFun_Play objPlayAddress;
objFun_YV12toRGB32 objYV12toRGB32Address;
objFun_InputData objInputDataAddress;
objFun_CloseStream objCloseStreamAddress;
objFun_RefreshPlay objRefreshPlayAddress;

int linshi;

static int mypanel;
//HWND hwnd;
int imghandle;
static int ImaqHandle; // will contain the handle to the imaq window
static int windHandle; // will contain the handle to the CVI window


BITMAPINFO info;
unsigned char *pData;


int CVICALLBACK TimeToDo (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_TIMER_TICK:

memset(&info,0,sizeof(info));
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = W;
info.bmiHeader.biHeight = -H;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biCompression = BI_RGB;

*pData = NULL ;

if(mIndex >=0 && mIndex <5 || NULL == mImgData)
pData = mImgData + (mIndex-1)*W*H*4 ;
SetDIBitsToDevice((HWND)imghandle,0,0,
704,576,0,0,0,576,
pData,&info,DIB_RGB_COLORS);
break;
}
return 0;
}

int main (int argc, char *argv[])
{



if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((mypanel = LoadPanel (0, "serial.uir", MYPANEL)) < 0)
return -1;
DisplayPanel (mypanel);
//////////////////////////////////////////////////////////////
//Onplay();
///*set the image window to be one part of the CVI window
imaqSetupWindow(WINDOW_TO_USE,0);
imaqSetWindowPalette(WINDOW_TO_USE,2,NULL,0);
windHandle = (int) FindWindow (NULL, "TARGET LOCATION");
//h264image= imaqCreateImage (IMAQ_IMAGE_RGB, 0);
ImaqHandle = (int) imaqGetSystemWindowHandle(0);
SetParent( (HWND) ImaqHandle, (HWND)windHandle);
imaqSetWindowTitle( WINDOW_TO_USE, "Show Image" );
imaqMoveWindow( WINDOW_TO_USE, imaqMakePoint(10,10));
imaqSetCurrentTool (IMAQ_POINT_TOOL);

RunUserInterface ();
FreeLibrary(objDll); //卸载动态链接库.DLL,放在程序退出的函数里面
DiscardPanel (mypanel);
return 0;
}

int CVICALLBACK quit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}

int CVICALLBACK onplay (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int i;
int fileLen;
FILE *fp;
unsigned char data[512] ;
int times;
int j;
switch (event)
{
case EVENT_COMMIT:
/////////////////////////////////////////////////////////
SetCtrlAttribute(mypanel,MYPANEL_TIMER,ATTR_ENABLED,1);

fp = fopen("VP0_cdv.264","rb");
fseek(fp,0,SEEK_END);
fileLen = ftell(fp);
rewind(fp);
//GetCtrlAttribute(mypanel,MYPANEL_TIMER,ATTR_ENABLED,&linshi);
//printf("%d",linshi);


times = fileLen/512 ;

for(i=0; i<times; i++)
{
fread(data,1,512,fp);
re=(*objInputDataAddress)(0,data,512);


for(j=0; j<2; j++)
{}
//Sleep(1);

}


fclose(fp);
///////////////////////////////////////////////////////////////////

break;
}
return 0;
}

int CVICALLBACK onini (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//////////////////////////////////////////////////////////////////////////////
//imghandle=(HWND)GetCVIWindowHandle();
objDll = LoadLibrary("playSDK.dll");

if (objDll != NULL) //成功装载动态链接库.DLL
{

//typedef BOOL(*tFunSig)(0,0,0);

objOpenStreamAddress = (objFun_OpenStream)GetProcAddress(objDll, "PlayM4_OpenStream"); //取函数指针地址
objSetDisplayCallBackAddress = (objFun_SetDisplayCallBack)GetProcAddress(objDll, "PlayM4_SetDisplayCallBack"); //取函数指针地址
objPlayAddress = (objFun_Play)GetProcAddress(objDll, "PlayM4_Play"); //取函数指针地址
objYV12toRGB32Address = (objFun_YV12toRGB32)GetProcAddress(objDll, "PlayM4_YV12toRGB32"); //取函数指针地址
objInputDataAddress = (objFun_InputData)GetProcAddress(objDll, "PlayM4_InputData"); //取函数指针地址
objCloseStreamAddress = (objFun_CloseStream)GetProcAddress(objDll, "PlayM4_CloseStream");
objRefreshPlayAddress = (objFun_RefreshPlay)GetProcAddress(objDll, "PlayM4_RefreshPlay");

if (objOpenStreamAddress) //dll中有函数()
{
re=(*objOpenStreamAddress)(0,NULL,0,0x64000);
re=(*objSetDisplayCallBackAddress)(0,DisplayCallBackFunc);
GetPanelAttribute (mypanel, ATTR_SYSTEM_WINDOW_HANDLE, &imghandle);
//re=(*objPlayAddress)(0,(HWND)imghandle); //调用dll函数播放,但是这里是利用cvi的当前窗口进行播放,覆盖整个窗口!!!


}
//

}
break;
}
return 0;
}
void CALLBACK DisplayCallBackFunc(long nPort,char * pBuf,long nSize,long nWidth,long nHeight,
long nStamp,long nType,long nReserved)
{


if(mIndex >=0 && mIndex <5)
{
///*
if(NULL == mImgData)
{
mImgData=(unsigned char*)malloc(sizeof(unsigned char)*nWidth*nHeight*4*6);

}
if(NULL == mTempData)
{
mImgData=(unsigned char*)malloc(sizeof(unsigned char)*nWidth*nHeight*4);
//mTempData = new unsigned char[nWidth*nHeight*4];
}
//*/

re=(*objYV12toRGB32Address)((unsigned char*)pBuf,nWidth,nHeight,mTempData);
W = nWidth ;
H = nHeight ;
Band = nType ;

memcpy(mImgData + W*H*4*mIndex ,mTempData,W*H*4) ;
memcpy(mTempDataSwap ,mTempData,W*H*4);

mIndex++ ;

if(mIndex >= 4)
mIndex = 0 ;

}


}
...全文
253 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
w0911h 2011-02-23
  • 打赏
  • 举报
回复
第一参数要求是HDC类型的,但你传了一个HWND
zjs100901 2011-02-23
  • 打赏
  • 举报
回复
SetDIBitsToDevice要求第一个参数是HDC类型。要把HWND转成HDC类型。
[code=C]/C++GetDC( (HWND)imghandle )[/code]

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧