问题如下:为了在Domodal之后的窗口立刻在pictureBox控件绘图,重载了数个函数进行绘图操作,皆未绘制成功。请问要实现这个功能应该在哪个函数中添加操作?
在新窗口重载了OnPaint(),OnCreate(LPCREATESTRUCT lpCreateStruct),OnShowWindow(BOOL bShow, UINT nStatus)
,OnChildActivate()这几个函数。
结果都没有在Domodal出来的新窗口没有在pictureBox中绘制图片。以下是代码:
DrawImage2和DrawImage1已经在OnInitDialog初始化。
IDC_PICTURE88和IDC_PICTURE8是俩个不同的pictureBox的控件ID。
void   RotationDialog::ShowImage(IplImage* img, UINT ID)  //显示图片的函数
{
//如果有用CImage类的显示图片的函数,请给一个。
//这个图片显示函数是基于opencv的图像显示类构建的,在创建完之后的其他地方能显示图片中能正常绘制。
CDC*pDC=GetDlgItem(ID)->GetDC();
HDC hdc=pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
int iw=img->width;
int ih=img->height;
int rw=rect.right-rect.left;
int rh=rect.bottom-rect.top;
int tx=(int)(rw-iw)/2;
int ty=(int)(rh-iw)/2;
SetRect(rect,0,0,iw,ih);
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hdc,&rect);
ReleaseDC(pDC);
}
void RotationDialog::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码

CDialog::OnPaint();
ShowImage(DrawImage2,IDC_PICTURE88);
ShowImage(DrawImage1,IDC_PICTURE8);
}int RotationDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1; // TODO:  在此添加您专用的创建代码
        ShowImage(DrawImage2,IDC_PICTURE88);
ShowImage(DrawImage1,IDC_PICTURE8);
return 0;
}void RotationDialog::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus); // TODO: 在此处添加消息处理程序代码
ShowImage(DrawImage2,IDC_PICTURE88);
ShowImage(DrawImage1,IDC_PICTURE8);}void RotationDialog::OnChildActivate()
{
CDialog::OnChildActivate(); // TODO: 在此处添加消息处理程序代码
ShowImage(DrawImage2,IDC_PICTURE88);
ShowImage(DrawImage1,IDC_PICTURE8);
}

解决方案 »

  1.   

    我找到问题了。添加了OnPaint函数,却没有在
    BEGIN_MESSAGE_MAP(RotationDialog, CDialog)
    ……
    END_MESSAGE_MAP()
    之间添加ON_WM_PAINT() 进行消息映射。
    又试了一下重载鼠标光标移动消息相似里面添加一个静态变量指示第一次调用的时候绘制图片,也能解决问题。
    楼上的OnActivate()试过,在最开始的时候还是没有画,在窗口最小化等情况下能绘制出来。
    现在有个问题就是在没有ON_WM_PAINT()进行声明的情况下,为什么我在整个DomoDal过程中的函数都重载却不会绘制我想绘制的图,也就是为什么以上我重载的函数没有在窗口一出现就有图片,被谁覆盖了(断点调试showWindows有进行绘制)?
      

  2.   

    OnActivte也是第一次不画?
    别的应该没有更合适的地方了吧?
    试试OnInitDialog的这一一行CDialog::OnInitDialog();的后面吧。
      

  3.   

    确实,就是将DC上的HBITMAP对象保存成BMP文件而已,网上有现在的代码。
      

  4.   

    我…………
    我前天的回复怎么没了?
    4楼我的图片是动态照片,我得出问题是因为重载OnPaint()但未在消息声明的地方添加ON_WM_PAINT()导致绘图失败。
    我加上ON_WM_PAINT()之后就能在显示窗口的时候显示图片了。
    现在想问的是当重载了OnPaint()函数而在消息声明的地方把ON_WM_PAINT()注释掉,之后重载OnInitDialog()之后这些函数,都没有实现窗口显示即绘图的功能?
      

  5.   

    这帖子我结了俩次还没结完成。csdn这么搞。