diff --git a/reactos/dll/win32/comctl32/CMakeLists.txt b/reactos/dll/win32/comctl32/CMakeLists.txt index 6f18d889a62..1b55c5dfdf4 100644 --- a/reactos/dll/win32/comctl32/CMakeLists.txt +++ b/reactos/dll/win32/comctl32/CMakeLists.txt @@ -37,6 +37,7 @@ list(APPEND SOURCE string.c syslink.c tab.c + taskdialog.c theme_button.c theme_combo.c theme_dialog.c diff --git a/reactos/dll/win32/comctl32/comctl32.h b/reactos/dll/win32/comctl32/comctl32.h index c677878d738..32ba0fe4ea8 100644 --- a/reactos/dll/win32/comctl32/comctl32.h +++ b/reactos/dll/win32/comctl32/comctl32.h @@ -45,8 +45,9 @@ #include #include -#include #include +#include +#include #include "resource.h" diff --git a/reactos/dll/win32/comctl32/commctrl.c b/reactos/dll/win32/comctl32/commctrl.c index 38cdce51892..2a6f774ab56 100644 --- a/reactos/dll/win32/comctl32/commctrl.c +++ b/reactos/dll/win32/comctl32/commctrl.c @@ -60,6 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(commctrl); + static LRESULT WINAPI COMCTL32_SubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LPWSTR COMCTL32_wSubclass = NULL; @@ -1949,45 +1950,6 @@ int WINAPI DrawShadowText(HDC hdc, LPCWSTR pszText, UINT cch, RECT *prc, DWORD d return iRet; } -/*********************************************************************** - * TaskDialogIndirect [COMCTL32.@] - */ -HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *pTaskConfig, int *pnButton, - int *pnRadioButton, BOOL *pfVerificationFlagChecked) -{ - UINT uType = 0; - INT ret; - FIXME("%p, %p, %p, %p\n", pTaskConfig, pnButton, pnRadioButton, pfVerificationFlagChecked); - - if (pTaskConfig->dwCommonButtons & TDCBF_YES_BUTTON && - pTaskConfig->dwCommonButtons & TDCBF_NO_BUTTON && - pTaskConfig->dwCommonButtons & TDCBF_CANCEL_BUTTON) - uType |= MB_YESNOCANCEL; - else - if (pTaskConfig->dwCommonButtons & TDCBF_YES_BUTTON && - pTaskConfig->dwCommonButtons & TDCBF_NO_BUTTON) - uType |= MB_YESNO; - else - if (pTaskConfig->dwCommonButtons & TDCBF_RETRY_BUTTON && - pTaskConfig->dwCommonButtons & TDCBF_CANCEL_BUTTON) - uType |= MB_RETRYCANCEL; - else - if (pTaskConfig->dwCommonButtons & TDCBF_OK_BUTTON && - pTaskConfig->dwCommonButtons & TDCBF_CANCEL_BUTTON) - uType |= MB_OKCANCEL; - else - if (pTaskConfig->dwCommonButtons & TDCBF_OK_BUTTON) - uType |= MB_OK; - ret = MessageBoxW(pTaskConfig->hwndParent, pTaskConfig->pszMainInstruction, - pTaskConfig->pszWindowTitle, uType); - FIXME("dwCommonButtons=%x uType=%x ret=%x\n", pTaskConfig->dwCommonButtons, uType, ret); - - if (pnButton) *pnButton = ret; - if (pnRadioButton) *pnRadioButton = pTaskConfig->nDefaultButton; - if (pfVerificationFlagChecked) *pfVerificationFlagChecked = TRUE; - return S_OK; -} - /*********************************************************************** * LoadIconWithScaleDown [COMCTL32.@] */ diff --git a/reactos/dll/win32/comctl32/lang/comctl_Bg.rc b/reactos/dll/win32/comctl32/lang/comctl_Bg.rc index f3b3227ba73..acc9f7d83a6 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Bg.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Bg.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Нищо" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Свойства на %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Cs.rc b/reactos/dll/win32/comctl32/lang/comctl_Cs.rc index 23562f817af..21caa2049d9 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Cs.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Cs.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Žádný" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Vlastnosti %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Da.rc b/reactos/dll/win32/comctl32/lang/comctl_Da.rc index 730cb7a9e0b..8776b00c7e5 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Da.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Da.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Ingen" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Egenskaper for %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_De.rc b/reactos/dll/win32/comctl32/lang/comctl_De.rc index eb6f7d80ab5..3d3d6f673b0 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_De.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_De.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Kein" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Eigenschaften für %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_El.rc b/reactos/dll/win32/comctl32/lang/comctl_El.rc index 809c79c21dc..e5176ed2cab 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_El.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_El.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Κανένα" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Ιδιότητες για %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_En.rc b/reactos/dll/win32/comctl32/lang/comctl_En.rc index 5a616a7f9eb..366434039bd 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_En.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_En.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "None" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Properties for %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Eo.rc b/reactos/dll/win32/comctl32/lang/comctl_Eo.rc index 0f2d877c1b2..83cd9468e4c 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Eo.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Eo.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Neniu" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Ecoj laŭ %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Es.rc b/reactos/dll/win32/comctl32/lang/comctl_Es.rc index d16099ba691..2d789d4bf11 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Es.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Es.rc @@ -43,6 +43,16 @@ STRINGTABLE HKY_NONE "Ninguno" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Propiedades de %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Fr.rc b/reactos/dll/win32/comctl32/lang/comctl_Fr.rc index 987ed3f77d8..209d7e196bd 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Fr.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Fr.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Aucune" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Propriétés de %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_He.rc b/reactos/dll/win32/comctl32/lang/comctl_He.rc index 0df363e6979..9768ba7ebc7 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_He.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_He.rc @@ -44,6 +44,16 @@ STRINGTABLE HKY_NONE "אין" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "מאפיינים של %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Hu.rc b/reactos/dll/win32/comctl32/lang/comctl_Hu.rc index 19b11f4b40c..6b4b94cecda 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Hu.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Hu.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Semmi" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Tulajdonságok: %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_It.rc b/reactos/dll/win32/comctl32/lang/comctl_It.rc index 08bca218314..30c0a2de102 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_It.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_It.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Nessuno" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Proprietà di %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Ja.rc b/reactos/dll/win32/comctl32/lang/comctl_Ja.rc index 229a54f2793..3ec783bbdf7 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Ja.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Ja.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "なし" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "%sのプロパティ" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Ko.rc b/reactos/dll/win32/comctl32/lang/comctl_Ko.rc index 97fca6dc8f2..6c98669d9a2 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Ko.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Ko.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "없음" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "%s 속성" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Lt.rc b/reactos/dll/win32/comctl32/lang/comctl_Lt.rc index d71346b2d5a..4b6586fa716 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Lt.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Lt.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Joks" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "%s savybės" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Nl.rc b/reactos/dll/win32/comctl32/lang/comctl_Nl.rc index 0295e3d998b..37c51872cce 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Nl.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Nl.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Geen" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Eigenschappen voor %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_No.rc b/reactos/dll/win32/comctl32/lang/comctl_No.rc index 2aeabdbf20f..76688c74512 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_No.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_No.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Ingen" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Egenskaper for %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Pl.rc b/reactos/dll/win32/comctl32/lang/comctl_Pl.rc index 78f19dd8fc5..952d1181a8a 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Pl.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Pl.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Brak" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Właściwości: %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Pt.rc b/reactos/dll/win32/comctl32/lang/comctl_Pt.rc index 6f7b0c1c86c..6f352d4b33e 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Pt.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Pt.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Nenhuma" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Propriedades de %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Ro.rc b/reactos/dll/win32/comctl32/lang/comctl_Ro.rc index 746dac08de2..a34d159cc68 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Ro.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Ro.rc @@ -44,6 +44,16 @@ STRINGTABLE HKY_NONE "Niciuna" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Proprietăți pentru %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Ru.rc b/reactos/dll/win32/comctl32/lang/comctl_Ru.rc index aaef743e44a..2152c99bbd1 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Ru.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Ru.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Нет" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Свойства: %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Si.rc b/reactos/dll/win32/comctl32/lang/comctl_Si.rc index 3e954f72981..bee6d507b51 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Si.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Si.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Brez" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Lastnosti %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Sk.rc b/reactos/dll/win32/comctl32/lang/comctl_Sk.rc index d18e342c82a..d1ebd015bdc 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Sk.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Sk.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Žiadne" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "%s - vlastnosti" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Sq.rc b/reactos/dll/win32/comctl32/lang/comctl_Sq.rc index 288721f73c9..fd6e6e7bf70 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Sq.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Sq.rc @@ -45,6 +45,16 @@ STRINGTABLE HKY_NONE "Asnje" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Properties for %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Sr.rc b/reactos/dll/win32/comctl32/lang/comctl_Sr.rc index 87ea048ff03..b200342d550 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Sr.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Sr.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Nista" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Svojstva za %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Sv.rc b/reactos/dll/win32/comctl32/lang/comctl_Sv.rc index 559ae186edf..a9037d83b42 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Sv.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Sv.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Ingen" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Egenskaper för %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Th.rc b/reactos/dll/win32/comctl32/lang/comctl_Th.rc index 6a9a270c280..3633f682685 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Th.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Th.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "ไม่มีเลย" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "คุณสมบัติของ %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Tr.rc b/reactos/dll/win32/comctl32/lang/comctl_Tr.rc index cac3910c318..eb151e9cc32 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Tr.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Tr.rc @@ -41,6 +41,16 @@ STRINGTABLE HKY_NONE "Yok" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "%s Husûsiyetleri" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Tw.rc b/reactos/dll/win32/comctl32/lang/comctl_Tw.rc index 40b6e68396a..74a6e78d6bc 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Tw.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Tw.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "無" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "%s內容" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Uk.rc b/reactos/dll/win32/comctl32/lang/comctl_Uk.rc index 38678b17546..42715da32be 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Uk.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Uk.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "Немає" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Властивості для %s" diff --git a/reactos/dll/win32/comctl32/lang/comctl_Zh.rc b/reactos/dll/win32/comctl32/lang/comctl_Zh.rc index f117d157c05..9790bd19631 100644 --- a/reactos/dll/win32/comctl32/lang/comctl_Zh.rc +++ b/reactos/dll/win32/comctl32/lang/comctl_Zh.rc @@ -42,6 +42,16 @@ STRINGTABLE HKY_NONE "无" } +STRINGTABLE +{ + IDS_BUTTON_YES "&Yes" + IDS_BUTTON_NO "&No" + IDS_BUTTON_RETRY "&Retry" + IDS_BUTTON_OK "OK" + IDS_BUTTON_CANCEL "Cancel" + IDS_BUTTON_CLOSE "&Close" +} + IDD_PROPSHEET DIALOGEX 0, 0, 220, 140 STYLE DS_SHELLFONT | DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "属性 %s" diff --git a/reactos/dll/win32/comctl32/listview.c b/reactos/dll/win32/comctl32/listview.c index aa7c38e25c9..0c1d6f6a3e2 100644 --- a/reactos/dll/win32/comctl32/listview.c +++ b/reactos/dll/win32/comctl32/listview.c @@ -230,7 +230,6 @@ typedef struct tagLISTVIEW_INFO RANGES selectionRanges; INT nSelectionMark; /* item to start next multiselection from */ INT nHotItem; - BOOL bAutoarrange; /* Autoarrange flag when NOT in LVS_AUTOARRANGE */ /* columns */ HDPA hdpaColumns; /* array of COLUMN_INFO pointers */ @@ -1568,8 +1567,8 @@ static inline LRESULT CallWindowProcT(WNDPROC proc, HWND hwnd, UINT uMsg, static inline BOOL is_autoarrange(const LISTVIEW_INFO *infoPtr) { - return ((infoPtr->dwStyle & LVS_AUTOARRANGE) || infoPtr->bAutoarrange) && - (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON); + return (infoPtr->dwStyle & LVS_AUTOARRANGE) && + (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON); } static void toggle_checkbox_state(LISTVIEW_INFO *infoPtr, INT nItem) @@ -2016,23 +2015,10 @@ static void LISTVIEW_UpdateHeaderSize(const LISTVIEW_INFO *infoPtr, INT nNewScro SWP_NOZORDER | SWP_NOACTIVATE); } -/*** - * DESCRIPTION: - * Update the scrollbars. This functions should be called whenever - * the content, size or view changes. - * - * PARAMETER(S): - * [I] infoPtr : valid pointer to the listview structure - * - * RETURN: - * None - */ -static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr) +static INT LISTVIEW_UpdateHScroll(LISTVIEW_INFO *infoPtr) { - SCROLLINFO horzInfo, vertInfo; - INT dx, dy; - - if ((infoPtr->dwStyle & LVS_NOSCROLL) || !is_redrawing(infoPtr)) return; + SCROLLINFO horzInfo; + INT dx; ZeroMemory(&horzInfo, sizeof(SCROLLINFO)); horzInfo.cbSize = sizeof(SCROLLINFO); @@ -2084,10 +2070,22 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr) dx -= SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo, TRUE); TRACE("horzInfo=%s\n", debugscrollinfo(&horzInfo)); - /* Setting the horizontal scroll can change the listview size - * (and potentially everything else) so we need to recompute - * everything again for the vertical scroll - */ + /* Update the Header Control */ + if (infoPtr->hwndHeader) + { + horzInfo.fMask = SIF_POS; + GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo); + LISTVIEW_UpdateHeaderSize(infoPtr, horzInfo.nPos); + } + + LISTVIEW_UpdateSize(infoPtr); + return dx; +} + +static INT LISTVIEW_UpdateVScroll(LISTVIEW_INFO *infoPtr) +{ + SCROLLINFO vertInfo; + INT dy; ZeroMemory(&vertInfo, sizeof(SCROLLINFO)); vertInfo.cbSize = sizeof(SCROLLINFO); @@ -2117,6 +2115,37 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr) dy -= SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &vertInfo, TRUE); TRACE("vertInfo=%s\n", debugscrollinfo(&vertInfo)); + LISTVIEW_UpdateSize(infoPtr); + return dy; +} + +/*** + * DESCRIPTION: + * Update the scrollbars. This function should be called whenever + * the content, size or view changes. + * + * PARAMETER(S): + * [I] infoPtr : valid pointer to the listview structure + * + * RETURN: + * None + */ +static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr) +{ + INT dx, dy, pass; + + if ((infoPtr->dwStyle & LVS_NOSCROLL) || !is_redrawing(infoPtr)) return; + + /* Setting the horizontal scroll can change the listview size + * (and potentially everything else) so we need to recompute + * everything again for the vertical scroll and vice-versa + */ + for (dx = 0, dy = 0, pass = 0; pass <= 1; pass++) + { + dx += LISTVIEW_UpdateHScroll(infoPtr); + dy += LISTVIEW_UpdateVScroll(infoPtr); + } + /* Change of the range may have changed the scroll pos. If so move the content */ if (dx != 0 || dy != 0) { @@ -2125,14 +2154,6 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr) ScrollWindowEx(infoPtr->hwndSelf, dx, dy, &listRect, &listRect, 0, 0, SW_ERASE | SW_INVALIDATE); } - - /* Update the Header Control */ - if (infoPtr->hwndHeader) - { - horzInfo.fMask = SIF_POS; - GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo); - LISTVIEW_UpdateHeaderSize(infoPtr, horzInfo.nPos); - } } @@ -2782,7 +2803,6 @@ static BOOL LISTVIEW_Arrange(LISTVIEW_INFO *infoPtr, INT nAlignCode) default: return FALSE; } - infoPtr->bAutoarrange = TRUE; infoPtr->currIconPos.x = infoPtr->currIconPos.y = 0; for (i = 0; i < infoPtr->nItemCount; i++) { @@ -6331,8 +6351,7 @@ static INT LISTVIEW_FindItemW(const LISTVIEW_INFO *infoPtr, INT nStart, if (!lpFindInfo || nItem < 0) return -1; lvItem.mask = 0; - if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL) || - lpFindInfo->flags & LVFI_SUBSTRING) + if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL | LVFI_SUBSTRING)) { lvItem.mask |= LVIF_TEXT; lvItem.pszText = szDispText; @@ -6379,6 +6398,8 @@ static INT LISTVIEW_FindItemW(const LISTVIEW_INFO *infoPtr, INT nStart, lvItem.mask &= ~LVIF_TEXT; } + nItem = bNearest ? -1 : nStart + 1; + again: for (; nItem < nLast; nItem++) { @@ -6454,14 +6475,13 @@ again: static INT LISTVIEW_FindItemA(const LISTVIEW_INFO *infoPtr, INT nStart, const LVFINDINFOA *lpFindInfo) { - BOOL hasText = lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL) || - lpFindInfo->flags & LVFI_SUBSTRING; LVFINDINFOW fiw; INT res; LPWSTR strW = NULL; memcpy(&fiw, lpFindInfo, sizeof(fiw)); - if (hasText) fiw.psz = strW = textdupTtoW((LPCWSTR)lpFindInfo->psz, FALSE); + if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL | LVFI_SUBSTRING)) + fiw.psz = strW = textdupTtoW((LPCWSTR)lpFindInfo->psz, FALSE); res = LISTVIEW_FindItemW(infoPtr, nStart, &fiw); textfreeT(strW, FALSE); return res; @@ -7833,18 +7853,24 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, HDPA hItem; ITEM_INFO *item_s; INT i = 0, cmpv; + WCHAR *textW; + + textW = textdupTtoW(lpLVItem->pszText, isW); while (i < infoPtr->nItemCount) { hItem = DPA_GetPtr( infoPtr->hdpaItems, i); item_s = DPA_GetPtr(hItem, 0); - cmpv = textcmpWT(item_s->hdr.pszText, lpLVItem->pszText, isW); + cmpv = textcmpWT(item_s->hdr.pszText, textW, TRUE); if (infoPtr->dwStyle & LVS_SORTDESCENDING) cmpv *= -1; if (cmpv >= 0) break; i++; } + + textfreeT(textW, isW); + nItem = i; } else @@ -7996,12 +8022,8 @@ static BOOL LISTVIEW_IsItemVisible(const LISTVIEW_INFO *infoPtr, INT nItem) static BOOL LISTVIEW_RedrawItems(const LISTVIEW_INFO *infoPtr, INT nFirst, INT nLast) { INT i; - - if (nLast < nFirst || min(nFirst, nLast) < 0 || - max(nFirst, nLast) >= infoPtr->nItemCount) - return FALSE; - - for (i = nFirst; i <= nLast; i++) + + for (i = max(nFirst, 0); i <= min(nLast, infoPtr->nItemCount - 1); i++) LISTVIEW_InvalidateItem(infoPtr, i); return TRUE; @@ -8950,8 +8972,6 @@ static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, const PO Pt.x -= Origin.x; Pt.y -= Origin.y; - infoPtr->bAutoarrange = FALSE; - return LISTVIEW_MoveIconTo(infoPtr, nItem, &Pt, FALSE); } @@ -10637,10 +10657,15 @@ static BOOL LISTVIEW_NCPaint(const LISTVIEW_INFO *infoPtr, HRGN region) CombineRgn (cliprgn, cliprgn, region, RGN_AND); OffsetRect(&r, -r.left, -r.top); +#ifdef __REACTOS__ /* r73789 */ dc = GetWindowDC(infoPtr->hwndSelf); /* Exclude client part */ ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge, r.right - cxEdge, r.bottom -cyEdge); +#else + dc = GetDCEx(infoPtr->hwndSelf, region, DCX_WINDOW|DCX_INTERSECTRGN); + OffsetRect(&r, -r.left, -r.top); +#endif if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0)) DrawThemeParentBackground(infoPtr->hwndSelf, dc, &r); diff --git a/reactos/dll/win32/comctl32/pager.c b/reactos/dll/win32/comctl32/pager.c index d4fbd397a9e..3004435c6a7 100644 --- a/reactos/dll/win32/comctl32/pager.c +++ b/reactos/dll/win32/comctl32/pager.c @@ -239,10 +239,9 @@ PAGER_PositionChildWnd(PAGER_INFO* infoPtr) TRACE("[%p] SWP %dx%d at (%d,%d)\n", infoPtr->hwndSelf, infoPtr->nWidth, infoPtr->nHeight, -nPos, 0); - SetWindowPos(infoPtr->hwndChild, 0, + SetWindowPos(infoPtr->hwndChild, HWND_TOP, -nPos, 0, - infoPtr->nWidth, infoPtr->nHeight, - SWP_NOZORDER); + infoPtr->nWidth, infoPtr->nHeight, 0); } else { @@ -253,10 +252,9 @@ PAGER_PositionChildWnd(PAGER_INFO* infoPtr) TRACE("[%p] SWP %dx%d at (%d,%d)\n", infoPtr->hwndSelf, infoPtr->nWidth, infoPtr->nHeight, 0, -nPos); - SetWindowPos(infoPtr->hwndChild, 0, + SetWindowPos(infoPtr->hwndChild, HWND_TOP, 0, -nPos, - infoPtr->nWidth, infoPtr->nHeight, - SWP_NOZORDER); + infoPtr->nWidth, infoPtr->nHeight, 0); } InvalidateRect(infoPtr->hwndChild, NULL, TRUE); @@ -264,7 +262,7 @@ PAGER_PositionChildWnd(PAGER_INFO* infoPtr) } static INT -PAGER_GetScrollRange(PAGER_INFO* infoPtr) +PAGER_GetScrollRange(PAGER_INFO* infoPtr, BOOL calc_size) { INT scrollRange = 0; @@ -274,7 +272,8 @@ PAGER_GetScrollRange(PAGER_INFO* infoPtr) RECT wndRect; GetWindowRect(infoPtr->hwndSelf, &wndRect); - PAGER_CalcSize(infoPtr); + if (calc_size) + PAGER_CalcSize(infoPtr); if (infoPtr->dwStyle & PGS_HORZ) { wndSize = wndRect.right - wndRect.left; @@ -355,9 +354,9 @@ PAGER_UpdateBtns(PAGER_INFO *infoPtr, INT scrollRange, BOOL hideGrayBtns) } static LRESULT -PAGER_SetPos(PAGER_INFO* infoPtr, INT newPos, BOOL fromBtnPress) +PAGER_SetPos(PAGER_INFO* infoPtr, INT newPos, BOOL fromBtnPress, BOOL calc_size) { - INT scrollRange = PAGER_GetScrollRange(infoPtr); + INT scrollRange = PAGER_GetScrollRange(infoPtr, calc_size); INT oldPos = infoPtr->nPos; if ((scrollRange <= 0) || (newPos < 0)) @@ -398,12 +397,12 @@ PAGER_RecalcSize(PAGER_INFO *infoPtr) if (infoPtr->hwndChild) { - INT scrollRange = PAGER_GetScrollRange(infoPtr); + INT scrollRange = PAGER_GetScrollRange(infoPtr, TRUE); if (scrollRange <= 0) { infoPtr->nPos = -1; - PAGER_SetPos(infoPtr, 0, FALSE); + PAGER_SetPos(infoPtr, 0, FALSE, TRUE); } else PAGER_PositionChildWnd(infoPtr); @@ -472,13 +471,8 @@ PAGER_SetChild (PAGER_INFO* infoPtr, HWND hwndChild) SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - /* position child within the page scroller */ - SetWindowPos(infoPtr->hwndChild, HWND_TOP, - 0,0,0,0, - SWP_SHOWWINDOW | SWP_NOSIZE); /* native is 0 */ - infoPtr->nPos = -1; - PAGER_SetPos(infoPtr, 0, FALSE); + PAGER_SetPos(infoPtr, 0, FALSE, FALSE); } return 0; @@ -523,9 +517,9 @@ PAGER_Scroll(PAGER_INFO* infoPtr, INT dir) infoPtr->direction = dir; if (dir == PGF_SCROLLLEFT || dir == PGF_SCROLLUP) - PAGER_SetPos(infoPtr, infoPtr->nPos - nmpgScroll.iScroll, TRUE); + PAGER_SetPos(infoPtr, infoPtr->nPos - nmpgScroll.iScroll, TRUE, TRUE); else - PAGER_SetPos(infoPtr, infoPtr->nPos + nmpgScroll.iScroll, TRUE); + PAGER_SetPos(infoPtr, infoPtr->nPos + nmpgScroll.iScroll, TRUE, TRUE); } else infoPtr->direction = -1; @@ -1045,7 +1039,7 @@ PAGER_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return PAGER_SetChild (infoPtr, (HWND)lParam); case PGM_SETPOS: - return PAGER_SetPos(infoPtr, (INT)lParam, FALSE); + return PAGER_SetPos(infoPtr, (INT)lParam, FALSE, TRUE); case WM_CREATE: return PAGER_Create (hwnd, (LPCREATESTRUCTW)lParam); diff --git a/reactos/dll/win32/comctl32/propsheet.c b/reactos/dll/win32/comctl32/propsheet.c index 59652824cad..39e9d9a80e2 100644 --- a/reactos/dll/win32/comctl32/propsheet.c +++ b/reactos/dll/win32/comctl32/propsheet.c @@ -2973,11 +2973,25 @@ static LPWSTR load_string( HINSTANCE instance, LPCWSTR str ) HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( LPCPROPSHEETPAGEA lpPropSheetPage) { - PROPSHEETPAGEW* ppsp = Alloc(sizeof(PROPSHEETPAGEW)); + PROPSHEETPAGEW *ppsp; - memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEA))); + if (lpPropSheetPage->dwSize < PROPSHEETPAGEA_V1_SIZE) + return NULL; - ppsp->dwFlags &= ~ PSP_INTERNAL_UNICODE; + /* original data is used for callback notifications */ + if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback) + { + ppsp = Alloc(2 * sizeof(*ppsp)); + memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA))); + memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA))); + } + else + { + ppsp = Alloc(sizeof(*ppsp)); + memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA))); + } + + ppsp->dwFlags &= ~PSP_INTERNAL_UNICODE; if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) ) { @@ -3029,8 +3043,8 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( else ppsp->pszHeaderSubTitle = NULL; - if ((ppsp->dwFlags & PSH_USECALLBACK) && ppsp->pfnCallback) - ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp); + if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEA_V1_SIZE && ppsp->pfnCallback) + ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1); return (HPROPSHEETPAGE)ppsp; } @@ -3042,11 +3056,25 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( */ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage) { - PROPSHEETPAGEW* ppsp = Alloc(sizeof(PROPSHEETPAGEW)); + PROPSHEETPAGEW *ppsp; - memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEW))); + if (lpPropSheetPage->dwSize < PROPSHEETPAGEW_V1_SIZE) + return NULL; - ppsp->dwFlags |= PSP_INTERNAL_UNICODE; + /* original data is used for callback notifications */ + if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback) + { + ppsp = Alloc(2 * sizeof(*ppsp)); + memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW))); + memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW))); + } + else + { + ppsp = Alloc(sizeof(*ppsp)); + memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW))); + } + + ppsp->dwFlags |= PSP_INTERNAL_UNICODE; if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) ) { @@ -3078,8 +3106,8 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage else ppsp->pszHeaderSubTitle = NULL; - if ((ppsp->dwFlags & PSH_USECALLBACK) && ppsp->pfnCallback) - ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp); + if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEW_V1_SIZE && ppsp->pfnCallback) + ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1); return (HPROPSHEETPAGE)ppsp; } @@ -3102,8 +3130,8 @@ BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage) if (!psp) return FALSE; - if ((psp->dwFlags & PSH_USECALLBACK) && psp->pfnCallback) - psp->pfnCallback(0, PSPCB_RELEASE, psp); + if ((psp->dwFlags & PSP_USECALLBACK) && psp->pfnCallback) + psp->pfnCallback(0, PSPCB_RELEASE, psp + 1); if (!(psp->dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE( psp->u.pszTemplate )) Free ((LPVOID)psp->u.pszTemplate); @@ -3393,7 +3421,7 @@ static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam) (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) && #ifdef __REACTOS__ (psInfo->ppshheader.dwFlags & PSH_WATERMARK) && - (psInfo->ppshheader.u4.hbmWatermark) ) + (psInfo->ppshheader.u4.hbmWatermark) ) #else (psInfo->ppshheader.dwFlags & PSH_WATERMARK) ) #endif diff --git a/reactos/dll/win32/comctl32/resource.h b/reactos/dll/win32/comctl32/resource.h index 0b027cb500f..9d91dad3baf 100644 --- a/reactos/dll/win32/comctl32/resource.h +++ b/reactos/dll/win32/comctl32/resource.h @@ -59,6 +59,14 @@ #define IDI_TT_WARN_SM 25 #define IDI_TT_ERROR_SM 28 +/* Taskdialog strings */ +#define IDS_BUTTON_YES 3000 +#define IDS_BUTTON_NO 3001 +#define IDS_BUTTON_RETRY 3002 +#define IDS_BUTTON_OK 3003 +#define IDS_BUTTON_CANCEL 3004 +#define IDS_BUTTON_CLOSE 3005 + // This is really ComCtl32 v5.82, the last one not supporting SxS #undef COMCTL32_VERSION // Undefines what the PSDK gave to us #define COMCTL32_VERSION 5 diff --git a/reactos/dll/win32/comctl32/syslink.c b/reactos/dll/win32/comctl32/syslink.c index 4c0904d20fa..6ba1a0b5b10 100644 --- a/reactos/dll/win32/comctl32/syslink.c +++ b/reactos/dll/win32/comctl32/syslink.c @@ -29,8 +29,6 @@ #include "comctl32.h" -#include - WINE_DEFAULT_DEBUG_CHANNEL(syslink); typedef struct diff --git a/reactos/dll/win32/comctl32/taskdialog.c b/reactos/dll/win32/comctl32/taskdialog.c new file mode 100644 index 00000000000..d5ab0f984d0 --- /dev/null +++ b/reactos/dll/win32/comctl32/taskdialog.c @@ -0,0 +1,373 @@ +/* + * Task dialog control + * + * Copyright 2017 Fabian Maurer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#include "comctl32.h" + +WINE_DEFAULT_DEBUG_CHANNEL(taskdialog); + +#define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align)) +#define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align)) +#define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align) +#define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align) + +static const UINT DIALOG_MIN_WIDTH = 180; +static const UINT DIALOG_SPACING = 5; +static const UINT DIALOG_BUTTON_WIDTH = 50; +static const UINT DIALOG_BUTTON_HEIGHT = 14; + +static const UINT ID_MAIN_INSTRUCTION = 0xf000; +static const UINT ID_CONTENT = 0xf001; + +struct taskdialog_control +{ + struct list entry; + DLGITEMTEMPLATE *template; + unsigned int template_size; +}; + +struct taskdialog_template_desc +{ + const TASKDIALOGCONFIG *taskconfig; + unsigned int dialog_height; + unsigned int dialog_width; + struct list controls; + WORD control_count; + LONG x_baseunit; + LONG y_baseunit; + HFONT font; +}; + +static void pixels_to_dialogunits(const struct taskdialog_template_desc *desc, LONG *width, LONG *height) +{ + if (width) + *width = MulDiv(*width, 4, desc->x_baseunit); + if (height) + *height = MulDiv(*height, 8, desc->y_baseunit); +} + +static void dialogunits_to_pixels(const struct taskdialog_template_desc *desc, LONG *width, LONG *height) +{ + if (width) + *width = MulDiv(*width, desc->x_baseunit, 4); + if (height) + *height = MulDiv(*height, desc->y_baseunit, 8); +} + +static void template_write_data(char **ptr, const void *src, unsigned int size) +{ + memcpy(*ptr, src, size); + *ptr += size; +} + +static unsigned int taskdialog_add_control(struct taskdialog_template_desc *desc, WORD id, const WCHAR *class, + HINSTANCE hInstance, const WCHAR *text, short x, short y, short cx, short cy) +{ + struct taskdialog_control *control = Alloc(sizeof(*control)); + unsigned int size, class_size, text_size; + DLGITEMTEMPLATE *template; + static const WCHAR nulW; + const WCHAR *textW; + char *ptr; + + class_size = (strlenW(class) + 1) * sizeof(WCHAR); + + if (IS_INTRESOURCE(text)) + text_size = LoadStringW(hInstance, (UINT_PTR)text, (WCHAR *)&textW, 0) * sizeof(WCHAR); + else + { + textW = text; + text_size = strlenW(textW) * sizeof(WCHAR); + } + + size = sizeof(DLGITEMTEMPLATE); + size += class_size; + size += text_size + sizeof(WCHAR); + size += sizeof(WORD); /* creation data */ + + control->template = template = Alloc(size); + control->template_size = size; + + template->style = WS_VISIBLE; + template->dwExtendedStyle = 0; + template->x = x; + template->y = y; + template->cx = cx; + template->cy = cy; + template->id = id; + ptr = (char *)(template + 1); + template_write_data(&ptr, class, class_size); + template_write_data(&ptr, textW, text_size); + template_write_data(&ptr, &nulW, sizeof(nulW)); + + list_add_tail(&desc->controls, &control->entry); + desc->control_count++; + return ALIGNED_LENGTH(size, 3); +} + +static unsigned int taskdialog_add_static_label(struct taskdialog_template_desc *desc, WORD id, const WCHAR *str) +{ + RECT rect = { 0, 0, desc->dialog_width - DIALOG_SPACING * 2, 0}; /* padding left and right of the control */ + const WCHAR *textW = NULL; + unsigned int size, length; + HFONT oldfont; + HDC hdc; + + if (!str) + return 0; + + if (IS_INTRESOURCE(str)) + { + if (!(length = LoadStringW(desc->taskconfig->hInstance, (UINT_PTR)str, (WCHAR *)&textW, 0))) + { + WARN("Failed to load static text %s, id %#x\n", debugstr_w(str), id); + return 0; + } + } + else + { + textW = str; + length = strlenW(textW); + } + + hdc = GetDC(0); + oldfont = SelectObject(hdc, desc->font); + + dialogunits_to_pixels(desc, &rect.right, NULL); + DrawTextW(hdc, textW, length, &rect, DT_LEFT | DT_EXPANDTABS | DT_CALCRECT | DT_WORDBREAK); + pixels_to_dialogunits(desc, &rect.right, &rect.bottom); + + SelectObject(hdc, oldfont); + ReleaseDC(0, hdc); + + desc->dialog_height += DIALOG_SPACING; + size = taskdialog_add_control(desc, id, WC_STATICW, desc->taskconfig->hInstance, str, DIALOG_SPACING, + desc->dialog_height, rect.right, rect.bottom); + desc->dialog_height += rect.bottom; + return size; +} + +static unsigned int taskdialog_add_main_instruction(struct taskdialog_template_desc *desc) +{ + return taskdialog_add_static_label(desc, ID_MAIN_INSTRUCTION, desc->taskconfig->pszMainInstruction); +} + +static unsigned int taskdialog_add_content(struct taskdialog_template_desc *desc) +{ + return taskdialog_add_static_label(desc, ID_CONTENT, desc->taskconfig->pszContent); +} + +static unsigned int taskdialog_add_common_buttons(struct taskdialog_template_desc *desc) +{ + short button_x = desc->dialog_width - DIALOG_BUTTON_WIDTH - DIALOG_SPACING; + DWORD flags = desc->taskconfig->dwCommonButtons; + unsigned int size = 0; + +#define TASKDIALOG_ADD_COMMON_BUTTON(id) \ + do { \ + size += taskdialog_add_control(desc, ID##id, WC_BUTTONW, COMCTL32_hModule, MAKEINTRESOURCEW(IDS_BUTTON_##id), \ + button_x, desc->dialog_height + DIALOG_SPACING, DIALOG_BUTTON_WIDTH, DIALOG_BUTTON_HEIGHT); \ + button_x -= DIALOG_BUTTON_WIDTH + DIALOG_SPACING; \ + } while(0) + if (flags & TDCBF_CLOSE_BUTTON) + TASKDIALOG_ADD_COMMON_BUTTON(CLOSE); + if (flags & TDCBF_CANCEL_BUTTON) + TASKDIALOG_ADD_COMMON_BUTTON(CANCEL); + if (flags & TDCBF_RETRY_BUTTON) + TASKDIALOG_ADD_COMMON_BUTTON(RETRY); + if (flags & TDCBF_NO_BUTTON) + TASKDIALOG_ADD_COMMON_BUTTON(NO); + if (flags & TDCBF_YES_BUTTON) + TASKDIALOG_ADD_COMMON_BUTTON(YES); + if (flags & TDCBF_OK_BUTTON) + TASKDIALOG_ADD_COMMON_BUTTON(OK); + /* Always add OK button */ + if (list_empty(&desc->controls)) + TASKDIALOG_ADD_COMMON_BUTTON(OK); +#undef TASKDIALOG_ADD_COMMON_BUTTON + + /* make room for common buttons row */ + desc->dialog_height += DIALOG_BUTTON_HEIGHT + 2 * DIALOG_SPACING; + return size; +} + +static void taskdialog_clear_controls(struct list *controls) +{ + struct taskdialog_control *control, *control2; + + LIST_FOR_EACH_ENTRY_SAFE(control, control2, controls, struct taskdialog_control, entry) + { + list_remove(&control->entry); + Free(control->template); + Free(control); + } +} + +static unsigned int taskdialog_get_reference_rect(const struct taskdialog_template_desc *desc, RECT *ret) +{ + HMONITOR monitor = MonitorFromWindow(desc->taskconfig->hwndParent ? desc->taskconfig->hwndParent : GetActiveWindow(), + MONITOR_DEFAULTTOPRIMARY); + MONITORINFO info; + + info.cbSize = sizeof(info); + GetMonitorInfoW(monitor, &info); + + if (desc->taskconfig->dwFlags & TDF_POSITION_RELATIVE_TO_WINDOW && desc->taskconfig->hwndParent) + GetWindowRect(desc->taskconfig->hwndParent, ret); + else + *ret = info.rcWork; + + pixels_to_dialogunits(desc, &ret->left, &ret->top); + pixels_to_dialogunits(desc, &ret->right, &ret->bottom); + + pixels_to_dialogunits(desc, &info.rcWork.left, &info.rcWork.top); + pixels_to_dialogunits(desc, &info.rcWork.right, &info.rcWork.bottom); + return info.rcWork.right - info.rcWork.left; +} + +static DLGTEMPLATE *create_taskdialog_template(const TASKDIALOGCONFIG *taskconfig) +{ + struct taskdialog_control *control, *control2; + unsigned int size, title_size, screen_width; + struct taskdialog_template_desc desc; + static const WORD fontsize = 0x7fff; + static const WCHAR emptyW[] = { 0 }; + const WCHAR *titleW = NULL; + DLGTEMPLATE *template; + NONCLIENTMETRICSW ncm; + RECT ref_rect; + char *ptr; + HDC hdc; + + /* Window title */ + if (!taskconfig->pszWindowTitle) + FIXME("use executable name for window title\n"); + else if (IS_INTRESOURCE(taskconfig->pszWindowTitle)) + FIXME("load window title from resources\n"); + else + titleW = taskconfig->pszWindowTitle; + if (!titleW) + titleW = emptyW; + title_size = (strlenW(titleW) + 1) * sizeof(WCHAR); + + size = sizeof(DLGTEMPLATE) + 2 * sizeof(WORD); + size += title_size; + size += 2; /* font size */ + + list_init(&desc.controls); + desc.taskconfig = taskconfig; + desc.control_count = 0; + + ncm.cbSize = sizeof(ncm); + SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0); + desc.font = CreateFontIndirectW(&ncm.lfMessageFont); + + hdc = GetDC(0); + SelectObject(hdc, desc.font); + desc.x_baseunit = GdiGetCharDimensions(hdc, NULL, &desc.y_baseunit); + ReleaseDC(0, hdc); + + screen_width = taskdialog_get_reference_rect(&desc, &ref_rect); + + desc.dialog_height = 0; + desc.dialog_width = max(taskconfig->cxWidth, DIALOG_MIN_WIDTH); + desc.dialog_width = min(desc.dialog_width, screen_width); + + size += taskdialog_add_main_instruction(&desc); + size += taskdialog_add_content(&desc); + size += taskdialog_add_common_buttons(&desc); + + template = Alloc(size); + if (!template) + { + taskdialog_clear_controls(&desc.controls); + DeleteObject(desc.font); + return NULL; + } + + template->style = DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_VISIBLE | WS_SYSMENU; + template->cdit = desc.control_count; + template->x = (ref_rect.left + ref_rect.right + desc.dialog_width) / 2; + template->y = (ref_rect.top + ref_rect.bottom + desc.dialog_height) / 2; + template->cx = desc.dialog_width; + template->cy = desc.dialog_height; + + ptr = (char *)(template + 1); + ptr += 2; /* menu */ + ptr += 2; /* class */ + template_write_data(&ptr, titleW, title_size); + template_write_data(&ptr, &fontsize, sizeof(fontsize)); + + /* write control entries */ + LIST_FOR_EACH_ENTRY_SAFE(control, control2, &desc.controls, struct taskdialog_control, entry) + { + ALIGN_POINTER(ptr, 3); + + template_write_data(&ptr, control->template, control->template_size); + + /* list item won't be needed later */ + list_remove(&control->entry); + Free(control->template); + Free(control); + } + + DeleteObject(desc.font); + return template; +} + +static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + TRACE("hwnd=%p msg=0x%04x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam); + + switch (msg) + { + case WM_COMMAND: + if (HIWORD(wParam) == BN_CLICKED) + { + WORD command_id = LOWORD(wParam); + EndDialog(hwnd, command_id); + return TRUE; + } + break; + } + return FALSE; +} + +/*********************************************************************** + * TaskDialogIndirect [COMCTL32.@] + */ +HRESULT WINAPI TaskDialogIndirect(const TASKDIALOGCONFIG *taskconfig, int *button, + int *radio_button, BOOL *verification_flag_checked) +{ + DLGTEMPLATE *template; + INT ret; + + TRACE("%p, %p, %p, %p\n", taskconfig, button, radio_button, verification_flag_checked); + + template = create_taskdialog_template(taskconfig); + ret = DialogBoxIndirectParamW(taskconfig->hInstance, template, taskconfig->hwndParent, taskdialog_proc, 0); + Free(template); + + if (button) *button = ret; + if (radio_button) *radio_button = taskconfig->nDefaultButton; + if (verification_flag_checked) *verification_flag_checked = TRUE; + + return S_OK; +} diff --git a/reactos/dll/win32/comctl32/theme_button.c b/reactos/dll/win32/comctl32/theme_button.c index 14939d0be17..5a2cf98633c 100644 --- a/reactos/dll/win32/comctl32/theme_button.c +++ b/reactos/dll/win32/comctl32/theme_button.c @@ -34,8 +34,13 @@ typedef enum STATE_DEFAULTED } ButtonState; +#ifdef __REACTOS__ /* r73885 */ typedef void (*pfThemedPaint)(HTHEME theme, HWND hwnd, HDC hdc, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag); +#else +typedef void (*pfThemedPaint)(HTHEME theme, HWND hwnd, HDC hdc, ButtonState drawState, UINT dtFlags, BOOL focused); +#endif +#ifdef __REACTOS__ /* r73885 & r73907 */ static inline LONG get_button_state( HWND hwnd ) { return _GetButtonData(hwnd)->state; @@ -50,6 +55,7 @@ static inline LONG_PTR get_button_image(HWND hwnd) { return _GetButtonData(hwnd)->image; } +#endif static UINT get_drawtext_flags(DWORD style, DWORD ex_style) { @@ -102,36 +108,54 @@ static inline WCHAR *get_button_text(HWND hwnd) return text; } +#ifdef __REACTOS__ /* r73885 */ static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag) +#else +static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused) +#endif { static const int states[] = { PBS_NORMAL, PBS_DISABLED, PBS_HOT, PBS_PRESSED, PBS_DEFAULTED }; RECT bgRect, textRect; +#ifdef __REACTOS__ /* r73885 */ HFONT font = get_button_font(hwnd); +#else + HFONT font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0); +#endif HFONT hPrevFont = font ? SelectObject(hDC, font) : NULL; int state = states[ drawState ]; WCHAR *text = get_button_text(hwnd); +#ifdef __REACTOS__ /* r74012 & r74406 */ PBUTTON_DATA pdata = _GetButtonData(hwnd); SIZE ImageSize; HWND parent; HBRUSH hBrush; +#endif GetClientRect(hwnd, &bgRect); GetThemeBackgroundContentRect(theme, hDC, BP_PUSHBUTTON, state, &bgRect, &textRect); +#ifdef __REACTOS__ /* r73885 & r74149 */ if (prfFlag == 0) { if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state)) DrawThemeParentBackground(hwnd, hDC, NULL); } +#else + if (IsThemeBackgroundPartiallyTransparent(theme, BP_PUSHBUTTON, state)) + DrawThemeParentBackground(hwnd, hDC, NULL); +#endif +#ifdef __REACTOS__ /* r74406 */ parent = GetParent(hwnd); if (!parent) parent = hwnd; hBrush = (HBRUSH)SendMessageW( parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd ); FillRect( hDC, &bgRect, hBrush ); +#endif DrawThemeBackground(theme, hDC, BP_PUSHBUTTON, state, &bgRect, NULL); +#ifdef __REACTOS__ /* r74012 */ if (pdata->imlData.himl && ImageList_GetIconSize(pdata->imlData.himl, &ImageSize.cx, &ImageSize.cy)) { int left = textRect.left + pdata->imlData.margin.left; @@ -139,6 +163,7 @@ static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN textRect.left += pdata->imlData.margin.left + pdata->imlData.margin.right + ImageSize.cy; ImageList_Draw(pdata->imlData.himl, 0, hDC, left, top, 0); } +#endif if (text) { @@ -164,7 +189,11 @@ static void PB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN if (hPrevFont) SelectObject(hDC, hPrevFont); } +#ifdef __REACTOS__ /* r73885 */ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag) +#else +static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused) +#endif { static const int cb_states[3][5] = { @@ -182,7 +211,11 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN SIZE sz; RECT bgRect, textRect; HFONT font, hPrevFont = NULL; +#ifdef __REACTOS__ /* r73885 */ LRESULT checkState = get_button_state(hwnd) & 3; +#else + LRESULT checkState = SendMessageW(hwnd, BM_GETCHECK, 0, 0); +#endif DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE); int part = ((dwStyle & BUTTON_TYPE) == BS_RADIOBUTTON) || ((dwStyle & BUTTON_TYPE) == BS_AUTORADIOBUTTON) ? BP_RADIOBUTTON @@ -193,8 +226,10 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN WCHAR *text = get_button_text(hwnd); LOGFONTW lf; BOOL created_font = FALSE; +#ifdef __REACTOS__ /* r74406 */ HWND parent; HBRUSH hBrush; +#endif HRESULT hr = GetThemeFont(theme, hDC, part, state, TMT_FONT, &lf); if (SUCCEEDED(hr)) { @@ -207,7 +242,11 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN created_font = TRUE; } } else { +#ifdef __REACTOS__ /* r73885 */ font = get_button_font(hwnd); +#else + font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0); +#endif hPrevFont = SelectObject(hDC, font); } @@ -216,6 +255,7 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN GetClientRect(hwnd, &bgRect); +#ifdef __REACTOS__ /* r73885, r74149 and r74406 */ if (prfFlag == 0) { DrawThemeParentBackground(hwnd, hDC, NULL); @@ -229,6 +269,7 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN hBrush = (HBRUSH)DefWindowProcW(parent, WM_CTLCOLORSTATIC, (WPARAM)hDC, (LPARAM)hwnd ); FillRect( hDC, &bgRect, hBrush ); +#endif GetThemeBackgroundContentRect(theme, hDC, part, state, &bgRect, &textRect); @@ -240,6 +281,10 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN bgRect.right = bgRect.left + sz.cx; textRect.left = bgRect.right + 6; +#ifndef __REACTOS__ /* r74406 */ + DrawThemeParentBackground(hwnd, hDC, NULL); +#endif + DrawThemeBackground(theme, hDC, part, state, &bgRect, NULL); if (text) { @@ -266,7 +311,11 @@ static void CB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN if (hPrevFont) SelectObject(hDC, hPrevFont); } +#ifdef __REACTOS__ /* r73885 */ static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused, LPARAM prfFlag) +#else +static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UINT dtFlags, BOOL focused) +#endif { static const int states[] = { GBS_NORMAL, GBS_DISABLED, GBS_NORMAL, GBS_NORMAL, GBS_NORMAL }; @@ -276,9 +325,11 @@ static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN LOGFONTW lf; HFONT font, hPrevFont = NULL; BOOL created_font = FALSE; +#ifdef __REACTOS__ /* r74406 */ HWND parent; HBRUSH hBrush; RECT clientRect; +#endif HRESULT hr = GetThemeFont(theme, hDC, BP_GROUPBOX, state, TMT_FONT, &lf); if (SUCCEEDED(hr)) { @@ -290,7 +341,11 @@ static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN created_font = TRUE; } } else { +#ifdef __REACTOS__ /* r73885 */ font = get_button_font(hwnd); +#else + font = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0); +#endif hPrevFont = SelectObject(hDC, font); } @@ -312,12 +367,18 @@ static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN GetThemeBackgroundContentRect(theme, hDC, BP_GROUPBOX, state, &bgRect, &contentRect); ExcludeClipRect(hDC, contentRect.left, contentRect.top, contentRect.right, contentRect.bottom); +#ifdef __REACTOS__ /* r73885 & r74149 */ if (prfFlag == 0) { if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state)) DrawThemeParentBackground(hwnd, hDC, NULL); } +#else + if (IsThemeBackgroundPartiallyTransparent(theme, BP_GROUPBOX, state)) + DrawThemeParentBackground(hwnd, hDC, NULL); +#endif +#ifdef __REACTOS__ /* r74406 */ parent = GetParent(hwnd); if (!parent) parent = hwnd; hBrush = (HBRUSH)SendMessageW(parent, WM_CTLCOLORSTATIC, @@ -327,6 +388,7 @@ static void GB_draw(HTHEME theme, HWND hwnd, HDC hDC, ButtonState drawState, UIN (WPARAM)hDC, (LPARAM)hwnd ); GetClientRect(hwnd, &clientRect); FillRect( hDC, &clientRect, hBrush ); +#endif DrawThemeBackground(theme, hDC, BP_GROUPBOX, state, &bgRect, NULL); @@ -363,14 +425,28 @@ static const pfThemedPaint btnThemedPaintFunc[BUTTON_TYPE + 1] = NULL, /* Not defined */ }; +#ifdef __REACTOS__ /* r73873 */ BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC, LPARAM prfFlag) +#else +static BOOL BUTTON_Paint(HTHEME theme, HWND hwnd, HDC hParamDC) +#endif { +#ifdef __REACTOS__ /* r73873, r73897 and r74120 */ DWORD dwStyle; DWORD dwStyleEx; DWORD type; UINT dtFlags; int state; +#else + PAINTSTRUCT ps; + HDC hDC; + DWORD dwStyle = GetWindowLongW(hwnd, GWL_STYLE); + DWORD dwStyleEx = GetWindowLongW(hwnd, GWL_EXSTYLE); + UINT dtFlags = get_drawtext_flags(dwStyle, dwStyleEx); + int state = (int)SendMessageW(hwnd, BM_GETSTATE, 0, 0); +#endif ButtonState drawState; +#ifdef __REACTOS__ /* r73873, r73897, r73907 and r74120 */ pfThemedPaint paint; dwStyle = GetWindowLongW(hwnd, GWL_STYLE); @@ -389,6 +465,9 @@ BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC, LPARAM prfFlag dwStyleEx = GetWindowLongW(hwnd, GWL_EXSTYLE); dtFlags = get_drawtext_flags(dwStyle, dwStyleEx); state = get_button_state(hwnd); +#else + pfThemedPaint paint = btnThemedPaintFunc[ dwStyle & BUTTON_TYPE ]; +#endif if(IsWindowEnabled(hwnd)) { @@ -399,11 +478,118 @@ BOOL BUTTON_PaintWithTheme(HTHEME theme, HWND hwnd, HDC hParamDC, LPARAM prfFlag } else drawState = STATE_DISABLED; +#ifndef __REACTOS__ /* r73873 */ + hDC = hParamDC ? hParamDC : BeginPaint(hwnd, &ps); + if (paint) paint(theme, hwnd, hDC, drawState, dtFlags, state & BST_FOCUS); + if (!hParamDC) EndPaint(hwnd, &ps); +#endif + +#ifdef __REACTOS__ /* r74074 & r74120 */ if (drawState == STATE_NORMAL && type == BS_DEFPUSHBUTTON) { drawState = STATE_DEFAULTED; } +#endif paint(theme, hwnd, hParamDC, drawState, dtFlags, state & BST_FOCUS, prfFlag); return TRUE; } + +#ifndef __REACTOS__ /* r73873 */ +/********************************************************************** + * The button control subclass window proc. + */ +LRESULT CALLBACK THEMING_ButtonSubclassProc(HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam, + ULONG_PTR dwRefData) +{ + const WCHAR* themeClass = WC_BUTTONW; + HTHEME theme; + LRESULT result; + + switch (msg) + { + case WM_CREATE: + result = THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + OpenThemeData(hwnd, themeClass); + return result; + + case WM_DESTROY: + theme = GetWindowTheme(hwnd); + CloseThemeData (theme); + return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + + case WM_THEMECHANGED: + theme = GetWindowTheme(hwnd); + CloseThemeData (theme); + OpenThemeData(hwnd, themeClass); + break; + + case WM_SYSCOLORCHANGE: + theme = GetWindowTheme(hwnd); + if (!theme) return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, + * which will do the repaint. */ + break; + + case WM_PAINT: + theme = GetWindowTheme(hwnd); + if (theme && BUTTON_Paint(theme, hwnd, (HDC)wParam)) + return 0; + else + return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + + case WM_ENABLE: + theme = GetWindowTheme(hwnd); + if (theme) { + RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); + return 0; + } else + return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + + case WM_MOUSEMOVE: + { + TRACKMOUSEEVENT mouse_event; + mouse_event.cbSize = sizeof(TRACKMOUSEEVENT); + mouse_event.dwFlags = TME_QUERY; + if(!TrackMouseEvent(&mouse_event) || !(mouse_event.dwFlags&(TME_HOVER|TME_LEAVE))) + { + mouse_event.dwFlags = TME_HOVER|TME_LEAVE; + mouse_event.hwndTrack = hwnd; + mouse_event.dwHoverTime = 1; + TrackMouseEvent(&mouse_event); + } + break; + } + + case WM_MOUSEHOVER: + { + int state = (int)SendMessageW(hwnd, BM_GETSTATE, 0, 0); + SetWindowLongW(hwnd, 0, state|BST_HOT); + InvalidateRect(hwnd, NULL, FALSE); + break; + } + + case WM_MOUSELEAVE: + { + int state = (int)SendMessageW(hwnd, BM_GETSTATE, 0, 0); + SetWindowLongW(hwnd, 0, state&(~BST_HOT)); + InvalidateRect(hwnd, NULL, FALSE); + break; + } + + case BM_SETCHECK: + case BM_SETSTATE: + theme = GetWindowTheme(hwnd); + if (theme) { + InvalidateRect(hwnd, NULL, FALSE); + } + return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + + default: + /* Call old proc */ + return THEMING_CallOriginalClass(hwnd, msg, wParam, lParam); + } + return 0; +} +#endif /* !__REACTOS__ */ diff --git a/reactos/dll/win32/comctl32/theme_edit.c b/reactos/dll/win32/comctl32/theme_edit.c index 8452181a945..a13cff4c8d3 100644 --- a/reactos/dll/win32/comctl32/theme_edit.c +++ b/reactos/dll/win32/comctl32/theme_edit.c @@ -52,11 +52,16 @@ static void nc_paint (HTHEME theme, HWND hwnd, HRGN region) CombineRgn (cliprgn, cliprgn, region, RGN_AND); OffsetRect(&r, -r.left, -r.top); +#ifdef __REACTOS__ /* r73789 */ dc = GetWindowDC(hwnd); /* Exclude client part */ ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge, r.right - cxEdge, r.bottom -cyEdge); - +#else + dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN); + OffsetRect(&r, -r.left, -r.top); +#endif + if (IsThemeBackgroundPartiallyTransparent (theme, part, state)) DrawThemeParentBackground(hwnd, dc, &r); DrawThemeBackground (theme, dc, part, state, &r, 0); diff --git a/reactos/dll/win32/comctl32/theme_listbox.c b/reactos/dll/win32/comctl32/theme_listbox.c index c7a294062ac..773701663cf 100644 --- a/reactos/dll/win32/comctl32/theme_listbox.c +++ b/reactos/dll/win32/comctl32/theme_listbox.c @@ -42,11 +42,16 @@ static void nc_paint (HTHEME theme, HWND hwnd, HRGN region) CombineRgn (cliprgn, cliprgn, region, RGN_AND); OffsetRect(&r, -r.left, -r.top); +#ifdef __REACTOS__ /* r73789 */ dc = GetWindowDC(hwnd); /* Exclude client part */ ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge, r.right - cxEdge, r.bottom -cyEdge); - +#else + dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN); + OffsetRect(&r, -r.left, -r.top); +#endif + if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0)) DrawThemeParentBackground(hwnd, dc, &r); DrawThemeBackground (theme, dc, 0, 0, &r, 0); diff --git a/reactos/dll/win32/comctl32/theming.c b/reactos/dll/win32/comctl32/theming.c index bec84118e5a..c80b4e46d88 100644 --- a/reactos/dll/win32/comctl32/theming.c +++ b/reactos/dll/win32/comctl32/theming.c @@ -26,8 +26,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(theming); typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM, ULONG_PTR); +#ifndef __REACTOS__ /* r73871 */ +extern LRESULT CALLBACK THEMING_ButtonSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR) DECLSPEC_HIDDEN; +#endif extern LRESULT CALLBACK THEMING_ComboSubclassProc (HWND, UINT, WPARAM, LPARAM, ULONG_PTR) DECLSPEC_HIDDEN; +#ifndef __REACTOS__ /* r73803 */ +extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR) DECLSPEC_HIDDEN; +#endif extern LRESULT CALLBACK THEMING_EditSubclassProc (HWND, UINT, WPARAM, LPARAM, ULONG_PTR) DECLSPEC_HIDDEN; extern LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND, UINT, WPARAM, LPARAM, @@ -44,6 +52,10 @@ static const struct ThemingSubclass THEMING_SUBCLASSPROC subclassProc; } subclasses[] = { /* Note: list must be sorted by class name */ +#ifndef __REACTOS__ /* r73803 & r73871 */ + {dialogClass, THEMING_DialogSubclassProc}, + {WC_BUTTONW, THEMING_ButtonSubclassProc}, +#endif {WC_COMBOBOXW, THEMING_ComboSubclassProc}, {comboLboxClass, THEMING_ListBoxSubclassProc}, {WC_EDITW, THEMING_EditSubclassProc}, @@ -83,13 +95,23 @@ MAKE_SUBCLASS_PROC(1) MAKE_SUBCLASS_PROC(2) MAKE_SUBCLASS_PROC(3) MAKE_SUBCLASS_PROC(4) +#ifndef __REACTOS__ /* r73803 & r73871 */ +MAKE_SUBCLASS_PROC(5) +MAKE_SUBCLASS_PROC(6) +#endif static const WNDPROC subclassProcs[NUM_SUBCLASSES] = { subclass_proc0, subclass_proc1, subclass_proc2, subclass_proc3, +#ifdef __REACTOS__ /* r73871 */ subclass_proc4 +#else + subclass_proc4, + subclass_proc5, + subclass_proc6 +#endif }; /*********************************************************************** @@ -98,15 +120,23 @@ static const WNDPROC subclassProcs[NUM_SUBCLASSES] = { * Register classes for standard controls that will shadow the system * classes. */ -void THEMING_Initialize (HANDLE hActCtx5, HANDLE hActCtx6) +#ifdef __REACTOS__ /* r73803 */ +void THEMING_Initialize(HANDLE hActCtx5, HANDLE hActCtx6) +#else +void THEMING_Initialize (void) +#endif { unsigned int i; static const WCHAR subclassPropName[] = { 'C','C','3','2','T','h','e','m','i','n','g','S','u','b','C','l',0 }; static const WCHAR refDataPropName[] = { 'C','C','3','2','T','h','e','m','i','n','g','D','a','t','a',0 }; +#ifdef __REACTOS__ /* r73803 */ ULONG_PTR ulCookie; BOOL ret, bActivated; +#else + if (!IsThemeActive()) return; +#endif atSubclassProp = GlobalAddAtomW (subclassPropName); atRefDataProp = GlobalAddAtomW (refDataPropName); @@ -117,12 +147,16 @@ void THEMING_Initialize (HANDLE hActCtx5, HANDLE hActCtx6) class.cbSize = sizeof(class); +#ifdef __REACTOS__ /* r73803 */ bActivated = ActivateActCtx(hActCtx5, &ulCookie); ret = GetClassInfoExW (NULL, subclasses[i].className, &class); if (bActivated) DeactivateActCtx(0, ulCookie); if (!ret) +#else + if (!GetClassInfoExW (NULL, subclasses[i].className, &class)) +#endif { ERR("Could not retrieve information for class %s\n", debugstr_w (subclasses[i].className)); @@ -130,9 +164,11 @@ void THEMING_Initialize (HANDLE hActCtx5, HANDLE hActCtx6) } originalProcs[i] = class.lpfnWndProc; class.lpfnWndProc = subclassProcs[i]; +#ifdef __REACTOS__ /* r73803 */ class.style |= CS_GLOBALCLASS; class.hInstance = COMCTL32_hModule; - +#endif + if (!class.lpfnWndProc) { ERR("Missing proc for class %s\n", @@ -140,11 +176,16 @@ void THEMING_Initialize (HANDLE hActCtx5, HANDLE hActCtx6) continue; } +#ifdef __REACTOS__ /* r73803 */ bActivated = ActivateActCtx(hActCtx6, &ulCookie); - +#endif if (!RegisterClassExW (&class)) { +#ifdef __REACTOS__ /* r73803 */ WARN("Could not re-register class %s: %x\n", +#else + ERR("Could not re-register class %s: %x\n", +#endif debugstr_w (subclasses[i].className), GetLastError ()); } else @@ -153,8 +194,10 @@ void THEMING_Initialize (HANDLE hActCtx5, HANDLE hActCtx6) debugstr_w (subclasses[i].className)); } +#ifdef __REACTOS__ /* r73803 */ if (bActivated) DeactivateActCtx(0, ulCookie); +#endif } } diff --git a/reactos/dll/win32/comctl32/treeview.c b/reactos/dll/win32/comctl32/treeview.c index 26bc1b9b088..26ff8e19a09 100644 --- a/reactos/dll/win32/comctl32/treeview.c +++ b/reactos/dll/win32/comctl32/treeview.c @@ -4333,7 +4333,12 @@ TREEVIEW_RButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) ht.pt.x = (short)LOWORD(lParam); ht.pt.y = (short)HIWORD(lParam); - TREEVIEW_HitTest(infoPtr, &ht); + if (TREEVIEW_HitTest(infoPtr, &ht)) + { + infoPtr->focusedItem = ht.hItem; + TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem); + TREEVIEW_InvalidateItem(infoPtr, infoPtr->selectedItem); + } if (TREEVIEW_TrackMouse(infoPtr, ht.pt)) { @@ -4354,6 +4359,13 @@ TREEVIEW_RButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam) } } + if (ht.hItem) + { + TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem); + infoPtr->focusedItem = infoPtr->selectedItem; + TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem); + } + return 0; } @@ -5434,10 +5446,15 @@ static BOOL TREEVIEW_NCPaint (const TREEVIEW_INFO *infoPtr, HRGN region, LPARAM CombineRgn (cliprgn, cliprgn, region, RGN_AND); OffsetRect(&r, -r.left, -r.top); +#ifdef __REACTOS__ /* r73789 */ dc = GetWindowDC(infoPtr->hwnd); /* Exclude client part */ ExcludeClipRect(dc, r.left + cxEdge, r.top + cyEdge, r.right - cxEdge, r.bottom -cyEdge); +#else + dc = GetDCEx(infoPtr->hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN); + OffsetRect(&r, -r.left, -r.top); +#endif if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0)) DrawThemeParentBackground(infoPtr->hwnd, dc, &r); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 30506e1f55f..9188d9a2f5c 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -54,7 +54,7 @@ reactos/dll/win32/browseui # Out of sync reactos/dll/win32/cabinet # Synced to WineStaging-2.2 reactos/dll/win32/clusapi # Synced to WineStaging-1.9.11 reactos/dll/win32/comcat # Synced to WineStaging-1.9.11 -reactos/dll/win32/comctl32 # Synced to WineStaging-2.2 +reactos/dll/win32/comctl32 # Synced to WineStaging-2.9 reactos/dll/win32/comdlg32 # Synced to WineStaging-2.9 reactos/dll/win32/compstui # Synced to WineStaging-2.2 reactos/dll/win32/credui # Synced to WineStaging-2.9