C++ MFC 刷新 Window
C++ MFC Refresh Window
我将 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);}
我将这段代码插入到 OnInitDlg 方法中,矩形确实出现了,但是当设备连接时它并没有变为绿色。无论如何我可以刷新 window 以便再次执行代码并且颜色变为绿色?
IDC_CONNECT_STATUS 是什么类型的控件?如果它是静态控件,您可以删除所有这些代码并在父对话框中处理 WM_CTLCOLOR_STATIC。该消息的消息处理程序将控制静态控件的颜色。要刷新静态控件,请对该控件调用 Invalidate。这将导致它调用您的 WM_CTLCOLOR_STATIC 消息处理程序。
已解决,因为我是 C++ 的新手,所以我不知道将代码片段放入 OnInitDlg()
方法中是行不通的。所以我将代码放入 OnPaint()
方法中,并使用函数 Invalidate()
和 UpdateWindow()
强制 window 在设备为 connected/disconnected 时刷新。感谢您的帮助。
编辑 感谢 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();
}
我将 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);}
我将这段代码插入到 OnInitDlg 方法中,矩形确实出现了,但是当设备连接时它并没有变为绿色。无论如何我可以刷新 window 以便再次执行代码并且颜色变为绿色?
IDC_CONNECT_STATUS 是什么类型的控件?如果它是静态控件,您可以删除所有这些代码并在父对话框中处理 WM_CTLCOLOR_STATIC。该消息的消息处理程序将控制静态控件的颜色。要刷新静态控件,请对该控件调用 Invalidate。这将导致它调用您的 WM_CTLCOLOR_STATIC 消息处理程序。
已解决,因为我是 C++ 的新手,所以我不知道将代码片段放入 OnInitDlg()
方法中是行不通的。所以我将代码放入 OnPaint()
方法中,并使用函数 Invalidate()
和 UpdateWindow()
强制 window 在设备为 connected/disconnected 时刷新。感谢您的帮助。
编辑 感谢 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();
}