在一个单文档里显示了一副bmp图,为什么窗体放大或缩小时显示的图像不见了?怎样可以不管窗体的大小怎么改变,图像都存在?

解决方案 »

  1.   

    你的显示代码放在OnPaint里面了吗?
      

  2.   

    那当然不行了,当有WM_PAINT消息来时,窗体一刷新就没有了,一般情况下输出或是画图的代码放在OnPaint 中,如果你想在菜单中加入控制功能的话,可以在菜单事件中用Invalidate来要求重绘
      

  3.   

    void CMainFrame::OnViewBitmap() 
    {
    // TODO: Add your command handler code here
    CFileDialog dlg(TRUE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");
    CString strFileName;
    //CClientDC dc(this);
    dc = new CClientDC(this); if (dlg.DoModal() == IDOK)
    {
    strFileName = dlg.GetPathName(); HBITMAP h_map;
    h_map = (HBITMAP)LoadImage(AfxGetInstanceHandle(), strFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); CBitmap Bitmap;
    Bitmap.DeleteObject();
    if (!Bitmap.Attach(h_map))
    {
    AfxMessageBox("导入背景图失败!");
    return;
    } BITMAP bm;
    Bitmap.GetObject(sizeof(BITMAP),&bm); CDC MemDC;
    MemDC.CreateCompatibleDC(dc); MemDC.SelectObject(&Bitmap);
    dc->BitBlt(2, 0, bm.bmWidth ,bm.bmHeight, &MemDC, 0, 0, SRCCOPY); }}
    ps:dc是CMainFrame类的成员
      

  4.   

    看了一下你的代码,你的代码能显示,但是由于不是写在OnPaint中的,一出现无效区显示就没了。因为你的代码中显示的图片是从打开文件对话框中选的,所以建议采取以下的方法来处理:
    第一:在CXXXView类中加一个CString变量保存要打开的图片文件的文件名。
    第二:在CXXXView类中加入菜单处理函数,在函数调用CFileDialog打开文件,但是不LoadImage,只将获取的文件名给上面的CString变量。同时调用Invalidate引发OnPaint执行。
    第三:给CXXXView类加OnPaint函数,在函数中用LoadImage装入CString变量中的图片文件,然后用BitBlt显示。
    另外,你上面代码是写在CMainFrame类中的,一般显示等工作都是写在CView类中的。