【问题标题】:C++ MFC Refresh WindowC++ MFC 刷新窗口
【发布时间】:2015-10-26 06:46:00
【问题描述】:

我正在将 Visual Studio 2010 与 MFC 一起使用,并且我正在尝试制作一个在设备断开连接时为红色且在断开连接时为绿色的矩形。我用以下代码制作了矩形:

CRect lConnectStatus;
    GetDlgItem( IDC_CONNECT_STATUS ) -> GetClientRect( &lConnectStatus );
    GetDlgItem( IDC_CONNECT_STATUS ) -> ClientToScreen( &lConnectStatus );
    ScreenToClient( &lConnectStatus );
    mConnected.Create( GetSafeHwnd(), 10000 );
    mConnected.SetPosition( lConnectStatus.left, lConnectStatus.top, lConnectStatus.Width(), lConnectStatus.Height() );
    if( mDevice.IsConnected() ){
        mConnected.SetBackgroundColor(0, 255, 0);
    }
    else{mConnected.SetBackgroundColor(0, 0, 255);}

我将此 sn-p 插入到 OnInitDlg 方法中,矩形确实出现了,但是当设备连接时它不会变为绿色。无论如何我可以刷新窗口,以便再次执行代码并将颜色变为绿色?

【问题讨论】:

  • 是的,看看a CWnd reference,我相信你会找到办法的。
  • 该链接没有太大帮助,但感谢您的评论。
  • 如果您点击该链接,还有另一个指向the CWnd class members 的链接,其中包含关于update and painting functions 的部分,其中列出了InvalidateRedrawWindow 等函数。
  • 啊,好吧,我对这一切都很陌生,所以我还没有完全了解参考页面。它看起来像一个很好的资源,所以请记住它以备后用。谢谢

标签: c++ visual-studio-2010 mfc


【解决方案1】:

IDC_CONNECT_STATUS 是什么类型的控制?如果它是一个静态控件,您可以消除所有这些代码并在父对话框中处理 WM_CTLCOLOR_STATIC。该消息的消息处理程序将控制静态控件的颜色。要刷新该控件上的静态控件调用 Invalidate。这将导致它调用您的 WM_CTLCOLOR_STATIC 消息处理程序。

【讨论】:

  • 谢谢您的好先生!我的解决方法略有不同,但您的回答确实帮助我使用了Invalidate() 函数
【解决方案2】:

解决了,因为我是 C++ 新手,所以我不知道将代码 sn-p 放入 OnInitDlg() 方法是行不通的。所以我将代码放入OnPaint()方法中,并使用Invalidate()UpdateWindow()函数在设备连接/断开连接时强制窗口刷新。感谢您的帮助。

编辑感谢 Barmak 建议不要在 OnPaint() 方法中创建控件。我已经更新了下面的代码。

program::OnInitDlg(){
    CRect lConnectStatus;
    GetDlgItem( IDC_CONNECT_STATUS ) -> GetClientRect( &lConnectStatus );
    GetDlgItem( IDC_CONNECT_STATUS ) -> ClientToScreen( &lConnectStatus );
    ScreenToClient( &lConnectStatus );
    mConnected.Create( GetSafeHwnd(), 10000 );
    mConnected.SetPosition( lConnectStatus.left, lConnectStatus.top, lConnectStatus.Width(), lConnectStatus.Height() );
}

program::OnPaint(){
    if( mDevice.IsConnected() ){
        mConnected.SetBackgroundColor(0, 255, 0);
    }
    else{mConnected.SetBackgroundColor(0, 0, 255);}
}

program::Connect(){
Invalidate();
UpdateWindow();
}

program::disconnect(){
Invalidate();
UpdateWindow();
}

【讨论】:

  • 您还没有解释您的代码,但看起来您正在OnPaint 函数中创建一个控件。每次绘制对话框时,您都在创建一个控件。程序可能会崩溃。
  • 它不会崩溃,但我采纳了您的建议并在OnInitDlg() 方法中创建了控件,并将if 语句放入OnPaint() 方法中。它仍然可以正常工作
  • 也可以尝试使用program::Connect() { mConnected.SetBackgroundColor(...); mConnected.Invalidate();},如果可行,则无需覆盖OnPaint
  • 如果您是 C++ 新手,为什么要从 MFC 开始?您应该先大致了解一下 Win32 和 C++。
  • 在这里我不得不同意@Blacktempel。如果您不了解 C++ 或 Windows API,那么您了解 MFC 的机会。请参阅Prerequisites for learning MFC programming 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2019-11-30
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多