重绘消息是在主框架窗口OnCreate函数之后发送吗

来源:百度知道 编辑:UC知道 时间:2024/06/07 06:18:52
我自定义了消息 并在响应函数里做了个一个进度栏在状态栏上
在CMainFrame的OnCreate里PostMessage该消息,问题是当窗口发生重绘时
进度栏和状态栏的位置就会错开 ,于是我做了一个OnPaint响应函数,里面的代码如下:

CRect m_PRect;
m_wndStatusBar.GetItemRect(1,&m_PRect); //1是状态栏里的一个窗格的索引
if(!m_wndStatusBar.m_hWnd)
m_progressctrl.Create(WS_CHILD | WS_VISIBLE ,m_PRect,&m_wndStatusBar,123);
else
m_progressctrl.MoveWindow(m_PRect);

m_progressctrl.SetPos(50);
问题是运行出现错误 是什么问题 请高人指教一下~
一楼我也考虑过 于是我做了一个判断if(!m_progressctrl.m_hWnd) 进度栏是否创建,但问题还是纯在啊

谢谢 我知道错哪了

HI上聊

因为OnPaint函数是会执行多次的,所以你在这里调用
m_progressctrl.Create(WS_CHILD | WS_VISIBLE ,m_PRect,&m_wndStatusBar,123);

那么它就会被create多次,肯定会出错了

if(!m_wndStatusBar.m_hWnd)
你这样判断是不对的,你要判断m_progressctrl有没有创建,没有就create,如果已经创建了就movewindow

定义一个用户消息UM_PROGRESS
在OnCreate中加入SendMessage(UM_PROGRESS);(要在状态栏创建之后)
在OnPaint中也加入SendMessage(UM_PROGRESS);

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_MESSAGE(UM_PROGRESS,&CMainFrame::OnProgress)
END_MESSAGE_MAP()

LRESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam)
{
CRect rect;
m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
if(!m_progress.m_hWnd)
{
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar, ID_PROGRESS);
}
m_progress.MoveWindow(&rect);

return 0;
}