对话框窗口(嵌入一个子窗口)的重绘问题 我单击主对话框一个按钮后,显示嵌入的子对话框。如果不在几秒内单击子对话框里的按钮,那么整个对话框就不会重绘,一片空白,且CPU占90%以上;单击子对话框里的按钮,被其他窗口覆盖后也可以重绘,那是怎么回事????? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 子对话框需要WM_CHILD属性 需要去掉标题栏才能嵌入到其他的对话框里面.把代码贴出来看看......一般来说应该不会出现那种状况啊 我就经常这样用的 也没见出过啊 显示子窗口的代码: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} 我按照你的做法没有出问题啊,子窗口需要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);} 我另一个程序也没这个问题;我是在子窗口里又嵌入一个属性表单,相当于二级子窗口;不知道为什么不能重绘,CPU还占90%多?? CTest* pDlg=new CTest;楼主想搞内存泄露么? LZ的可以解决的,重写PostNcDestroy函数,里面加 delete this;重写OnOK函数,DestroyWindow();屏蔽基类的OnOK函数 请问有高手能够总结出下面字符串的加密算法吗? 打印机状态返回 wizardbar c++ mumber 一点就变灰了 关于字体的缩放 画图时的虚框问题 主窗口接收不了对话框 的消息(不能在主窗口给出回应)可能是怎么回事 vc 窗口句柄问题 tcp连接为什么会失败? 请教运行多线程,cpu100%的问题 怎么利用MFC 绘制一些二次曲面? 求个验证用户名是否合法的函数 请问字符指针如何向字符数组转化
把代码贴出来看看......
一般来说应该不会出现那种状况啊 我就经常这样用的 也没见出过啊
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
}
{
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);
}