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
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
);
50 struct _ATL_WNDCLASSINFOW
;
51 typedef _ATL_WNDCLASSINFOW CWndClassInfo
;
53 template <DWORD t_dwStyle
= 0, DWORD t_dwExStyle
= 0>
57 static DWORD
GetWndStyle(DWORD dwStyle
)
64 static DWORD
GetWndExStyle(DWORD dwExStyle
)
72 typedef CWinTraits
<WS_CHILD
| WS_VISIBLE
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, 0> CControlWinTraits
;
73 typedef CWinTraits
<WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_APPWINDOW
| WS_EX_WINDOWEDGE
> CFrameWinTraits
;
74 typedef CWinTraits
<WS_OVERLAPPEDWINDOW
| WS_CHILD
| WS_VISIBLE
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_MDICHILD
> CMDIChildWinTraits
;
76 template <DWORD t_dwStyle
= 0, DWORD t_dwExStyle
= 0, class TWinTraits
= CControlWinTraits
>
80 static DWORD
GetWndStyle(DWORD dwStyle
)
82 return dwStyle
| t_dwStyle
| TWinTraits::GetWndStyle(dwStyle
);
85 static DWORD
GetWndExStyle(DWORD dwExStyle
)
87 return dwExStyle
| t_dwExStyle
| TWinTraits::GetWndExStyle(dwExStyle
);
96 _U_MENUorID(HMENU hMenu
)
101 _U_MENUorID(UINT nID
)
103 m_hMenu
= (HMENU
)(UINT_PTR
)nID
;
112 _U_RECT(LPRECT lpRect
)
123 struct _ATL_MSG
: public MSG
128 _ATL_MSG(HWND hWnd
, UINT uMsg
, WPARAM wParamIn
, LPARAM lParamIn
, BOOL bHandledIn
= TRUE
)
137 bHandled
= bHandledIn
;
146 DWORD m_mov
; /* mov dword ptr [esp+4], m_this */
148 BYTE m_jmp
; /* jmp relproc */
152 Init(WNDPROC proc
, void *pThis
)
155 m_this
= PtrToUlong(pThis
);
157 m_relproc
= DWORD(reinterpret_cast<char *>(proc
) - (reinterpret_cast<char *>(this) + sizeof(thunkCode
)));
158 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
163 #elif defined(_AMD64_)
168 USHORT m_mov_rcx
; /* mov rcx, m_this */
170 USHORT m_mov_rax
; /* mov rax, m_proc */
172 USHORT m_jmp
; /* jmp rax */
175 Init(WNDPROC proc
, void *pThis
)
178 m_this
= (ULONG64
)pThis
;
180 m_proc
= (ULONG64
)proc
;
182 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
187 #elif defined(_M_ARM)
192 DWORD m_mov_r0
; /* mov r0, m_this */
193 DWORD m_mov_pc
; /* mov pc, m_proc */
198 Init(WNDPROC proc
, void *pThis
)
200 m_mov_r0
= 0xE59F0000;
201 m_mov_pc
= 0xE59FF000;
202 m_this
= (DWORD
)pThis
;
203 m_proc
= (DWORD
)proc
;
204 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
210 #error ARCH not supported
217 _AtlCreateWndData cd
;
222 m_pthunk
= (thunkCode
*)VirtualAlloc(NULL
, sizeof(thunkCode
), MEM_COMMIT
, PAGE_EXECUTE_READWRITE
);
227 if (m_pthunk
!= NULL
)
228 VirtualFree(m_pthunk
, 0, MEM_RELEASE
);
231 BOOL
Init(WNDPROC proc
, void *pThis
)
233 if (m_pthunk
== NULL
)
235 m_pthunk
->Init(proc
, pThis
);
241 return reinterpret_cast<WNDPROC
>(m_pthunk
);
248 virtual BOOL
ProcessWindowMessage(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
&lResult
, DWORD dwMsgMapID
) = 0;
255 static RECT rcDefault
;
257 CWindow(HWND hWnd
= NULL
)
262 operator HWND() const
267 static LPCTSTR
GetWndClassName()
272 UINT
ArrangeIconicWindows()
274 ATLASSERT(::IsWindow(m_hWnd
));
275 return ::ArrangeIconicWindows(m_hWnd
);
278 void Attach(HWND hWndNew
)
283 HDC
BeginPaint(LPPAINTSTRUCT lpPaint
)
285 ATLASSERT(::IsWindow(m_hWnd
));
286 return ::BeginPaint(m_hWnd
, lpPaint
);
289 BOOL
BringWindowToTop()
291 ATLASSERT(::IsWindow(m_hWnd
));
292 return ::BringWindowToTop(m_hWnd
);
295 BOOL
CenterWindow(HWND hWndCenter
= NULL
)
297 ATLASSERT(::IsWindow(m_hWnd
));
298 if (hWndCenter
== NULL
)
299 hWndCenter
= ::GetParent(m_hWnd
);
300 if (hWndCenter
== NULL
)
302 RECT wndCenterRect
, wndRect
;
303 if (!::GetWindowRect(hWndCenter
, &wndCenterRect
) || !::GetWindowRect(m_hWnd
, &wndRect
))
305 int wndCenterWidth
= wndCenterRect
.right
- wndCenterRect
.left
;
306 int wndCenterHeight
= wndCenterRect
.bottom
- wndCenterRect
.top
;
307 int wndWidth
= wndRect
.right
- wndRect
.left
;
308 int wndHeight
= wndRect
.bottom
- wndRect
.top
;
309 return ::MoveWindow(m_hWnd
,
310 wndCenterRect
.left
+ ((wndCenterWidth
- wndWidth
+ 1) >> 1),
311 wndCenterRect
.top
+ ((wndCenterHeight
- wndHeight
+ 1) >> 1),
312 wndWidth
, wndHeight
, TRUE
);
315 BOOL
ChangeClipboardChain(HWND hWndNewNext
)
317 ATLASSERT(::IsWindow(m_hWnd
));
318 return ::ChangeClipboardChain(m_hWnd
, hWndNewNext
);
321 BOOL
CheckDlgButton(int nIDButton
, UINT nCheck
)
323 ATLASSERT(::IsWindow(m_hWnd
));
324 return ::CheckDlgButton(m_hWnd
, nIDButton
, nCheck
);
327 BOOL
CheckRadioButton(int nIDFirstButton
, int nIDLastButton
, int nIDCheckButton
)
329 ATLASSERT(::IsWindow(m_hWnd
));
330 return ::CheckRadioButton(m_hWnd
, nIDFirstButton
, nIDLastButton
, nIDCheckButton
);
333 HWND
ChildWindowFromPoint(POINT point
) const
335 ATLASSERT(::IsWindow(m_hWnd
));
336 return ::ChildWindowFromPoint(m_hWnd
, point
);
339 HWND
ChildWindowFromPointEx(POINT point
, UINT uFlags
) const
341 ATLASSERT(::IsWindow(m_hWnd
));
342 return ::ChildWindowFromPointEx(m_hWnd
, point
, uFlags
);
345 BOOL
ClientToScreen(LPPOINT lpPoint
) const
347 ATLASSERT(::IsWindow(m_hWnd
));
348 return ::ClientToScreen(m_hWnd
, lpPoint
);
351 BOOL
ClientToScreen(LPRECT lpRect
) const
355 ATLASSERT(::IsWindow(m_hWnd
));
356 POINT leftTop
= {lpRect
->left
, lpRect
->top
};
357 POINT rightBottom
= {lpRect
->right
, lpRect
->bottom
};
358 BOOL success
= ::ClientToScreen(m_hWnd
, &leftTop
) && ::ClientToScreen(m_hWnd
, &rightBottom
);
361 lpRect
->left
= leftTop
.x
;
362 lpRect
->top
= leftTop
.y
;
363 lpRect
->right
= rightBottom
.x
;
364 lpRect
->bottom
= rightBottom
.y
;
369 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
)
372 ATLASSERT(m_hWnd
== NULL
);
373 hWnd
= ::CreateWindowEx(dwExStyle
,
379 rect
.m_lpRect
->right
- rect
.m_lpRect
->left
,
380 rect
.m_lpRect
->bottom
- rect
.m_lpRect
->top
,
383 _AtlBaseModule
.GetModuleInstance(),
390 BOOL
CreateCaret(HBITMAP pBitmap
)
392 ATLASSERT(::IsWindow(m_hWnd
));
393 return ::CreateCaret(m_hWnd
, pBitmap
, 0, 0);
396 BOOL
CreateGrayCaret(int nWidth
, int nHeight
)
398 ATLASSERT(::IsWindow(m_hWnd
));
399 return ::CreateCaret(m_hWnd
, (HBITMAP
)1, nWidth
, nHeight
);
402 BOOL
CreateSolidCaret(int nWidth
, int nHeight
)
404 ATLASSERT(::IsWindow(m_hWnd
));
405 return ::CreateCaret(m_hWnd
, (HBITMAP
)0, nWidth
, nHeight
);
408 HDWP
DeferWindowPos(HDWP hWinPosInfo
, HWND hWndInsertAfter
, int x
, int y
, int cx
, int cy
, UINT uFlags
)
410 ATLASSERT(::IsWindow(m_hWnd
));
411 return ::DeferWindowPos(hWinPosInfo
, m_hWnd
, hWndInsertAfter
, x
, y
, cx
, cy
, uFlags
);
416 ATLASSERT(::IsWindow(m_hWnd
));
418 if (!::DestroyWindow(m_hWnd
))
432 int DlgDirList(LPTSTR lpPathSpec
, int nIDListBox
, int nIDStaticPath
, UINT nFileType
)
434 ATLASSERT(::IsWindow(m_hWnd
));
435 return ::DlgDirList(m_hWnd
, lpPathSpec
, nIDListBox
, nIDStaticPath
, nFileType
);
438 int DlgDirListComboBox(LPTSTR lpPathSpec
, int nIDComboBox
, int nIDStaticPath
, UINT nFileType
)
440 ATLASSERT(::IsWindow(m_hWnd
));
441 return ::DlgDirListComboBox(m_hWnd
, lpPathSpec
, nIDComboBox
, nIDStaticPath
, nFileType
);
444 BOOL
DlgDirSelect(LPTSTR lpString
, int nCount
, int nIDListBox
)
446 ATLASSERT(::IsWindow(m_hWnd
));
447 return ::DlgDirSelectEx(m_hWnd
, lpString
, nCount
, nIDListBox
);
450 BOOL
DlgDirSelectComboBox(LPTSTR lpString
, int nCount
, int nIDComboBox
)
452 ATLASSERT(::IsWindow(m_hWnd
));
453 return ::DlgDirSelectComboBoxEx(m_hWnd
, lpString
, nCount
, nIDComboBox
);
456 void DragAcceptFiles(BOOL bAccept
= TRUE
)
458 ATLASSERT(::IsWindow(m_hWnd
));
459 // FIXME following line requires shellapi.h
460 // ::DragAcceptFiles(m_hWnd, bAccept);
465 ATLASSERT(::IsWindow(m_hWnd
));
466 return ::DrawMenuBar(m_hWnd
);
469 BOOL
EnableScrollBar(UINT uSBFlags
, UINT uArrowFlags
= ESB_ENABLE_BOTH
)
471 ATLASSERT(::IsWindow(m_hWnd
));
472 return ::EnableScrollBar(m_hWnd
, uSBFlags
, uArrowFlags
);
475 BOOL
EnableWindow(BOOL bEnable
= TRUE
)
477 ATLASSERT(::IsWindow(m_hWnd
));
478 return ::EnableWindow(m_hWnd
, bEnable
);
481 void EndPaint(LPPAINTSTRUCT lpPaint
)
483 ATLASSERT(::IsWindow(m_hWnd
));
484 ::EndPaint(m_hWnd
, lpPaint
);
487 BOOL
FlashWindow(BOOL bInvert
)
489 ATLASSERT(::IsWindow(m_hWnd
));
490 return ::FlashWindow(m_hWnd
, bInvert
);
493 BOOL
GetClientRect(LPRECT lpRect
) const
495 ATLASSERT(::IsWindow(m_hWnd
));
496 return ::GetClientRect(m_hWnd
, lpRect
);
501 ATLASSERT(::IsWindow(m_hWnd
));
502 return ::GetDC(m_hWnd
);
505 HDC
GetDCEx(HRGN hRgnClip
, DWORD flags
)
507 ATLASSERT(::IsWindow(m_hWnd
));
508 return ::GetDCEx(m_hWnd
, hRgnClip
, flags
);
512 typedef struct _IDHWNDPAIR
{
515 } IDHWNDPAIR
, *PIDHWNDPAIR
;
517 static BOOL CALLBACK
GetDescendantWindowCallback(HWND hWnd
, LPARAM lParam
)
519 if (::GetWindowLong(hWnd
, GWL_ID
) == ((PIDHWNDPAIR
)lParam
)->nID
)
521 ((PIDHWNDPAIR
)lParam
)->hWnd
= hWnd
;
524 ::EnumChildWindows(hWnd
, &GetDescendantWindowCallback
, lParam
);
525 return (((PIDHWNDPAIR
)lParam
)->hWnd
== NULL
);
529 HWND
GetDescendantWindow(int nID
) const
531 ATLASSERT(::IsWindow(m_hWnd
));
532 IDHWNDPAIR idHWndPair
;
533 idHWndPair
.nID
= nID
;
534 idHWndPair
.hWnd
= NULL
;
535 ::EnumChildWindows(m_hWnd
, &GetDescendantWindowCallback
, (LPARAM
)&idHWndPair
);
536 return idHWndPair
.hWnd
;
539 HRESULT
GetDlgControl(int nID
, REFIID iid
, void** ppCtrl
)
541 ATLASSERT(::IsWindow(m_hWnd
));
542 return E_FAIL
;//FIXME stub
545 int GetDlgCtrlID() const
547 ATLASSERT(::IsWindow(m_hWnd
));
548 return ::GetDlgCtrlID(m_hWnd
);
551 HRESULT
GetDlgHost(int nID
, REFIID iid
, void** ppHost
)
553 ATLASSERT(::IsWindow(m_hWnd
));
554 return E_FAIL
;//FIXME stub
557 HWND
GetDlgItem(int nID
)
559 ATLASSERT(::IsWindow(m_hWnd
));
560 return ::GetDlgItem(m_hWnd
, nID
);
563 UINT
GetDlgItemInt(int nID
, BOOL
* lpTrans
= NULL
, BOOL bSigned
= TRUE
) const
565 ATLASSERT(::IsWindow(m_hWnd
));
566 return ::GetDlgItemInt(m_hWnd
, nID
, lpTrans
, bSigned
);
569 UINT
GetDlgItemText(int nID
, LPTSTR lpStr
, int nMaxCount
) const
571 ATLASSERT(::IsWindow(m_hWnd
));
572 return ::GetDlgItemText(m_hWnd
, nID
, lpStr
, nMaxCount
);
575 BOOL
GetDlgItemText(int nID
, BSTR
& bstrText
) const
577 ATLASSERT(::IsWindow(m_hWnd
));
578 return FALSE
;//FIXME stub
581 DWORD
GetExStyle() const
583 ATLASSERT(::IsWindow(m_hWnd
));
584 return ::GetWindowLong(m_hWnd
, GWL_EXSTYLE
);
587 HFONT
GetFont() const
589 ATLASSERT(::IsWindow(m_hWnd
));
590 return (HFONT
)::SendMessage(m_hWnd
, WM_GETFONT
, 0, 0);
593 DWORD
GetHotKey() const
595 ATLASSERT(::IsWindow(m_hWnd
));
596 return (DWORD
)::SendMessage(m_hWnd
, WM_GETHOTKEY
, 0, 0);
599 HICON
GetIcon(BOOL bBigIcon
= TRUE
) const
601 ATLASSERT(::IsWindow(m_hWnd
));
602 return (HICON
)::SendMessage(m_hWnd
, WM_GETICON
, (WPARAM
)bBigIcon
, 0);
605 HWND
GetLastActivePopup() const
607 ATLASSERT(::IsWindow(m_hWnd
));
608 return ::GetLastActivePopup(m_hWnd
);
611 HMENU
GetMenu() const
613 ATLASSERT(::IsWindow(m_hWnd
));
614 return ::GetMenu(m_hWnd
);
617 HWND
GetNextDlgGroupItem(HWND hWndCtl
, BOOL bPrevious
= FALSE
) const
619 ATLASSERT(::IsWindow(m_hWnd
));
620 return ::GetNextDlgGroupItem(m_hWnd
, hWndCtl
, bPrevious
);
623 HWND
GetNextDlgTabItem(HWND hWndCtl
, BOOL bPrevious
= FALSE
) const
625 ATLASSERT(::IsWindow(m_hWnd
));
626 return ::GetNextDlgTabItem(m_hWnd
, hWndCtl
, bPrevious
);
629 CWindow
GetParent() const
631 ATLASSERT(::IsWindow(m_hWnd
));
632 return CWindow(::GetParent(m_hWnd
));
635 BOOL
GetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
)
637 ATLASSERT(::IsWindow(m_hWnd
));
638 return ::GetScrollInfo(m_hWnd
, nBar
, lpScrollInfo
);
641 BOOL
GetScrollPos(int nBar
)
643 ATLASSERT(::IsWindow(m_hWnd
));
644 return ::GetScrollPos(m_hWnd
, nBar
);
647 BOOL
GetScrollRange(int nBar
, LPINT lpMinPos
, LPINT lpMaxPos
) const
649 ATLASSERT(::IsWindow(m_hWnd
));
650 return ::GetScrollRange(m_hWnd
, nBar
, lpMinPos
, lpMaxPos
);
653 DWORD
GetStyle() const
655 ATLASSERT(::IsWindow(m_hWnd
));
656 return ::GetWindowLong(m_hWnd
, GWL_STYLE
);
659 HMENU
GetSystemMenu(BOOL bRevert
)
661 ATLASSERT(::IsWindow(m_hWnd
));
662 return ::GetSystemMenu(m_hWnd
, bRevert
);
665 HWND
GetTopLevelParent() const
667 ATLASSERT(::IsWindow(m_hWnd
));
668 return NULL
;//FIXME stub
671 HWND
GetTopLevelWindow() const
673 ATLASSERT(::IsWindow(m_hWnd
));
674 return NULL
;//FIXME stub
677 HWND
GetTopWindow() const
679 ATLASSERT(::IsWindow(m_hWnd
));
680 return ::GetTopWindow(m_hWnd
);
683 BOOL
GetUpdateRect(LPRECT lpRect
, BOOL bErase
= FALSE
)
685 ATLASSERT(::IsWindow(m_hWnd
));
686 return ::GetUpdateRect(m_hWnd
, lpRect
, bErase
);
689 int GetUpdateRgn(HRGN hRgn
, BOOL bErase
= FALSE
)
691 ATLASSERT(::IsWindow(m_hWnd
));
692 return :: GetUpdateRgn(m_hWnd
, hRgn
, bErase
);
695 HWND
GetWindow(UINT nCmd
) const
697 ATLASSERT(::IsWindow(m_hWnd
));
698 return ::GetWindow(m_hWnd
, nCmd
);
701 DWORD
GetWindowContextHelpId() const
703 ATLASSERT(::IsWindow(m_hWnd
));
704 return ::GetWindowContextHelpId(m_hWnd
);
709 ATLASSERT(::IsWindow(m_hWnd
));
710 return ::GetWindowDC(m_hWnd
);
713 LONG
GetWindowLong(int nIndex
) const
715 ATLASSERT(::IsWindow(m_hWnd
));
716 return ::GetWindowLong(m_hWnd
, nIndex
);
719 LONG_PTR
GetWindowLongPtr(int nIndex
) const
721 ATLASSERT(::IsWindow(m_hWnd
));
722 return ::GetWindowLongPtr(m_hWnd
, nIndex
);
725 BOOL
GetWindowPlacement(WINDOWPLACEMENT
* lpwndpl
) const
727 ATLASSERT(::IsWindow(m_hWnd
));
728 return ::GetWindowPlacement(m_hWnd
, lpwndpl
);
731 DWORD
GetWindowProcessID()
733 ATLASSERT(::IsWindow(m_hWnd
));
735 ::GetWindowThreadProcessId(m_hWnd
, &processID
);
739 BOOL
GetWindowRect(LPRECT lpRect
) const
741 ATLASSERT(::IsWindow(m_hWnd
));
742 return ::GetWindowRect(m_hWnd
, lpRect
);
745 int GetWindowRgn(HRGN hRgn
)
747 ATLASSERT(::IsWindow(m_hWnd
));
748 return ::GetWindowRgn(m_hWnd
, hRgn
);
751 int GetWindowText(LPTSTR lpszStringBuf
, int nMaxCount
) const
753 ATLASSERT(::IsWindow(m_hWnd
));
754 return ::GetWindowText(m_hWnd
, lpszStringBuf
, nMaxCount
);
757 BOOL
GetWindowText(BSTR
& bstrText
)
759 ATLASSERT(::IsWindow(m_hWnd
));
760 int length
= ::GetWindowTextLength(m_hWnd
);
761 if (!SysReAllocStringLen(&bstrText
, NULL
, length
))
763 ::GetWindowText(m_hWnd
, (LPTSTR
)&bstrText
[2], length
);
767 int GetWindowTextLength() const
769 ATLASSERT(::IsWindow(m_hWnd
));
770 return ::GetWindowTextLength(m_hWnd
);
773 DWORD
GetWindowThreadID()
775 ATLASSERT(::IsWindow(m_hWnd
));
776 return ::GetWindowThreadProcessId(m_hWnd
, NULL
);
779 WORD
GetWindowWord(int nIndex
) const
781 ATLASSERT(::IsWindow(m_hWnd
));
782 return (WORD
)::GetWindowLong(m_hWnd
, nIndex
);
785 void GotoDlgCtrl(HWND hWndCtrl
) const
787 ATLASSERT(::IsWindow(m_hWnd
));
788 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 0, 0);
793 ATLASSERT(::IsWindow(m_hWnd
));
794 return ::HideCaret(m_hWnd
);
797 BOOL
HiliteMenuItem(HMENU hMenu
, UINT uHiliteItem
, UINT uHilite
)
799 ATLASSERT(::IsWindow(m_hWnd
));
800 return ::HiliteMenuItem(m_hWnd
, hMenu
, uHiliteItem
, uHilite
);
803 BOOL
Invalidate(BOOL bErase
= TRUE
)
805 ATLASSERT(::IsWindow(m_hWnd
));
806 return ::InvalidateRect(m_hWnd
, NULL
, bErase
);
809 BOOL
InvalidateRect(LPCRECT lpRect
, BOOL bErase
= TRUE
)
811 ATLASSERT(::IsWindow(m_hWnd
));
812 return ::InvalidateRect(m_hWnd
, lpRect
, bErase
);
815 void InvalidateRgn(HRGN hRgn
, BOOL bErase
= TRUE
)
817 ATLASSERT(::IsWindow(m_hWnd
));
818 ::InvalidateRgn(m_hWnd
, hRgn
, bErase
);
821 BOOL
IsChild(const HWND hWnd
) const
823 ATLASSERT(::IsWindow(m_hWnd
));
824 return ::IsChild(m_hWnd
, hWnd
);
827 BOOL
IsDialogMessage(LPMSG lpMsg
)
829 ATLASSERT(::IsWindow(m_hWnd
));
830 return ::IsDialogMessage(m_hWnd
, lpMsg
);
833 UINT
IsDlgButtonChecked(int nIDButton
) const
835 ATLASSERT(::IsWindow(m_hWnd
));
836 return ::IsDlgButtonChecked(m_hWnd
, nIDButton
);
839 BOOL
IsIconic() const
841 ATLASSERT(::IsWindow(m_hWnd
));
842 return ::IsIconic(m_hWnd
);
845 BOOL
IsParentDialog()
847 ATLASSERT(::IsWindow(m_hWnd
));
849 if (!RealGetWindowClass(::GetParent(m_hWnd
), pszType
, sizeof(pszType
) / sizeof(pszType
[0])))
851 return !_tcscmp(pszType
, _T("#32770"));
854 BOOL
IsWindow() const
856 return ::IsWindow(m_hWnd
);
859 BOOL
IsWindowEnabled() const
861 ATLASSERT(::IsWindow(m_hWnd
));
862 return ::IsWindowEnabled(m_hWnd
);
865 BOOL
IsWindowVisible() const
867 ATLASSERT(::IsWindow(m_hWnd
));
868 return ::IsWindowVisible(m_hWnd
);
871 BOOL
IsWindowUnicode()
873 ATLASSERT(::IsWindow(m_hWnd
));
874 return ::IsWindowUnicode(m_hWnd
);
877 BOOL
IsZoomed() const
879 ATLASSERT(::IsWindow(m_hWnd
));
880 return ::IsZoomed(m_hWnd
);
883 BOOL
KillTimer(UINT_PTR nIDEvent
)
885 ATLASSERT(::IsWindow(m_hWnd
));
886 return ::KillTimer(m_hWnd
, nIDEvent
);
889 BOOL
LockWindowUpdate(BOOL bLock
= TRUE
)
891 ATLASSERT(::IsWindow(m_hWnd
));
893 return ::LockWindowUpdate(m_hWnd
);
894 return ::LockWindowUpdate(NULL
);
897 int MapWindowPoints(HWND hWndTo
, LPPOINT lpPoint
, UINT nCount
) const
899 ATLASSERT(::IsWindow(m_hWnd
));
900 return ::MapWindowPoints(m_hWnd
, hWndTo
, lpPoint
, nCount
);
903 int MapWindowPoints(HWND hWndTo
, LPRECT lpRect
) const
905 ATLASSERT(::IsWindow(m_hWnd
));
906 return ::MapWindowPoints(m_hWnd
, hWndTo
, (LPPOINT
)lpRect
, sizeof(RECT
) / sizeof(POINT
));
909 int MessageBox(LPCTSTR lpszText
, LPCTSTR lpszCaption
= NULL
, UINT nType
= MB_OK
)
911 ATLASSERT(::IsWindow(m_hWnd
));
912 return ::MessageBox(m_hWnd
, lpszText
, lpszCaption
, nType
);
915 BOOL
ModifyStyle(DWORD dwRemove
, DWORD dwAdd
, UINT nFlags
= 0)
917 ATLASSERT(::IsWindow(m_hWnd
));
918 ::SetWindowLong(m_hWnd
, GWL_STYLE
, (::GetWindowLong(m_hWnd
, GWL_STYLE
) & ~dwRemove
) | dwAdd
);
920 return ::SetWindowPos(m_hWnd
, NULL
, 0, 0, 0, 0, nFlags
| SWP_NOSIZE
| SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
924 BOOL
ModifyStyleEx(DWORD dwRemove
, DWORD dwAdd
, UINT nFlags
= 0)
926 ATLASSERT(::IsWindow(m_hWnd
));
927 ::SetWindowLong(m_hWnd
, GWL_EXSTYLE
, (::GetWindowLong(m_hWnd
, GWL_EXSTYLE
) & ~dwRemove
) | dwAdd
);
929 return ::SetWindowPos(m_hWnd
, NULL
, 0, 0, 0, 0, nFlags
| SWP_NOSIZE
| SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
933 BOOL
MoveWindow(int x
, int y
, int nWidth
, int nHeight
, BOOL bRepaint
= TRUE
)
935 ATLASSERT(::IsWindow(m_hWnd
));
936 return ::MoveWindow(m_hWnd
, x
, y
, nWidth
, nHeight
, bRepaint
);
939 void NextDlgCtrl() const
941 ATLASSERT(::IsWindow(m_hWnd
));
942 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 0, 0);
947 ATLASSERT(::IsWindow(m_hWnd
));
948 return ::OpenClipboard(m_hWnd
);
951 BOOL
PostMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
953 ATLASSERT(::IsWindow(m_hWnd
));
954 return ::PostMessage(m_hWnd
, message
, wParam
, lParam
);
957 void PrevDlgCtrl() const
959 ATLASSERT(::IsWindow(m_hWnd
));
960 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 1, 0);
963 void Print(HDC hDC
, DWORD dwFlags
) const
965 ATLASSERT(::IsWindow(m_hWnd
));
966 ::SendMessage(m_hWnd
, WM_PRINT
, (WPARAM
)hDC
, (LPARAM
)dwFlags
);
969 void PrintClient(HDC hDC
, DWORD dwFlags
) const
971 ATLASSERT(::IsWindow(m_hWnd
));
972 ::SendMessage(m_hWnd
, WM_PRINTCLIENT
, (WPARAM
)hDC
, (LPARAM
)dwFlags
);
975 BOOL
RedrawWindow(LPCRECT lpRectUpdate
= NULL
, HRGN hRgnUpdate
= NULL
, UINT flags
= RDW_INVALIDATE
| RDW_UPDATENOW
| RDW_ERASE
)
977 ATLASSERT(::IsWindow(m_hWnd
));
978 return ::RedrawWindow(m_hWnd
, lpRectUpdate
, hRgnUpdate
, flags
);
981 int ReleaseDC(HDC hDC
)
983 ATLASSERT(::IsWindow(m_hWnd
));
984 return ::ReleaseDC(m_hWnd
, hDC
);
987 BOOL
ResizeClient(int nWidth
, int nHeight
, BOOL bRedraw
= FALSE
)
989 ATLASSERT(::IsWindow(m_hWnd
));
990 RECT clientRect
, wndRect
;
991 ::GetClientRect(m_hWnd
, &clientRect
);
992 ::GetWindowRect(m_hWnd
, &wndRect
);
993 return ::MoveWindow(m_hWnd
, wndRect
.left
, wndRect
.top
,
994 nWidth
+ (wndRect
.right
- wndRect
.left
) - (clientRect
.right
- clientRect
.left
),
995 nHeight
+ (wndRect
.bottom
- wndRect
.top
) - (clientRect
.bottom
- clientRect
.top
),
999 BOOL
ScreenToClient(LPPOINT lpPoint
) const
1001 ATLASSERT(::IsWindow(m_hWnd
));
1002 return ::ScreenToClient(m_hWnd
, lpPoint
);
1005 BOOL
ScrollWindow(int xAmount
, int yAmount
, LPCRECT lpRect
= NULL
, LPCRECT lpClipRect
= NULL
)
1007 ATLASSERT(::IsWindow(m_hWnd
));
1008 return ::ScrollWindow(m_hWnd
, xAmount
, yAmount
, lpRect
, lpClipRect
);
1011 int ScrollWindowEx(int dx
, int dy
, LPCRECT lpRectScroll
, LPCRECT lpRectClip
, HRGN hRgnUpdate
, LPRECT lpRectUpdate
, UINT flags
)
1013 ATLASSERT(::IsWindow(m_hWnd
));
1014 return ::ScrollWindowEx(m_hWnd
, dx
, dy
, lpRectScroll
, lpRectClip
, hRgnUpdate
, lpRectUpdate
, flags
);
1017 LRESULT
SendDlgItemMessage(int nID
, UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1019 ATLASSERT(::IsWindow(m_hWnd
));
1020 return ::SendDlgItemMessage(m_hWnd
, nID
, message
, wParam
, lParam
);
1023 LRESULT
SendMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1025 ATLASSERT(::IsWindow(m_hWnd
));
1026 return ::SendMessage(m_hWnd
, message
, wParam
, lParam
);
1029 static LRESULT
SendMessage(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1031 ATLASSERT(::IsWindow(hWnd
));
1032 return ::SendMessage(hWnd
, message
, wParam
, lParam
);
1036 static BOOL CALLBACK
SendMessageToDescendantsCallback(HWND hWnd
, LPARAM lParam
)
1038 ::SendMessage(hWnd
, ((LPMSG
)lParam
)->message
, ((LPMSG
)lParam
)->wParam
, ((LPMSG
)lParam
)->lParam
);
1042 static BOOL CALLBACK
SendMessageToDescendantsCallbackDeep(HWND hWnd
, LPARAM lParam
)
1044 ::SendMessage(hWnd
, ((LPMSG
)lParam
)->message
, ((LPMSG
)lParam
)->wParam
, ((LPMSG
)lParam
)->lParam
);
1045 ::EnumChildWindows(hWnd
, &SendMessageToDescendantsCallbackDeep
, lParam
);
1050 void SendMessageToDescendants(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0, BOOL bDeep
= TRUE
)
1052 ATLASSERT(::IsWindow(m_hWnd
));
1054 msg
.message
= message
;
1055 msg
.wParam
= wParam
;
1056 msg
.lParam
= lParam
;
1058 ::EnumChildWindows(m_hWnd
, &SendMessageToDescendantsCallback
, (LPARAM
)&msg
);
1060 ::EnumChildWindows(m_hWnd
, &SendMessageToDescendantsCallbackDeep
, (LPARAM
)&msg
);
1063 BOOL
SendNotifyMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1065 ATLASSERT(::IsWindow(m_hWnd
));
1066 return ::SendNotifyMessage(m_hWnd
, message
, wParam
, lParam
);
1069 HWND
SetActiveWindow()
1071 ATLASSERT(::IsWindow(m_hWnd
));
1072 return ::SetActiveWindow(m_hWnd
);
1077 ATLASSERT(::IsWindow(m_hWnd
));
1078 return ::SetCapture(m_hWnd
);
1081 HWND
SetClipboardViewer()
1083 ATLASSERT(::IsWindow(m_hWnd
));
1084 return ::SetClipboardViewer(m_hWnd
);
1087 int SetDlgCtrlID(int nID
)
1089 ATLASSERT(::IsWindow(m_hWnd
));
1090 return ::SetWindowLong(m_hWnd
, GWL_ID
, nID
);
1093 BOOL
SetDlgItemInt(int nID
, UINT nValue
, BOOL bSigned
= TRUE
)
1095 ATLASSERT(::IsWindow(m_hWnd
));
1096 return ::SetDlgItemInt(m_hWnd
, nID
, nValue
, bSigned
);
1099 BOOL
SetDlgItemText(int nID
, LPCTSTR lpszString
)
1101 ATLASSERT(::IsWindow(m_hWnd
));
1102 return ::SetDlgItemText(m_hWnd
, nID
, lpszString
);
1107 ATLASSERT(::IsWindow(m_hWnd
));
1108 return ::SetFocus(m_hWnd
);
1111 void SetFont(HFONT hFont
, BOOL bRedraw
= TRUE
)
1113 ATLASSERT(::IsWindow(m_hWnd
));
1114 ::SendMessage(m_hWnd
, WM_SETFONT
, (WPARAM
)hFont
, (LPARAM
)bRedraw
);
1117 int SetHotKey(WORD wVirtualKeyCode
, WORD wModifiers
)
1119 ATLASSERT(::IsWindow(m_hWnd
));
1120 return ::SendMessage(m_hWnd
, WM_SETHOTKEY
, MAKEWPARAM(wVirtualKeyCode
, wModifiers
), 0);
1123 HICON
SetIcon(HICON hIcon
, BOOL bBigIcon
= TRUE
)
1125 ATLASSERT(::IsWindow(m_hWnd
));
1126 return (HICON
)::SendMessage(m_hWnd
, WM_SETICON
, (WPARAM
)bBigIcon
, (LPARAM
)hIcon
);
1129 BOOL
SetMenu(HMENU hMenu
)
1131 ATLASSERT(::IsWindow(m_hWnd
));
1132 return ::SetMenu(m_hWnd
, hMenu
);
1135 HWND
SetParent(HWND hWndNewParent
)
1137 ATLASSERT(::IsWindow(m_hWnd
));
1138 return ::SetParent(m_hWnd
, hWndNewParent
);
1141 void SetRedraw(BOOL bRedraw
= TRUE
)
1143 ATLASSERT(::IsWindow(m_hWnd
));
1144 ::SendMessage(m_hWnd
, WM_SETREDRAW
, (WPARAM
)bRedraw
, 0);
1147 int SetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
, BOOL bRedraw
= TRUE
)
1149 ATLASSERT(::IsWindow(m_hWnd
));
1150 return ::SetScrollInfo(m_hWnd
, nBar
, lpScrollInfo
, bRedraw
);
1153 int SetScrollPos(int nBar
, int nPos
, BOOL bRedraw
= TRUE
)
1155 ATLASSERT(::IsWindow(m_hWnd
));
1156 return ::SetScrollPos(m_hWnd
, nBar
, nPos
, bRedraw
);
1159 BOOL
SetScrollRange(int nBar
, int nMinPos
, int nMaxPos
, BOOL bRedraw
= TRUE
)
1161 ATLASSERT(::IsWindow(m_hWnd
));
1162 return ::SetScrollRange(m_hWnd
, nBar
, nMinPos
, nMaxPos
, bRedraw
);
1165 UINT_PTR
SetTimer(UINT_PTR nIDEvent
, UINT nElapse
, void (CALLBACK
*lpfnTimer
)(HWND
, UINT
, UINT_PTR
, DWORD
) = NULL
)
1167 ATLASSERT(::IsWindow(m_hWnd
));
1168 return ::SetTimer(m_hWnd
, nIDEvent
, nElapse
, reinterpret_cast<TIMERPROC
>(lpfnTimer
));
1171 BOOL
SetWindowContextHelpId(DWORD dwContextHelpId
)
1173 ATLASSERT(::IsWindow(m_hWnd
));
1174 return ::SetWindowContextHelpId(m_hWnd
, dwContextHelpId
);
1177 LONG
SetWindowLong(int nIndex
, LONG dwNewLong
)
1179 ATLASSERT(::IsWindow(m_hWnd
));
1180 return ::SetWindowLong(m_hWnd
, nIndex
, dwNewLong
);
1183 LONG_PTR
SetWindowLongPtr(int nIndex
, LONG_PTR dwNewLong
)
1185 ATLASSERT(::IsWindow(m_hWnd
));
1186 return ::SetWindowLongPtr(m_hWnd
, nIndex
, dwNewLong
);
1189 BOOL
SetWindowPlacement(const WINDOWPLACEMENT
* lpwndpl
)
1191 ATLASSERT(::IsWindow(m_hWnd
));
1192 return ::SetWindowPlacement(m_hWnd
, lpwndpl
);
1195 BOOL
SetWindowPos(HWND hWndInsertAfter
, int x
, int y
, int cx
, int cy
, UINT nFlags
)
1197 ATLASSERT(::IsWindow(m_hWnd
));
1198 return ::SetWindowPos(m_hWnd
, hWndInsertAfter
, x
, y
, cx
, cy
, nFlags
);
1201 int SetWindowRgn(HRGN hRgn
, BOOL bRedraw
= FALSE
)
1203 ATLASSERT(::IsWindow(m_hWnd
));
1204 return ::SetWindowRgn(m_hWnd
, hRgn
, bRedraw
);
1207 BOOL
SetWindowText(LPCTSTR lpszString
)
1209 ATLASSERT(::IsWindow(m_hWnd
));
1210 return ::SetWindowText(m_hWnd
, lpszString
);
1213 WORD
SetWindowWord(int nIndex
, WORD wNewWord
)
1215 ATLASSERT(::IsWindow(m_hWnd
));
1217 return ::SetWindowLong(m_hWnd
, nIndex
- 2, MAKELONG(LOWORD(::GetWindowLong(m_hWnd
, nIndex
- 2)), wNewWord
));
1219 return ::SetWindowLong(m_hWnd
, nIndex
, MAKELONG(wNewWord
, HIWORD(::GetWindowLong(m_hWnd
, nIndex
))));
1224 ATLASSERT(::IsWindow(m_hWnd
));
1225 return ::ShowCaret(m_hWnd
);
1228 BOOL
ShowOwnedPopups(BOOL bShow
= TRUE
)
1230 ATLASSERT(::IsWindow(m_hWnd
));
1231 return ::ShowOwnedPopups(m_hWnd
, bShow
);
1234 BOOL
ShowScrollBar(UINT nBar
, BOOL bShow
= TRUE
)
1236 ATLASSERT(::IsWindow(m_hWnd
));
1237 return ::ShowScrollBar(m_hWnd
, nBar
, bShow
);
1240 BOOL
ShowWindow(int nCmdShow
)
1242 ATLASSERT(::IsWindow(m_hWnd
));
1243 return ::ShowWindow(m_hWnd
, nCmdShow
);
1246 BOOL
ShowWindowAsync(int nCmdShow
)
1248 ATLASSERT(::IsWindow(m_hWnd
));
1249 return ::ShowWindowAsync(m_hWnd
, nCmdShow
);
1254 ATLASSERT(::IsWindow(m_hWnd
));
1255 return ::UpdateWindow(m_hWnd
);
1258 BOOL
ValidateRect(LPCRECT lpRect
)
1260 ATLASSERT(::IsWindow(m_hWnd
));
1261 return ::ValidateRect(m_hWnd
, lpRect
);
1264 BOOL
ValidateRgn(HRGN hRgn
)
1266 ATLASSERT(::IsWindow(m_hWnd
));
1267 return ::ValidateRgn(m_hWnd
, hRgn
);
1270 BOOL
WinHelp(LPCTSTR lpszHelp
, UINT nCmd
= HELP_CONTEXT
, DWORD dwData
= 0)
1272 ATLASSERT(::IsWindow(m_hWnd
));
1273 return ::WinHelp(m_hWnd
, lpszHelp
, nCmd
, dwData
);
1277 __declspec(selectany
) RECT
CWindow::rcDefault
= { CW_USEDEFAULT
, CW_USEDEFAULT
, 0, 0 };
1279 template <class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1280 class CWindowImplBaseT
: public TBase
, public CMessageMap
1283 enum { WINSTATE_DESTROYED
= 0x00000001 };
1285 const _ATL_MSG
*m_pCurrentMsg
;
1286 CWndProcThunk m_thunk
;
1287 WNDPROC m_pfnSuperWindowProc
;
1292 m_pCurrentMsg
= NULL
;
1293 m_pfnSuperWindowProc
= ::DefWindowProc
;
1296 virtual void OnFinalMessage(HWND
/* hWnd */)
1300 BOOL
SubclassWindow(HWND hWnd
)
1302 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1303 WNDPROC newWindowProc
;
1304 WNDPROC oldWindowProc
;
1307 ATLASSERT(m_hWnd
== NULL
);
1308 ATLASSERT(::IsWindow(hWnd
));
1310 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
>*>(this);
1312 result
= m_thunk
.Init(GetWindowProc(), this);
1313 if (result
== FALSE
)
1315 newWindowProc
= m_thunk
.GetWNDPROC();
1316 oldWindowProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1317 if (oldWindowProc
== NULL
)
1319 m_pfnSuperWindowProc
= oldWindowProc
;
1320 pThis
->m_hWnd
= hWnd
;
1324 virtual WNDPROC
GetWindowProc()
1329 static DWORD
GetWndStyle(DWORD dwStyle
)
1331 return TWinTraits::GetWndStyle(dwStyle
);
1334 static DWORD
GetWndExStyle(DWORD dwExStyle
)
1336 return TWinTraits::GetWndExStyle(dwExStyle
);
1339 LRESULT
DefWindowProc(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1341 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1343 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
> *>(this);
1344 return ::CallWindowProc(m_pfnSuperWindowProc
, pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1347 static LRESULT CALLBACK
StartWindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1349 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1350 WNDPROC newWindowProc
;
1351 WNDPROC
GCCU(pOldProc
);
1353 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
> *>(_AtlWinModule
.ExtractCreateWndData());
1354 ATLASSERT(pThis
!= NULL
);
1357 pThis
->m_thunk
.Init(pThis
->GetWindowProc(), pThis
);
1358 newWindowProc
= pThis
->m_thunk
.GetWNDPROC();
1359 pOldProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1360 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1361 pThis
->m_hWnd
= hWnd
;
1362 return newWindowProc(hWnd
, uMsg
, wParam
, lParam
);
1365 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1367 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
= reinterpret_cast<CWindowImplBaseT
< TBase
, TWinTraits
> *>(hWnd
);
1368 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1370 const _ATL_MSG
*previousMessage
;
1372 LONG_PTR saveWindowProc
;
1374 ATLASSERT(pThis
!= NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) == 0 && pThis
->m_hWnd
!= NULL
);
1375 if (pThis
== NULL
|| (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0 || pThis
->m_hWnd
== NULL
)
1378 hWnd
= pThis
->m_hWnd
;
1379 previousMessage
= pThis
->m_pCurrentMsg
;
1380 pThis
->m_pCurrentMsg
= &msg
;
1382 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1383 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1385 if (handled
== FALSE
)
1387 if (uMsg
== WM_NCDESTROY
)
1389 saveWindowProc
= ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
);
1390 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1391 if (pThis
->m_pfnSuperWindowProc
!= ::DefWindowProc
&& saveWindowProc
== ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
))
1392 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(pThis
->m_pfnSuperWindowProc
));
1393 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1396 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1398 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1399 pThis
->m_pCurrentMsg
= previousMessage
;
1400 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1402 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1403 pThis
->m_hWnd
= NULL
;
1404 pThis
->OnFinalMessage(hWnd
);
1409 HWND
Create(HWND hWndParent
, _U_RECT rect
, LPCTSTR szWindowName
, DWORD dwStyle
, DWORD dwExStyle
,
1410 _U_MENUorID MenuOrID
, ATOM atom
, LPVOID lpCreateParam
)
1414 ATLASSERT(m_hWnd
== NULL
);
1415 ATLASSERT(atom
!= 0);
1418 if (m_thunk
.Init(NULL
, NULL
) == FALSE
)
1420 SetLastError(ERROR_OUTOFMEMORY
);
1424 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1425 if (MenuOrID
.m_hMenu
== NULL
&& (dwStyle
& WS_CHILD
) != 0)
1426 MenuOrID
.m_hMenu
= (HMENU
)(UINT_PTR
)this;
1427 if (rect
.m_lpRect
== NULL
)
1428 rect
.m_lpRect
= &TBase::rcDefault
;
1429 hWnd
= ::CreateWindowEx(dwExStyle
, reinterpret_cast<LPCWSTR
>(MAKEINTATOM(atom
)), szWindowName
, dwStyle
, rect
.m_lpRect
->left
,
1430 rect
.m_lpRect
->top
, rect
.m_lpRect
->right
- rect
.m_lpRect
->left
, rect
.m_lpRect
->bottom
- rect
.m_lpRect
->top
,
1431 hWndParent
, MenuOrID
.m_hMenu
, _AtlBaseModule
.GetModuleInstance(), lpCreateParam
);
1433 ATLASSERT(m_hWnd
== hWnd
);
1439 template <class T
, class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1440 class CWindowImpl
: public CWindowImplBaseT
<TBase
, TWinTraits
>
1443 static LPCTSTR
GetWndCaption()
1448 HWND
Create(HWND hWndParent
, _U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
, DWORD dwStyle
= 0,
1449 DWORD dwExStyle
= 0, _U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
1451 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1454 ATLASSERT(m_hWnd
== NULL
);
1455 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
>*>(this);
1457 if (T::GetWndClassInfo().m_lpszOrigName
== NULL
)
1458 T::GetWndClassInfo().m_lpszOrigName
= pThis
->GetWndClassName();
1459 atom
= T::GetWndClassInfo().Register(&pThis
->m_pfnSuperWindowProc
);
1461 if (szWindowName
== NULL
)
1462 szWindowName
= T::GetWndCaption();
1463 dwStyle
= T::GetWndStyle(dwStyle
);
1464 dwExStyle
= T::GetWndExStyle(dwExStyle
);
1466 return CWindowImplBaseT
<TBase
, TWinTraits
>::Create(hWndParent
, rect
, szWindowName
, dwStyle
,
1467 dwExStyle
, MenuOrID
, atom
, lpCreateParam
);
1471 template <class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1472 class CContainedWindowT
: public TBase
1475 CWndProcThunk m_thunk
;
1476 LPCTSTR m_lpszClassName
;
1477 WNDPROC m_pfnSuperWindowProc
;
1478 CMessageMap
*m_pObject
;
1480 const _ATL_MSG
*m_pCurrentMsg
;
1482 CContainedWindowT(CMessageMap
*pObject
, DWORD dwMsgMapID
= 0)
1484 m_lpszClassName
= TBase::GetWndClassName();
1485 m_pfnSuperWindowProc
= ::DefWindowProc
;
1486 m_pObject
= pObject
;
1487 m_dwMsgMapID
= dwMsgMapID
;
1488 m_pCurrentMsg
= NULL
;
1491 CContainedWindowT(LPTSTR lpszClassName
, CMessageMap
*pObject
, DWORD dwMsgMapID
= 0)
1493 m_lpszClassName
= lpszClassName
;
1494 m_pfnSuperWindowProc
= ::DefWindowProc
;
1495 m_pObject
= pObject
;
1496 m_dwMsgMapID
= dwMsgMapID
;
1497 m_pCurrentMsg
= NULL
;
1500 LRESULT
DefWindowProc(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1502 return ::CallWindowProc(m_pfnSuperWindowProc
, this->m_hWnd
, uMsg
, wParam
, lParam
);
1505 BOOL
SubclassWindow(HWND hWnd
)
1507 CContainedWindowT
<TBase
> *pThis
;
1508 WNDPROC newWindowProc
;
1509 WNDPROC oldWindowProc
;
1512 ATLASSERT(m_hWnd
== NULL
);
1513 ATLASSERT(::IsWindow(hWnd
));
1515 pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(this);
1517 result
= m_thunk
.Init(WindowProc
, pThis
);
1518 if (result
== FALSE
)
1520 newWindowProc
= m_thunk
.GetWNDPROC();
1521 oldWindowProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1522 if (oldWindowProc
== NULL
)
1524 m_pfnSuperWindowProc
= oldWindowProc
;
1525 pThis
->m_hWnd
= hWnd
;
1529 static LRESULT CALLBACK
StartWindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1531 CContainedWindowT
<TBase
> *pThis
;
1532 WNDPROC newWindowProc
;
1533 WNDPROC
GCCU(pOldProc
);
1535 pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(_AtlWinModule
.ExtractCreateWndData());
1536 ATLASSERT(pThis
!= NULL
);
1539 pThis
->m_thunk
.Init(WindowProc
, pThis
);
1540 newWindowProc
= pThis
->m_thunk
.GetWNDPROC();
1541 pOldProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1542 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1543 pThis
->m_hWnd
= hWnd
;
1544 return newWindowProc(hWnd
, uMsg
, wParam
, lParam
);
1547 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1549 CContainedWindowT
<TBase
> *pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(hWnd
);
1550 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1552 const _ATL_MSG
*previousMessage
;
1554 LONG_PTR saveWindowProc
;
1556 ATLASSERT(pThis
!= NULL
&& pThis
->m_hWnd
!= NULL
&& pThis
->m_pObject
!= NULL
);
1557 if (pThis
== NULL
|| pThis
->m_hWnd
== NULL
|| pThis
->m_pObject
== NULL
)
1560 hWnd
= pThis
->m_hWnd
;
1561 previousMessage
= pThis
->m_pCurrentMsg
;
1562 pThis
->m_pCurrentMsg
= &msg
;
1564 handled
= pThis
->m_pObject
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, pThis
->m_dwMsgMapID
);
1565 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1567 pThis
->m_pCurrentMsg
= previousMessage
;
1568 if (handled
== FALSE
)
1570 if (uMsg
== WM_NCDESTROY
)
1572 saveWindowProc
= ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
);
1573 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1574 if (pThis
->m_pfnSuperWindowProc
!= ::DefWindowProc
&& saveWindowProc
== ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
))
1575 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(pThis
->m_pfnSuperWindowProc
));
1576 pThis
->m_hWnd
= NULL
;
1579 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1585 typedef CContainedWindowT
<CWindow
> CContainedWindow
;
1587 #define BEGIN_MSG_MAP(theClass) \
1589 BOOL ProcessWindowMessage(HWND GCCU(hWnd), UINT GCCU(uMsg), WPARAM GCCU(wParam), LPARAM GCCU(lParam), LRESULT &GCCU(lResult), DWORD dwMsgMapID = 0) \
1591 BOOL GCCU(bHandled) = TRUE; \
1598 switch(dwMsgMapID) \
1602 #define ALT_MSG_MAP(map) \
1606 #define END_MSG_MAP() \
1615 #define MESSAGE_HANDLER(msg, func) \
1619 lResult = func(uMsg, wParam, lParam, bHandled); \
1624 #define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func) \
1625 if (uMsg >= msgFirst && uMsg <= msgLast) \
1628 lResult = func(uMsg, wParam, lParam, bHandled); \
1633 #define COMMAND_ID_HANDLER(id, func) \
1634 if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \
1637 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1642 #define COMMAND_RANGE_HANDLER(idFirst, idLast, func) \
1643 if (uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
1646 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1651 #define NOTIFY_CODE_HANDLER(cd, func) \
1652 if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \
1655 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
1660 #define NOTIFY_HANDLER(id, cd, func) \
1661 if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \
1664 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
1669 #define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \
1670 static ATL::CWndClassInfo& GetWndClassInfo() \
1672 static ATL::CWndClassInfo wc = \
1674 { sizeof(WNDCLASSEX), style, StartWindowProc, \
1675 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \
1676 NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \
1681 struct _ATL_WNDCLASSINFOW
1684 LPCWSTR m_lpszOrigName
;
1686 LPCWSTR m_lpszCursorID
;
1687 BOOL m_bSystemCursor
;
1689 WCHAR m_szAutoName
[5 + sizeof(void *)];
1691 ATOM
Register(WNDPROC
*p
)
1693 if (m_wc
.hInstance
== NULL
)
1694 m_wc
.hInstance
= _AtlBaseModule
.GetModuleInstance();
1696 m_atom
= RegisterClassEx(&m_wc
);