Witam,
mam problem z repaintem, który to odrysowuje zawartość okna na toolbarze choć nie powinien. Nie mam pojęcia jak to wyeliminować. Oto kod odpowiedzialny z tworzenie toolbaru:
TBBUTTON tbb[6];
ZeroMemory( tbb, sizeof( tbb ) );
tbb[0].idCommand = ID_TBB_BUTTON1;
tbb[0].iBitmap = tbb[0].iString = 0;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_GROUP;
// pozostale definiowanie przyciskow...
m_hToolbar = CreateWindowEx( 0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, m_hWnd, NULL, GetModuleHandle( NULL ), NULL );
SendMessage( m_hToolbar, TB_BUTTONSTRUCTSIZE, ( WPARAM )sizeof( TBBUTTON ), 0 );
TBADDBITMAP tbab;
tbab.hInst = GetModuleHandle( NULL );
tbab.nID = IDR_TOOLBAR1;
SendMessage( m_hToolbar, TB_ADDBITMAP, 5, ( LPARAM ) &tbab );
SendMessage( m_hToolbar, TB_ADDBUTTONS, sizeof( tbb ) / sizeof( TBBUTTON ), ( LPARAM ) &tbb );
Odpowiedź na komunikat WM_PAINT:
case WM_PAINT:
DrawAll();
ValidateRect(m_hWnd, NULL);
return TRUE;
Funkcja DrawAll();
void COkno::DrawAll()
{
HDC hdcBufor;
HBITMAP hbmBuf, hbmOldBuf;
PAINTSTRUCT ps;
HDC hDC = NULL;
hDC = BeginPaint( m_hWnd, &ps );
hdcBufor = CreateCompatibleDC( hDC );
hbmBuf = CreateCompatibleBitmap( hDC, ps.rcPaint.right, ps.rcPaint.bottom );
hbmOldBuf = ( HBITMAP ) SelectObject( hdcBufor, hbmBuf );
RECT rc = ps.rcPaint;
FillRect(hdcBufor, &rc, ( HBRUSH ) GetStockObject( WHITE_BRUSH ) );
BitBlt ( hDC, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, hdcBufor, 0, 0, SRCCOPY );
SelectObject( hdcBufor, hbmOldBuf );
ReleaseDC( m_hWnd, hdcBufor );
DeleteObject( hdcBufor );
DeleteObject( hbmBuf );
EndPaint( m_hWnd, &ps );
ReleaseDC( m_hWnd, hDC );
} // {end} void COkno::DrawAll()
Jeżeli klikam w miejsce gdzie powinien znajdować się przycisk, to się odrysowuje i faktycznie tam jest. Natomiast jeżeli ruszę myszą to wszystko jest zamalowywane przez biały prosokąt (przy WM_MOUSEMOVE mam InvalidateRect i o to mi chodziło, jednakże nie powinien być uwzględniany przy tym toolbar). Jeżeli daję InvalidateRect( m_hToolbar, NULL, TRUE ); po ValidateRect(m_hWnd, NULL); w WM_PAINT to jest odrysowany, lecz przy poruszaniu mysza miga, przez to, że ten biały prostokąt jest rysowany na nim. Może jakieś podpowiedzi?