MFC编程控制一台仪器,单击按钮的响应事件里面添加了两个操作。一个事操作仪器,第二个是截取操作后的仪器屏幕截图并保存在目录中随后显示在客户区。我设置了多个按钮,但我运行后发现单击按钮一次只能实现操作仪器,需要再单击一次按钮才能截图并显示。
MemDC =CreateCompatibleDC(0);//得到一个兼容设备句柄
HBITMAP bit;//一个位图
CString cc;
cc="buf.bmp";//图片名称 要放到当前目录
bit=(HBITMAP)LoadImage(AfxGetInstanceHandle(),cc,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片
SelectObject(MemDC,bit);//把图片选择设备
CClientDC dc(this);//取得dc
BitBlt(dc.m_hDC,185,177,400,300,MemDC,0,0,SRCCOPY);
viClose (vi);
viClose (defaultRM);
这是我用来显示图片的方法。就是图片显示有迟疑。需要单击两次按钮。
如果放在鼠标点击函数里应该在获得响应后就会执行,是不是显示图片的函数有问题?你定义在哪?
加上一点延迟看看,是不是那个窗口没有打开就截图了,结果导致截取的是当前的窗口,好像没有操作一样。
直接在按钮事件中添加一些信息分析看看,第二次点击应该还是跑得同样的按钮代码。
如果你的显示图片绘制的代码是卸载OnPaint函数里的,单击不显示可能是因为你没有刷新导致的不会响应OnPaint函数,
可以尝试Invalidate函数去刷新下
void CDlgChild1::OnBtn1()
{
ViSession defaultRM,vi;
char buf [512000] = {0};
CString s;
char c;
FILE f;
int L,len;
errno_t err;
HDC MemDC;
ViRsrc matches;
viOpenDefaultRM (&defaultRM);
m_dev.GetWindowText(s);
matches=(char)(LPCTSTR)s;
viOpen (defaultRM,matches,VI_NULL,VI_NULL,&vi);
viPrintf (vi,":HCOPy:SDUMp:DATA?\n");
viScanf(vi,"%t\n", &buf);
if(buf[2]==49){
viPrintf (vi,":SOUR2:FUNC SIN\n");
}else{
viPrintf (vi,":SOUR1:FUNC SIN\n");
}/*单击一次按钮只能执行到这儿,是不是这中间要加点什么*/
if (1!=sscanf_s(buf,"#%1d",&L)) {
printf("buf format error!\n");
}
c=buf[2+L];buf[2+L]=0;
if (1!=sscanf_s(buf+2,"%d",&len)) {
printf("buf format error!\n");
}
if (len<32) {
printf("buf format error!\n");
}
err=fopen_s(&f,"buf.bmp","wb");
if (NULL==f) {
printf("create file buf.bmp error!\n");
}
buf[2+L]=c;
fwrite(buf+2+L,len,1,f);
fclose(f);
printf("save to buf.bmp OK.\n");
MemDC =CreateCompatibleDC(0);//得到一个兼容设备句柄
HBITMAP bit;//一个位图
CString cc;
cc="buf.bmp";//图片名称 要放到当前目录
bit=(HBITMAP)LoadImage(AfxGetInstanceHandle(),cc,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片
SelectObject(MemDC,bit);//把图片选择设备
CClientDC dc(this);//取得dc
BitBlt(dc.m_hDC,185,177,400,300,MemDC,0,0,SRCCOPY);
viClose (vi);
viClose (defaultRM);
}