ShowWindow() 刷新太慢怎么办?

lzhwh 2008-09-29 10:07:20
我在视图上面创建了一个基于CMyStatic类的静态文本框,然后我想让鼠标双击和单击时分别响应一个消息响应函数,(双击时:隐藏,单击时:拖动控件上的图像)
所以我给静态文本框加上属性:SS_NOTIFY。但是我发现响应双击怎么刷新都不管用,非得我手动刷新才能观察到控件隐藏。
大家看看是怎么回事?谢谢了
以下是CMyStatic.cpp中的双击响应:
void CMyStatic::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default

ShowWindow(FALSE);
Invalidate();
CStatic::OnLButtonDblClk(nFlags, point);
}
...全文
433 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
king820802 2008-09-29
  • 打赏
  • 举报
回复
1、GetParent()->Invalidate(); 当然最好是InvalidateRect否则整个dialog会闪的
2、还是那句话,“如果实现成功隐藏是不需要刷的”
3、这个函数进来的话,那表示你别的code有问题,建议去理下思路,全部code整理一下
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xsc2001 的回复:]
这个在你的视图中调用子控件的showWindow(false)或者刷新一下视图就可以。
[/Quote]
那在视图的什么地方刷新呢?是先判断鼠标双击状态,然后定义一个刷新函数?是这样吗?不好意思,我对VC还很模糊,见谅,说详细一点
xsc2001 2008-09-29
  • 打赏
  • 举报
回复
这个在你的视图中调用子控件的showWindow(false)或者刷新一下视图就可以。
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 king820802 的回复:]
1、static是透明的,要刷父窗口
2、如果实现成功隐藏是不需要刷的
3、你确定确实进入了当前这个函数?或者是别的地方又显示了?双击也响应单击消息的,你是不是那里又显示了?
[/Quote]

回复:
1、那在父窗口的什么地方刷?先判断一下鼠标双击了,然后刷新?是这样吗?
2、确实是隐藏了,手动刷新一下就没有那个控件了
3、我设置了断点测试了一下,确实是进入这个函数了,我在这个CMyStatic类中还没加上点击呢,所以也不可能你说的这种情况吧
king820802 2008-09-29
  • 打赏
  • 举报
回复
1、static是透明的,要刷父窗口
2、如果实现成功隐藏是不需要刷的
3、你确定确实进入了当前这个函数?或者是别的地方又显示了?双击也响应单击消息的,你是不是那里又显示了?
cnzdgs 2008-09-29
  • 打赏
  • 举报
回复
控件隐藏后,需要刷新视图的背景,但你的视图类中响应了WM_ERASEBKGND消息,其中又加了if (m_gEraseBk)这个条件,导致背景没有刷新。
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
1.重载CStatic类的cpp文件
// MyStatic.cpp : implementation file

BEGIN_MESSAGE_MAP(CMyStatic, CWnd)
//{{AFX_MSG_MAP(CMyStatic)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyStatic message handlers
void CMyStatic::OnPaint()
{
CNetWatcherViewerView *pView=(CNetWatcherViewerView *)((CMainFrame *)AfxGetMainWnd())->GetActiveView() ;
CPaintDC dc(this); // device context for painting
CNetWatcherViewerDoc* pDoc = (CNetWatcherViewerDoc*)((CView*)GetParent())->GetDocument();
if( pDoc->m_bRecvFlag){
DrawCurve(dc);
}


}
void CMyStatic::DrawCurve(CPaintDC& dc)
{
//图像的绘制部分
}
BOOL CMyStatic::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(rect);
pDC->FillSolidRect(rect,RGB(230,230,230));
return TRUE;
//return FALSE;
//return CWnd::OnEraseBkgnd(pDC);
}

void CMyStatic::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
ShowWindow(SW_HIDE);
CWnd::OnLButtonDblClk(nFlags, point);
}

2.视图类的cpp文件
// NetWatcherViewerView.cpp : implementation of the CNetWatcherViewerView class
//

/////////////////////////////////////////////////////////////////////////////
// CNetWatcherViewerView
IMPLEMENT_DYNCREATE(CNetWatcherViewerView, CScrollView)
BEGIN_MESSAGE_MAP(CNetWatcherViewerView, CScrollView)
//{{AFX_MSG_MAP(CNetWatcherViewerView)
ON_WM_ERASEBKGND()
ON_COMMAND(IDC_BUTTON3, ButtonCheck_choice1)
ON_COMMAND(IDC_BUTTON3, UpButtonCheck_choice1)
ON_COMMAND(ID_CONFIG_VIEW_SIGNALTIME, OnConfigViewSignaltime)
ON_UPDATE_COMMAND_UI(ID_CONFIG_VIEW_SIGNALTIME, OnUpdateConfigViewSignaltime)
ON_COMMAND(ID_CONFIG_VIEW_FFT, OnConfigViewFft)
ON_UPDATE_COMMAND_UI(ID_CONFIG_VIEW_FFT, OnUpdateConfigViewFft)
ON_WM_TIMER()
ON_COMMAND(ID_CONFIG_CHANNELCONFIG, OnConfigChannelconfig)
ON_COMMAND(IDC_BUTTON4, ButtonCheck_choice2)
ON_COMMAND(IDC_BUTTON4, UpButtonCheck_choice2)
ON_COMMAND(IDC_BUTTON5, ButtonCheck_choice3)
ON_COMMAND(IDC_BUTTON6, ButtonCheck_choice4)
ON_COMMAND(IDC_BUTTON6, UpButtonCheck_choice4)
ON_COMMAND(IDC_BUTTON7, ButtonCheck_choice5)
ON_COMMAND(IDC_BUTTON7, UpButtonCheck_choice5)
ON_COMMAND(IDC_BUTTON8, ButtonCheck_choice6)
ON_COMMAND(IDC_BUTTON8, UpButtonCheck_choice6)
ON_COMMAND(IDC_BUTTON9, ButtonCheck_choice7)
ON_COMMAND(IDC_BUTTON9, UpButtonCheck_choice7)
ON_COMMAND(IDC_BUTTON10, ButtonCheck_choice8)
ON_COMMAND(IDC_BUTTON10, UpButtonCheck_choice8)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
ON_MESSAGE(WM_RECVDATAOK, OnRecvDataOK)
ON_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON10, OnButton)


