1 /** DGui project file.
2
3 Copyright: Trogu Antonio Davide 2011-2013
4
5 License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
6
7 Authors: Trogu Antonio Davide
8 */
9 module dgui.core.controls.reflectedcontrol;
10
11 public import dgui.core.controls.control;
12
13 abstract class ReflectedControl: Control
14 {
15 private void reflectMessageToChild(ref Message m)
16 {
17 HWND hFrom = void; //Inizializzata sotto
18
19 switch(m.msg)
20 {
21 case WM_NOTIFY:
22 NMHDR* pNotify = cast(NMHDR*)m.lParam;
23 hFrom = pNotify.hwndFrom;
24 break;
25
26 case WM_MEASUREITEM:
27 {
28 MEASUREITEMSTRUCT* pMeasureItem = cast(MEASUREITEMSTRUCT*)m.lParam;
29
30 switch(pMeasureItem.CtlType)
31 {
32 case ODT_COMBOBOX:
33 hFrom = GetParent(cast(HWND)pMeasureItem.CtlID);
34 break;
35
36 case ODT_MENU:
37 hFrom = this._handle; // Set the owner of the menu (this window)
38 break;
39
40 default:
41 hFrom = cast(HWND)pMeasureItem.CtlID;
42 break;
43 }
44 }
45 break;
46
47 case WM_DRAWITEM:
48 {
49 DRAWITEMSTRUCT* pDrawItem = cast(DRAWITEMSTRUCT*)m.lParam;
50
51 switch(pDrawItem.CtlType)
52 {
53 case ODT_COMBOBOX:
54 hFrom = GetParent(pDrawItem.hwndItem);
55 break;
56
57 case ODT_MENU:
58 hFrom = this._handle; // Set the owner of the menu (this window)
59 break;
60
61 default:
62 hFrom = cast(HWND)pDrawItem.hwndItem;
63 break;
64 }
65 }
66 break;
67
68 default: // WM_COMMAND
69 hFrom = cast(HWND)m.lParam;
70 break;
71 }
72
73 /* If 'hFrom' is this window, the notification is sent by menus */
74 Control c = winCast!(Control)(GetWindowLongW(hFrom, GWL_USERDATA));
75
76 if(c)
77 {
78 c.sendMessage(DGUI_REFLECTMESSAGE, cast(WPARAM)&m, 0);
79 }
80 }
81
82 protected override void wndProc(ref Message m)
83 {
84 switch(m.msg)
85 {
86 case WM_NOTIFY, WM_COMMAND, WM_MEASUREITEM, WM_DRAWITEM, WM_CTLCOLOREDIT, WM_CTLCOLORBTN:
87 {
88 this.originalWndProc(m); //Components like: ComboBoxEx need this one!
89
90 if(ReflectedControl.hasBit(this._cBits, ControlBits.canNotify)) //Avoid fake notification messages caused by component's properties (like text(), checked(), ...)
91 {
92 this.reflectMessageToChild(m);
93 }
94 }
95 break;
96
97 default:
98 super.wndProc(m);
99 break;
100 }
101 }
102 }