diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2020-07-06 19:43:10 +1000 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2020-07-06 21:30:49 +1000 |
commit | 171b886bc5652da63b5ed549c755aa3fa3337eab (patch) | |
tree | 1524df15d393acd1c3a70f77906717c2da7d99a9 | |
parent | 219964095a1f4678d8c8e7ae2685c52392161ca2 (diff) | |
download | wix-171b886bc5652da63b5ed549c755aa3fa3337eab.tar.gz wix-171b886bc5652da63b5ed549c755aa3fa3337eab.tar.bz2 wix-171b886bc5652da63b5ed549c755aa3fa3337eab.zip |
Split up ThemeDefWindowProc so that the right message handling code is shared with PanelWndProc.
-rw-r--r-- | src/dutil/thmutil.cpp | 235 |
1 files changed, 132 insertions, 103 deletions
diff --git a/src/dutil/thmutil.cpp b/src/dutil/thmutil.cpp index 75b0e4a0..6025749e 100644 --- a/src/dutil/thmutil.cpp +++ b/src/dutil/thmutil.cpp | |||
@@ -334,6 +334,13 @@ static void GetControlDimensions( | |||
334 | static HRESULT SizeListViewColumns( | 334 | static HRESULT SizeListViewColumns( |
335 | __inout THEME_CONTROL* pControl | 335 | __inout THEME_CONTROL* pControl |
336 | ); | 336 | ); |
337 | static LRESULT CALLBACK ControlGroupDefWindowProc( | ||
338 | __in_opt THEME* pTheme, | ||
339 | __in HWND hWnd, | ||
340 | __in UINT uMsg, | ||
341 | __in WPARAM wParam, | ||
342 | __in LPARAM lParam | ||
343 | ); | ||
337 | static LRESULT CALLBACK PanelWndProc( | 344 | static LRESULT CALLBACK PanelWndProc( |
338 | __in HWND hWnd, | 345 | __in HWND hWnd, |
339 | __in UINT uMsg, | 346 | __in UINT uMsg, |
@@ -860,7 +867,14 @@ extern "C" LRESULT CALLBACK ThemeDefWindowProc( | |||
860 | switch (uMsg) | 867 | switch (uMsg) |
861 | { | 868 | { |
862 | case WM_NCCREATE: | 869 | case WM_NCCREATE: |
863 | OnNcCreate(pTheme, hWnd, lParam); | 870 | if (pTheme->hwndParent) |
871 | { | ||
872 | AssertSz(FALSE, "WM_NCCREATE called multiple times"); | ||
873 | } | ||
874 | else | ||
875 | { | ||
876 | OnNcCreate(pTheme, hWnd, lParam); | ||
877 | } | ||
864 | break; | 878 | break; |
865 | 879 | ||
866 | case WM_NCHITTEST: | 880 | case WM_NCHITTEST: |
@@ -877,41 +891,6 @@ extern "C" LRESULT CALLBACK ThemeDefWindowProc( | |||
877 | } | 891 | } |
878 | break; | 892 | break; |
879 | 893 | ||
880 | case WM_DRAWITEM: | ||
881 | ThemeDrawControl(pTheme, reinterpret_cast<LPDRAWITEMSTRUCT>(lParam)); | ||
882 | return TRUE; | ||
883 | |||
884 | case WM_CTLCOLORBTN: __fallthrough; | ||
885 | case WM_CTLCOLORSTATIC: | ||
886 | { | ||
887 | HBRUSH hBrush = NULL; | ||
888 | if (ThemeSetControlColor(pTheme, reinterpret_cast<HDC>(wParam), reinterpret_cast<HWND>(lParam), &hBrush)) | ||
889 | { | ||
890 | return reinterpret_cast<LRESULT>(hBrush); | ||
891 | } | ||
892 | } | ||
893 | break; | ||
894 | |||
895 | case WM_SETCURSOR: | ||
896 | if (ThemeHoverControl(pTheme, hWnd, reinterpret_cast<HWND>(wParam))) | ||
897 | { | ||
898 | return TRUE; | ||
899 | } | ||
900 | break; | ||
901 | |||
902 | case WM_PAINT: | ||
903 | if (::GetUpdateRect(hWnd, NULL, FALSE)) | ||
904 | { | ||
905 | PAINTSTRUCT ps; | ||
906 | ::BeginPaint(hWnd, &ps); | ||
907 | if (hWnd == pTheme->hwndParent) | ||
908 | { | ||
909 | ThemeDrawBackground(pTheme, &ps); | ||
910 | } | ||
911 | ::EndPaint(hWnd, &ps); | ||
912 | } | ||
913 | return 0; | ||
914 | |||
915 | case WM_SIZING: | 894 | case WM_SIZING: |
916 | if (pTheme->fAutoResize) | 895 | if (pTheme->fAutoResize) |
917 | { | 896 | { |
@@ -952,70 +931,10 @@ extern "C" LRESULT CALLBACK ThemeDefWindowProc( | |||
952 | return 0; | 931 | return 0; |
953 | } | 932 | } |
954 | break; | 933 | break; |
955 | |||
956 | case WM_TIMER: | ||
957 | OnBillboardTimer(pTheme, hWnd, wParam); | ||
958 | break; | ||
959 | |||
960 | case WM_NOTIFY: | ||
961 | if (lParam) | ||
962 | { | ||
963 | LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam); | ||
964 | switch (pnmhdr->code) | ||
965 | { | ||
966 | // Tab/Shift+Tab support for rich-edit control. | ||
967 | case EN_MSGFILTER: | ||
968 | { | ||
969 | MSGFILTER* msgFilter = reinterpret_cast<MSGFILTER*>(lParam); | ||
970 | if (WM_KEYDOWN == msgFilter->msg && VK_TAB == msgFilter->wParam) | ||
971 | { | ||
972 | BOOL fShift = 0x8000 & ::GetKeyState(VK_SHIFT); | ||
973 | HWND hwndFocus = ::GetNextDlgTabItem(hWnd, msgFilter->nmhdr.hwndFrom, fShift); | ||
974 | ::SetFocus(hwndFocus); | ||
975 | return 1; | ||
976 | } | ||
977 | break; | ||
978 | } | ||
979 | |||
980 | // Hyperlink clicks from rich-edit control. | ||
981 | case EN_LINK: | ||
982 | return SUCCEEDED(OnRichEditEnLink(lParam, pnmhdr->hwndFrom, hWnd)); | ||
983 | |||
984 | // Clicks on a hypertext/syslink control. | ||
985 | case NM_CLICK: __fallthrough; | ||
986 | case NM_RETURN: | ||
987 | if (ControlIsType(pTheme, static_cast<DWORD>(pnmhdr->idFrom), THEME_CONTROL_TYPE_HYPERTEXT)) | ||
988 | { | ||
989 | PNMLINK pnmlink = reinterpret_cast<PNMLINK>(lParam); | ||
990 | LITEM litem = pnmlink->item; | ||
991 | ShelExec(litem.szUrl, NULL, L"open", NULL, SW_SHOWDEFAULT, hWnd, NULL); | ||
992 | return 1; | ||
993 | } | ||
994 | |||
995 | return 0; | ||
996 | } | ||
997 | } | ||
998 | break; | ||
999 | |||
1000 | case WM_COMMAND: | ||
1001 | switch (HIWORD(wParam)) | ||
1002 | { | ||
1003 | case BN_CLICKED: | ||
1004 | if (lParam) | ||
1005 | { | ||
1006 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, (HWND)lParam); | ||
1007 | if (pControl && OnButtonClicked(pTheme, hWnd, pControl)) | ||
1008 | { | ||
1009 | return 0; | ||
1010 | } | ||
1011 | } | ||
1012 | break; | ||
1013 | } | ||
1014 | break; | ||
1015 | } | 934 | } |
1016 | } | 935 | } |
1017 | 936 | ||
1018 | return ::DefWindowProcW(hWnd, uMsg, wParam, lParam); | 937 | return ControlGroupDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam); |
1019 | } | 938 | } |
1020 | 939 | ||
1021 | 940 | ||
@@ -4846,6 +4765,119 @@ LExit: | |||
4846 | } | 4765 | } |
4847 | 4766 | ||
4848 | 4767 | ||
4768 | static LRESULT CALLBACK ControlGroupDefWindowProc( | ||
4769 | __in_opt THEME* pTheme, | ||
4770 | __in HWND hWnd, | ||
4771 | __in UINT uMsg, | ||
4772 | __in WPARAM wParam, | ||
4773 | __in LPARAM lParam | ||
4774 | ) | ||
4775 | { | ||
4776 | if (pTheme) | ||
4777 | { | ||
4778 | switch (uMsg) | ||
4779 | { | ||
4780 | case WM_DRAWITEM: | ||
4781 | ThemeDrawControl(pTheme, reinterpret_cast<LPDRAWITEMSTRUCT>(lParam)); | ||
4782 | return TRUE; | ||
4783 | |||
4784 | case WM_CTLCOLORBTN: __fallthrough; | ||
4785 | case WM_CTLCOLORSTATIC: | ||
4786 | { | ||
4787 | HBRUSH hBrush = NULL; | ||
4788 | if (ThemeSetControlColor(pTheme, reinterpret_cast<HDC>(wParam), reinterpret_cast<HWND>(lParam), &hBrush)) | ||
4789 | { | ||
4790 | return reinterpret_cast<LRESULT>(hBrush); | ||
4791 | } | ||
4792 | } | ||
4793 | break; | ||
4794 | |||
4795 | case WM_SETCURSOR: | ||
4796 | if (ThemeHoverControl(pTheme, hWnd, reinterpret_cast<HWND>(wParam))) | ||
4797 | { | ||
4798 | return TRUE; | ||
4799 | } | ||
4800 | break; | ||
4801 | |||
4802 | case WM_PAINT: | ||
4803 | if (::GetUpdateRect(hWnd, NULL, FALSE)) | ||
4804 | { | ||
4805 | PAINTSTRUCT ps; | ||
4806 | ::BeginPaint(hWnd, &ps); | ||
4807 | if (hWnd == pTheme->hwndParent) | ||
4808 | { | ||
4809 | ThemeDrawBackground(pTheme, &ps); | ||
4810 | } | ||
4811 | ::EndPaint(hWnd, &ps); | ||
4812 | } | ||
4813 | return 0; | ||
4814 | |||
4815 | case WM_TIMER: | ||
4816 | OnBillboardTimer(pTheme, hWnd, wParam); | ||
4817 | break; | ||
4818 | |||
4819 | case WM_NOTIFY: | ||
4820 | if (lParam) | ||
4821 | { | ||
4822 | LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam); | ||
4823 | switch (pnmhdr->code) | ||
4824 | { | ||
4825 | // Tab/Shift+Tab support for rich-edit control. | ||
4826 | case EN_MSGFILTER: | ||
4827 | { | ||
4828 | MSGFILTER* msgFilter = reinterpret_cast<MSGFILTER*>(lParam); | ||
4829 | if (WM_KEYDOWN == msgFilter->msg && VK_TAB == msgFilter->wParam) | ||
4830 | { | ||
4831 | BOOL fShift = 0x8000 & ::GetKeyState(VK_SHIFT); | ||
4832 | HWND hwndFocus = ::GetNextDlgTabItem(hWnd, msgFilter->nmhdr.hwndFrom, fShift); | ||
4833 | ::SetFocus(hwndFocus); | ||
4834 | return 1; | ||
4835 | } | ||
4836 | break; | ||
4837 | } | ||
4838 | |||
4839 | // Hyperlink clicks from rich-edit control. | ||
4840 | case EN_LINK: | ||
4841 | return SUCCEEDED(OnRichEditEnLink(lParam, pnmhdr->hwndFrom, hWnd)); | ||
4842 | |||
4843 | // Clicks on a hypertext/syslink control. | ||
4844 | case NM_CLICK: __fallthrough; | ||
4845 | case NM_RETURN: | ||
4846 | if (ControlIsType(pTheme, static_cast<DWORD>(pnmhdr->idFrom), THEME_CONTROL_TYPE_HYPERTEXT)) | ||
4847 | { | ||
4848 | PNMLINK pnmlink = reinterpret_cast<PNMLINK>(lParam); | ||
4849 | LITEM litem = pnmlink->item; | ||
4850 | ShelExec(litem.szUrl, NULL, L"open", NULL, SW_SHOWDEFAULT, hWnd, NULL); | ||
4851 | return 1; | ||
4852 | } | ||
4853 | |||
4854 | return 0; | ||
4855 | } | ||
4856 | } | ||
4857 | break; | ||
4858 | |||
4859 | case WM_COMMAND: | ||
4860 | switch (HIWORD(wParam)) | ||
4861 | { | ||
4862 | case BN_CLICKED: | ||
4863 | if (lParam) | ||
4864 | { | ||
4865 | const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, (HWND)lParam); | ||
4866 | if (pControl && OnButtonClicked(pTheme, hWnd, pControl)) | ||
4867 | { | ||
4868 | return 0; | ||
4869 | } | ||
4870 | } | ||
4871 | break; | ||
4872 | } | ||
4873 | break; | ||
4874 | } | ||
4875 | } | ||
4876 | |||
4877 | return ::DefWindowProcW(hWnd, uMsg, wParam, lParam); | ||
4878 | } | ||
4879 | |||
4880 | |||
4849 | static LRESULT CALLBACK PanelWndProc( | 4881 | static LRESULT CALLBACK PanelWndProc( |
4850 | __in HWND hWnd, | 4882 | __in HWND hWnd, |
4851 | __in UINT uMsg, | 4883 | __in UINT uMsg, |
@@ -4861,7 +4893,8 @@ static LRESULT CALLBACK PanelWndProc( | |||
4861 | case WM_NCCREATE: | 4893 | case WM_NCCREATE: |
4862 | { | 4894 | { |
4863 | LPCREATESTRUCTW lpcs = reinterpret_cast<LPCREATESTRUCTW>(lParam); | 4895 | LPCREATESTRUCTW lpcs = reinterpret_cast<LPCREATESTRUCTW>(lParam); |
4864 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(lpcs->lpCreateParams)); | 4896 | pTheme = reinterpret_cast<THEME*>(lpcs->lpCreateParams); |
4897 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pTheme)); | ||
4865 | } | 4898 | } |
4866 | break; | 4899 | break; |
4867 | 4900 | ||
@@ -4873,13 +4906,9 @@ static LRESULT CALLBACK PanelWndProc( | |||
4873 | case WM_NCHITTEST: | 4906 | case WM_NCHITTEST: |
4874 | return HTCLIENT; | 4907 | return HTCLIENT; |
4875 | break; | 4908 | break; |
4876 | |||
4877 | case WM_DRAWITEM: | ||
4878 | ThemeDrawControl(pTheme, reinterpret_cast<LPDRAWITEMSTRUCT>(lParam)); | ||
4879 | return TRUE; | ||
4880 | } | 4909 | } |
4881 | 4910 | ||
4882 | return ThemeDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam); | 4911 | return ControlGroupDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam); |
4883 | } | 4912 | } |
4884 | 4913 | ||
4885 | 4914 | ||