Re: image is not redrawed sometimes when I bring my window to foregrou
You are drawing the content of a child window in the parent window?
That is a bad thing. You should subclass the child control's class and
catch the WM_PAINT there, and do your point.
That means that if the control is a CStatic then create your own CStatic
derived class CxxxxStatic, catch the WM_PAINT there and do your drawing and
use that class instead of CStatic.
Why are you using the standard versions of SDK functions instead of the MFC
version. You are just doing more work than you need to.
CWnd has a GetDlgItem that retuns a CWnd.
CPaintDC is a better thing that GetDC or BeginPaint
If was to write your incorrect code I would at least write it like so (I
repeat this is bad code, it is just so you can see that it would be at least
4 or 5 lines shorter and easier to read if you were using the MFC functions)
CWnd *pWnd = GetDlgItem(IDC_PREVIEW_WINDOW);
CRECT rcClient;
pWnd->GetClientRect(&rcClient);
CPaintDC dc(pWnd);
if(m_pWC)
m_pWC->RepaintVideo(pWnd->GetSafeHwnd(), dc.GetSafeHdc());
AliR.
"Kai" <Kai@discussions.microsoft.com> wrote in message
news:4FD7716D-2975-45B6-8B20-DC7574DB9BF7@microsoft.com...
I use the following Repaint function to redraw my image
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND,
reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
HWND hWnd;
GetDlgItem(IDC_PREVIEW_WINDOW, &hWnd);
PAINTSTRUCT ps;
HDC hdc;
RECT rcClient;
::GetClientRect(hWnd, &rcClient);
hdc = ::BeginPaint(hWnd, &ps);
if(m_pWC)
m_pWC->RepaintVideo(hWnd, hdc);
::EndPaint(hWnd, &ps);
CDialog::OnPaint();
}
m_pWC is non zero after initialization.
for safety, I added OnActivate function
CDialog::OnActivate(nState, pWndOther, bMinimized);
// TODO: Add your message handler code here
if(nState != WA_INACTIVE)
UpdateWindow();
It doesn't seem UpdateWindow repaints window immediately.
Any better solution?