窗口没有句柄

lqa876270 2011-05-30 11:49:17
写了一个CProgressBar类,在对话框的任务栏中加入进度条,其中
bool CProgressBar::Create(LPCSTR strMessage, int nSize, int maxValue, bool bSmooth, int nPane)
{
BOOL bSuccee=FALSE;
CStatusBar *pStatusBar=GetStatusBar();
if(pStatusBar)
return FALSE;

DWORD dwStyle=WS_CHILD | WS_VISIBLE;
#ifdef PBS_SMOOTH
dwStyle |= PBS_SMOOTH;
#endif
//Get CRect coordinates for required status bar pane
CRect PaneRect;
pStatusBar->GetItemRect(nPane,&PaneRect);//??????????????????????在barst.cpp中的

//Create the progress bar
bSuccee=CProgressCtrl::Create(dwStyle,
PaneRect,
pStatusBar,
1);

ASSERT(bSuccee);
if(!bSuccee)
return FALSE;

//Set range and step
SetRange(0,maxValue,1);
SetPos(1);

m_strMessage =strMessage;
m_nSize =nSize;
m_nPane =nPane;
m_strPreText =pStatusBar->GetPaneText(m_nPane);
Resize();
return true;
}

当调试到pStatusBar->GetItemRect(nPane,&PaneRect);时//??????????????????????在barst.cpp中的
进入barst.cpp中的
void CStatusBar::GetItemRect(int nIndex, LPRECT lpRect) const
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));///////Unhandled exception at 0x7c2569df (mfc71d.dll) in VOS.exe: 0xC0000005: Access violation reading location 0x00000020.
CStatusBar* pBar = (CStatusBar*)this;
if (!pBar->DefWindowProc(SB_GETRECT, nIndex, (LPARAM)lpRect))
::SetRectEmpty(lpRect);
}

在ASSERT(::IsWindow(m_hWnd));处出现错误,提示
Unhandled exception at 0x7c2569df (mfc71d.dll) in VOS.exe: 0xC0000005: Access violation reading location 0x00000020.


在主对话框类中的声明了CProgressBar的变量
/***********************20110527*********************************/
CProgressBar m_progressBar;//????????????????
m_progressBar.Create("Progress",40,1000,PBS_SMOOTH ,0);
for(int i=0;i<100;i++)
{
m_progressBar.StepIt();
}
m_progressBar.SetText("Writing");
for(int i=0;i<100;i++)
{
m_progressBar.StepIt();
//PeekAndPump();
}
m_progressBar.Clear();

/***********************20110527*********************************/
...全文
235 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyotrue 2011-05-30
  • 打赏
  • 举报
回复
任何窗口都有句柄的,但是Create返回前窗口是没有完成创建的,不能对窗口做除设置样式以外的操作
King_hhuang 2011-05-30
  • 打赏
  • 举报
回复
GetStatusBar();
返回的是什么?
lqa876270 2011-05-30
  • 打赏
  • 举报
回复
CStatusBar * CProgressBar::GetStatusBar(void)
{
CWnd *pMainWnd =AfxGetMainWnd();
if(!pMainWnd)
return NULL;

//If main window is a frame window use normmal methods...

if(pMainWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd)))
{
CWnd * pMessagebar=((CFrameWnd*)pMainWnd)->GetMessageBar();

return DYNAMIC_DOWNCAST(CStatusBar,pMessagebar);
}

//otherwise traverse children to try to find the status bar ...

else

return DYNAMIC_DOWNCAST(CStatusBar,pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR));
}
我调试了这个函数,发现,返回值为0。
我的是基于对话框的,按理说是经GetStatusBar()时,应该返回return DYNAMIC_DOWNCAST(CStatusBar,pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR));的值,返回值可是怎么是0???
lqa876270 2011-05-30
  • 打赏
  • 举报
回复
抱歉,我漏敲了一个 “!”.代码应该如下:
CStatusBar *pStatusBar=GetStatusBar();
if(!pStatusBar)
return FALSE;

其余代码应该没有错。

问题是pStatusBar 的返回值是0,所以经if 判断,直接return FALSE;

跳出了bool CProgressBar::Create();
ToperRay 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 caixilong 的回复:]

任何窗口都有句柄和指针
[/Quote]

NO,看你怎么定义窗口。

零零发 2011-05-30
  • 打赏
  • 举报
回复
任何窗口都有句柄和指针
lqa876270 2011-05-30
  • 打赏
  • 举报
回复
GetStatusBar();返回的是pStatusBar 是0
lqa876270 2011-05-30
  • 打赏
  • 举报
回复
GetStatusBar();返回的是pStatusBar hWnd=???
进行if判断时,
if(pStatusBar)
return FALSE;

跳出,不执行return FALSE.
帝国队长 2011-05-30
  • 打赏
  • 举报
回复
怎么可能没有句柄呢。。。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