4 * Copyright 2009 Andrew Hill <ash77@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #if defined(__GNUC__) || defined(__clang__)
24 #define GCCU(x) x __attribute__((unused))
28 #define Unused(x) (x);
31 #ifdef SetWindowLongPtr
32 #undef SetWindowLongPtr
33 inline LONG_PTR
SetWindowLongPtr(HWND hWnd
, int nIndex
, LONG_PTR dwNewLong
)
35 return SetWindowLong(hWnd
, nIndex
, (LONG
)dwNewLong
);
39 #ifdef GetWindowLongPtr
40 #undef GetWindowLongPtr
41 inline LONG_PTR
GetWindowLongPtr(HWND hWnd
, int nIndex
)
43 return (LONG_PTR
)GetWindowLong(hWnd
, nIndex
);
47 #pragma push_macro("SubclassWindow")
53 struct _ATL_WNDCLASSINFOW
;
54 typedef _ATL_WNDCLASSINFOW CWndClassInfo
;
56 template <DWORD t_dwStyle
= 0, DWORD t_dwExStyle
= 0>
60 static DWORD
GetWndStyle(DWORD dwStyle
)
67 static DWORD
GetWndExStyle(DWORD dwExStyle
)
75 typedef CWinTraits
<WS_CHILD
| WS_VISIBLE
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, 0> CControlWinTraits
;
76 typedef CWinTraits
<WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_APPWINDOW
| WS_EX_WINDOWEDGE
> CFrameWinTraits
;
77 typedef CWinTraits
<WS_OVERLAPPEDWINDOW
| WS_CHILD
| WS_VISIBLE
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_MDICHILD
> CMDIChildWinTraits
;
79 template <DWORD t_dwStyle
= 0, DWORD t_dwExStyle
= 0, class TWinTraits
= CControlWinTraits
>
83 static DWORD
GetWndStyle(DWORD dwStyle
)
85 return dwStyle
| t_dwStyle
| TWinTraits::GetWndStyle(dwStyle
);
88 static DWORD
GetWndExStyle(DWORD dwExStyle
)
90 return dwExStyle
| t_dwExStyle
| TWinTraits::GetWndExStyle(dwExStyle
);
99 _U_MENUorID(HMENU hMenu
)
104 _U_MENUorID(UINT nID
)
106 m_hMenu
= (HMENU
)(UINT_PTR
)nID
;
115 _U_RECT(LPRECT lpRect
)
126 struct _ATL_MSG
: public MSG
131 _ATL_MSG(HWND hWnd
, UINT uMsg
, WPARAM wParamIn
, LPARAM lParamIn
, BOOL bHandledIn
= TRUE
)
140 bHandled
= bHandledIn
;
149 DWORD m_mov
; /* mov dword ptr [esp+4], m_this */
151 BYTE m_jmp
; /* jmp relproc */
155 Init(WNDPROC proc
, void *pThis
)
158 m_this
= PtrToUlong(pThis
);
160 m_relproc
= DWORD(reinterpret_cast<char *>(proc
) - (reinterpret_cast<char *>(this) + sizeof(thunkCode
)));
161 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
166 #elif defined(_AMD64_)
171 USHORT m_mov_rcx
; /* mov rcx, m_this */
173 USHORT m_mov_rax
; /* mov rax, m_proc */
175 USHORT m_jmp
; /* jmp rax */
178 Init(WNDPROC proc
, void *pThis
)
181 m_this
= (ULONG64
)pThis
;
183 m_proc
= (ULONG64
)proc
;
185 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
190 #elif defined(_M_ARM)
195 DWORD m_mov_r0
; /* mov r0, m_this */
196 DWORD m_mov_pc
; /* mov pc, m_proc */
201 Init(WNDPROC proc
, void *pThis
)
203 m_mov_r0
= 0xE59F0000;
204 m_mov_pc
= 0xE59FF000;
205 m_this
= (DWORD
)pThis
;
206 m_proc
= (DWORD
)proc
;
207 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
213 #error ARCH not supported
220 _AtlCreateWndData cd
;
225 m_pthunk
= (thunkCode
*)VirtualAlloc(NULL
, sizeof(thunkCode
), MEM_COMMIT
, PAGE_EXECUTE_READWRITE
);
230 if (m_pthunk
!= NULL
)
231 VirtualFree(m_pthunk
, 0, MEM_RELEASE
);
234 BOOL
Init(WNDPROC proc
, void *pThis
)
236 if (m_pthunk
== NULL
)
238 m_pthunk
->Init(proc
, pThis
);
244 return reinterpret_cast<WNDPROC
>(m_pthunk
);
251 virtual BOOL
ProcessWindowMessage(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
&lResult
, DWORD dwMsgMapID
) = 0;
258 static RECT rcDefault
;
260 CWindow(HWND hWnd
= NULL
)
265 operator HWND() const
270 static LPCTSTR
GetWndClassName()
275 UINT
ArrangeIconicWindows()
277 ATLASSERT(::IsWindow(m_hWnd
));
278 return ::ArrangeIconicWindows(m_hWnd
);
281 void Attach(HWND hWndNew
)
286 HDC
BeginPaint(LPPAINTSTRUCT lpPaint
)
288 ATLASSERT(::IsWindow(m_hWnd
));
289 return ::BeginPaint(m_hWnd
, lpPaint
);
292 BOOL
BringWindowToTop()
294 ATLASSERT(::IsWindow(m_hWnd
));
295 return ::BringWindowToTop(m_hWnd
);
298 BOOL
CenterWindow(HWND hWndCenter
= NULL
)
300 ATLASSERT(::IsWindow(m_hWnd
));
301 if (hWndCenter
== NULL
)
302 hWndCenter
= ::GetParent(m_hWnd
);
303 if (hWndCenter
== NULL
)
305 RECT wndCenterRect
, wndRect
;
306 if (!::GetWindowRect(hWndCenter
, &wndCenterRect
) || !::GetWindowRect(m_hWnd
, &wndRect
))
308 int wndCenterWidth
= wndCenterRect
.right
- wndCenterRect
.left
;
309 int wndCenterHeight
= wndCenterRect
.bottom
- wndCenterRect
.top
;
310 int wndWidth
= wndRect
.right
- wndRect
.left
;
311 int wndHeight
= wndRect
.bottom
- wndRect
.top
;
312 return ::MoveWindow(m_hWnd
,
313 wndCenterRect
.left
+ ((wndCenterWidth
- wndWidth
+ 1) >> 1),
314 wndCenterRect
.top
+ ((wndCenterHeight
- wndHeight
+ 1) >> 1),
315 wndWidth
, wndHeight
, TRUE
);
318 BOOL
ChangeClipboardChain(HWND hWndNewNext
)
320 ATLASSERT(::IsWindow(m_hWnd
));
321 return ::ChangeClipboardChain(m_hWnd
, hWndNewNext
);
324 BOOL
CheckDlgButton(int nIDButton
, UINT nCheck
)
326 ATLASSERT(::IsWindow(m_hWnd
));
327 return ::CheckDlgButton(m_hWnd
, nIDButton
, nCheck
);
330 BOOL
CheckRadioButton(int nIDFirstButton
, int nIDLastButton
, int nIDCheckButton
)
332 ATLASSERT(::IsWindow(m_hWnd
));
333 return ::CheckRadioButton(m_hWnd
, nIDFirstButton
, nIDLastButton
, nIDCheckButton
);
336 HWND
ChildWindowFromPoint(POINT point
) const
338 ATLASSERT(::IsWindow(m_hWnd
));
339 return ::ChildWindowFromPoint(m_hWnd
, point
);
342 HWND
ChildWindowFromPointEx(POINT point
, UINT uFlags
) const
344 ATLASSERT(::IsWindow(m_hWnd
));
345 return ::ChildWindowFromPointEx(m_hWnd
, point
, uFlags
);
348 BOOL
ClientToScreen(LPPOINT lpPoint
) const
350 ATLASSERT(::IsWindow(m_hWnd
));
351 return ::ClientToScreen(m_hWnd
, lpPoint
);
354 BOOL
ClientToScreen(LPRECT lpRect
) const
358 ATLASSERT(::IsWindow(m_hWnd
));
359 POINT leftTop
= {lpRect
->left
, lpRect
->top
};
360 POINT rightBottom
= {lpRect
->right
, lpRect
->bottom
};
361 BOOL success
= ::ClientToScreen(m_hWnd
, &leftTop
) && ::ClientToScreen(m_hWnd
, &rightBottom
);
364 lpRect
->left
= leftTop
.x
;
365 lpRect
->top
= leftTop
.y
;
366 lpRect
->right
= rightBottom
.x
;
367 lpRect
->bottom
= rightBottom
.y
;
372 HWND
Create(LPCTSTR lpstrWndClass
, HWND hWndParent
, _U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
, DWORD dwStyle
= 0, DWORD dwExStyle
= 0, _U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
375 ATLASSERT(m_hWnd
== NULL
);
376 hWnd
= ::CreateWindowEx(dwExStyle
,
382 rect
.m_lpRect
->right
- rect
.m_lpRect
->left
,
383 rect
.m_lpRect
->bottom
- rect
.m_lpRect
->top
,
386 _AtlBaseModule
.GetModuleInstance(),
393 BOOL
CreateCaret(HBITMAP pBitmap
)
395 ATLASSERT(::IsWindow(m_hWnd
));
396 return ::CreateCaret(m_hWnd
, pBitmap
, 0, 0);
399 BOOL
CreateGrayCaret(int nWidth
, int nHeight
)
401 ATLASSERT(::IsWindow(m_hWnd
));
402 return ::CreateCaret(m_hWnd
, (HBITMAP
)1, nWidth
, nHeight
);
405 BOOL
CreateSolidCaret(int nWidth
, int nHeight
)
407 ATLASSERT(::IsWindow(m_hWnd
));
408 return ::CreateCaret(m_hWnd
, (HBITMAP
)0, nWidth
, nHeight
);
411 HDWP
DeferWindowPos(HDWP hWinPosInfo
, HWND hWndInsertAfter
, int x
, int y
, int cx
, int cy
, UINT uFlags
)
413 ATLASSERT(::IsWindow(m_hWnd
));
414 return ::DeferWindowPos(hWinPosInfo
, m_hWnd
, hWndInsertAfter
, x
, y
, cx
, cy
, uFlags
);
419 ATLASSERT(::IsWindow(m_hWnd
));
421 if (!::DestroyWindow(m_hWnd
))
435 int DlgDirList(LPTSTR lpPathSpec
, int nIDListBox
, int nIDStaticPath
, UINT nFileType
)
437 ATLASSERT(::IsWindow(m_hWnd
));
438 return ::DlgDirList(m_hWnd
, lpPathSpec
, nIDListBox
, nIDStaticPath
, nFileType
);
441 int DlgDirListComboBox(LPTSTR lpPathSpec
, int nIDComboBox
, int nIDStaticPath
, UINT nFileType
)
443 ATLASSERT(::IsWindow(m_hWnd
));
444 return ::DlgDirListComboBox(m_hWnd
, lpPathSpec
, nIDComboBox
, nIDStaticPath
, nFileType
);
447 BOOL
DlgDirSelect(LPTSTR lpString
, int nCount
, int nIDListBox
)
449 ATLASSERT(::IsWindow(m_hWnd
));
450 return ::DlgDirSelectEx(m_hWnd
, lpString
, nCount
, nIDListBox
);
453 BOOL
DlgDirSelectComboBox(LPTSTR lpString
, int nCount
, int nIDComboBox
)
455 ATLASSERT(::IsWindow(m_hWnd
));
456 return ::DlgDirSelectComboBoxEx(m_hWnd
, lpString
, nCount
, nIDComboBox
);
459 void DragAcceptFiles(BOOL bAccept
= TRUE
)
461 ATLASSERT(::IsWindow(m_hWnd
));
462 // FIXME following line requires shellapi.h
463 // ::DragAcceptFiles(m_hWnd, bAccept);
468 ATLASSERT(::IsWindow(m_hWnd
));
469 return ::DrawMenuBar(m_hWnd
);
472 BOOL
EnableScrollBar(UINT uSBFlags
, UINT uArrowFlags
= ESB_ENABLE_BOTH
)
474 ATLASSERT(::IsWindow(m_hWnd
));
475 return ::EnableScrollBar(m_hWnd
, uSBFlags
, uArrowFlags
);
478 BOOL
EnableWindow(BOOL bEnable
= TRUE
)
480 ATLASSERT(::IsWindow(m_hWnd
));
481 return ::EnableWindow(m_hWnd
, bEnable
);
484 void EndPaint(LPPAINTSTRUCT lpPaint
)
486 ATLASSERT(::IsWindow(m_hWnd
));
487 ::EndPaint(m_hWnd
, lpPaint
);
490 BOOL
FlashWindow(BOOL bInvert
)
492 ATLASSERT(::IsWindow(m_hWnd
));
493 return ::FlashWindow(m_hWnd
, bInvert
);
496 BOOL
GetClientRect(LPRECT lpRect
) const
498 ATLASSERT(::IsWindow(m_hWnd
));
499 return ::GetClientRect(m_hWnd
, lpRect
);
504 ATLASSERT(::IsWindow(m_hWnd
));
505 return ::GetDC(m_hWnd
);
508 HDC
GetDCEx(HRGN hRgnClip
, DWORD flags
)
510 ATLASSERT(::IsWindow(m_hWnd
));
511 return ::GetDCEx(m_hWnd
, hRgnClip
, flags
);
515 typedef struct _IDHWNDPAIR
{
518 } IDHWNDPAIR
, *PIDHWNDPAIR
;
520 static BOOL CALLBACK
GetDescendantWindowCallback(HWND hWnd
, LPARAM lParam
)
522 if (::GetWindowLong(hWnd
, GWL_ID
) == ((PIDHWNDPAIR
)lParam
)->nID
)
524 ((PIDHWNDPAIR
)lParam
)->hWnd
= hWnd
;
527 ::EnumChildWindows(hWnd
, &GetDescendantWindowCallback
, lParam
);
528 return (((PIDHWNDPAIR
)lParam
)->hWnd
== NULL
);
532 HWND
GetDescendantWindow(int nID
) const
534 ATLASSERT(::IsWindow(m_hWnd
));
535 IDHWNDPAIR idHWndPair
;
536 idHWndPair
.nID
= nID
;
537 idHWndPair
.hWnd
= NULL
;
538 ::EnumChildWindows(m_hWnd
, &GetDescendantWindowCallback
, (LPARAM
)&idHWndPair
);
539 return idHWndPair
.hWnd
;
542 HRESULT
GetDlgControl(int nID
, REFIID iid
, void** ppCtrl
)
544 ATLASSERT(::IsWindow(m_hWnd
));
545 return E_FAIL
;//FIXME stub
548 int GetDlgCtrlID() const
550 ATLASSERT(::IsWindow(m_hWnd
));
551 return ::GetDlgCtrlID(m_hWnd
);
554 HRESULT
GetDlgHost(int nID
, REFIID iid
, void** ppHost
)
556 ATLASSERT(::IsWindow(m_hWnd
));
557 return E_FAIL
;//FIXME stub
560 HWND
GetDlgItem(int nID
)
562 ATLASSERT(::IsWindow(m_hWnd
));
563 return ::GetDlgItem(m_hWnd
, nID
);
566 UINT
GetDlgItemInt(int nID
, BOOL
* lpTrans
= NULL
, BOOL bSigned
= TRUE
) const
568 ATLASSERT(::IsWindow(m_hWnd
));
569 return ::GetDlgItemInt(m_hWnd
, nID
, lpTrans
, bSigned
);
572 UINT
GetDlgItemText(int nID
, LPTSTR lpStr
, int nMaxCount
) const
574 ATLASSERT(::IsWindow(m_hWnd
));
575 return ::GetDlgItemText(m_hWnd
, nID
, lpStr
, nMaxCount
);
578 BOOL
GetDlgItemText(int nID
, BSTR
& bstrText
) const
580 ATLASSERT(::IsWindow(m_hWnd
));
581 return FALSE
;//FIXME stub
584 DWORD
GetExStyle() const
586 ATLASSERT(::IsWindow(m_hWnd
));
587 return ::GetWindowLong(m_hWnd
, GWL_EXSTYLE
);
590 HFONT
GetFont() const
592 ATLASSERT(::IsWindow(m_hWnd
));
593 return (HFONT
)::SendMessage(m_hWnd
, WM_GETFONT
, 0, 0);
596 DWORD
GetHotKey() const
598 ATLASSERT(::IsWindow(m_hWnd
));
599 return (DWORD
)::SendMessage(m_hWnd
, WM_GETHOTKEY
, 0, 0);
602 HICON
GetIcon(BOOL bBigIcon
= TRUE
) const
604 ATLASSERT(::IsWindow(m_hWnd
));
605 return (HICON
)::SendMessage(m_hWnd
, WM_GETICON
, (WPARAM
)bBigIcon
, 0);
608 HWND
GetLastActivePopup() const
610 ATLASSERT(::IsWindow(m_hWnd
));
611 return ::GetLastActivePopup(m_hWnd
);
614 HMENU
GetMenu() const
616 ATLASSERT(::IsWindow(m_hWnd
));
617 return ::GetMenu(m_hWnd
);
620 HWND
GetNextDlgGroupItem(HWND hWndCtl
, BOOL bPrevious
= FALSE
) const
622 ATLASSERT(::IsWindow(m_hWnd
));
623 return ::GetNextDlgGroupItem(m_hWnd
, hWndCtl
, bPrevious
);
626 HWND
GetNextDlgTabItem(HWND hWndCtl
, BOOL bPrevious
= FALSE
) const
628 ATLASSERT(::IsWindow(m_hWnd
));
629 return ::GetNextDlgTabItem(m_hWnd
, hWndCtl
, bPrevious
);
632 CWindow
GetParent() const
634 ATLASSERT(::IsWindow(m_hWnd
));
635 return CWindow(::GetParent(m_hWnd
));
638 BOOL
GetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
)
640 ATLASSERT(::IsWindow(m_hWnd
));
641 return ::GetScrollInfo(m_hWnd
, nBar
, lpScrollInfo
);
644 BOOL
GetScrollPos(int nBar
)
646 ATLASSERT(::IsWindow(m_hWnd
));
647 return ::GetScrollPos(m_hWnd
, nBar
);
650 BOOL
GetScrollRange(int nBar
, LPINT lpMinPos
, LPINT lpMaxPos
) const
652 ATLASSERT(::IsWindow(m_hWnd
));
653 return ::GetScrollRange(m_hWnd
, nBar
, lpMinPos
, lpMaxPos
);
656 DWORD
GetStyle() const
658 ATLASSERT(::IsWindow(m_hWnd
));
659 return ::GetWindowLong(m_hWnd
, GWL_STYLE
);
662 HMENU
GetSystemMenu(BOOL bRevert
)
664 ATLASSERT(::IsWindow(m_hWnd
));
665 return ::GetSystemMenu(m_hWnd
, bRevert
);
668 HWND
GetTopLevelParent() const
670 ATLASSERT(::IsWindow(m_hWnd
));
671 return NULL
;//FIXME stub
674 HWND
GetTopLevelWindow() const
676 ATLASSERT(::IsWindow(m_hWnd
));
677 return NULL
;//FIXME stub
680 HWND
GetTopWindow() const
682 ATLASSERT(::IsWindow(m_hWnd
));
683 return ::GetTopWindow(m_hWnd
);
686 BOOL
GetUpdateRect(LPRECT lpRect
, BOOL bErase
= FALSE
)
688 ATLASSERT(::IsWindow(m_hWnd
));
689 return ::GetUpdateRect(m_hWnd
, lpRect
, bErase
);
692 int GetUpdateRgn(HRGN hRgn
, BOOL bErase
= FALSE
)
694 ATLASSERT(::IsWindow(m_hWnd
));
695 return :: GetUpdateRgn(m_hWnd
, hRgn
, bErase
);
698 HWND
GetWindow(UINT nCmd
) const
700 ATLASSERT(::IsWindow(m_hWnd
));
701 return ::GetWindow(m_hWnd
, nCmd
);
704 DWORD
GetWindowContextHelpId() const
706 ATLASSERT(::IsWindow(m_hWnd
));
707 return ::GetWindowContextHelpId(m_hWnd
);
712 ATLASSERT(::IsWindow(m_hWnd
));
713 return ::GetWindowDC(m_hWnd
);
716 LONG
GetWindowLong(int nIndex
) const
718 ATLASSERT(::IsWindow(m_hWnd
));
719 return ::GetWindowLong(m_hWnd
, nIndex
);
722 LONG_PTR
GetWindowLongPtr(int nIndex
) const
724 ATLASSERT(::IsWindow(m_hWnd
));
725 return ::GetWindowLongPtr(m_hWnd
, nIndex
);
728 BOOL
GetWindowPlacement(WINDOWPLACEMENT
* lpwndpl
) const
730 ATLASSERT(::IsWindow(m_hWnd
));
731 return ::GetWindowPlacement(m_hWnd
, lpwndpl
);
734 DWORD
GetWindowProcessID()
736 ATLASSERT(::IsWindow(m_hWnd
));
738 ::GetWindowThreadProcessId(m_hWnd
, &processID
);
742 BOOL
GetWindowRect(LPRECT lpRect
) const
744 ATLASSERT(::IsWindow(m_hWnd
));
745 return ::GetWindowRect(m_hWnd
, lpRect
);
748 int GetWindowRgn(HRGN hRgn
)
750 ATLASSERT(::IsWindow(m_hWnd
));
751 return ::GetWindowRgn(m_hWnd
, hRgn
);
754 int GetWindowText(LPTSTR lpszStringBuf
, int nMaxCount
) const
756 ATLASSERT(::IsWindow(m_hWnd
));
757 return ::GetWindowText(m_hWnd
, lpszStringBuf
, nMaxCount
);
760 BOOL
GetWindowText(BSTR
& bstrText
)
762 ATLASSERT(::IsWindow(m_hWnd
));
763 int length
= ::GetWindowTextLength(m_hWnd
);
764 if (!SysReAllocStringLen(&bstrText
, NULL
, length
))
766 ::GetWindowText(m_hWnd
, (LPTSTR
)&bstrText
[2], length
);
770 int GetWindowTextLength() const
772 ATLASSERT(::IsWindow(m_hWnd
));
773 return ::GetWindowTextLength(m_hWnd
);
776 DWORD
GetWindowThreadID()
778 ATLASSERT(::IsWindow(m_hWnd
));
779 return ::GetWindowThreadProcessId(m_hWnd
, NULL
);
782 WORD
GetWindowWord(int nIndex
) const
784 ATLASSERT(::IsWindow(m_hWnd
));
785 return (WORD
)::GetWindowLong(m_hWnd
, nIndex
);
788 void GotoDlgCtrl(HWND hWndCtrl
) const
790 ATLASSERT(::IsWindow(m_hWnd
));
791 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 0, 0);
796 ATLASSERT(::IsWindow(m_hWnd
));
797 return ::HideCaret(m_hWnd
);
800 BOOL
HiliteMenuItem(HMENU hMenu
, UINT uHiliteItem
, UINT uHilite
)
802 ATLASSERT(::IsWindow(m_hWnd
));
803 return ::HiliteMenuItem(m_hWnd
, hMenu
, uHiliteItem
, uHilite
);
806 BOOL
Invalidate(BOOL bErase
= TRUE
)
808 ATLASSERT(::IsWindow(m_hWnd
));
809 return ::InvalidateRect(m_hWnd
, NULL
, bErase
);
812 BOOL
InvalidateRect(LPCRECT lpRect
, BOOL bErase
= TRUE
)
814 ATLASSERT(::IsWindow(m_hWnd
));
815 return ::InvalidateRect(m_hWnd
, lpRect
, bErase
);
818 void InvalidateRgn(HRGN hRgn
, BOOL bErase
= TRUE
)
820 ATLASSERT(::IsWindow(m_hWnd
));
821 ::InvalidateRgn(m_hWnd
, hRgn
, bErase
);
824 BOOL
IsChild(const HWND hWnd
) const
826 ATLASSERT(::IsWindow(m_hWnd
));
827 return ::IsChild(m_hWnd
, hWnd
);
830 BOOL
IsDialogMessage(LPMSG lpMsg
)
832 ATLASSERT(::IsWindow(m_hWnd
));
833 return ::IsDialogMessage(m_hWnd
, lpMsg
);
836 UINT
IsDlgButtonChecked(int nIDButton
) const
838 ATLASSERT(::IsWindow(m_hWnd
));
839 return ::IsDlgButtonChecked(m_hWnd
, nIDButton
);
842 BOOL
IsIconic() const
844 ATLASSERT(::IsWindow(m_hWnd
));
845 return ::IsIconic(m_hWnd
);
848 BOOL
IsParentDialog()
850 ATLASSERT(::IsWindow(m_hWnd
));
852 if (!RealGetWindowClass(::GetParent(m_hWnd
), pszType
, sizeof(pszType
) / sizeof(pszType
[0])))
854 return !_tcscmp(pszType
, _T("#32770"));
857 BOOL
IsWindow() const
859 return ::IsWindow(m_hWnd
);
862 BOOL
IsWindowEnabled() const
864 ATLASSERT(::IsWindow(m_hWnd
));
865 return ::IsWindowEnabled(m_hWnd
);
868 BOOL
IsWindowVisible() const
870 ATLASSERT(::IsWindow(m_hWnd
));
871 return ::IsWindowVisible(m_hWnd
);
874 BOOL
IsWindowUnicode()
876 ATLASSERT(::IsWindow(m_hWnd
));
877 return ::IsWindowUnicode(m_hWnd
);
880 BOOL
IsZoomed() const
882 ATLASSERT(::IsWindow(m_hWnd
));
883 return ::IsZoomed(m_hWnd
);
886 BOOL
KillTimer(UINT_PTR nIDEvent
)
888 ATLASSERT(::IsWindow(m_hWnd
));
889 return ::KillTimer(m_hWnd
, nIDEvent
);
892 BOOL
LockWindowUpdate(BOOL bLock
= TRUE
)
894 ATLASSERT(::IsWindow(m_hWnd
));
896 return ::LockWindowUpdate(m_hWnd
);
897 return ::LockWindowUpdate(NULL
);
900 int MapWindowPoints(HWND hWndTo
, LPPOINT lpPoint
, UINT nCount
) const
902 ATLASSERT(::IsWindow(m_hWnd
));
903 return ::MapWindowPoints(m_hWnd
, hWndTo
, lpPoint
, nCount
);
906 int MapWindowPoints(HWND hWndTo
, LPRECT lpRect
) const
908 ATLASSERT(::IsWindow(m_hWnd
));
909 return ::MapWindowPoints(m_hWnd
, hWndTo
, (LPPOINT
)lpRect
, sizeof(RECT
) / sizeof(POINT
));
912 int MessageBox(LPCTSTR lpszText
, LPCTSTR lpszCaption
= NULL
, UINT nType
= MB_OK
)
914 ATLASSERT(::IsWindow(m_hWnd
));
915 return ::MessageBox(m_hWnd
, lpszText
, lpszCaption
, nType
);
918 BOOL
ModifyStyle(DWORD dwRemove
, DWORD dwAdd
, UINT nFlags
= 0)
920 ATLASSERT(::IsWindow(m_hWnd
));
921 ::SetWindowLong(m_hWnd
, GWL_STYLE
, (::GetWindowLong(m_hWnd
, GWL_STYLE
) & ~dwRemove
) | dwAdd
);
923 return ::SetWindowPos(m_hWnd
, NULL
, 0, 0, 0, 0, nFlags
| SWP_NOSIZE
| SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
927 BOOL
ModifyStyleEx(DWORD dwRemove
, DWORD dwAdd
, UINT nFlags
= 0)
929 ATLASSERT(::IsWindow(m_hWnd
));
930 ::SetWindowLong(m_hWnd
, GWL_EXSTYLE
, (::GetWindowLong(m_hWnd
, GWL_EXSTYLE
) & ~dwRemove
) | dwAdd
);
932 return ::SetWindowPos(m_hWnd
, NULL
, 0, 0, 0, 0, nFlags
| SWP_NOSIZE
| SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
936 BOOL
MoveWindow(int x
, int y
, int nWidth
, int nHeight
, BOOL bRepaint
= TRUE
)
938 ATLASSERT(::IsWindow(m_hWnd
));
939 return ::MoveWindow(m_hWnd
, x
, y
, nWidth
, nHeight
, bRepaint
);
942 void NextDlgCtrl() const
944 ATLASSERT(::IsWindow(m_hWnd
));
945 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 0, 0);
950 ATLASSERT(::IsWindow(m_hWnd
));
951 return ::OpenClipboard(m_hWnd
);
954 BOOL
PostMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
956 ATLASSERT(::IsWindow(m_hWnd
));
957 return ::PostMessage(m_hWnd
, message
, wParam
, lParam
);
960 void PrevDlgCtrl() const
962 ATLASSERT(::IsWindow(m_hWnd
));
963 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 1, 0);
966 void Print(HDC hDC
, DWORD dwFlags
) const
968 ATLASSERT(::IsWindow(m_hWnd
));
969 ::SendMessage(m_hWnd
, WM_PRINT
, (WPARAM
)hDC
, (LPARAM
)dwFlags
);
972 void PrintClient(HDC hDC
, DWORD dwFlags
) const
974 ATLASSERT(::IsWindow(m_hWnd
));
975 ::SendMessage(m_hWnd
, WM_PRINTCLIENT
, (WPARAM
)hDC
, (LPARAM
)dwFlags
);
978 BOOL
RedrawWindow(LPCRECT lpRectUpdate
= NULL
, HRGN hRgnUpdate
= NULL
, UINT flags
= RDW_INVALIDATE
| RDW_UPDATENOW
| RDW_ERASE
)
980 ATLASSERT(::IsWindow(m_hWnd
));
981 return ::RedrawWindow(m_hWnd
, lpRectUpdate
, hRgnUpdate
, flags
);
984 int ReleaseDC(HDC hDC
)
986 ATLASSERT(::IsWindow(m_hWnd
));
987 return ::ReleaseDC(m_hWnd
, hDC
);
990 BOOL
ResizeClient(int nWidth
, int nHeight
, BOOL bRedraw
= FALSE
)
992 ATLASSERT(::IsWindow(m_hWnd
));
993 RECT clientRect
, wndRect
;
994 ::GetClientRect(m_hWnd
, &clientRect
);
995 ::GetWindowRect(m_hWnd
, &wndRect
);
996 return ::MoveWindow(m_hWnd
, wndRect
.left
, wndRect
.top
,
997 nWidth
+ (wndRect
.right
- wndRect
.left
) - (clientRect
.right
- clientRect
.left
),
998 nHeight
+ (wndRect
.bottom
- wndRect
.top
) - (clientRect
.bottom
- clientRect
.top
),
1002 BOOL
ScreenToClient(LPPOINT lpPoint
) const
1004 ATLASSERT(::IsWindow(m_hWnd
));
1005 return ::ScreenToClient(m_hWnd
, lpPoint
);
1008 BOOL
ScrollWindow(int xAmount
, int yAmount
, LPCRECT lpRect
= NULL
, LPCRECT lpClipRect
= NULL
)
1010 ATLASSERT(::IsWindow(m_hWnd
));
1011 return ::ScrollWindow(m_hWnd
, xAmount
, yAmount
, lpRect
, lpClipRect
);
1014 int ScrollWindowEx(int dx
, int dy
, LPCRECT lpRectScroll
, LPCRECT lpRectClip
, HRGN hRgnUpdate
, LPRECT lpRectUpdate
, UINT flags
)
1016 ATLASSERT(::IsWindow(m_hWnd
));
1017 return ::ScrollWindowEx(m_hWnd
, dx
, dy
, lpRectScroll
, lpRectClip
, hRgnUpdate
, lpRectUpdate
, flags
);
1020 LRESULT
SendDlgItemMessage(int nID
, UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1022 ATLASSERT(::IsWindow(m_hWnd
));
1023 return ::SendDlgItemMessage(m_hWnd
, nID
, message
, wParam
, lParam
);
1026 LRESULT
SendMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1028 ATLASSERT(::IsWindow(m_hWnd
));
1029 return ::SendMessage(m_hWnd
, message
, wParam
, lParam
);
1032 static LRESULT
SendMessage(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1034 ATLASSERT(::IsWindow(hWnd
));
1035 return ::SendMessage(hWnd
, message
, wParam
, lParam
);
1039 static BOOL CALLBACK
SendMessageToDescendantsCallback(HWND hWnd
, LPARAM lParam
)
1041 ::SendMessage(hWnd
, ((LPMSG
)lParam
)->message
, ((LPMSG
)lParam
)->wParam
, ((LPMSG
)lParam
)->lParam
);
1045 static BOOL CALLBACK
SendMessageToDescendantsCallbackDeep(HWND hWnd
, LPARAM lParam
)
1047 ::SendMessage(hWnd
, ((LPMSG
)lParam
)->message
, ((LPMSG
)lParam
)->wParam
, ((LPMSG
)lParam
)->lParam
);
1048 ::EnumChildWindows(hWnd
, &SendMessageToDescendantsCallbackDeep
, lParam
);
1053 void SendMessageToDescendants(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0, BOOL bDeep
= TRUE
)
1055 ATLASSERT(::IsWindow(m_hWnd
));
1057 msg
.message
= message
;
1058 msg
.wParam
= wParam
;
1059 msg
.lParam
= lParam
;
1061 ::EnumChildWindows(m_hWnd
, &SendMessageToDescendantsCallback
, (LPARAM
)&msg
);
1063 ::EnumChildWindows(m_hWnd
, &SendMessageToDescendantsCallbackDeep
, (LPARAM
)&msg
);
1066 BOOL
SendNotifyMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1068 ATLASSERT(::IsWindow(m_hWnd
));
1069 return ::SendNotifyMessage(m_hWnd
, message
, wParam
, lParam
);
1072 HWND
SetActiveWindow()
1074 ATLASSERT(::IsWindow(m_hWnd
));
1075 return ::SetActiveWindow(m_hWnd
);
1080 ATLASSERT(::IsWindow(m_hWnd
));
1081 return ::SetCapture(m_hWnd
);
1084 HWND
SetClipboardViewer()
1086 ATLASSERT(::IsWindow(m_hWnd
));
1087 return ::SetClipboardViewer(m_hWnd
);
1090 int SetDlgCtrlID(int nID
)
1092 ATLASSERT(::IsWindow(m_hWnd
));
1093 return ::SetWindowLong(m_hWnd
, GWL_ID
, nID
);
1096 BOOL
SetDlgItemInt(int nID
, UINT nValue
, BOOL bSigned
= TRUE
)
1098 ATLASSERT(::IsWindow(m_hWnd
));
1099 return ::SetDlgItemInt(m_hWnd
, nID
, nValue
, bSigned
);
1102 BOOL
SetDlgItemText(int nID
, LPCTSTR lpszString
)
1104 ATLASSERT(::IsWindow(m_hWnd
));
1105 return ::SetDlgItemText(m_hWnd
, nID
, lpszString
);
1110 ATLASSERT(::IsWindow(m_hWnd
));
1111 return ::SetFocus(m_hWnd
);
1114 void SetFont(HFONT hFont
, BOOL bRedraw
= TRUE
)
1116 ATLASSERT(::IsWindow(m_hWnd
));
1117 ::SendMessage(m_hWnd
, WM_SETFONT
, (WPARAM
)hFont
, (LPARAM
)bRedraw
);
1120 int SetHotKey(WORD wVirtualKeyCode
, WORD wModifiers
)
1122 ATLASSERT(::IsWindow(m_hWnd
));
1123 return ::SendMessage(m_hWnd
, WM_SETHOTKEY
, MAKEWPARAM(wVirtualKeyCode
, wModifiers
), 0);
1126 HICON
SetIcon(HICON hIcon
, BOOL bBigIcon
= TRUE
)
1128 ATLASSERT(::IsWindow(m_hWnd
));
1129 return (HICON
)::SendMessage(m_hWnd
, WM_SETICON
, (WPARAM
)bBigIcon
, (LPARAM
)hIcon
);
1132 BOOL
SetMenu(HMENU hMenu
)
1134 ATLASSERT(::IsWindow(m_hWnd
));
1135 return ::SetMenu(m_hWnd
, hMenu
);
1138 HWND
SetParent(HWND hWndNewParent
)
1140 ATLASSERT(::IsWindow(m_hWnd
));
1141 return ::SetParent(m_hWnd
, hWndNewParent
);
1144 void SetRedraw(BOOL bRedraw
= TRUE
)
1146 ATLASSERT(::IsWindow(m_hWnd
));
1147 ::SendMessage(m_hWnd
, WM_SETREDRAW
, (WPARAM
)bRedraw
, 0);
1150 int SetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
, BOOL bRedraw
= TRUE
)
1152 ATLASSERT(::IsWindow(m_hWnd
));
1153 return ::SetScrollInfo(m_hWnd
, nBar
, lpScrollInfo
, bRedraw
);
1156 int SetScrollPos(int nBar
, int nPos
, BOOL bRedraw
= TRUE
)
1158 ATLASSERT(::IsWindow(m_hWnd
));
1159 return ::SetScrollPos(m_hWnd
, nBar
, nPos
, bRedraw
);
1162 BOOL
SetScrollRange(int nBar
, int nMinPos
, int nMaxPos
, BOOL bRedraw
= TRUE
)
1164 ATLASSERT(::IsWindow(m_hWnd
));
1165 return ::SetScrollRange(m_hWnd
, nBar
, nMinPos
, nMaxPos
, bRedraw
);
1168 UINT_PTR
SetTimer(UINT_PTR nIDEvent
, UINT nElapse
, void (CALLBACK
*lpfnTimer
)(HWND
, UINT
, UINT_PTR
, DWORD
) = NULL
)
1170 ATLASSERT(::IsWindow(m_hWnd
));
1171 return ::SetTimer(m_hWnd
, nIDEvent
, nElapse
, reinterpret_cast<TIMERPROC
>(lpfnTimer
));
1174 BOOL
SetWindowContextHelpId(DWORD dwContextHelpId
)
1176 ATLASSERT(::IsWindow(m_hWnd
));
1177 return ::SetWindowContextHelpId(m_hWnd
, dwContextHelpId
);
1180 LONG
SetWindowLong(int nIndex
, LONG dwNewLong
)
1182 ATLASSERT(::IsWindow(m_hWnd
));
1183 return ::SetWindowLong(m_hWnd
, nIndex
, dwNewLong
);
1186 LONG_PTR
SetWindowLongPtr(int nIndex
, LONG_PTR dwNewLong
)
1188 ATLASSERT(::IsWindow(m_hWnd
));
1189 return ::SetWindowLongPtr(m_hWnd
, nIndex
, dwNewLong
);
1192 BOOL
SetWindowPlacement(const WINDOWPLACEMENT
* lpwndpl
)
1194 ATLASSERT(::IsWindow(m_hWnd
));
1195 return ::SetWindowPlacement(m_hWnd
, lpwndpl
);
1198 BOOL
SetWindowPos(HWND hWndInsertAfter
, int x
, int y
, int cx
, int cy
, UINT nFlags
)
1200 ATLASSERT(::IsWindow(m_hWnd
));
1201 return ::SetWindowPos(m_hWnd
, hWndInsertAfter
, x
, y
, cx
, cy
, nFlags
);
1204 int SetWindowRgn(HRGN hRgn
, BOOL bRedraw
= FALSE
)
1206 ATLASSERT(::IsWindow(m_hWnd
));
1207 return ::SetWindowRgn(m_hWnd
, hRgn
, bRedraw
);
1210 BOOL
SetWindowText(LPCTSTR lpszString
)
1212 ATLASSERT(::IsWindow(m_hWnd
));
1213 return ::SetWindowText(m_hWnd
, lpszString
);
1216 WORD
SetWindowWord(int nIndex
, WORD wNewWord
)
1218 ATLASSERT(::IsWindow(m_hWnd
));
1220 return ::SetWindowLong(m_hWnd
, nIndex
- 2, MAKELONG(LOWORD(::GetWindowLong(m_hWnd
, nIndex
- 2)), wNewWord
));
1222 return ::SetWindowLong(m_hWnd
, nIndex
, MAKELONG(wNewWord
, HIWORD(::GetWindowLong(m_hWnd
, nIndex
))));
1227 ATLASSERT(::IsWindow(m_hWnd
));
1228 return ::ShowCaret(m_hWnd
);
1231 BOOL
ShowOwnedPopups(BOOL bShow
= TRUE
)
1233 ATLASSERT(::IsWindow(m_hWnd
));
1234 return ::ShowOwnedPopups(m_hWnd
, bShow
);
1237 BOOL
ShowScrollBar(UINT nBar
, BOOL bShow
= TRUE
)
1239 ATLASSERT(::IsWindow(m_hWnd
));
1240 return ::ShowScrollBar(m_hWnd
, nBar
, bShow
);
1243 BOOL
ShowWindow(int nCmdShow
)
1245 ATLASSERT(::IsWindow(m_hWnd
));
1246 return ::ShowWindow(m_hWnd
, nCmdShow
);
1249 BOOL
ShowWindowAsync(int nCmdShow
)
1251 ATLASSERT(::IsWindow(m_hWnd
));
1252 return ::ShowWindowAsync(m_hWnd
, nCmdShow
);
1257 ATLASSERT(::IsWindow(m_hWnd
));
1258 return ::UpdateWindow(m_hWnd
);
1261 BOOL
ValidateRect(LPCRECT lpRect
)
1263 ATLASSERT(::IsWindow(m_hWnd
));
1264 return ::ValidateRect(m_hWnd
, lpRect
);
1267 BOOL
ValidateRgn(HRGN hRgn
)
1269 ATLASSERT(::IsWindow(m_hWnd
));
1270 return ::ValidateRgn(m_hWnd
, hRgn
);
1273 BOOL
WinHelp(LPCTSTR lpszHelp
, UINT nCmd
= HELP_CONTEXT
, DWORD dwData
= 0)
1275 ATLASSERT(::IsWindow(m_hWnd
));
1276 return ::WinHelp(m_hWnd
, lpszHelp
, nCmd
, dwData
);
1280 __declspec(selectany
) RECT
CWindow::rcDefault
= { CW_USEDEFAULT
, CW_USEDEFAULT
, 0, 0 };
1282 template <class TBase
= CWindow
>
1283 class CWindowImplRoot
: public TBase
, public CMessageMap
1286 enum { WINSTATE_DESTROYED
= 0x00000001 };
1289 CWndProcThunk m_thunk
;
1290 const _ATL_MSG
*m_pCurrentMsg
;
1294 : m_pCurrentMsg(NULL
)
1299 virtual ~CWindowImplRoot()
1305 template <class TBase
= CWindow
>
1306 class CDialogImplBaseT
: public CWindowImplRoot
<TBase
>
1310 using CWindowImplRoot
<TBase
>::WINSTATE_DESTROYED
;
1313 virtual ~CDialogImplBaseT()
1316 virtual DLGPROC
GetDialogProc()
1321 static INT_PTR CALLBACK
StartDialogProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1323 CDialogImplBaseT
<TBase
> *pThis
;
1325 DLGPROC
GCCU(pOldProc
);
1327 pThis
= reinterpret_cast<CDialogImplBaseT
<TBase
>*>(_AtlWinModule
.ExtractCreateWndData());
1328 ATLASSERT(pThis
!= NULL
);
1331 pThis
->m_thunk
.Init((WNDPROC
)pThis
->GetDialogProc(), pThis
);
1332 newDlgProc
= reinterpret_cast<DLGPROC
>(pThis
->m_thunk
.GetWNDPROC());
1333 pOldProc
= reinterpret_cast<DLGPROC
>(::SetWindowLongPtr(hWnd
, DWLP_DLGPROC
, reinterpret_cast<LONG_PTR
>(newDlgProc
)));
1334 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1335 pThis
->m_hWnd
= hWnd
;
1336 return newDlgProc(hWnd
, uMsg
, wParam
, lParam
);
1339 static INT_PTR CALLBACK
DialogProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1341 CDialogImplBaseT
<TBase
> *pThis
= reinterpret_cast<CDialogImplBaseT
<TBase
>*>(hWnd
);
1342 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1343 LRESULT lResult
= 0;
1344 const _ATL_MSG
*previousMessage
;
1347 hWnd
= pThis
->m_hWnd
;
1348 previousMessage
= pThis
->m_pCurrentMsg
;
1349 pThis
->m_pCurrentMsg
= &msg
;
1351 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1352 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1356 if ((pThis
->m_dwState
& WINSTATE_DESTROYED
) == 0)
1358 ::SetWindowLongPtr(pThis
->m_hWnd
, DWLP_MSGRESULT
, lResult
);
1363 if (uMsg
== WM_NCDESTROY
)
1365 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1369 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1370 pThis
->m_pCurrentMsg
= previousMessage
;
1372 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1374 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1375 pThis
->m_hWnd
= NULL
;
1376 pThis
->OnFinalMessage(hWnd
);
1381 virtual void OnFinalMessage(HWND
)
1387 template <class T
, class TBase
= CWindow
>
1388 class CDialogImpl
: public CDialogImplBaseT
< TBase
>
1392 using CWindowImplRoot
<TBase
>::m_thunk
;
1393 using CWindowImplRoot
<TBase
>::m_hWnd
;
1396 HWND
Create(HWND hWndParent
, LPARAM dwInitParam
= NULL
)
1402 result
= m_thunk
.Init(NULL
, NULL
);
1403 if (result
== FALSE
)
1406 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1408 pImpl
= static_cast<T
*>(this);
1409 hWnd
= ::CreateDialogParam(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(pImpl
->IDD
), hWndParent
, T::StartDialogProc
, dwInitParam
);
1413 INT_PTR
DoModal(HWND hWndParent
= ::GetActiveWindow(), LPARAM dwInitParam
= NULL
)
1418 result
= m_thunk
.Init(NULL
, NULL
);
1419 if (result
== FALSE
)
1422 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1424 pImpl
= static_cast<T
*>(this);
1425 return ::DialogBoxParam(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(pImpl
->IDD
), hWndParent
, T::StartDialogProc
, dwInitParam
);
1428 BOOL
EndDialog(_In_
int nRetCode
)
1430 return ::EndDialog(m_hWnd
, nRetCode
);
1433 BOOL
DestroyWindow()
1435 return ::DestroyWindow(m_hWnd
);
1439 template <class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1440 class CWindowImplBaseT
: public CWindowImplRoot
<TBase
>
1444 using CWindowImplRoot
<TBase
>::WINSTATE_DESTROYED
;
1445 using CWindowImplRoot
<TBase
>::m_thunk
;
1448 WNDPROC m_pfnSuperWindowProc
;
1453 m_pfnSuperWindowProc
= ::DefWindowProc
;
1456 virtual void OnFinalMessage(HWND
/* hWnd */)
1460 BOOL
SubclassWindow(HWND hWnd
)
1462 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1463 WNDPROC newWindowProc
;
1464 WNDPROC oldWindowProc
;
1467 ATLASSERT(m_hWnd
== NULL
);
1468 ATLASSERT(::IsWindow(hWnd
));
1470 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
>*>(this);
1472 result
= m_thunk
.Init(GetWindowProc(), this);
1473 if (result
== FALSE
)
1475 newWindowProc
= m_thunk
.GetWNDPROC();
1476 oldWindowProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1477 if (oldWindowProc
== NULL
)
1479 m_pfnSuperWindowProc
= oldWindowProc
;
1480 pThis
->m_hWnd
= hWnd
;
1484 virtual WNDPROC
GetWindowProc()
1489 static DWORD
GetWndStyle(DWORD dwStyle
)
1491 return TWinTraits::GetWndStyle(dwStyle
);
1494 static DWORD
GetWndExStyle(DWORD dwExStyle
)
1496 return TWinTraits::GetWndExStyle(dwExStyle
);
1499 LRESULT
DefWindowProc(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1501 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1503 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
> *>(this);
1504 return ::CallWindowProc(m_pfnSuperWindowProc
, pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1507 static LRESULT CALLBACK
StartWindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1509 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1510 WNDPROC newWindowProc
;
1511 WNDPROC
GCCU(pOldProc
);
1513 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
> *>(_AtlWinModule
.ExtractCreateWndData());
1514 ATLASSERT(pThis
!= NULL
);
1517 pThis
->m_thunk
.Init(pThis
->GetWindowProc(), pThis
);
1518 newWindowProc
= pThis
->m_thunk
.GetWNDPROC();
1519 pOldProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1520 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1521 pThis
->m_hWnd
= hWnd
;
1522 return newWindowProc(hWnd
, uMsg
, wParam
, lParam
);
1525 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1527 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
= reinterpret_cast<CWindowImplBaseT
< TBase
, TWinTraits
> *>(hWnd
);
1528 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1530 const _ATL_MSG
*previousMessage
;
1532 LONG_PTR saveWindowProc
;
1534 ATLASSERT(pThis
!= NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) == 0 && pThis
->m_hWnd
!= NULL
);
1535 if (pThis
== NULL
|| (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0 || pThis
->m_hWnd
== NULL
)
1538 hWnd
= pThis
->m_hWnd
;
1539 previousMessage
= pThis
->m_pCurrentMsg
;
1540 pThis
->m_pCurrentMsg
= &msg
;
1542 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1543 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1545 if (handled
== FALSE
)
1547 if (uMsg
== WM_NCDESTROY
)
1549 saveWindowProc
= ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
);
1550 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1551 if (pThis
->m_pfnSuperWindowProc
!= ::DefWindowProc
&& saveWindowProc
== ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
))
1552 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(pThis
->m_pfnSuperWindowProc
));
1553 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1556 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1558 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1559 pThis
->m_pCurrentMsg
= previousMessage
;
1560 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1562 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1563 pThis
->m_hWnd
= NULL
;
1564 pThis
->OnFinalMessage(hWnd
);
1569 HWND
Create(HWND hWndParent
, _U_RECT rect
, LPCTSTR szWindowName
, DWORD dwStyle
, DWORD dwExStyle
,
1570 _U_MENUorID MenuOrID
, ATOM atom
, LPVOID lpCreateParam
)
1574 ATLASSERT(m_hWnd
== NULL
);
1575 ATLASSERT(atom
!= 0);
1578 if (m_thunk
.Init(NULL
, NULL
) == FALSE
)
1580 SetLastError(ERROR_OUTOFMEMORY
);
1584 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1585 if (MenuOrID
.m_hMenu
== NULL
&& (dwStyle
& WS_CHILD
) != 0)
1586 MenuOrID
.m_hMenu
= (HMENU
)(UINT_PTR
)this;
1587 if (rect
.m_lpRect
== NULL
)
1588 rect
.m_lpRect
= &TBase::rcDefault
;
1589 hWnd
= ::CreateWindowEx(dwExStyle
, reinterpret_cast<LPCWSTR
>(MAKEINTATOM(atom
)), szWindowName
, dwStyle
, rect
.m_lpRect
->left
,
1590 rect
.m_lpRect
->top
, rect
.m_lpRect
->right
- rect
.m_lpRect
->left
, rect
.m_lpRect
->bottom
- rect
.m_lpRect
->top
,
1591 hWndParent
, MenuOrID
.m_hMenu
, _AtlBaseModule
.GetModuleInstance(), lpCreateParam
);
1593 ATLASSERT(m_hWnd
== hWnd
);
1600 template <class T
, class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1601 class CWindowImpl
: public CWindowImplBaseT
<TBase
, TWinTraits
>
1604 static LPCTSTR
GetWndCaption()
1609 HWND
Create(HWND hWndParent
, _U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
, DWORD dwStyle
= 0,
1610 DWORD dwExStyle
= 0, _U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
1612 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1615 ATLASSERT(m_hWnd
== NULL
);
1616 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
>*>(this);
1618 if (T::GetWndClassInfo().m_lpszOrigName
== NULL
)
1619 T::GetWndClassInfo().m_lpszOrigName
= pThis
->GetWndClassName();
1620 atom
= T::GetWndClassInfo().Register(&pThis
->m_pfnSuperWindowProc
);
1622 if (szWindowName
== NULL
)
1623 szWindowName
= T::GetWndCaption();
1624 dwStyle
= T::GetWndStyle(dwStyle
);
1625 dwExStyle
= T::GetWndExStyle(dwExStyle
);
1627 return CWindowImplBaseT
<TBase
, TWinTraits
>::Create(hWndParent
, rect
, szWindowName
, dwStyle
,
1628 dwExStyle
, MenuOrID
, atom
, lpCreateParam
);
1632 template <class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1633 class CContainedWindowT
: public TBase
1636 CWndProcThunk m_thunk
;
1637 LPCTSTR m_lpszClassName
;
1638 WNDPROC m_pfnSuperWindowProc
;
1639 CMessageMap
*m_pObject
;
1641 const _ATL_MSG
*m_pCurrentMsg
;
1643 CContainedWindowT(CMessageMap
*pObject
, DWORD dwMsgMapID
= 0)
1645 m_lpszClassName
= TBase::GetWndClassName();
1646 m_pfnSuperWindowProc
= ::DefWindowProc
;
1647 m_pObject
= pObject
;
1648 m_dwMsgMapID
= dwMsgMapID
;
1649 m_pCurrentMsg
= NULL
;
1652 CContainedWindowT(LPTSTR lpszClassName
, CMessageMap
*pObject
, DWORD dwMsgMapID
= 0)
1654 m_lpszClassName
= lpszClassName
;
1655 m_pfnSuperWindowProc
= ::DefWindowProc
;
1656 m_pObject
= pObject
;
1657 m_dwMsgMapID
= dwMsgMapID
;
1658 m_pCurrentMsg
= NULL
;
1661 LRESULT
DefWindowProc(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1663 return ::CallWindowProc(m_pfnSuperWindowProc
, this->m_hWnd
, uMsg
, wParam
, lParam
);
1666 BOOL
SubclassWindow(HWND hWnd
)
1668 CContainedWindowT
<TBase
> *pThis
;
1669 WNDPROC newWindowProc
;
1670 WNDPROC oldWindowProc
;
1673 ATLASSERT(m_hWnd
== NULL
);
1674 ATLASSERT(::IsWindow(hWnd
));
1676 pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(this);
1678 result
= m_thunk
.Init(WindowProc
, pThis
);
1679 if (result
== FALSE
)
1681 newWindowProc
= m_thunk
.GetWNDPROC();
1682 oldWindowProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1683 if (oldWindowProc
== NULL
)
1685 m_pfnSuperWindowProc
= oldWindowProc
;
1686 pThis
->m_hWnd
= hWnd
;
1690 static LRESULT CALLBACK
StartWindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1692 CContainedWindowT
<TBase
> *pThis
;
1693 WNDPROC newWindowProc
;
1694 WNDPROC
GCCU(pOldProc
);
1696 pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(_AtlWinModule
.ExtractCreateWndData());
1697 ATLASSERT(pThis
!= NULL
);
1700 pThis
->m_thunk
.Init(WindowProc
, pThis
);
1701 newWindowProc
= pThis
->m_thunk
.GetWNDPROC();
1702 pOldProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1703 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1704 pThis
->m_hWnd
= hWnd
;
1705 return newWindowProc(hWnd
, uMsg
, wParam
, lParam
);
1708 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1710 CContainedWindowT
<TBase
> *pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(hWnd
);
1711 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1713 const _ATL_MSG
*previousMessage
;
1715 LONG_PTR saveWindowProc
;
1717 ATLASSERT(pThis
!= NULL
&& pThis
->m_hWnd
!= NULL
&& pThis
->m_pObject
!= NULL
);
1718 if (pThis
== NULL
|| pThis
->m_hWnd
== NULL
|| pThis
->m_pObject
== NULL
)
1721 hWnd
= pThis
->m_hWnd
;
1722 previousMessage
= pThis
->m_pCurrentMsg
;
1723 pThis
->m_pCurrentMsg
= &msg
;
1725 handled
= pThis
->m_pObject
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, pThis
->m_dwMsgMapID
);
1726 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1728 pThis
->m_pCurrentMsg
= previousMessage
;
1729 if (handled
== FALSE
)
1731 if (uMsg
== WM_NCDESTROY
)
1733 saveWindowProc
= ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
);
1734 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1735 if (pThis
->m_pfnSuperWindowProc
!= ::DefWindowProc
&& saveWindowProc
== ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
))
1736 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(pThis
->m_pfnSuperWindowProc
));
1737 pThis
->m_hWnd
= NULL
;
1740 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1746 typedef CContainedWindowT
<CWindow
> CContainedWindow
;
1748 #define BEGIN_MSG_MAP(theClass) \
1750 BOOL ProcessWindowMessage(HWND GCCU(hWnd), UINT GCCU(uMsg), WPARAM GCCU(wParam), LPARAM GCCU(lParam), LRESULT &GCCU(lResult), DWORD dwMsgMapID = 0) \
1752 BOOL GCCU(bHandled) = TRUE; \
1759 switch(dwMsgMapID) \
1763 #define ALT_MSG_MAP(map) \
1767 #define END_MSG_MAP() \
1776 #define MESSAGE_HANDLER(msg, func) \
1780 lResult = func(uMsg, wParam, lParam, bHandled); \
1785 #define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func) \
1786 if (uMsg >= msgFirst && uMsg <= msgLast) \
1789 lResult = func(uMsg, wParam, lParam, bHandled); \
1794 #define COMMAND_ID_HANDLER(id, func) \
1795 if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \
1798 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1803 #define COMMAND_RANGE_HANDLER(idFirst, idLast, func) \
1804 if (uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
1807 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1812 #define NOTIFY_CODE_HANDLER(cd, func) \
1813 if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \
1816 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
1821 #define NOTIFY_HANDLER(id, cd, func) \
1822 if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \
1825 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
1830 #define CHAIN_MSG_MAP(theChainClass) \
1832 if (theChainClass::ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult)) \
1836 #define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \
1837 static ATL::CWndClassInfo& GetWndClassInfo() \
1839 static ATL::CWndClassInfo wc = \
1841 { sizeof(WNDCLASSEX), style, StartWindowProc, \
1842 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \
1843 NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \
1848 struct _ATL_WNDCLASSINFOW
1851 LPCWSTR m_lpszOrigName
;
1853 LPCWSTR m_lpszCursorID
;
1854 BOOL m_bSystemCursor
;
1856 WCHAR m_szAutoName
[5 + sizeof(void *)];
1858 ATOM
Register(WNDPROC
*p
)
1860 if (m_wc
.hInstance
== NULL
)
1861 m_wc
.hInstance
= _AtlBaseModule
.GetModuleInstance();
1864 if (m_bSystemCursor
)
1865 m_wc
.hCursor
= ::LoadCursor(NULL
, m_lpszCursorID
);
1867 m_wc
.hCursor
= ::LoadCursor(_AtlBaseModule
.GetResourceInstance(), m_lpszCursorID
);
1869 m_atom
= RegisterClassEx(&m_wc
);
1878 #pragma pop_macro("SubclassWindow")