各位高手,我现在做一个VC下基于对话框的程序,遇到一点问题软件需要实现如下功能:1)在打开软件后,在对话框的一个区域绘制一个位图2)点击运行后,根据外部硬件中断触发,通过网络实时接收数据(图像数据,位图格式),然后动态的现实在对话框的界面。目前,我接收数据,以及位图的操作都没问题了,就是在进行显示的时候,出了问题。我的初始化代码如下:
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CFile file;
      file.Open("1.bmp", CFile::modeRead|CFile::typeBinary);
      DWORD m_nFileLen;
      m_nFileLen = file.GetLength();
      m_pBMPBuffer = new char[m_nFileLen + 1];
      if(!m_pBMPBuffer)
          MessageBox("为位图显示分配内存错误!!!");
      if(file.Read(m_pBMPBuffer,m_nFileLen) != m_nFileLen)
          MessageBox("读取位图文件错误!!!");;
file.Close();

LPSTR    hDIB,  lpBuffer = m_pBMPBuffer;
DWORD  bmfHeaderLen = sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader, (LPSTR)lpBuffer, bmfHeaderLen); //拷贝文件头
if (bmfHeader.bfType != (*(WORD*)"BM")) //判断是否为位图文件
MessageBox("此文件不是位图!");
hDIB = lpBuffer + bmfHeaderLen; //获取文件信息结构地址
BITMAPINFOHEADER &bmiHeader1 = *(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo1 = *(LPBITMAPINFO)hDIB;         //获取其中的数据结构地址
bmiHeader=&bmiHeader1;
bmInfo=&bmInfo1;
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;  //获取位图数据的首地址

CClientDC dc(this);
hShowBMP = CreateDIBitmap(dc.m_hDC, bmiHeader, CBM_INIT, lpDIBBits, bmInfo, DIB_RGB_COLORS);
CDC *pDC;
pDC=GetDC();
CDC MemDC;

MemDC.CreateCompatibleDC(pDC);
      OldBitmap=(HBITMAP)MemDC.SelectObject(hShowBMP);
pDC->StretchBlt(0, 0, 350, 310, &MemDC, 0, 0, bmiHeader->biWidth, bmiHeader->biHeight,  SRCCOPY);
MemDC.SelectObject(OldBitmap);
DeleteObject(hShowBMP);
    /////在这里调用函数就是正确的/////////
return TRUE;  // return TRUE  unless you set the focus to a control
}为什么这样写,初始化后,什么都看不见?
但是我将绘图的代码写到一个函数中,再调用这个函数,就可以显示图像,但是这样显示不能重绘,被遮挡后就没有了
我的第一个的问题是:出现这样问题的原因是什么,同样一段代码,为什么直接用不能够现实位图呢?
第二个问题:如果要实现上述功能,是否需要在void CMyDlg::OnPaint()中进行相关的操作?那么怎么实现呢?
第三个问题:从网络接收数据,我用的是线程,通过线程在需要绘图时发送消息,然后在DefWindowProc函数中通过对消息进行判断来绘图,图形也出不来,这个问题想了好久,都没有方法解决补充:我的程序因为重绘了标题栏,因此有如下代码:
LRESULT CMyDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
  if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
    {
//这里进行绘制标题栏
    }
    return CDialog::DefWindowProc(message, wParam, lParam);
}
请高手,给我指一个方向吧。以上问题请大家畅所欲言

解决方案 »

  1.   

    绘制的代码应该放到WM_PAINT里,而不是放到初始化中,基于对话框一般默认有OnPaint 
    在OnPaint中加入你的绘制代码
      

  2.   

    除了OnPaint()不能用CClientDC dc(this);
      

  3.   

    你把CMyDlg::DefWindowProc 里面的代码注释掉 再试试吧 因为里面你截取的WM_PAINT消息 所以运行不到OnPaint里面去然后 把OnInitDialog中 绘制图片的代码 放到 OnPaint里面去试试吧!
      

  4.   

    吧绘图相关的代码整理到OnPaint中
    你可以参考一下这个
    http://blog.csdn.net/xianglitian/archive/2010/12/27/6100767.aspx