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);
32 #ifdef SetWindowLongPtr
33 #undef SetWindowLongPtr
34 inline LONG_PTR
SetWindowLongPtr(HWND hWnd
, int nIndex
, LONG_PTR dwNewLong
)
36 return SetWindowLong(hWnd
, nIndex
, (LONG
)dwNewLong
);
40 #ifdef GetWindowLongPtr
41 #undef GetWindowLongPtr
42 inline LONG_PTR
GetWindowLongPtr(HWND hWnd
, int nIndex
)
44 return (LONG_PTR
)GetWindowLong(hWnd
, nIndex
);
49 #pragma push_macro("SubclassWindow")
55 struct _ATL_WNDCLASSINFOW
;
56 typedef _ATL_WNDCLASSINFOW CWndClassInfo
;
58 template <DWORD t_dwStyle
= 0, DWORD t_dwExStyle
= 0>
62 static DWORD
GetWndStyle(DWORD dwStyle
)
69 static DWORD
GetWndExStyle(DWORD dwExStyle
)
77 typedef CWinTraits
<WS_CHILD
| WS_VISIBLE
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, 0> CControlWinTraits
;
78 typedef CWinTraits
<WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_APPWINDOW
| WS_EX_WINDOWEDGE
> CFrameWinTraits
;
79 typedef CWinTraits
<WS_OVERLAPPEDWINDOW
| WS_CHILD
| WS_VISIBLE
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
, WS_EX_MDICHILD
> CMDIChildWinTraits
;
81 template <DWORD t_dwStyle
= 0, DWORD t_dwExStyle
= 0, class TWinTraits
= CControlWinTraits
>
85 static DWORD
GetWndStyle(DWORD dwStyle
)
87 return dwStyle
| t_dwStyle
| TWinTraits::GetWndStyle(dwStyle
);
90 static DWORD
GetWndExStyle(DWORD dwExStyle
)
92 return dwExStyle
| t_dwExStyle
| TWinTraits::GetWndExStyle(dwExStyle
);
101 _U_MENUorID(HMENU hMenu
)
106 _U_MENUorID(UINT nID
)
108 m_hMenu
= (HMENU
)(UINT_PTR
)nID
;
117 _U_RECT(LPRECT lpRect
)
128 struct _ATL_MSG
: public MSG
133 _ATL_MSG(HWND hWnd
, UINT uMsg
, WPARAM wParamIn
, LPARAM lParamIn
, BOOL bHandledIn
= TRUE
)
142 bHandled
= bHandledIn
;
151 DWORD m_mov
; /* mov dword ptr [esp+4], m_this */
153 BYTE m_jmp
; /* jmp relproc */
157 Init(WNDPROC proc
, void *pThis
)
160 m_this
= PtrToUlong(pThis
);
162 m_relproc
= DWORD(reinterpret_cast<char *>(proc
) - (reinterpret_cast<char *>(this) + sizeof(thunkCode
)));
163 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
168 #elif defined(_AMD64_)
173 USHORT m_mov_rcx
; /* mov rcx, m_this */
175 USHORT m_mov_rax
; /* mov rax, m_proc */
177 USHORT m_jmp
; /* jmp rax */
180 Init(WNDPROC proc
, void *pThis
)
183 m_this
= (ULONG64
)pThis
;
185 m_proc
= (ULONG64
)proc
;
187 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
192 #elif defined(_M_ARM)
197 DWORD m_mov_r0
; /* mov r0, m_this */
198 DWORD m_mov_pc
; /* mov pc, m_proc */
203 Init(WNDPROC proc
, void *pThis
)
205 m_mov_r0
= 0xE59F0000;
206 m_mov_pc
= 0xE59FF000;
207 m_this
= (DWORD
)pThis
;
208 m_proc
= (DWORD
)proc
;
209 FlushInstructionCache(GetCurrentProcess(), this, sizeof(thunkCode
));
215 #error ARCH not supported
222 _AtlCreateWndData cd
;
227 m_pthunk
= (thunkCode
*)VirtualAlloc(NULL
, sizeof(thunkCode
), MEM_COMMIT
, PAGE_EXECUTE_READWRITE
);
232 if (m_pthunk
!= NULL
)
233 VirtualFree(m_pthunk
, 0, MEM_RELEASE
);
236 BOOL
Init(WNDPROC proc
, void *pThis
)
238 if (m_pthunk
== NULL
)
240 m_pthunk
->Init(proc
, pThis
);
246 return reinterpret_cast<WNDPROC
>(m_pthunk
);
253 virtual BOOL
ProcessWindowMessage(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
&lResult
, DWORD dwMsgMapID
) = 0;
260 static RECT rcDefault
;
262 CWindow(HWND hWnd
= NULL
)
267 operator HWND() const
272 static LPCTSTR
GetWndClassName()
277 UINT
ArrangeIconicWindows()
279 ATLASSERT(::IsWindow(m_hWnd
));
280 return ::ArrangeIconicWindows(m_hWnd
);
283 void Attach(HWND hWndNew
)
288 HDC
BeginPaint(LPPAINTSTRUCT lpPaint
)
290 ATLASSERT(::IsWindow(m_hWnd
));
291 return ::BeginPaint(m_hWnd
, lpPaint
);
294 BOOL
BringWindowToTop()
296 ATLASSERT(::IsWindow(m_hWnd
));
297 return ::BringWindowToTop(m_hWnd
);
300 BOOL
CenterWindow(HWND hWndCenter
= NULL
)
302 ATLASSERT(::IsWindow(m_hWnd
));
303 if (hWndCenter
== NULL
)
304 hWndCenter
= ::GetParent(m_hWnd
);
305 if (hWndCenter
== NULL
)
307 RECT wndCenterRect
, wndRect
;
308 if (!::GetWindowRect(hWndCenter
, &wndCenterRect
) || !::GetWindowRect(m_hWnd
, &wndRect
))
310 int wndCenterWidth
= wndCenterRect
.right
- wndCenterRect
.left
;
311 int wndCenterHeight
= wndCenterRect
.bottom
- wndCenterRect
.top
;
312 int wndWidth
= wndRect
.right
- wndRect
.left
;
313 int wndHeight
= wndRect
.bottom
- wndRect
.top
;
314 return ::MoveWindow(m_hWnd
,
315 wndCenterRect
.left
+ ((wndCenterWidth
- wndWidth
+ 1) >> 1),
316 wndCenterRect
.top
+ ((wndCenterHeight
- wndHeight
+ 1) >> 1),
317 wndWidth
, wndHeight
, TRUE
);
320 BOOL
ChangeClipboardChain(HWND hWndNewNext
)
322 ATLASSERT(::IsWindow(m_hWnd
));
323 return ::ChangeClipboardChain(m_hWnd
, hWndNewNext
);
326 BOOL
CheckDlgButton(int nIDButton
, UINT nCheck
)
328 ATLASSERT(::IsWindow(m_hWnd
));
329 return ::CheckDlgButton(m_hWnd
, nIDButton
, nCheck
);
332 BOOL
CheckRadioButton(int nIDFirstButton
, int nIDLastButton
, int nIDCheckButton
)
334 ATLASSERT(::IsWindow(m_hWnd
));
335 return ::CheckRadioButton(m_hWnd
, nIDFirstButton
, nIDLastButton
, nIDCheckButton
);
338 HWND
ChildWindowFromPoint(POINT point
) const
340 ATLASSERT(::IsWindow(m_hWnd
));
341 return ::ChildWindowFromPoint(m_hWnd
, point
);
344 HWND
ChildWindowFromPointEx(POINT point
, UINT uFlags
) const
346 ATLASSERT(::IsWindow(m_hWnd
));
347 return ::ChildWindowFromPointEx(m_hWnd
, point
, uFlags
);
350 BOOL
ClientToScreen(LPPOINT lpPoint
) const
352 ATLASSERT(::IsWindow(m_hWnd
));
353 return ::ClientToScreen(m_hWnd
, lpPoint
);
356 BOOL
ClientToScreen(LPRECT lpRect
) const
360 ATLASSERT(::IsWindow(m_hWnd
));
361 POINT leftTop
= {lpRect
->left
, lpRect
->top
};
362 POINT rightBottom
= {lpRect
->right
, lpRect
->bottom
};
363 BOOL success
= ::ClientToScreen(m_hWnd
, &leftTop
) && ::ClientToScreen(m_hWnd
, &rightBottom
);
366 lpRect
->left
= leftTop
.x
;
367 lpRect
->top
= leftTop
.y
;
368 lpRect
->right
= rightBottom
.x
;
369 lpRect
->bottom
= rightBottom
.y
;
374 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
)
377 ATLASSERT(m_hWnd
== NULL
);
378 hWnd
= ::CreateWindowEx(dwExStyle
,
384 rect
.m_lpRect
->right
- rect
.m_lpRect
->left
,
385 rect
.m_lpRect
->bottom
- rect
.m_lpRect
->top
,
388 _AtlBaseModule
.GetModuleInstance(),
395 BOOL
CreateCaret(HBITMAP pBitmap
)
397 ATLASSERT(::IsWindow(m_hWnd
));
398 return ::CreateCaret(m_hWnd
, pBitmap
, 0, 0);
401 BOOL
CreateGrayCaret(int nWidth
, int nHeight
)
403 ATLASSERT(::IsWindow(m_hWnd
));
404 return ::CreateCaret(m_hWnd
, (HBITMAP
)1, nWidth
, nHeight
);
407 BOOL
CreateSolidCaret(int nWidth
, int nHeight
)
409 ATLASSERT(::IsWindow(m_hWnd
));
410 return ::CreateCaret(m_hWnd
, (HBITMAP
)0, nWidth
, nHeight
);
413 HDWP
DeferWindowPos(HDWP hWinPosInfo
, HWND hWndInsertAfter
, int x
, int y
, int cx
, int cy
, UINT uFlags
)
415 ATLASSERT(::IsWindow(m_hWnd
));
416 return ::DeferWindowPos(hWinPosInfo
, m_hWnd
, hWndInsertAfter
, x
, y
, cx
, cy
, uFlags
);
421 ATLASSERT(::IsWindow(m_hWnd
));
423 if (!::DestroyWindow(m_hWnd
))
437 int DlgDirList(LPTSTR lpPathSpec
, int nIDListBox
, int nIDStaticPath
, UINT nFileType
)
439 ATLASSERT(::IsWindow(m_hWnd
));
440 return ::DlgDirList(m_hWnd
, lpPathSpec
, nIDListBox
, nIDStaticPath
, nFileType
);
443 int DlgDirListComboBox(LPTSTR lpPathSpec
, int nIDComboBox
, int nIDStaticPath
, UINT nFileType
)
445 ATLASSERT(::IsWindow(m_hWnd
));
446 return ::DlgDirListComboBox(m_hWnd
, lpPathSpec
, nIDComboBox
, nIDStaticPath
, nFileType
);
449 BOOL
DlgDirSelect(LPTSTR lpString
, int nCount
, int nIDListBox
)
451 ATLASSERT(::IsWindow(m_hWnd
));
452 return ::DlgDirSelectEx(m_hWnd
, lpString
, nCount
, nIDListBox
);
455 BOOL
DlgDirSelectComboBox(LPTSTR lpString
, int nCount
, int nIDComboBox
)
457 ATLASSERT(::IsWindow(m_hWnd
));
458 return ::DlgDirSelectComboBoxEx(m_hWnd
, lpString
, nCount
, nIDComboBox
);
461 void DragAcceptFiles(BOOL bAccept
= TRUE
)
463 ATLASSERT(::IsWindow(m_hWnd
));
464 // FIXME following line requires shellapi.h
465 // ::DragAcceptFiles(m_hWnd, bAccept);
470 ATLASSERT(::IsWindow(m_hWnd
));
471 return ::DrawMenuBar(m_hWnd
);
474 BOOL
EnableScrollBar(UINT uSBFlags
, UINT uArrowFlags
= ESB_ENABLE_BOTH
)
476 ATLASSERT(::IsWindow(m_hWnd
));
477 return ::EnableScrollBar(m_hWnd
, uSBFlags
, uArrowFlags
);
480 BOOL
EnableWindow(BOOL bEnable
= TRUE
)
482 ATLASSERT(::IsWindow(m_hWnd
));
483 return ::EnableWindow(m_hWnd
, bEnable
);
486 void EndPaint(LPPAINTSTRUCT lpPaint
)
488 ATLASSERT(::IsWindow(m_hWnd
));
489 ::EndPaint(m_hWnd
, lpPaint
);
492 BOOL
FlashWindow(BOOL bInvert
)
494 ATLASSERT(::IsWindow(m_hWnd
));
495 return ::FlashWindow(m_hWnd
, bInvert
);
498 BOOL
GetClientRect(LPRECT lpRect
) const
500 ATLASSERT(::IsWindow(m_hWnd
));
501 return ::GetClientRect(m_hWnd
, lpRect
);
506 ATLASSERT(::IsWindow(m_hWnd
));
507 return ::GetDC(m_hWnd
);
510 HDC
GetDCEx(HRGN hRgnClip
, DWORD flags
)
512 ATLASSERT(::IsWindow(m_hWnd
));
513 return ::GetDCEx(m_hWnd
, hRgnClip
, flags
);
517 typedef struct _IDHWNDPAIR
{
520 } IDHWNDPAIR
, *PIDHWNDPAIR
;
522 static BOOL CALLBACK
GetDescendantWindowCallback(HWND hWnd
, LPARAM lParam
)
524 if (::GetWindowLong(hWnd
, GWL_ID
) == ((PIDHWNDPAIR
)lParam
)->nID
)
526 ((PIDHWNDPAIR
)lParam
)->hWnd
= hWnd
;
529 ::EnumChildWindows(hWnd
, &GetDescendantWindowCallback
, lParam
);
530 return (((PIDHWNDPAIR
)lParam
)->hWnd
== NULL
);
534 HWND
GetDescendantWindow(int nID
) const
536 ATLASSERT(::IsWindow(m_hWnd
));
537 IDHWNDPAIR idHWndPair
;
538 idHWndPair
.nID
= nID
;
539 idHWndPair
.hWnd
= NULL
;
540 ::EnumChildWindows(m_hWnd
, &GetDescendantWindowCallback
, (LPARAM
)&idHWndPair
);
541 return idHWndPair
.hWnd
;
544 HRESULT
GetDlgControl(int nID
, REFIID iid
, void** ppCtrl
)
546 ATLASSERT(::IsWindow(m_hWnd
));
547 return E_FAIL
;//FIXME stub
550 int GetDlgCtrlID() const
552 ATLASSERT(::IsWindow(m_hWnd
));
553 return ::GetDlgCtrlID(m_hWnd
);
556 HRESULT
GetDlgHost(int nID
, REFIID iid
, void** ppHost
)
558 ATLASSERT(::IsWindow(m_hWnd
));
559 return E_FAIL
;//FIXME stub
562 HWND
GetDlgItem(int nID
)
564 ATLASSERT(::IsWindow(m_hWnd
));
565 return ::GetDlgItem(m_hWnd
, nID
);
568 UINT
GetDlgItemInt(int nID
, BOOL
* lpTrans
= NULL
, BOOL bSigned
= TRUE
) const
570 ATLASSERT(::IsWindow(m_hWnd
));
571 return ::GetDlgItemInt(m_hWnd
, nID
, lpTrans
, bSigned
);
574 UINT
GetDlgItemText(int nID
, LPTSTR lpStr
, int nMaxCount
) const
576 ATLASSERT(::IsWindow(m_hWnd
));
577 return ::GetDlgItemText(m_hWnd
, nID
, lpStr
, nMaxCount
);
581 UINT
GetDlgItemText(int nID
, CSimpleString
& string
)
583 HWND item
= GetDlgItem(nID
);
584 int len
= ::GetWindowTextLength(item
);
585 len
= GetDlgItemText(nID
, string
.GetBuffer(len
+1), len
+1);
586 string
.ReleaseBuffer(len
);
591 BOOL
GetDlgItemText(int nID
, BSTR
& bstrText
) const
593 ATLASSERT(::IsWindow(m_hWnd
));
594 return FALSE
;//FIXME stub
597 DWORD
GetExStyle() const
599 ATLASSERT(::IsWindow(m_hWnd
));
600 return ::GetWindowLong(m_hWnd
, GWL_EXSTYLE
);
603 HFONT
GetFont() const
605 ATLASSERT(::IsWindow(m_hWnd
));
606 return (HFONT
)::SendMessage(m_hWnd
, WM_GETFONT
, 0, 0);
609 DWORD
GetHotKey() const
611 ATLASSERT(::IsWindow(m_hWnd
));
612 return (DWORD
)::SendMessage(m_hWnd
, WM_GETHOTKEY
, 0, 0);
615 HICON
GetIcon(BOOL bBigIcon
= TRUE
) const
617 ATLASSERT(::IsWindow(m_hWnd
));
618 return (HICON
)::SendMessage(m_hWnd
, WM_GETICON
, (WPARAM
)bBigIcon
, 0);
621 HWND
GetLastActivePopup() const
623 ATLASSERT(::IsWindow(m_hWnd
));
624 return ::GetLastActivePopup(m_hWnd
);
627 HMENU
GetMenu() const
629 ATLASSERT(::IsWindow(m_hWnd
));
630 return ::GetMenu(m_hWnd
);
633 HWND
GetNextDlgGroupItem(HWND hWndCtl
, BOOL bPrevious
= FALSE
) const
635 ATLASSERT(::IsWindow(m_hWnd
));
636 return ::GetNextDlgGroupItem(m_hWnd
, hWndCtl
, bPrevious
);
639 HWND
GetNextDlgTabItem(HWND hWndCtl
, BOOL bPrevious
= FALSE
) const
641 ATLASSERT(::IsWindow(m_hWnd
));
642 return ::GetNextDlgTabItem(m_hWnd
, hWndCtl
, bPrevious
);
645 CWindow
GetParent() const
647 ATLASSERT(::IsWindow(m_hWnd
));
648 return CWindow(::GetParent(m_hWnd
));
651 BOOL
GetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
)
653 ATLASSERT(::IsWindow(m_hWnd
));
654 return ::GetScrollInfo(m_hWnd
, nBar
, lpScrollInfo
);
657 BOOL
GetScrollPos(int nBar
)
659 ATLASSERT(::IsWindow(m_hWnd
));
660 return ::GetScrollPos(m_hWnd
, nBar
);
663 BOOL
GetScrollRange(int nBar
, LPINT lpMinPos
, LPINT lpMaxPos
) const
665 ATLASSERT(::IsWindow(m_hWnd
));
666 return ::GetScrollRange(m_hWnd
, nBar
, lpMinPos
, lpMaxPos
);
669 DWORD
GetStyle() const
671 ATLASSERT(::IsWindow(m_hWnd
));
672 return ::GetWindowLong(m_hWnd
, GWL_STYLE
);
675 HMENU
GetSystemMenu(BOOL bRevert
)
677 ATLASSERT(::IsWindow(m_hWnd
));
678 return ::GetSystemMenu(m_hWnd
, bRevert
);
681 HWND
GetTopLevelParent() const
683 ATLASSERT(::IsWindow(m_hWnd
));
684 return NULL
;//FIXME stub
687 HWND
GetTopLevelWindow() const
689 ATLASSERT(::IsWindow(m_hWnd
));
690 return NULL
;//FIXME stub
693 HWND
GetTopWindow() const
695 ATLASSERT(::IsWindow(m_hWnd
));
696 return ::GetTopWindow(m_hWnd
);
699 BOOL
GetUpdateRect(LPRECT lpRect
, BOOL bErase
= FALSE
)
701 ATLASSERT(::IsWindow(m_hWnd
));
702 return ::GetUpdateRect(m_hWnd
, lpRect
, bErase
);
705 int GetUpdateRgn(HRGN hRgn
, BOOL bErase
= FALSE
)
707 ATLASSERT(::IsWindow(m_hWnd
));
708 return :: GetUpdateRgn(m_hWnd
, hRgn
, bErase
);
711 HWND
GetWindow(UINT nCmd
) const
713 ATLASSERT(::IsWindow(m_hWnd
));
714 return ::GetWindow(m_hWnd
, nCmd
);
717 DWORD
GetWindowContextHelpId() const
719 ATLASSERT(::IsWindow(m_hWnd
));
720 return ::GetWindowContextHelpId(m_hWnd
);
725 ATLASSERT(::IsWindow(m_hWnd
));
726 return ::GetWindowDC(m_hWnd
);
729 LONG
GetWindowLong(int nIndex
) const
731 ATLASSERT(::IsWindow(m_hWnd
));
732 return ::GetWindowLong(m_hWnd
, nIndex
);
735 LONG_PTR
GetWindowLongPtr(int nIndex
) const
737 ATLASSERT(::IsWindow(m_hWnd
));
738 return ::GetWindowLongPtr(m_hWnd
, nIndex
);
741 BOOL
GetWindowPlacement(WINDOWPLACEMENT
* lpwndpl
) const
743 ATLASSERT(::IsWindow(m_hWnd
));
744 return ::GetWindowPlacement(m_hWnd
, lpwndpl
);
747 DWORD
GetWindowProcessID()
749 ATLASSERT(::IsWindow(m_hWnd
));
751 ::GetWindowThreadProcessId(m_hWnd
, &processID
);
755 BOOL
GetWindowRect(LPRECT lpRect
) const
757 ATLASSERT(::IsWindow(m_hWnd
));
758 return ::GetWindowRect(m_hWnd
, lpRect
);
761 int GetWindowRgn(HRGN hRgn
)
763 ATLASSERT(::IsWindow(m_hWnd
));
764 return ::GetWindowRgn(m_hWnd
, hRgn
);
767 int GetWindowText(LPTSTR lpszStringBuf
, int nMaxCount
) const
769 ATLASSERT(::IsWindow(m_hWnd
));
770 return ::GetWindowText(m_hWnd
, lpszStringBuf
, nMaxCount
);
773 BOOL
GetWindowText(BSTR
& bstrText
)
775 ATLASSERT(::IsWindow(m_hWnd
));
776 int length
= ::GetWindowTextLength(m_hWnd
);
777 if (!SysReAllocStringLen(&bstrText
, NULL
, length
))
779 ::GetWindowText(m_hWnd
, (LPTSTR
)&bstrText
[2], length
);
783 int GetWindowTextLength() const
785 ATLASSERT(::IsWindow(m_hWnd
));
786 return ::GetWindowTextLength(m_hWnd
);
789 DWORD
GetWindowThreadID()
791 ATLASSERT(::IsWindow(m_hWnd
));
792 return ::GetWindowThreadProcessId(m_hWnd
, NULL
);
795 WORD
GetWindowWord(int nIndex
) const
797 ATLASSERT(::IsWindow(m_hWnd
));
798 return (WORD
)::GetWindowLong(m_hWnd
, nIndex
);
801 void GotoDlgCtrl(HWND hWndCtrl
) const
803 ATLASSERT(::IsWindow(m_hWnd
));
804 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 0, 0);
809 ATLASSERT(::IsWindow(m_hWnd
));
810 return ::HideCaret(m_hWnd
);
813 BOOL
HiliteMenuItem(HMENU hMenu
, UINT uHiliteItem
, UINT uHilite
)
815 ATLASSERT(::IsWindow(m_hWnd
));
816 return ::HiliteMenuItem(m_hWnd
, hMenu
, uHiliteItem
, uHilite
);
819 BOOL
Invalidate(BOOL bErase
= TRUE
)
821 ATLASSERT(::IsWindow(m_hWnd
));
822 return ::InvalidateRect(m_hWnd
, NULL
, bErase
);
825 BOOL
InvalidateRect(LPCRECT lpRect
, BOOL bErase
= TRUE
)
827 ATLASSERT(::IsWindow(m_hWnd
));
828 return ::InvalidateRect(m_hWnd
, lpRect
, bErase
);
831 void InvalidateRgn(HRGN hRgn
, BOOL bErase
= TRUE
)
833 ATLASSERT(::IsWindow(m_hWnd
));
834 ::InvalidateRgn(m_hWnd
, hRgn
, bErase
);
837 BOOL
IsChild(const HWND hWnd
) const
839 ATLASSERT(::IsWindow(m_hWnd
));
840 return ::IsChild(m_hWnd
, hWnd
);
843 BOOL
IsDialogMessage(LPMSG lpMsg
)
845 ATLASSERT(::IsWindow(m_hWnd
));
846 return ::IsDialogMessage(m_hWnd
, lpMsg
);
849 UINT
IsDlgButtonChecked(int nIDButton
) const
851 ATLASSERT(::IsWindow(m_hWnd
));
852 return ::IsDlgButtonChecked(m_hWnd
, nIDButton
);
855 BOOL
IsIconic() const
857 ATLASSERT(::IsWindow(m_hWnd
));
858 return ::IsIconic(m_hWnd
);
861 BOOL
IsParentDialog()
863 ATLASSERT(::IsWindow(m_hWnd
));
865 if (!RealGetWindowClass(::GetParent(m_hWnd
), pszType
, sizeof(pszType
) / sizeof(pszType
[0])))
867 return !_tcscmp(pszType
, _T("#32770"));
870 BOOL
IsWindow() const
872 return ::IsWindow(m_hWnd
);
875 BOOL
IsWindowEnabled() const
877 ATLASSERT(::IsWindow(m_hWnd
));
878 return ::IsWindowEnabled(m_hWnd
);
881 BOOL
IsWindowVisible() const
883 ATLASSERT(::IsWindow(m_hWnd
));
884 return ::IsWindowVisible(m_hWnd
);
887 BOOL
IsWindowUnicode()
889 ATLASSERT(::IsWindow(m_hWnd
));
890 return ::IsWindowUnicode(m_hWnd
);
893 BOOL
IsZoomed() const
895 ATLASSERT(::IsWindow(m_hWnd
));
896 return ::IsZoomed(m_hWnd
);
899 BOOL
KillTimer(UINT_PTR nIDEvent
)
901 ATLASSERT(::IsWindow(m_hWnd
));
902 return ::KillTimer(m_hWnd
, nIDEvent
);
905 BOOL
LockWindowUpdate(BOOL bLock
= TRUE
)
907 ATLASSERT(::IsWindow(m_hWnd
));
909 return ::LockWindowUpdate(m_hWnd
);
910 return ::LockWindowUpdate(NULL
);
913 int MapWindowPoints(HWND hWndTo
, LPPOINT lpPoint
, UINT nCount
) const
915 ATLASSERT(::IsWindow(m_hWnd
));
916 return ::MapWindowPoints(m_hWnd
, hWndTo
, lpPoint
, nCount
);
919 int MapWindowPoints(HWND hWndTo
, LPRECT lpRect
) const
921 ATLASSERT(::IsWindow(m_hWnd
));
922 return ::MapWindowPoints(m_hWnd
, hWndTo
, (LPPOINT
)lpRect
, sizeof(RECT
) / sizeof(POINT
));
925 int MessageBox(LPCTSTR lpszText
, LPCTSTR lpszCaption
= NULL
, UINT nType
= MB_OK
)
927 ATLASSERT(::IsWindow(m_hWnd
));
928 return ::MessageBox(m_hWnd
, lpszText
, lpszCaption
, nType
);
931 BOOL
ModifyStyle(DWORD dwRemove
, DWORD dwAdd
, UINT nFlags
= 0)
933 ATLASSERT(::IsWindow(m_hWnd
));
934 ::SetWindowLong(m_hWnd
, GWL_STYLE
, (::GetWindowLong(m_hWnd
, GWL_STYLE
) & ~dwRemove
) | dwAdd
);
936 return ::SetWindowPos(m_hWnd
, NULL
, 0, 0, 0, 0, nFlags
| SWP_NOSIZE
| SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
940 BOOL
ModifyStyleEx(DWORD dwRemove
, DWORD dwAdd
, UINT nFlags
= 0)
942 ATLASSERT(::IsWindow(m_hWnd
));
943 ::SetWindowLong(m_hWnd
, GWL_EXSTYLE
, (::GetWindowLong(m_hWnd
, GWL_EXSTYLE
) & ~dwRemove
) | dwAdd
);
945 return ::SetWindowPos(m_hWnd
, NULL
, 0, 0, 0, 0, nFlags
| SWP_NOSIZE
| SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
);
949 BOOL
MoveWindow(int x
, int y
, int nWidth
, int nHeight
, BOOL bRepaint
= TRUE
)
951 ATLASSERT(::IsWindow(m_hWnd
));
952 return ::MoveWindow(m_hWnd
, x
, y
, nWidth
, nHeight
, bRepaint
);
955 void NextDlgCtrl() const
957 ATLASSERT(::IsWindow(m_hWnd
));
958 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 0, 0);
963 ATLASSERT(::IsWindow(m_hWnd
));
964 return ::OpenClipboard(m_hWnd
);
967 BOOL
PostMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
969 ATLASSERT(::IsWindow(m_hWnd
));
970 return ::PostMessage(m_hWnd
, message
, wParam
, lParam
);
973 void PrevDlgCtrl() const
975 ATLASSERT(::IsWindow(m_hWnd
));
976 ::SendMessage(m_hWnd
, WM_NEXTDLGCTL
, 1, 0);
979 void Print(HDC hDC
, DWORD dwFlags
) const
981 ATLASSERT(::IsWindow(m_hWnd
));
982 ::SendMessage(m_hWnd
, WM_PRINT
, (WPARAM
)hDC
, (LPARAM
)dwFlags
);
985 void PrintClient(HDC hDC
, DWORD dwFlags
) const
987 ATLASSERT(::IsWindow(m_hWnd
));
988 ::SendMessage(m_hWnd
, WM_PRINTCLIENT
, (WPARAM
)hDC
, (LPARAM
)dwFlags
);
991 BOOL
RedrawWindow(LPCRECT lpRectUpdate
= NULL
, HRGN hRgnUpdate
= NULL
, UINT flags
= RDW_INVALIDATE
| RDW_UPDATENOW
| RDW_ERASE
)
993 ATLASSERT(::IsWindow(m_hWnd
));
994 return ::RedrawWindow(m_hWnd
, lpRectUpdate
, hRgnUpdate
, flags
);
997 int ReleaseDC(HDC hDC
)
999 ATLASSERT(::IsWindow(m_hWnd
));
1000 return ::ReleaseDC(m_hWnd
, hDC
);
1003 BOOL
ResizeClient(int nWidth
, int nHeight
, BOOL bRedraw
= FALSE
)
1005 ATLASSERT(::IsWindow(m_hWnd
));
1006 RECT clientRect
, wndRect
;
1007 ::GetClientRect(m_hWnd
, &clientRect
);
1008 ::GetWindowRect(m_hWnd
, &wndRect
);
1009 return ::MoveWindow(m_hWnd
, wndRect
.left
, wndRect
.top
,
1010 nWidth
+ (wndRect
.right
- wndRect
.left
) - (clientRect
.right
- clientRect
.left
),
1011 nHeight
+ (wndRect
.bottom
- wndRect
.top
) - (clientRect
.bottom
- clientRect
.top
),
1015 BOOL
ScreenToClient(LPPOINT lpPoint
) const
1017 ATLASSERT(::IsWindow(m_hWnd
));
1018 return ::ScreenToClient(m_hWnd
, lpPoint
);
1021 BOOL
ScrollWindow(int xAmount
, int yAmount
, LPCRECT lpRect
= NULL
, LPCRECT lpClipRect
= NULL
)
1023 ATLASSERT(::IsWindow(m_hWnd
));
1024 return ::ScrollWindow(m_hWnd
, xAmount
, yAmount
, lpRect
, lpClipRect
);
1027 int ScrollWindowEx(int dx
, int dy
, LPCRECT lpRectScroll
, LPCRECT lpRectClip
, HRGN hRgnUpdate
, LPRECT lpRectUpdate
, UINT flags
)
1029 ATLASSERT(::IsWindow(m_hWnd
));
1030 return ::ScrollWindowEx(m_hWnd
, dx
, dy
, lpRectScroll
, lpRectClip
, hRgnUpdate
, lpRectUpdate
, flags
);
1033 LRESULT
SendDlgItemMessage(int nID
, UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1035 ATLASSERT(::IsWindow(m_hWnd
));
1036 return ::SendDlgItemMessage(m_hWnd
, nID
, message
, wParam
, lParam
);
1039 LRESULT
SendMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1041 ATLASSERT(::IsWindow(m_hWnd
));
1042 return ::SendMessage(m_hWnd
, message
, wParam
, lParam
);
1045 static LRESULT
SendMessage(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1047 ATLASSERT(::IsWindow(hWnd
));
1048 return ::SendMessage(hWnd
, message
, wParam
, lParam
);
1052 static BOOL CALLBACK
SendMessageToDescendantsCallback(HWND hWnd
, LPARAM lParam
)
1054 ::SendMessage(hWnd
, ((LPMSG
)lParam
)->message
, ((LPMSG
)lParam
)->wParam
, ((LPMSG
)lParam
)->lParam
);
1058 static BOOL CALLBACK
SendMessageToDescendantsCallbackDeep(HWND hWnd
, LPARAM lParam
)
1060 ::SendMessage(hWnd
, ((LPMSG
)lParam
)->message
, ((LPMSG
)lParam
)->wParam
, ((LPMSG
)lParam
)->lParam
);
1061 ::EnumChildWindows(hWnd
, &SendMessageToDescendantsCallbackDeep
, lParam
);
1066 void SendMessageToDescendants(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0, BOOL bDeep
= TRUE
)
1068 ATLASSERT(::IsWindow(m_hWnd
));
1070 msg
.message
= message
;
1071 msg
.wParam
= wParam
;
1072 msg
.lParam
= lParam
;
1074 ::EnumChildWindows(m_hWnd
, &SendMessageToDescendantsCallback
, (LPARAM
)&msg
);
1076 ::EnumChildWindows(m_hWnd
, &SendMessageToDescendantsCallbackDeep
, (LPARAM
)&msg
);
1079 BOOL
SendNotifyMessage(UINT message
, WPARAM wParam
= 0, LPARAM lParam
= 0)
1081 ATLASSERT(::IsWindow(m_hWnd
));
1082 return ::SendNotifyMessage(m_hWnd
, message
, wParam
, lParam
);
1085 HWND
SetActiveWindow()
1087 ATLASSERT(::IsWindow(m_hWnd
));
1088 return ::SetActiveWindow(m_hWnd
);
1093 ATLASSERT(::IsWindow(m_hWnd
));
1094 return ::SetCapture(m_hWnd
);
1097 HWND
SetClipboardViewer()
1099 ATLASSERT(::IsWindow(m_hWnd
));
1100 return ::SetClipboardViewer(m_hWnd
);
1103 int SetDlgCtrlID(int nID
)
1105 ATLASSERT(::IsWindow(m_hWnd
));
1106 return ::SetWindowLong(m_hWnd
, GWL_ID
, nID
);
1109 BOOL
SetDlgItemInt(int nID
, UINT nValue
, BOOL bSigned
= TRUE
)
1111 ATLASSERT(::IsWindow(m_hWnd
));
1112 return ::SetDlgItemInt(m_hWnd
, nID
, nValue
, bSigned
);
1115 BOOL
SetDlgItemText(int nID
, LPCTSTR lpszString
)
1117 ATLASSERT(::IsWindow(m_hWnd
));
1118 return ::SetDlgItemText(m_hWnd
, nID
, lpszString
);
1123 ATLASSERT(::IsWindow(m_hWnd
));
1124 return ::SetFocus(m_hWnd
);
1127 void SetFont(HFONT hFont
, BOOL bRedraw
= TRUE
)
1129 ATLASSERT(::IsWindow(m_hWnd
));
1130 ::SendMessage(m_hWnd
, WM_SETFONT
, (WPARAM
)hFont
, (LPARAM
)bRedraw
);
1133 int SetHotKey(WORD wVirtualKeyCode
, WORD wModifiers
)
1135 ATLASSERT(::IsWindow(m_hWnd
));
1136 return ::SendMessage(m_hWnd
, WM_SETHOTKEY
, MAKEWPARAM(wVirtualKeyCode
, wModifiers
), 0);
1139 HICON
SetIcon(HICON hIcon
, BOOL bBigIcon
= TRUE
)
1141 ATLASSERT(::IsWindow(m_hWnd
));
1142 return (HICON
)::SendMessage(m_hWnd
, WM_SETICON
, (WPARAM
)bBigIcon
, (LPARAM
)hIcon
);
1145 BOOL
SetMenu(HMENU hMenu
)
1147 ATLASSERT(::IsWindow(m_hWnd
));
1148 return ::SetMenu(m_hWnd
, hMenu
);
1151 HWND
SetParent(HWND hWndNewParent
)
1153 ATLASSERT(::IsWindow(m_hWnd
));
1154 return ::SetParent(m_hWnd
, hWndNewParent
);
1157 void SetRedraw(BOOL bRedraw
= TRUE
)
1159 ATLASSERT(::IsWindow(m_hWnd
));
1160 ::SendMessage(m_hWnd
, WM_SETREDRAW
, (WPARAM
)bRedraw
, 0);
1163 int SetScrollInfo(int nBar
, LPSCROLLINFO lpScrollInfo
, BOOL bRedraw
= TRUE
)
1165 ATLASSERT(::IsWindow(m_hWnd
));
1166 return ::SetScrollInfo(m_hWnd
, nBar
, lpScrollInfo
, bRedraw
);
1169 int SetScrollPos(int nBar
, int nPos
, BOOL bRedraw
= TRUE
)
1171 ATLASSERT(::IsWindow(m_hWnd
));
1172 return ::SetScrollPos(m_hWnd
, nBar
, nPos
, bRedraw
);
1175 BOOL
SetScrollRange(int nBar
, int nMinPos
, int nMaxPos
, BOOL bRedraw
= TRUE
)
1177 ATLASSERT(::IsWindow(m_hWnd
));
1178 return ::SetScrollRange(m_hWnd
, nBar
, nMinPos
, nMaxPos
, bRedraw
);
1181 UINT_PTR
SetTimer(UINT_PTR nIDEvent
, UINT nElapse
, void (CALLBACK
*lpfnTimer
)(HWND
, UINT
, UINT_PTR
, DWORD
) = NULL
)
1183 ATLASSERT(::IsWindow(m_hWnd
));
1184 return ::SetTimer(m_hWnd
, nIDEvent
, nElapse
, reinterpret_cast<TIMERPROC
>(lpfnTimer
));
1187 BOOL
SetWindowContextHelpId(DWORD dwContextHelpId
)
1189 ATLASSERT(::IsWindow(m_hWnd
));
1190 return ::SetWindowContextHelpId(m_hWnd
, dwContextHelpId
);
1193 LONG
SetWindowLong(int nIndex
, LONG dwNewLong
)
1195 ATLASSERT(::IsWindow(m_hWnd
));
1196 return ::SetWindowLong(m_hWnd
, nIndex
, dwNewLong
);
1199 LONG_PTR
SetWindowLongPtr(int nIndex
, LONG_PTR dwNewLong
)
1201 ATLASSERT(::IsWindow(m_hWnd
));
1202 return ::SetWindowLongPtr(m_hWnd
, nIndex
, dwNewLong
);
1205 BOOL
SetWindowPlacement(const WINDOWPLACEMENT
* lpwndpl
)
1207 ATLASSERT(::IsWindow(m_hWnd
));
1208 return ::SetWindowPlacement(m_hWnd
, lpwndpl
);
1211 BOOL
SetWindowPos(HWND hWndInsertAfter
, int x
, int y
, int cx
, int cy
, UINT nFlags
)
1213 ATLASSERT(::IsWindow(m_hWnd
));
1214 return ::SetWindowPos(m_hWnd
, hWndInsertAfter
, x
, y
, cx
, cy
, nFlags
);
1217 int SetWindowRgn(HRGN hRgn
, BOOL bRedraw
= FALSE
)
1219 ATLASSERT(::IsWindow(m_hWnd
));
1220 return ::SetWindowRgn(m_hWnd
, hRgn
, bRedraw
);
1223 BOOL
SetWindowText(LPCTSTR lpszString
)
1225 ATLASSERT(::IsWindow(m_hWnd
));
1226 return ::SetWindowText(m_hWnd
, lpszString
);
1229 WORD
SetWindowWord(int nIndex
, WORD wNewWord
)
1231 ATLASSERT(::IsWindow(m_hWnd
));
1233 return ::SetWindowLong(m_hWnd
, nIndex
- 2, MAKELONG(LOWORD(::GetWindowLong(m_hWnd
, nIndex
- 2)), wNewWord
));
1235 return ::SetWindowLong(m_hWnd
, nIndex
, MAKELONG(wNewWord
, HIWORD(::GetWindowLong(m_hWnd
, nIndex
))));
1240 ATLASSERT(::IsWindow(m_hWnd
));
1241 return ::ShowCaret(m_hWnd
);
1244 BOOL
ShowOwnedPopups(BOOL bShow
= TRUE
)
1246 ATLASSERT(::IsWindow(m_hWnd
));
1247 return ::ShowOwnedPopups(m_hWnd
, bShow
);
1250 BOOL
ShowScrollBar(UINT nBar
, BOOL bShow
= TRUE
)
1252 ATLASSERT(::IsWindow(m_hWnd
));
1253 return ::ShowScrollBar(m_hWnd
, nBar
, bShow
);
1256 BOOL
ShowWindow(int nCmdShow
)
1258 ATLASSERT(::IsWindow(m_hWnd
));
1259 return ::ShowWindow(m_hWnd
, nCmdShow
);
1262 BOOL
ShowWindowAsync(int nCmdShow
)
1264 ATLASSERT(::IsWindow(m_hWnd
));
1265 return ::ShowWindowAsync(m_hWnd
, nCmdShow
);
1270 ATLASSERT(::IsWindow(m_hWnd
));
1271 return ::UpdateWindow(m_hWnd
);
1274 BOOL
ValidateRect(LPCRECT lpRect
)
1276 ATLASSERT(::IsWindow(m_hWnd
));
1277 return ::ValidateRect(m_hWnd
, lpRect
);
1280 BOOL
ValidateRgn(HRGN hRgn
)
1282 ATLASSERT(::IsWindow(m_hWnd
));
1283 return ::ValidateRgn(m_hWnd
, hRgn
);
1286 BOOL
WinHelp(LPCTSTR lpszHelp
, UINT nCmd
= HELP_CONTEXT
, DWORD dwData
= 0)
1288 ATLASSERT(::IsWindow(m_hWnd
));
1289 return ::WinHelp(m_hWnd
, lpszHelp
, nCmd
, dwData
);
1293 __declspec(selectany
) RECT
CWindow::rcDefault
= { CW_USEDEFAULT
, CW_USEDEFAULT
, 0, 0 };
1295 template <class TBase
= CWindow
>
1296 class CWindowImplRoot
: public TBase
, public CMessageMap
1299 enum { WINSTATE_DESTROYED
= 0x00000001 };
1302 CWndProcThunk m_thunk
;
1303 const _ATL_MSG
*m_pCurrentMsg
;
1307 : m_pCurrentMsg(NULL
)
1312 virtual ~CWindowImplRoot()
1318 template <class TBase
= CWindow
>
1319 class CDialogImplBaseT
: public CWindowImplRoot
<TBase
>
1323 using CWindowImplRoot
<TBase
>::WINSTATE_DESTROYED
;
1326 virtual ~CDialogImplBaseT()
1329 virtual DLGPROC
GetDialogProc()
1334 static INT_PTR CALLBACK
StartDialogProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1336 CDialogImplBaseT
<TBase
> *pThis
;
1338 DLGPROC
GCCU(pOldProc
);
1340 pThis
= reinterpret_cast<CDialogImplBaseT
<TBase
>*>(_AtlWinModule
.ExtractCreateWndData());
1341 ATLASSERT(pThis
!= NULL
);
1344 pThis
->m_thunk
.Init((WNDPROC
)pThis
->GetDialogProc(), pThis
);
1345 newDlgProc
= reinterpret_cast<DLGPROC
>(pThis
->m_thunk
.GetWNDPROC());
1346 pOldProc
= reinterpret_cast<DLGPROC
>(::SetWindowLongPtr(hWnd
, DWLP_DLGPROC
, reinterpret_cast<LONG_PTR
>(newDlgProc
)));
1347 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1348 pThis
->m_hWnd
= hWnd
;
1349 return newDlgProc(hWnd
, uMsg
, wParam
, lParam
);
1352 static INT_PTR CALLBACK
DialogProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1354 CDialogImplBaseT
<TBase
> *pThis
= reinterpret_cast<CDialogImplBaseT
<TBase
>*>(hWnd
);
1355 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1356 LRESULT lResult
= 0;
1357 const _ATL_MSG
*previousMessage
;
1360 hWnd
= pThis
->m_hWnd
;
1361 previousMessage
= pThis
->m_pCurrentMsg
;
1362 pThis
->m_pCurrentMsg
= &msg
;
1364 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1365 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1369 if ((pThis
->m_dwState
& WINSTATE_DESTROYED
) == 0)
1371 ::SetWindowLongPtr(pThis
->m_hWnd
, DWLP_MSGRESULT
, lResult
);
1376 if (uMsg
== WM_NCDESTROY
)
1378 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1382 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1383 pThis
->m_pCurrentMsg
= previousMessage
;
1385 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1387 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1388 pThis
->m_hWnd
= NULL
;
1389 pThis
->OnFinalMessage(hWnd
);
1394 virtual void OnFinalMessage(HWND
)
1400 template <class T
, class TBase
= CWindow
>
1401 class CDialogImpl
: public CDialogImplBaseT
< TBase
>
1405 using CWindowImplRoot
<TBase
>::m_thunk
;
1406 using CWindowImplRoot
<TBase
>::m_hWnd
;
1409 HWND
Create(HWND hWndParent
, LPARAM dwInitParam
= NULL
)
1415 result
= m_thunk
.Init(NULL
, NULL
);
1416 if (result
== FALSE
)
1419 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1421 pImpl
= static_cast<T
*>(this);
1422 hWnd
= ::CreateDialogParam(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(pImpl
->IDD
), hWndParent
, T::StartDialogProc
, dwInitParam
);
1426 INT_PTR
DoModal(HWND hWndParent
= ::GetActiveWindow(), LPARAM dwInitParam
= NULL
)
1431 result
= m_thunk
.Init(NULL
, NULL
);
1432 if (result
== FALSE
)
1435 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1437 pImpl
= static_cast<T
*>(this);
1438 return ::DialogBoxParam(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(pImpl
->IDD
), hWndParent
, T::StartDialogProc
, dwInitParam
);
1441 BOOL
EndDialog(_In_
int nRetCode
)
1443 return ::EndDialog(m_hWnd
, nRetCode
);
1446 BOOL
DestroyWindow()
1448 return ::DestroyWindow(m_hWnd
);
1452 template <class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1453 class CWindowImplBaseT
: public CWindowImplRoot
<TBase
>
1457 using CWindowImplRoot
<TBase
>::WINSTATE_DESTROYED
;
1458 using CWindowImplRoot
<TBase
>::m_thunk
;
1461 WNDPROC m_pfnSuperWindowProc
;
1466 m_pfnSuperWindowProc
= ::DefWindowProc
;
1469 virtual void OnFinalMessage(HWND
/* hWnd */)
1473 BOOL
SubclassWindow(HWND hWnd
)
1475 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1476 WNDPROC newWindowProc
;
1477 WNDPROC oldWindowProc
;
1480 ATLASSERT(m_hWnd
== NULL
);
1481 ATLASSERT(::IsWindow(hWnd
));
1483 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
>*>(this);
1485 result
= m_thunk
.Init(GetWindowProc(), this);
1486 if (result
== FALSE
)
1488 newWindowProc
= m_thunk
.GetWNDPROC();
1489 oldWindowProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1490 if (oldWindowProc
== NULL
)
1492 m_pfnSuperWindowProc
= oldWindowProc
;
1493 pThis
->m_hWnd
= hWnd
;
1497 virtual WNDPROC
GetWindowProc()
1502 static DWORD
GetWndStyle(DWORD dwStyle
)
1504 return TWinTraits::GetWndStyle(dwStyle
);
1507 static DWORD
GetWndExStyle(DWORD dwExStyle
)
1509 return TWinTraits::GetWndExStyle(dwExStyle
);
1512 LRESULT
DefWindowProc(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1514 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1516 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
> *>(this);
1517 return ::CallWindowProc(m_pfnSuperWindowProc
, pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1520 static LRESULT CALLBACK
StartWindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1522 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1523 WNDPROC newWindowProc
;
1524 WNDPROC
GCCU(pOldProc
);
1526 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
> *>(_AtlWinModule
.ExtractCreateWndData());
1527 ATLASSERT(pThis
!= NULL
);
1530 pThis
->m_thunk
.Init(pThis
->GetWindowProc(), pThis
);
1531 newWindowProc
= pThis
->m_thunk
.GetWNDPROC();
1532 pOldProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1533 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1534 pThis
->m_hWnd
= hWnd
;
1535 return newWindowProc(hWnd
, uMsg
, wParam
, lParam
);
1538 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1540 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
= reinterpret_cast<CWindowImplBaseT
< TBase
, TWinTraits
> *>(hWnd
);
1541 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1543 const _ATL_MSG
*previousMessage
;
1545 LONG_PTR saveWindowProc
;
1547 ATLASSERT(pThis
!= NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) == 0 && pThis
->m_hWnd
!= NULL
);
1548 if (pThis
== NULL
|| (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0 || pThis
->m_hWnd
== NULL
)
1551 hWnd
= pThis
->m_hWnd
;
1552 previousMessage
= pThis
->m_pCurrentMsg
;
1553 pThis
->m_pCurrentMsg
= &msg
;
1555 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1556 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1558 if (handled
== FALSE
)
1560 if (uMsg
== WM_NCDESTROY
)
1562 saveWindowProc
= ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
);
1563 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1564 if (pThis
->m_pfnSuperWindowProc
!= ::DefWindowProc
&& saveWindowProc
== ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
))
1565 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(pThis
->m_pfnSuperWindowProc
));
1566 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1569 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1571 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1572 pThis
->m_pCurrentMsg
= previousMessage
;
1573 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1575 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1576 pThis
->m_hWnd
= NULL
;
1577 pThis
->OnFinalMessage(hWnd
);
1582 HWND
Create(HWND hWndParent
, _U_RECT rect
, LPCTSTR szWindowName
, DWORD dwStyle
, DWORD dwExStyle
,
1583 _U_MENUorID MenuOrID
, ATOM atom
, LPVOID lpCreateParam
)
1587 ATLASSERT(m_hWnd
== NULL
);
1588 ATLASSERT(atom
!= 0);
1591 if (m_thunk
.Init(NULL
, NULL
) == FALSE
)
1593 SetLastError(ERROR_OUTOFMEMORY
);
1597 _AtlWinModule
.AddCreateWndData(&m_thunk
.cd
, this);
1598 if (MenuOrID
.m_hMenu
== NULL
&& (dwStyle
& WS_CHILD
) != 0)
1599 MenuOrID
.m_hMenu
= (HMENU
)(UINT_PTR
)this;
1600 if (rect
.m_lpRect
== NULL
)
1601 rect
.m_lpRect
= &TBase::rcDefault
;
1602 hWnd
= ::CreateWindowEx(dwExStyle
, reinterpret_cast<LPCWSTR
>(MAKEINTATOM(atom
)), szWindowName
, dwStyle
, rect
.m_lpRect
->left
,
1603 rect
.m_lpRect
->top
, rect
.m_lpRect
->right
- rect
.m_lpRect
->left
, rect
.m_lpRect
->bottom
- rect
.m_lpRect
->top
,
1604 hWndParent
, MenuOrID
.m_hMenu
, _AtlBaseModule
.GetModuleInstance(), lpCreateParam
);
1606 ATLASSERT(m_hWnd
== hWnd
);
1613 template <class T
, class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1614 class CWindowImpl
: public CWindowImplBaseT
<TBase
, TWinTraits
>
1617 static LPCTSTR
GetWndCaption()
1622 HWND
Create(HWND hWndParent
, _U_RECT rect
= NULL
, LPCTSTR szWindowName
= NULL
, DWORD dwStyle
= 0,
1623 DWORD dwExStyle
= 0, _U_MENUorID MenuOrID
= 0U, LPVOID lpCreateParam
= NULL
)
1625 CWindowImplBaseT
<TBase
, TWinTraits
> *pThis
;
1628 ATLASSERT(m_hWnd
== NULL
);
1629 pThis
= reinterpret_cast<CWindowImplBaseT
<TBase
, TWinTraits
>*>(this);
1631 if (T::GetWndClassInfo().m_lpszOrigName
== NULL
)
1632 T::GetWndClassInfo().m_lpszOrigName
= pThis
->GetWndClassName();
1633 atom
= T::GetWndClassInfo().Register(&pThis
->m_pfnSuperWindowProc
);
1635 if (szWindowName
== NULL
)
1636 szWindowName
= T::GetWndCaption();
1637 dwStyle
= T::GetWndStyle(dwStyle
);
1638 dwExStyle
= T::GetWndExStyle(dwExStyle
);
1640 return CWindowImplBaseT
<TBase
, TWinTraits
>::Create(hWndParent
, rect
, szWindowName
, dwStyle
,
1641 dwExStyle
, MenuOrID
, atom
, lpCreateParam
);
1645 template <class TBase
= CWindow
, class TWinTraits
= CControlWinTraits
>
1646 class CContainedWindowT
: public TBase
1649 CWndProcThunk m_thunk
;
1650 LPCTSTR m_lpszClassName
;
1651 WNDPROC m_pfnSuperWindowProc
;
1652 CMessageMap
*m_pObject
;
1654 const _ATL_MSG
*m_pCurrentMsg
;
1656 CContainedWindowT(CMessageMap
*pObject
, DWORD dwMsgMapID
= 0)
1658 m_lpszClassName
= TBase::GetWndClassName();
1659 m_pfnSuperWindowProc
= ::DefWindowProc
;
1660 m_pObject
= pObject
;
1661 m_dwMsgMapID
= dwMsgMapID
;
1662 m_pCurrentMsg
= NULL
;
1665 CContainedWindowT(LPTSTR lpszClassName
, CMessageMap
*pObject
, DWORD dwMsgMapID
= 0)
1667 m_lpszClassName
= lpszClassName
;
1668 m_pfnSuperWindowProc
= ::DefWindowProc
;
1669 m_pObject
= pObject
;
1670 m_dwMsgMapID
= dwMsgMapID
;
1671 m_pCurrentMsg
= NULL
;
1674 LRESULT
DefWindowProc(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1676 return ::CallWindowProc(m_pfnSuperWindowProc
, this->m_hWnd
, uMsg
, wParam
, lParam
);
1679 BOOL
SubclassWindow(HWND hWnd
)
1681 CContainedWindowT
<TBase
> *pThis
;
1682 WNDPROC newWindowProc
;
1683 WNDPROC oldWindowProc
;
1686 ATLASSERT(m_hWnd
== NULL
);
1687 ATLASSERT(::IsWindow(hWnd
));
1689 pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(this);
1691 result
= m_thunk
.Init(WindowProc
, pThis
);
1692 if (result
== FALSE
)
1694 newWindowProc
= m_thunk
.GetWNDPROC();
1695 oldWindowProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1696 if (oldWindowProc
== NULL
)
1698 m_pfnSuperWindowProc
= oldWindowProc
;
1699 pThis
->m_hWnd
= hWnd
;
1703 static LRESULT CALLBACK
StartWindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1705 CContainedWindowT
<TBase
> *pThis
;
1706 WNDPROC newWindowProc
;
1707 WNDPROC
GCCU(pOldProc
);
1709 pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(_AtlWinModule
.ExtractCreateWndData());
1710 ATLASSERT(pThis
!= NULL
);
1713 pThis
->m_thunk
.Init(WindowProc
, pThis
);
1714 newWindowProc
= pThis
->m_thunk
.GetWNDPROC();
1715 pOldProc
= reinterpret_cast<WNDPROC
>(::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(newWindowProc
)));
1716 Unused(pOldProc
); // TODO: should generate trace message if overwriting another subclass
1717 pThis
->m_hWnd
= hWnd
;
1718 return newWindowProc(hWnd
, uMsg
, wParam
, lParam
);
1721 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1723 CContainedWindowT
<TBase
> *pThis
= reinterpret_cast<CContainedWindowT
<TBase
> *>(hWnd
);
1724 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1726 const _ATL_MSG
*previousMessage
;
1728 LONG_PTR saveWindowProc
;
1730 ATLASSERT(pThis
!= NULL
&& pThis
->m_hWnd
!= NULL
&& pThis
->m_pObject
!= NULL
);
1731 if (pThis
== NULL
|| pThis
->m_hWnd
== NULL
|| pThis
->m_pObject
== NULL
)
1734 hWnd
= pThis
->m_hWnd
;
1735 previousMessage
= pThis
->m_pCurrentMsg
;
1736 pThis
->m_pCurrentMsg
= &msg
;
1738 handled
= pThis
->m_pObject
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, pThis
->m_dwMsgMapID
);
1739 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1741 pThis
->m_pCurrentMsg
= previousMessage
;
1742 if (handled
== FALSE
)
1744 if (uMsg
== WM_NCDESTROY
)
1746 saveWindowProc
= ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
);
1747 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1748 if (pThis
->m_pfnSuperWindowProc
!= ::DefWindowProc
&& saveWindowProc
== ::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
))
1749 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, reinterpret_cast<LONG_PTR
>(pThis
->m_pfnSuperWindowProc
));
1750 pThis
->m_hWnd
= NULL
;
1753 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1759 typedef CContainedWindowT
<CWindow
> CContainedWindow
;
1761 #define BEGIN_MSG_MAP(theClass) \
1763 BOOL ProcessWindowMessage(HWND GCCU(hWnd), UINT GCCU(uMsg), WPARAM GCCU(wParam), LPARAM GCCU(lParam), LRESULT &GCCU(lResult), DWORD dwMsgMapID = 0) \
1765 BOOL GCCU(bHandled) = TRUE; \
1772 switch(dwMsgMapID) \
1776 #define ALT_MSG_MAP(map) \
1780 #define END_MSG_MAP() \
1789 #define MESSAGE_HANDLER(msg, func) \
1793 lResult = func(uMsg, wParam, lParam, bHandled); \
1798 #define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func) \
1799 if (uMsg >= msgFirst && uMsg <= msgLast) \
1802 lResult = func(uMsg, wParam, lParam, bHandled); \
1807 #define COMMAND_HANDLER(id, code, func) \
1808 if (uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \
1811 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1816 #define COMMAND_ID_HANDLER(id, func) \
1817 if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \
1820 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1825 #define COMMAND_CODE_HANDLER(code, func) \
1826 if (uMsg == WM_COMMAND && code == HIWORD(wParam)) \
1829 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1834 #define COMMAND_RANGE_HANDLER(idFirst, idLast, func) \
1835 if (uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \
1838 lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
1843 #define NOTIFY_CODE_HANDLER(cd, func) \
1844 if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \
1847 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
1852 #define NOTIFY_HANDLER(id, cd, func) \
1853 if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \
1856 lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
1861 #define CHAIN_MSG_MAP(theChainClass) \
1863 if (theChainClass::ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult)) \
1867 #define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \
1868 static ATL::CWndClassInfo& GetWndClassInfo() \
1870 static ATL::CWndClassInfo wc = \
1872 { sizeof(WNDCLASSEX), style, StartWindowProc, \
1873 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \
1874 NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \
1879 struct _ATL_WNDCLASSINFOW
1882 LPCWSTR m_lpszOrigName
;
1884 LPCWSTR m_lpszCursorID
;
1885 BOOL m_bSystemCursor
;
1887 WCHAR m_szAutoName
[5 + sizeof(void *)];
1889 ATOM
Register(WNDPROC
*p
)
1891 if (m_wc
.hInstance
== NULL
)
1892 m_wc
.hInstance
= _AtlBaseModule
.GetModuleInstance();
1895 if (m_bSystemCursor
)
1896 m_wc
.hCursor
= ::LoadCursor(NULL
, m_lpszCursorID
);
1898 m_wc
.hCursor
= ::LoadCursor(_AtlBaseModule
.GetResourceInstance(), m_lpszCursorID
);
1900 m_atom
= RegisterClassEx(&m_wc
);
1909 #pragma pop_macro("SubclassWindow")