我单击主对话框一个按钮后,显示嵌入的子对话框。如果不在几秒内单击子对话框里的按钮,那么整个对话框就不会重绘,一片空白,且CPU占90%以上;单击子对话框里的按钮,被其他窗口覆盖后也可以重绘,那是怎么回事?????

解决方案 »

  1.   

    子对话框需要WM_CHILD属性 需要去掉标题栏才能嵌入到其他的对话框里面.
    把代码贴出来看看......
    一般来说应该不会出现那种状况啊 我就经常这样用的 也没见出过啊
      

  2.   

    显示子窗口的代码:
    void CMain::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CTest* pDlg=new CTest;
      pDlg->Create( IDD_TEST, this);
    pDlg->SetWindowPos(0, 195, 17, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);   
    pDlg->ModifyStyle(0,  WS_TABSTOP, 0);}
    勾了WM_CHILD属性,子窗口已经嵌进去了,
    Main对话框画了下背景图:
    void CMain::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    //为对话框添加背景图片          CRect   rect;   
              GetClientRect(&rect);
      
              CDC   dcMem;   
              dcMem.CreateCompatibleDC(&dc);
      
              CBitmap   bmpBackground;   
              bmpBackground.LoadBitmap(IDB_WELCOME);     //IDB_BACKGROUND是背景图对应的ID 
      
              BITMAP   bitmap;   
              bmpBackground.GetBitmap(&bitmap);
      
              CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground);   
              dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   
                    bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);  
    // Do not call CDialog::OnPaint() for painting messages
    }
      

  3.   

    我按照你的做法没有出问题啊,子窗口需要WS_CHILD风格并且去掉标题栏就好了BOOL CTest1Dlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码

    return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CTest1Dlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CPaintDC dc(this);
    CRect   rect;   
    GetClientRect(&rect); CDC   dcMem;   
    dcMem.CreateCompatibleDC(&dc); CBitmap   bmpBackground;   
    bmpBackground.LoadBitmap(10001);     //10001是背景图对应的ID  BITMAP   bitmap;   
    bmpBackground.GetBitmap(&bitmap); CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground);   
    dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   
    bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);  
    }
    }// 我按钮点击的地方
    void CTest1Dlg::OnOK()
    {
    // TODO: 在此添加专用代码和/或调用基类
    CTest11Dlg  * pTest = new CTest11Dlg();
    pTest->Create(CTest11Dlg::IDD,this);
    pTest->SetWindowPos(NULL,10,10,0,0,SWP_NOSIZE | SWP_SHOWWINDOW);
    pTest->ModifyStyle(0,WS_TABSTOP,0);
    }
      

  4.   

    我另一个程序也没这个问题;我是在子窗口里又嵌入一个属性表单,相当于二级子窗口;不知道为什么不能重绘,CPU还占90%多??
      

  5.   

    CTest* pDlg=new CTest;楼主想搞内存泄露么?
      

  6.   

    LZ的可以解决的,重写PostNcDestroy函数,里面加 delete this;重写OnOK函数,DestroyWindow();屏蔽基类的OnOK函数