END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNetWatcherViewerView construction/destruction
CNetWatcherViewerView::CNetWatcherViewerView()
{
// TODO: add construction code here
}
CNetWatcherViewerView::~CNetWatcherViewerView()
{
}
BOOL CNetWatcherViewerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx=::GetSystemMetrics(SM_CXFULLSCREEN);
cs.cy=::GetSystemMetrics(SM_CYFULLSCREEN);
m_iClientW =cs.cx ; m_iClientH =cs.cy ;
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CNetWatcherViewerView drawing
void CNetWatcherViewerView::OnDraw(CDC* pDC)//重绘函数
{
CNetWatcherViewerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
SetTimer(0,1000,NULL); //1000 ms = 1 s
//int nLen=m_pView->m_edit4.GetWindowTextLength();
//pText="hello\r\n";
//m_pView->m_edit4.SetSel(nLen, nLen);
//m_pView->m_edit4.ReplaceSel(pText);
//m_pView->m_edit4()
//m_pView->m_edit4.SetSel(nLen, nLen);
//if( pDoc->m_bRecvFlag){
//DrawCurve(pDC, m_uiChannelIndex);
//////////////////////////////////////////////////////////////////////////
//}
}
void CNetWatcherViewerView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CChannelConfigDlg m_ChannelConfigDlg(this);
CSize sizeTotal;
connect_state="正在监听";
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);

m_static_channel1.Create("Static",WS_CHILD|WS_VISIBLE|WS_BORDER|SS_NOTIFY, CRect (80,80,m_iClientW-80,(m_iClientH/2-50)/8+80),this,IDC_STATIC_CHANNEL1);
BOOL CNetWatcherViewerView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
if (m_gEraseBk)
{
pDC->FillSolidRect(0,0,m_iClientW,m_iClientH,RGB(0,78,115));//(左上角X,Y,widith,height,color)
m_gEraseBk = FALSE;
}
return TRUE;
}
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 DJK303823 的回复:]
RedrawWindow()
[/Quote]
RedrawWindow()、UpdateWindow()都试过了,没效果
DJK303823 2008-09-29
  • 打赏
  • 举报
回复
or UpdateWindow()
DJK303823 2008-09-29
  • 打赏
  • 举报
回复
RedrawWindow()
cnzdgs 2008-09-29
  • 打赏
  • 举报
回复
发一个帖子就够了。

你还没说视图类是什么类型。另外创建控件的代码是在哪个函数中执行的?另外,控件创建后有没有改过控件风格?
可以先这样试试:
ShowWindow(SW_HIDE);
RECT rt;
GetWindowRect(&rt);
CWnd* parent = GetParent();
parent->ScreenToClient(&rt);
parent->InvalidateRect(&rt);
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
我把双击改成单击也是一样的效果,急死我了,快要交差了!!!!!!!!!!!!1
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
如果在ShowWindow(FALSE);处设置断点,可以看到程序运行到那里时控件隐藏,好奇怪啊?
我在视图中加了一个函数,不知道为什么程序运行不到那里去?
void CNetWatcherViewerView::Refresh()
{
if (m_doubleclick==TRUE)
Invalidate();
}


	ON_COMMAND(IDC_STATIC_CHANNEL1, Refresh)


	afx_msg void Refresh();
lzhwh 2008-09-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cnzdgs 的回复:]
从你描述和代码都没有问题。你的视图是什么类型?创建控件的代码怎么写的?

另外提一下,ShowWindow的参数不是BOOL型,用FALSE是不好的习惯,虽然FALSE与SW_HIDE都是0。
[/Quote]
这就是我创建控件时的代码,您看看有什么问题吗?
 m_static_channel1.CreateEx(WS_EX_CLIENTEDGE,   "Static",   "",WS_CHILD|WS_VISIBLE|WS_BORDER|SS_NOTIFY, CRect (80,80,m_iClientW-80,(m_iClientH/2-50)/8+80),this,IDC_STATIC_CHANNEL1);
m_static_channel1.m_uiChannelIndex=1;
cnzdgs 2008-09-29
  • 打赏
  • 举报
回复
从你描述和代码都没有问题。你的视图是什么类型?创建控件的代码怎么写的?

另外提一下,ShowWindow的参数不是BOOL型,用FALSE是不好的习惯,虽然FALSE与SW_HIDE都是0。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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