SetBkMode (hdc, TRANSPARENT) ne fonctionne pas

Lorsque j’utilise SetBkMode(hdc, TRANSPARENT); Dans le code ci-dessous, j’ai eu l’effet suivant lorsque je redimensionnais la fenêtre principale (et donc lorsque l’enfant recevait le message WM_PAINT):

entrez la description de l'image ici

Le problème est le suivant: lorsque je redimensionne la fenêtre principale, l’ancienne zone de “Find:” doit être effacée, je suppose. Mais cela rest juste là.

Si je n’utilise pas SetBkMode(hdc, TRANSPARENT); , Je n’ai pas ce problème. Ça ressemble à:

entrez la description de l'image ici

C’est-à-dire qu’il a un fond blanc. De plus, si j’utilise SetBkMode(hdc, TRANSPARENT); , il ressemble à celui ci-dessus, avant de redimensionner la fenêtre principale. Donc, je ne pense pas SetBkMode(hdc, TRANSPARENT); travaille ici.

hwnd est un enfant statique de style SS_BITMAP .

Savez-vous pourquoi ce problème se produit?

 switch (message) { case WM_PAINT: PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); SelectObject(hdc, gDefaultGuiFont); SetBkMode(hdc, TRANSPARENT); RECT rc; GetClientRect(hwnd, &rc); DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; ............. } 

Essayez d’utiliser des rectangles “fixes”. Par exemple

  RECT rc; GetClientRect(hwnd, &rc); rc.left += ...; rc.top += ...; // shift up-left point DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_LEFT | DT_TOP); 

L’idée est de dessiner un texte en mauvaise position (une fois) et en bonne position (deux fois), tandis que l’arrière-plan n’est mis à jour qu’une seule fois. Je ne peux pas en dire plus sur une partie du code.

Le problème est que Windows ne met pas à jour le contrôle (à temps) qui se trouve derrière votre contrôle statique, vous êtes maintenant responsable de son contenu. Donc, vous voulez utiliser le fond fourni par le parent. Eh bien, demandez simplement au parent de le dessiner pour vous dans la fenêtre de l’enfant:

 RECT rc; GetClientRectRelative(m_hWnd, GetParent(m_hWnd), &rc); SetWindowOrgEx(m_mdc, rc.left, rc.top, NULL); SendMessage(GetParent(m_hWnd), WM_PAINT, (WPARAM)(HDC)m_mdc); SetWindowOrgEx(m_mdc, 0, 0, NULL); 

Dans lequel

 bool GetClientRectRelative(HWND hWnd, HWND hWndRelativeTo, RECT *pRect) { RECT rcWnd, rcRelativeTo; if (!GetClientRect(hWnd, &rcWnd) || !ClientToScreen(hWnd, (POINT*)&rcWnd) || !ClientToScreen(hWnd, (POINT*)&rcWnd + 1) || !GetClientRect(hWndRelativeTo, &rcRelativeTo) || !ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo) || !ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo + 1)) return false; pRect->top = rcWnd.top - rcRelativeTo.top; pRect->left = rcWnd.left - rcRelativeTo.left; pRect->right = rcWnd.right - rcRelativeTo.left; pRect->bottom = rcWnd.bottom - rcRelativeTo.top; return true; } 

Dessinez maintenant ce que vous voulez, je vous suggère d’utiliser le mode d’arrière-plan TRANSPARENT .

Veuillez créer toutes vos fenêtres enfants avec les styles WS_CLIPCHILDREN et WS_CLIPSIBLINGS . Ces problèmes apparaîtront immédiatement et vous éviterez le scintillement.