I think I finally fixed activation behaviour under MSW - now focus is not given
[wxWidgets.git] / include / wx / msw / window.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: window.h
3 // Purpose: wxWindow class
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 01/02/97
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_WINDOW_H_
13 #define _WX_WINDOW_H_
14
15 // ---------------------------------------------------------------------------
16 // headers
17 // ---------------------------------------------------------------------------
18
19 #ifdef __GNUG__
20 #pragma interface "window.h"
21 #endif
22
23 // #include "wx/msw/winundef.h"
24
25 // VZ: apparently some version of Windows send extra mouse move messages after
26 // a mouse click. My tests under NT 4.0 and 95 didn't show it so I'm
27 // tempted to think that it was just an effect of a poor mouse and so the
28 // code to work around this is currently disabled - just define this as 1
29 // to reenable it
30 #define wxUSE_MOUSEEVENT_HACK 0
31
32 // ---------------------------------------------------------------------------
33 // forward declarations
34 // ---------------------------------------------------------------------------
35
36 class WXDLLEXPORT wxButton;
37
38 // ---------------------------------------------------------------------------
39 // constants
40 // ---------------------------------------------------------------------------
41
42 // FIXME does anybody use those? they're unused by wxWindows...
43 enum
44 {
45 wxKEY_SHIFT = 1,
46 wxKEY_CTRL = 2
47 };
48
49 // ---------------------------------------------------------------------------
50 // wxWindow declaration for MSW
51 // ---------------------------------------------------------------------------
52
53 class WXDLLEXPORT wxWindow : public wxWindowBase
54 {
55 DECLARE_DYNAMIC_CLASS(wxWindow);
56
57 public:
58 wxWindow() { Init(); }
59
60 wxWindow(wxWindow *parent,
61 wxWindowID id,
62 const wxPoint& pos = wxDefaultPosition,
63 const wxSize& size = wxDefaultSize,
64 long style = 0,
65 const wxString& name = wxPanelNameStr)
66 {
67 Init();
68 Create(parent, id, pos, size, style, name);
69 }
70
71 virtual ~wxWindow();
72
73 bool Create(wxWindow *parent,
74 wxWindowID id,
75 const wxPoint& pos = wxDefaultPosition,
76 const wxSize& size = wxDefaultSize,
77 long style = 0,
78 const wxString& name = wxPanelNameStr);
79
80 // implement base class pure virtuals
81 virtual void SetTitle( const wxString& title);
82 virtual wxString GetTitle() const;
83
84 virtual void Raise();
85 virtual void Lower();
86
87 virtual bool Show( bool show = TRUE );
88 virtual bool Enable( bool enable = TRUE );
89
90 virtual void SetFocus();
91
92 virtual bool Reparent( wxWindow *newParent );
93
94 virtual void WarpPointer(int x, int y);
95 virtual void CaptureMouse();
96 virtual void ReleaseMouse();
97
98 virtual void Refresh( bool eraseBackground = TRUE,
99 const wxRect *rect = (const wxRect *) NULL );
100 virtual void Clear();
101
102 virtual bool SetCursor( const wxCursor &cursor );
103 virtual bool SetFont( const wxFont &font );
104
105 virtual int GetCharHeight() const;
106 virtual int GetCharWidth() const;
107 virtual void GetTextExtent(const wxString& string,
108 int *x, int *y,
109 int *descent = (int *) NULL,
110 int *externalLeading = (int *) NULL,
111 const wxFont *theFont = (const wxFont *) NULL)
112 const;
113
114 virtual bool DoPopupMenu( wxMenu *menu, int x, int y );
115
116 virtual void SetScrollbar( int orient, int pos, int thumbVisible,
117 int range, bool refresh = TRUE );
118 virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE );
119 virtual int GetScrollPos( int orient ) const;
120 virtual int GetScrollThumb( int orient ) const;
121 virtual int GetScrollRange( int orient ) const;
122 virtual void ScrollWindow( int dx, int dy,
123 const wxRect* rect = (wxRect *) NULL );
124
125 #if wxUSE_DRAG_AND_DROP
126 virtual void SetDropTarget( wxDropTarget *dropTarget );
127 #endif // wxUSE_DRAG_AND_DROP
128
129 // Accept files for dragging
130 virtual void DragAcceptFiles(bool accept);
131
132 #if WXWIN_COMPATIBILITY
133 // Set/get scroll attributes
134 virtual void SetScrollRange(int orient, int range, bool refresh = TRUE);
135 virtual void SetScrollPage(int orient, int page, bool refresh = TRUE);
136 virtual int OldGetScrollRange(int orient) const;
137 virtual int GetScrollPage(int orient) const;
138
139 // event handlers
140 // Handle a control command
141 virtual void OnCommand(wxWindow& win, wxCommandEvent& event);
142
143 // Override to define new behaviour for default action (e.g. double
144 // clicking on a listbox)
145 virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { }
146 #endif // WXWIN_COMPATIBILITY
147
148 #if wxUSE_CARET && WXWIN_COMPATIBILITY
149 // caret manipulation (old MSW only functions, see wxCaret class for the
150 // new API)
151 void CreateCaret(int w, int h);
152 void CreateCaret(const wxBitmap *bitmap);
153 void DestroyCaret();
154 void ShowCaret(bool show);
155 void SetCaretPos(int x, int y);
156 void GetCaretPos(int *x, int *y) const;
157 #endif // wxUSE_CARET
158
159 // Native resource loading (implemented in src/msw/nativdlg.cpp)
160 // FIXME: should they really be all virtual?
161 virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id);
162 virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name);
163 wxWindow* GetWindowChild1(wxWindowID id);
164 wxWindow* GetWindowChild(wxWindowID id);
165
166 // implementation from now on
167 // --------------------------
168
169 // simple accessors
170 // ----------------
171
172 WXHWND GetHWND() const { return m_hWnd; }
173 void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; }
174 virtual WXWidget GetHandle() const { return GetHWND(); }
175
176 bool GetUseCtl3D() const { return m_useCtl3D; }
177 bool GetTransparentBackground() const { return m_backgroundTransparent; }
178 void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; }
179
180 // event handlers
181 // --------------
182
183 void OnSetFocus(wxFocusEvent& event);
184 void OnEraseBackground(wxEraseEvent& event);
185 void OnIdle(wxIdleEvent& event);
186
187 public:
188 // For implementation purposes - sometimes decorations make the client area
189 // smaller
190 virtual wxPoint GetClientAreaOrigin() const;
191
192 // Makes an adjustment to the window position (for example, a frame that has
193 // a toolbar that it manages itself).
194 virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags);
195
196 // Windows subclassing
197 void SubclassWin(WXHWND hWnd);
198 void UnsubclassWin();
199
200 WXFARPROC MSWGetOldWndProc() const { return m_oldWndProc; }
201 void MSWSetOldWndProc(WXFARPROC proc) { m_oldWndProc = proc; }
202
203 wxWindow *FindItem(long id) const;
204 wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = FALSE) const;
205
206 // Make a Windows extended style from the given wxWindows window style
207 static WXDWORD MakeExtendedStyle(long style,
208 bool eliminateBorders = TRUE);
209 // Determine whether 3D effects are wanted
210 WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) const;
211
212 // MSW only: TRUE if this control is part of the main control
213 virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; };
214
215 // returns TRUE if the window has been created
216 bool MSWCreate(int id,
217 wxWindow *parent,
218 const wxChar *wclass,
219 wxWindow *wx_win,
220 const wxChar *title,
221 int x, int y, int width, int height,
222 WXDWORD style,
223 const wxChar *dialog_template = NULL,
224 WXDWORD exendedStyle = 0);
225 virtual bool MSWCommand(WXUINT param, WXWORD id);
226
227 #if WXWIN_COMPATIBILITY
228 wxObject *GetChild(int number) const;
229 virtual void MSWDeviceToLogical(float *x, float *y) const;
230 #endif // WXWIN_COMPATIBILITY
231
232 // Create an appropriate wxWindow from a HWND
233 virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd);
234
235 // Make sure the window style reflects the HWND style (roughly)
236 virtual void AdoptAttributesFromHWND();
237
238 // Setup background and foreground colours correctly
239 virtual void SetupColours();
240
241 // ------------------------------------------------------------------------
242 // helpers for message handlers: these perform the same function as the
243 // message crackers from <windowsx.h> - they unpack WPARAM and LPARAM into
244 // the correct parameters
245 // ------------------------------------------------------------------------
246
247 void UnpackCommand(WXWPARAM wParam, WXLPARAM lParam,
248 WXWORD *id, WXHWND *hwnd, WXWORD *cmd);
249 void UnpackActivate(WXWPARAM wParam, WXLPARAM lParam,
250 WXWORD *state, WXWORD *minimized, WXHWND *hwnd);
251 void UnpackScroll(WXWPARAM wParam, WXLPARAM lParam,
252 WXWORD *code, WXWORD *pos, WXHWND *hwnd);
253 void UnpackCtlColor(WXWPARAM wParam, WXLPARAM lParam,
254 WXWORD *nCtlColor, WXHDC *hdc, WXHWND *hwnd);
255 void UnpackMenuSelect(WXWPARAM wParam, WXLPARAM lParam,
256 WXWORD *item, WXWORD *flags, WXHMENU *hmenu);
257
258 // ------------------------------------------------------------------------
259 // internal handlers for MSW messages: all handlers return a boolen value:
260 // TRUE means that the handler processed the event and FALSE that it didn't
261 // ------------------------------------------------------------------------
262
263 // there are several cases where we have virtual functions for Windows
264 // message processing: this is because these messages often require to be
265 // processed in a different manner in the derived classes. For all other
266 // messages, however, we do *not* have corresponding MSWOnXXX() function
267 // and if the derived class wants to process them, it should override
268 // MSWWindowProc() directly.
269
270 // scroll event (both horizontal and vertical)
271 virtual bool MSWOnScroll(int orientation, WXWORD nSBCode,
272 WXWORD pos, WXHWND control);
273
274 // child control notifications
275 #ifdef __WIN95__
276 virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
277 #endif // __WIN95__
278
279 // owner-drawn controls need to process these messages
280 virtual bool MSWOnDrawItem(int id, WXDRAWITEMSTRUCT *item);
281 virtual bool MSWOnMeasureItem(int id, WXMEASUREITEMSTRUCT *item);
282
283 // the rest are not virtual
284 bool HandleCreate(WXLPCREATESTRUCT cs, bool *mayCreate);
285 bool HandleInitDialog(WXHWND hWndFocus);
286 bool HandleDestroy();
287
288 bool HandlePaint();
289 bool HandleEraseBkgnd(WXHDC pDC);
290
291 bool HandleMinimize();
292 bool HandleMaximize();
293 bool HandleSize(int x, int y, WXUINT flag);
294 bool HandleGetMinMaxInfo(void *mmInfo);
295
296 bool HandleShow(bool show, int status);
297 bool HandleActivate(int flag, bool minimized, WXHWND activate);
298
299 bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control);
300 bool HandleSysCommand(WXWPARAM wParam, WXLPARAM lParam);
301
302 bool HandleCtlColor(WXHBRUSH *hBrush,
303 WXHDC hdc,
304 WXHWND hWnd,
305 WXUINT nCtlColor,
306 WXUINT message,
307 WXWPARAM wParam,
308 WXLPARAM lParam);
309
310 bool HandlePaletteChanged(WXHWND hWndPalChange);
311 bool HandleQueryNewPalette();
312 bool HandleSysColorChange();
313
314 bool HandleQueryEndSession(long logOff, bool *mayEnd);
315 bool HandleEndSession(bool endSession, long logOff);
316
317 bool HandleSetFocus(WXHWND wnd);
318 bool HandleKillFocus(WXHWND wnd);
319
320 bool HandleDropFiles(WXWPARAM wParam);
321
322 bool HandleMouseEvent(WXUINT msg, int x, int y, WXUINT flags);
323 bool HandleMouseMove(int x, int y, WXUINT flags);
324
325 bool HandleChar(WXWORD wParam, WXLPARAM lParam, bool isASCII = FALSE);
326 bool HandleKeyDown(WXWORD wParam, WXLPARAM lParam);
327 bool HandleKeyUp(WXWORD wParam, WXLPARAM lParam);
328
329 bool HandleQueryDragIcon(WXHICON *hIcon);
330
331 bool HandleSetCursor(WXHWND hWnd, short nHitTest, int mouseMsg);
332
333 // Window procedure
334 virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
335
336 // Calls an appropriate default window procedure
337 virtual long MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
338 virtual bool MSWProcessMessage(WXMSG* pMsg);
339 virtual bool MSWTranslateMessage(WXMSG* pMsg);
340 virtual void MSWDestroyWindow();
341
342 // Detach "Window" menu from menu bar so it doesn't get deleted
343 void MSWDetachWindowMenu();
344
345 // this function should return the brush to paint the window background
346 // with or 0 for the default brush
347 virtual WXHBRUSH OnCtlColor(WXHDC hDC,
348 WXHWND hWnd,
349 WXUINT nCtlColor,
350 WXUINT message,
351 WXWPARAM wParam,
352 WXLPARAM lParam);
353
354 #if WXWIN_COMPATIBILITY
355 void SetShowing(bool show) { (void)Show(show); }
356 bool IsUserEnabled() const { return IsEnabled(); }
357 #endif // WXWIN_COMPATIBILITY
358
359 // Responds to colour changes: passes event on to children.
360 void OnSysColourChanged(wxSysColourChangedEvent& event);
361
362 // initialize various fields of wxMouseEvent (common part of MSWOnMouseXXX)
363 void InitMouseEvent(wxMouseEvent& event, int x, int y, WXUINT flags);
364
365 protected:
366 // the window handle
367 WXHWND m_hWnd;
368
369 // the old window proc (we subclass all windows)
370 WXFARPROC m_oldWndProc;
371
372 // additional (MSW specific) flags
373 bool m_useCtl3D:1; // Using CTL3D for this control
374 bool m_backgroundTransparent:1;
375 bool m_mouseInWindow:1;
376 bool m_doubleClickAllowed:1;
377 bool m_winCaptured:1;
378
379 // the size of one page for scrolling
380 int m_xThumbSize;
381 int m_yThumbSize;
382
383 #if wxUSE_MOUSEEVENT_HACK
384 // the coordinates of the last mouse event and the type of it
385 long m_lastMouseX,
386 m_lastMouseY;
387 int m_lastMouseEvent;
388 #endif // wxUSE_MOUSEEVENT_HACK
389
390 WXHMENU m_hMenu; // Menu, if any
391
392 // the return value of WM_GETDLGCODE handler
393 long m_lDlgCode;
394
395 // implement the base class pure virtuals
396 virtual void DoClientToScreen( int *x, int *y ) const;
397 virtual void DoScreenToClient( int *x, int *y ) const;
398 virtual void DoGetPosition( int *x, int *y ) const;
399 virtual void DoGetSize( int *width, int *height ) const;
400 virtual void DoGetClientSize( int *width, int *height ) const;
401 virtual void DoSetSize(int x, int y,
402 int width, int height,
403 int sizeFlags = wxSIZE_AUTO);
404 virtual void DoSetClientSize(int width, int height);
405
406 // move the window to the specified location and resize it: this is called
407 // from both DoSetSize() and DoSetClientSize() and would usually just call
408 // ::MoveWindow() except for composite controls which will want to arrange
409 // themselves inside the given rectangle
410 virtual void DoMoveWindow(int x, int y, int width, int height);
411
412 #if wxUSE_TOOLTIPS
413 virtual void DoSetToolTip( wxToolTip *tip );
414 #endif // wxUSE_TOOLTIPS
415
416 private:
417 // common part of all ctors
418 void Init();
419
420 // the (non-virtual) handlers for the events
421 bool HandleMove(int x, int y);
422 bool HandleJoystickEvent(WXUINT msg, int x, int y, WXUINT flags);
423
424 #ifdef __WIN95__
425 bool HandleNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
426 #endif // __WIN95__
427
428 DECLARE_NO_COPY_CLASS(wxWindow);
429 DECLARE_EVENT_TABLE()
430 };
431
432 // ---------------------------------------------------------------------------
433 // global functions
434 // ---------------------------------------------------------------------------
435
436 // kbd code translation
437 WXDLLEXPORT int wxCharCodeMSWToWX(int keySym);
438 WXDLLEXPORT int wxCharCodeWXToMSW(int id, bool *IsVirtual);
439
440 #endif
441 // _WX_WINDOW_H_