|
|
/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
cwcreate.cpp
Abstract:
This module contains the code for the new window architecture.
--*/
#include "precomp.hxx"
#pragma hdrstop
HWND New_CreateWindow( HWND hwndParent, WIN_TYPES Type, UINT uClassId, UINT uWinTitle, PRECT pRect ) /*++
Description Generic rotuine to create a child window.
Arguments hwndParent - handle to parent window uClassId - resource string ID containing class name uWinTitle - resource string ID containing window title pRect - Rect describing the position of the window. If NULL, CW_USEDEFAULT is used to specify the location of the window.
--*/ { TCHAR szClassName[MAX_MSG_TXT]; TCHAR szWinTitle[MAX_MSG_TXT]; int nX = CW_USEDEFAULT; int nY = CW_USEDEFAULT; int nWidth = CW_USEDEFAULT; int nHeight = CW_USEDEFAULT; COMMONWIN_CREATE_DATA Data;
if (pRect) { nX = pRect->left; nY = pRect->top; nWidth = pRect->right; nHeight = pRect->bottom; }
// get class name and tile
Dbg(LoadString(g_hInst, uClassId, szClassName, _tsizeof(szClassName))); Dbg(LoadString(g_hInst, uWinTitle, szWinTitle, _tsizeof(szWinTitle)));
Data.Type = Type;
BOOL TopMax; MDIGetActive(g_hwndMDIClient, &TopMax); HWND Win = CreateWindowEx( WS_EX_MDICHILD | WS_EX_CONTROLPARENT, // Extended style
szClassName, // class name
szWinTitle, // title
WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW | WS_VISIBLE | (TopMax ? WS_MAXIMIZE : 0), // style
nX, // x
nY, // y
nWidth, // width
nHeight, // height
hwndParent, // parent
NULL, // menu
g_hInst, // hInstance
&Data // user defined data
);
// Creation is considered an automatic operation in
// order to distinguish things occuring during creation
// from normal user operations. Now that create is
// finished, decrement to indicate the create op is over.
if (Win != NULL) { COMMONWIN_DATA* CmnWin = GetCommonWinData(Win); if (CmnWin != NULL) { CmnWin->m_InAutoOp--; } }
return Win; }
HWND NewWatch_CreateWindow( HWND hwndParent ) { return New_CreateWindow(hwndParent, WATCH_WINDOW, SYS_CommonWin_wClass, SYS_WatchWin_Title, NULL ); }
HWND NewLocals_CreateWindow( HWND hwndParent ) { return New_CreateWindow(hwndParent, LOCALS_WINDOW, SYS_CommonWin_wClass, SYS_LocalsWin_Title, NULL ); }
HWND NewDisasm_CreateWindow( HWND hwndParent ) { RECT Rect;
SetRect(&Rect, CW_USEDEFAULT, CW_USEDEFAULT, DISASM_WIDTH, DISASM_HEIGHT); return New_CreateWindow(hwndParent, DISASM_WINDOW, SYS_CommonWin_wClass, SYS_DisasmWin_Title, &Rect ); }
HWND NewQuickWatch_CreateWindow( HWND hwndParent ) { return New_CreateWindow(hwndParent, QUICKW_WINDOW, SYS_CommonWin_wClass, SYS_QuickWatchWin_Title, NULL ); }
HWND NewMemory_CreateWindow( HWND hwndParent ) { return New_CreateWindow(hwndParent, MEM_WINDOW, SYS_CommonWin_wClass, SYS_MemoryWin_Title, NULL ); }
HWND NewCalls_CreateWindow( HWND hwndParent ) { RECT Rect; SetRect(&Rect, CW_USEDEFAULT, CW_USEDEFAULT, CALLS_WIDTH, CALLS_HEIGHT); return New_CreateWindow(hwndParent, CALLS_WINDOW, SYS_CommonWin_wClass, SYS_CallsWin_Title, &Rect ); }
HWND NewCmd_CreateWindow( HWND hwndParent ) { RECT Rect;
SetRect(&Rect, CW_USEDEFAULT, CW_USEDEFAULT, CMD_WIDTH, CMD_HEIGHT); return New_CreateWindow(hwndParent, CMD_WINDOW, SYS_CommonWin_wClass, SYS_CmdWin_Title, &Rect ); }
HWND NewCpu_CreateWindow( HWND hwndParent ) { RECT Rect;
SetRect(&Rect, CW_USEDEFAULT, CW_USEDEFAULT, g_Ptr64 ? CPU_WIDTH_64 : CPU_WIDTH_32, CPU_HEIGHT); return New_CreateWindow(hwndParent, CPU_WINDOW, SYS_CommonWin_wClass, SYS_CpuWin_Title, &Rect ); }
HWND NewDoc_CreateWindow( HWND hwndParent ) /*++
Routine Description:
Create the command window.
Arguments:
hwndParent - The parent window to the command window. In an MDI document, this is usually the handle to the MDI client window: g_hwndMDIClient
Return Value:
If successful, creates a valid window handle to the new command window.
NULL if the window was not created.
--*/ { RECT Rect;
// Set default geometry.
SetRect(&Rect, CW_USEDEFAULT, CW_USEDEFAULT, DOC_WIDTH, DOC_HEIGHT); if (g_WinOptions & WOPT_OVERLAY_SOURCE) { PLIST_ENTRY Entry; PCOMMONWIN_DATA WinData; // If we're stacking up document windows go
// find the first one and use it as a template.
for (Entry = g_ActiveWin.Flink; Entry != &g_ActiveWin; Entry = Entry->Flink) { WinData = ACTIVE_WIN_ENTRY(Entry); if (WinData->m_enumType == DOC_WINDOW && !IsIconic(WinData->m_Win)) { GetWindowRect(WinData->m_Win, &Rect); MapWindowPoints(GetDesktopWindow(), g_hwndMDIClient, (LPPOINT)&Rect, 2); Rect.right -= Rect.left; Rect.bottom -= Rect.top; } } }
return New_CreateWindow(hwndParent, DOC_WINDOW, SYS_CommonWin_wClass, SYS_DocWin_Title, &Rect ); }
HWND NewScratch_CreateWindow( HWND hwndParent ) { return New_CreateWindow(hwndParent, SCRATCH_PAD_WINDOW, SYS_CommonWin_wClass, SYS_Scratch_Pad_Title, NULL ); }
HWND NewProcessThread_CreateWindow( HWND hwndParent ) { return New_CreateWindow(hwndParent, PROCESS_THREAD_WINDOW, SYS_CommonWin_wClass, SYS_Process_Thread_Title, NULL ); }
HWND New_OpenDebugWindow( WIN_TYPES winType, BOOL bUserActivated, ULONG Nth ) /*++
Routine Description:
Opens Cpu, Watch, Locals, Calls, or Memory Window under MDI Handles special case for memory win's
Arguments:
winType - Supplies Type of debug window to be openned bUserActivated - Indicates whether this action was initiated by the user or by windbg. The value is to determine the Z order of any windows that are opened.
Return Value:
Window handle.
NULL if an error occurs.
--*/ { HWND hwndActivate = NULL; PCOMMONWIN_DATA CmnWin;
switch (winType) { default: Assert(!_T("Invalid window type. Ignorable error.")); break;
case CMD_WINDOW: if (GetCmdHwnd()) { hwndActivate = GetCmdHwnd(); } else { return NewCmd_CreateWindow(g_hwndMDIClient); } break;
case WATCH_WINDOW: if (GetWatchHwnd()) { hwndActivate = GetWatchHwnd(); } else { return NewWatch_CreateWindow(g_hwndMDIClient); } break;
case LOCALS_WINDOW: if (GetLocalsHwnd()) { hwndActivate = GetLocalsHwnd(); } else { return NewLocals_CreateWindow(g_hwndMDIClient); } break;
case CPU_WINDOW: if (GetCpuHwnd()) { hwndActivate = GetCpuHwnd(); } else { return NewCpu_CreateWindow(g_hwndMDIClient); } break;
case SCRATCH_PAD_WINDOW: if (GetScratchHwnd()) { hwndActivate = GetScratchHwnd(); } else { return NewScratch_CreateWindow(g_hwndMDIClient); } break;
case DISASM_WINDOW: if (!bUserActivated && GetSrcMode_StatusBar() && NULL == GetDisasmHwnd() && (g_WinOptions & WOPT_AUTO_DISASM) == 0) { return NULL; }
if (GetDisasmHwnd()) { hwndActivate = GetDisasmHwnd(); } else { return NewDisasm_CreateWindow(g_hwndMDIClient); } break;
case MEM_WINDOW: // Memory windows normally open a fresh window
// whenever an open request occurs, but when applying
// workspaces we don't want to continually add
// new memory windows. In the workspace case we
// reuse existing memory windows as much as possible.
if (Nth != NTH_OPEN_ALWAYS && (CmnWin = FindNthWindow(Nth, 1 << winType)) != NULL) { hwndActivate = CmnWin->m_Win; break; } hwndActivate = NewMemory_CreateWindow(g_hwndMDIClient); if (hwndActivate) { MEMWIN_DATA * pMemWinData = GetMemWinData(hwndActivate); Assert(pMemWinData);
// If this window is being created from a workspace
// don't pop up the properties dialog.
if ( Nth == NTH_OPEN_ALWAYS && pMemWinData->HasEditableProperties() ) { pMemWinData->EditProperties(); pMemWinData->UiRequestRead(); } } break;
case DOC_WINDOW: return NewDoc_CreateWindow(g_hwndMDIClient);
case QUICKW_WINDOW: if (GetQuickWatchHwnd()) { hwndActivate = GetQuickWatchHwnd(); } else { return NewQuickWatch_CreateWindow(g_hwndMDIClient); } break;
case CALLS_WINDOW: if (GetCallsHwnd()) { hwndActivate = GetCallsHwnd(); } else { return NewCalls_CreateWindow(g_hwndMDIClient); } break; case PROCESS_THREAD_WINDOW: if (GetProcessThreadHwnd()) { hwndActivate = GetProcessThreadHwnd(); } else { return NewProcessThread_CreateWindow(g_hwndMDIClient); } break; }
if (hwndActivate) { if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) >= 0) { SendMessage(g_hwndMDIClient, WM_MDIDESTROY, (WPARAM)hwndActivate, 0); } else { if (IsIconic(hwndActivate)) { OpenIcon(hwndActivate); } ActivateMDIChild(hwndActivate, bUserActivated); } }
return hwndActivate; }
|