1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| static LRESULT CALLBACK WndProcRichXP(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
/* appel de l'ancienne procédure */
LRESULT lResult = CallWindowProc(WndProcRichEdit, hWnd, uMsg, wParam, lParam);
switch (uMsg) {
/* le thème courant, si NULL on laisse le richedit se dessiner seul (thèmes indisponibles) sinon on le fait nous-même (look XP) */
static HTHEME hTheme = NULL;
case WM_NCCREATE:
/* le richedit s'envoie un WM_THEMECHANGED */
SendMessage(hWnd, WM_THEMECHANGED, 0, 0);
return TRUE;
case WM_NCCALCSIZE:
/* calcul de la taille de la bordure, ou traitement par défaut (thèmes non chargés) */
return WVR_REDRAW;
case WM_NCPAINT:
/* dessin de la bordure, ou traitement par défaut (thèmes non chargés) */
return 0;
case WM_ENABLE:
case WM_STYLECHANGED:
/* faut redessiner la bordure */
RedrawWindow(hWnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
return 0;
case WM_THEMECHANGED:
/* on libère l'ancien thème, le cas échéant */
if (hTheme != NULL) {
pCloseThemeData(hTheme);
}
/* j'ai essayé un appel à IsAppThemed et IsThemeActive ici en plus du test sur pOpenThemeData, mais ils sont sans effet */
/* on récupère le nouveau thème */
if (pOpenThemeData != NULL) {
hTheme = pOpenThemeData(hWnd, L"EDIT");
} else {
hTheme = NULL;
}
/* et on positionne les bordures du richedit en fonction du thème : si "look XP" on la dessine, sinon on laisse le richedit le faire */
if (hTheme != NULL) {
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
} else {
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_CLIENTEDGE);
}
return 0;
default:
/* autres messages : ne pas interférer */
return lResult;
}
} |
Partager