|
1
|
1 #include "StdAfx.h"
|
|
|
2
|
|
|
3 #ifdef FOOBAR2000_DESKTOP_WINDOWS
|
|
|
4
|
|
|
5 #include "win32_misc.h"
|
|
|
6 #include "win32_dialog.h"
|
|
|
7
|
|
|
8 namespace dialog_helper {
|
|
|
9
|
|
|
10
|
|
|
11 INT_PTR CALLBACK dialog::DlgProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
|
|
|
12 {
|
|
|
13 dialog * p_this;
|
|
|
14 BOOL rv;
|
|
|
15 if (msg==WM_INITDIALOG)
|
|
|
16 {
|
|
|
17 p_this = reinterpret_cast<dialog*>(lp);
|
|
|
18 p_this->wnd = wnd;
|
|
|
19 SetWindowLongPtr(wnd,DWLP_USER,lp);
|
|
|
20
|
|
|
21 if (p_this->m_is_modal) p_this->m_modal_scope.initialize(wnd);
|
|
|
22 }
|
|
|
23 else p_this = reinterpret_cast<dialog*>(GetWindowLongPtr(wnd,DWLP_USER));
|
|
|
24
|
|
|
25 rv = p_this ? p_this->on_message(msg,wp,lp) : FALSE;
|
|
|
26
|
|
|
27 if (msg==WM_DESTROY && p_this)
|
|
|
28 {
|
|
|
29 SetWindowLongPtr(wnd,DWLP_USER,0);
|
|
|
30 // p_this->wnd = 0;
|
|
|
31 }
|
|
|
32
|
|
|
33 return rv;
|
|
|
34 }
|
|
|
35
|
|
|
36
|
|
|
37 int dialog::run_modal(unsigned id,HWND parent)
|
|
|
38 {
|
|
|
39 assert(wnd == 0);
|
|
|
40 if (wnd != 0) return -1;
|
|
|
41 m_is_modal = true;
|
|
|
42 return uDialogBox(id,parent,DlgProc,reinterpret_cast<LPARAM>(this));
|
|
|
43 }
|
|
|
44 HWND dialog::run_modeless(unsigned id,HWND parent)
|
|
|
45 {
|
|
|
46 assert(wnd == 0);
|
|
|
47 if (wnd != 0) return 0;
|
|
|
48 m_is_modal = false;
|
|
|
49 return uCreateDialog(id,parent,DlgProc,reinterpret_cast<LPARAM>(this));
|
|
|
50 }
|
|
|
51
|
|
|
52 void dialog::end_dialog(int code)
|
|
|
53 {
|
|
|
54 assert(m_is_modal);
|
|
|
55 if (m_is_modal) uEndDialog(wnd,code);
|
|
|
56 }
|
|
|
57
|
|
|
58
|
|
|
59
|
|
|
60
|
|
|
61
|
|
|
62
|
|
|
63
|
|
|
64
|
|
|
65
|
|
|
66
|
|
|
67 int dialog_modal::run(unsigned p_id,HWND p_parent,HINSTANCE p_instance)
|
|
|
68 {
|
|
|
69 int status;
|
|
|
70
|
|
|
71 // note: uDialogBox() has its own modal scope, we don't want that to trigger
|
|
|
72 // if this is ever changed, move deinit to WM_DESTROY handler in DlgProc
|
|
|
73
|
|
|
74 status = (int)DialogBoxParam(p_instance,MAKEINTRESOURCE(p_id),p_parent,DlgProc,reinterpret_cast<LPARAM>(this));
|
|
|
75
|
|
|
76 m_modal_scope.deinitialize();
|
|
|
77
|
|
|
78 return status;
|
|
|
79 }
|
|
|
80
|
|
|
81 void dialog_modal::end_dialog(int p_code)
|
|
|
82 {
|
|
|
83 EndDialog(m_wnd,p_code);
|
|
|
84 }
|
|
|
85
|
|
|
86
|
|
|
87 INT_PTR CALLBACK dialog_modal::DlgProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
|
|
|
88 {
|
|
|
89 dialog_modal * _this;
|
|
|
90 if (msg==WM_INITDIALOG)
|
|
|
91 {
|
|
|
92 _this = reinterpret_cast<dialog_modal*>(lp);
|
|
|
93 _this->m_wnd = wnd;
|
|
|
94 SetWindowLongPtr(wnd,DWLP_USER,lp);
|
|
|
95
|
|
|
96 _this->m_modal_scope.initialize(wnd);
|
|
|
97 }
|
|
|
98 else _this = reinterpret_cast<dialog_modal*>(GetWindowLongPtr(wnd,DWLP_USER));
|
|
|
99
|
|
|
100 assert(_this == 0 || _this->m_wnd == wnd);
|
|
|
101
|
|
|
102 return _this ? _this->on_message(msg,wp,lp) : FALSE;
|
|
|
103 }
|
|
|
104
|
|
|
105 }
|
|
|
106
|
|
|
107 HWND uCreateDialog(UINT id,HWND parent,DLGPROC proc,LPARAM param)
|
|
|
108 {
|
|
|
109 return CreateDialogParam(core_api::get_my_instance(),MAKEINTRESOURCE(id),parent,proc,param);
|
|
|
110 }
|
|
|
111
|
|
|
112 int uDialogBox(UINT id,HWND parent,DLGPROC proc,LPARAM param)
|
|
|
113 {
|
|
|
114 return (int)DialogBoxParam(core_api::get_my_instance(),MAKEINTRESOURCE(id),parent,proc,param);
|
|
|
115 }
|
|
|
116
|
|
|
117 #endif // FOOBAR2000_DESKTOP_WINDOWS
|