Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

940 lines
24 KiB

// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "mditest.h"
#include "rgn.h"
#include "MainFrm.h"
#include "NCMetricsDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TESTFLAG(bits,flag) (((bits) & (flag))!=0)
void TestRgnData();
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_GETMINMAXINFO()
ON_COMMAND(ID_FULLSCRNMAXIMIZED, OnFullScrnMaximized)
ON_UPDATE_COMMAND_UI(ID_FULLSCRNMAXIMIZED, OnUpdateFullScrnMaximized)
ON_COMMAND(ID_AWRWINDOW, OnAwrWindow)
ON_COMMAND(ID_AWRWINDOWMENU, OnAwrWindowMenu)
ON_COMMAND(ID_NONCLIENTMETRICS, OnNonClientMetrics)
ON_COMMAND(ID_THINFRAME, OnThinFrame)
ON_COMMAND(ID_DUMPMETRICS, OnDumpMetrics)
ON_COMMAND(ID_MINIMIZEBOX, OnMinimizeBox)
ON_UPDATE_COMMAND_UI(ID_MINIMIZEBOX, OnUpdateMinimizeBox)
ON_COMMAND(ID_MAXIMIZEBOX, OnMaximizeBox)
ON_UPDATE_COMMAND_UI(ID_MAXIMIZEBOX, OnUpdateMaximizeBox)
ON_COMMAND(ID_SYSMENU, OnSysMenu)
ON_UPDATE_COMMAND_UI(ID_SYSMENU, OnUpdateSysMenu)
ON_UPDATE_COMMAND_UI(ID_CLOSEBTN, OnUpdateCloseBtn)
ON_COMMAND(ID_CLOSEBTN, OnCloseBtn)
ON_COMMAND(ID_TOOLFRAME, OnToolframe)
ON_COMMAND(ID_ALTICON, OnAltIcon)
ON_UPDATE_COMMAND_UI(ID_ALTICON, OnUpdateAltIcon)
ON_COMMAND(ID_ALTTEXT, OnAltTitle)
ON_UPDATE_COMMAND_UI(ID_ALTTEXT, OnUpdateAltTitle)
ON_COMMAND(IDC_DCAPPCOMPAT, OnDcAppcompat)
ON_UPDATE_COMMAND_UI(IDC_DCAPPCOMPAT, OnUpdateDcAppcompat)
ON_COMMAND(IDC_DFCAPPCOMPAT, OnDfcAppcompat)
ON_UPDATE_COMMAND_UI(IDC_DFCAPPCOMPAT, OnUpdateDfcAppcompat)
ON_WM_NCPAINT()
ON_COMMAND(ID_MINMAXSTRESS, OnMinMaxStress)
ON_UPDATE_COMMAND_UI(ID_MINMAXSTRESS, OnUpdateMinMaxStress)
ON_WM_WINDOWPOSCHANGING()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
: m_fFullScrnMax(TRUE),
m_fAltIcon(FALSE),
m_fAltTitle(FALSE),
m_fDfcAppCompat(FALSE),
m_fDcAppCompat(FALSE),
m_fMinMaxStress(FALSE),
m_pwiNormal0(NULL),
m_hIcon(NULL)
{
}
CMainFrame::~CMainFrame()
{
if( m_hAltIcon )
DeleteObject( m_hAltIcon );
if( m_hIcon )
DeleteObject( m_hIcon );
}
LRESULT CALLBACK MsgWndProc( HWND hwnd, UINT uMsg, WPARAM lParam, LPARAM wParam )
{
return DefWindowProc( hwnd, uMsg, lParam, wParam );
}
int GetPrime( ULONG number )
{
int cPrimeCount = 0;
if( number > 1 )
{
for( UINT i = 2; i < number; i++ )
{
if( 0 == number % i )
cPrimeCount++;
}
}
return cPrimeCount;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndDlgBar.Create(this, IDR_MAINFRAME,
CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
{
TRACE0("Failed to create dialogbar\n");
return -1; // fail to create
}
if (!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar(&m_wndToolBar) ||
!m_wndReBar.AddBar(&m_wndDlgBar))
{
TRACE0("Failed to create rebar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY);
TestRgnData();
return 0;
}
void _GetRectSize( LPCRECT prc, PPOINT pptSize )
{
pptSize->x = RECTWIDTH(prc);
pptSize->y = RECTHEIGHT(prc);
}
BOOL _EqualPoint( PPOINT pt1, PPOINT pt2 )
{
return (pt1->x == pt2->x) && (pt1->y == pt2->y);
}
LRESULT CALLBACK AWRWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_COMMAND:
{
if( ID_CLOSE == LOWORD(wParam) )
DestroyWindow(hwnd);
break;
}
case WM_SIZE:
{
RECT rcCli, rcWnd, rcAwr;
POINT sizeWnd, sizeCli, sizeAwr;
GetWindowRect(hwnd, &rcWnd);
_GetRectSize(&rcWnd, &sizeWnd);
GetClientRect(hwnd, &rcCli);
_GetRectSize(&rcCli, &sizeCli);
int cyMenu = GetSystemMetrics(SM_CYMENU);
int cyMenuSize = GetSystemMetrics(SM_CYMENUSIZE);
WINDOWINFO wi = {0};
wi.cbSize = sizeof(wi);
GetWindowInfo(hwnd, &wi);
rcAwr = rcCli;
AdjustWindowRectEx(&rcAwr, wi.dwStyle, GetMenu(hwnd) != NULL, wi.dwExStyle);
_GetRectSize(&rcAwr, &sizeAwr);
TRACE( TEXT("AWRex: cli(%d,%d), wnd(%d,%d), awr(%d,%d), %s\n\n"),
sizeCli, sizeWnd, sizeAwr,
_EqualPoint(&sizeWnd, &sizeAwr) ? TEXT("Ok.") : TEXT("ERROR!") );
break;
}
}
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
//---------------------------------------------------------------------------
HRESULT _PrepareRegionDataForScaling(RGNDATA *pRgnData, LPCRECT prcImage, MARGINS *pMargins)
{
//---- compute margin values ----
int sw = prcImage->left;
int lw = prcImage->left + pMargins->cxLeftWidth;
int rw = prcImage->right - pMargins->cxRightWidth;
int sh = prcImage->top;
int th = prcImage->top + pMargins->cyTopHeight;
int bh = prcImage->bottom - pMargins->cyBottomHeight;
//---- step thru region data & customize it ----
//---- classify each POINT according to a gridnum and ----
//---- make it 0-relative to its grid location ----
POINT *pt = (POINT *)pRgnData->Buffer;
BYTE *pByte = (BYTE *)pRgnData->Buffer + pRgnData->rdh.nRgnSize;
int iCount = 2 * pRgnData->rdh.nCount;
for (int i=0; i < iCount; i++, pt++, pByte++)
{
if (pt->x < lw)
{
pt->x -= sw;
if (pt->y < th) // left top
{
*pByte = GN_LEFTTOP;
pt->y -= sh;
}
else if (pt->y < bh) // left middle
{
*pByte = GN_LEFTMIDDLE;
pt->y -= th;
}
else // left bottom
{
*pByte = GN_LEFTBOTTOM;
pt->y -= bh;
}
}
else if (pt->x < rw)
{
pt->x -= lw;
if (pt->y < th) // middle top
{
*pByte = GN_MIDDLETOP;
pt->y -= sh;
}
else if (pt->y < bh) // middle middle
{
*pByte = GN_MIDDLEMIDDLE;
pt->y -= th;
}
else // middle bottom
{
*pByte = GN_MIDDLEBOTTOM;
pt->y -= bh;
}
}
else
{
pt->x -= rw;
if (pt->y < th) // right top
{
*pByte = GN_RIGHTTOP;
pt->y -= sh;
}
else if (pt->y < bh) // right middle
{
*pByte = GN_RIGHTMIDDLE;
pt->y -= th;
}
else // right bottom
{
*pByte = GN_RIGHTBOTTOM;
pt->y -= bh;
}
}
}
return S_OK;
}
//---------------------------------------------------------------------------
void TestRgnData()
{
HBITMAP hbm = (HBITMAP)LoadImage(
NULL, TEXT("f:\\testapplets\\mditest\\rgndatatest.bmp"),
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
if( hbm )
{
HRGN hrgn;
BITMAP bm;
GetObject( hbm, sizeof(bm), &bm );
if( SUCCEEDED( CreateBitmapRgn( hbm, 0, 0, -1, -1, FALSE, 0, RGB(255,0,255), 0, &hrgn ) ) )
{
LONG cb = GetRegionData(hrgn, 0, NULL);
LONG cbRgnData = cb + sizeof(RGNDATAHEADER);
BYTE* pbData = NULL;
if( (pbData = new BYTE[cbRgnData]) != NULL )
{
RGNDATA* pRgnData = (RGNDATA*)pbData;
if( GetRegionData(hrgn, cbRgnData, pRgnData) )
{
MARGINS marSizing = {12,6,1,6};
RECT rcImage;
SetRect(&rcImage, 0, 0, bm.bmWidth, bm.bmHeight);
_PrepareRegionDataForScaling( pRgnData, &rcImage, &marSizing );
}
delete [] pbData;
}
}
}
}
void TestPidHash()
{
for( int rep = 0; rep < 500; rep++ )
{
ULONG cBestCollisions = -1;
int cBestBuckets = 0;
for( int cBuckets = 0xFD9; cBuckets <= 0xFF3; cBuckets++ )
{
ULONG hashtable[2][1000] = {0};
srand(GetTickCount());
ULONG cCollisions = 0;
for( int i=0; i < 1000; i++ )
{
ULONG pid = rand();
ULONG hash = (pid << 4);
hash %= cBuckets;
for( int j = 0; j < i; j++ )
{
if( hashtable[1][j] == hash )
{
ULONG pidOther = hashtable[0][j];
ULONG hashOther = hashtable[1][j];
cCollisions++;
}
}
hashtable[0][i] = pid;
hashtable[1][i] = hash;
}
if( cCollisions < cBestCollisions )
{
cBestCollisions = cCollisions;
cBestBuckets = cBuckets;
}
//TRACE("Collision count using bucket count %04X: %d\n", cBuckets, cCollisions );
}
TRACE(TEXT("%04X\t%d\t%d\n"), cBestBuckets, cBestCollisions, GetPrime(cBestBuckets) );
}
}
//---------------------------------------------------------------------------
HWND CreateAWRWindow( HWND hwndParent, DWORD dwStyle, DWORD dwExStyle, BOOL fMenu )
{
static WNDCLASS wc = {0};
if( !wc.lpfnWndProc )
{
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = AWRWndProc;
wc.hInstance = AfxGetInstanceHandle();
wc.hCursor = ::LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = TEXT("AWRTestWnd");
if( !RegisterClass( &wc ) )
return NULL;
}
HMENU hMenu = NULL;
if( fMenu )
hMenu = LoadMenu( AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_AWRMENU) );
return CreateWindowEx( dwExStyle, wc.lpszClassName, TEXT("AdustWindowRect test"), dwStyle,
0, 0, 640, 480, hwndParent, hMenu, wc.hInstance, NULL );
}
//---------------------------------------------------------------------------
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
if( !m_fFullScrnMax )
{
//lpMMI->ptMaxPosition.x = lpMMI->ptMaxPosition.y = 0;
lpMMI->ptMaxTrackSize.x = GetSystemMetrics(SM_CXSCREEN)/2;
lpMMI->ptMaxTrackSize.y = GetSystemMetrics(SM_CYSCREEN)/2;
}
}
void CMainFrame::OnFullScrnMaximized()
{
m_fFullScrnMax = !m_fFullScrnMax;
}
void CMainFrame::OnUpdateFullScrnMaximized(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_fFullScrnMax );
}
void CMainFrame::OnAwrWindow()
{
HWND hwnd;
if( (hwnd = CreateAWRWindow(
*this, WS_OVERLAPPEDWINDOW & ~WS_SYSMENU, WS_EX_CLIENTEDGE|WS_EX_CONTEXTHELP, FALSE )) != NULL )
{
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);
}
}
void CMainFrame::OnAwrWindowMenu()
{
HWND hwnd;
if( (hwnd = CreateAWRWindow(
*this, WS_OVERLAPPEDWINDOW, WS_EX_CLIENTEDGE, TRUE )) != NULL )
{
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);
}
}
void CMainFrame::OnNonClientMetrics()
{
CNCMetricsDlg dlg;
dlg.DoModal();
}
LRESULT CALLBACK ToolFrameWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
LRESULT CALLBACK ThinFrameWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
void CMainFrame::OnToolframe()
{
static WNDCLASS wc = {0};
if( !wc.lpfnWndProc )
{
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = ToolFrameWndProc;
wc.hInstance = AfxGetInstanceHandle();
wc.hCursor = ::LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = TEXT("ToolFrameTestWnd");
if( !RegisterClass( &wc ) )
return;
}
HWND hwnd = CreateWindowEx( WS_EX_TOOLWINDOW, wc.lpszClassName, TEXT("Tool Frame"),
WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
CW_USEDEFAULT, 0, 280, 320, *this, NULL, wc.hInstance, NULL );
if( hwnd )
{
::UpdateWindow(hwnd);
::ShowWindow(hwnd, SW_SHOW);
}
}
void CMainFrame::OnThinFrame()
{
static WNDCLASS wc = {0};
if( !wc.lpfnWndProc )
{
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = ThinFrameWndProc;
wc.hInstance = AfxGetInstanceHandle();
wc.hCursor = ::LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = TEXT("ThinFrameTestWnd");
if( !RegisterClass( &wc ) )
return;
}
HWND hwnd = CreateWindowEx( WS_EX_DLGMODALFRAME, wc.lpszClassName, TEXT("Thin Frame"), WS_CAPTION|WS_SYSMENU,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, *this, NULL, wc.hInstance, NULL );
if( hwnd )
{
::UpdateWindow(hwnd);
::ShowWindow(hwnd, SW_SHOW);
}
}
void CMainFrame::OnDumpMetrics()
{
NONCLIENTMETRICS ncm = {0};
ncm.cbSize = sizeof(ncm);
int iBorder;
SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 );
SystemParametersInfo( SPI_GETBORDER, 0, &iBorder, 0 );
#define SPEW_NCM(i) TRACE(TEXT("NONCLIENTMETRICS::") TEXT(#i) TEXT(":\t%d\n"), ncm.##i );
#define SPEW_SYSMET(sm) TRACE(TEXT(#sm) TEXT(":\t%d\n"), GetSystemMetrics(sm) );
TRACE(TEXT("SPI_BORDER:\t%d\n"), iBorder);
SPEW_NCM(iBorderWidth);
SPEW_NCM(iScrollWidth);
SPEW_NCM(iScrollHeight);
SPEW_NCM(iCaptionWidth);
SPEW_NCM(iCaptionHeight);
SPEW_NCM(iSmCaptionWidth);
SPEW_NCM(iSmCaptionHeight);
SPEW_NCM(iMenuWidth);
SPEW_NCM(iMenuHeight);
SPEW_SYSMET( SM_CXVSCROLL )
SPEW_SYSMET( SM_CYHSCROLL )
SPEW_SYSMET( SM_CYCAPTION )
SPEW_SYSMET( SM_CXBORDER )
SPEW_SYSMET( SM_CYBORDER )
SPEW_SYSMET( SM_CYVTHUMB )
SPEW_SYSMET( SM_CXHTHUMB )
SPEW_SYSMET( SM_CXICON )
SPEW_SYSMET( SM_CYICON )
SPEW_SYSMET( SM_CYMENU )
SPEW_SYSMET( SM_CYVSCROLL )
SPEW_SYSMET( SM_CXHSCROLL )
SPEW_SYSMET( SM_SWAPBUTTON )
SPEW_SYSMET( SM_CXSIZE )
SPEW_SYSMET( SM_CYSIZE )
SPEW_SYSMET( SM_CXFIXEDFRAME )
SPEW_SYSMET( SM_CYFIXEDFRAME )
SPEW_SYSMET( SM_CXSIZEFRAME )
SPEW_SYSMET( SM_CYSIZEFRAME )
SPEW_SYSMET( SM_CXEDGE )
SPEW_SYSMET( SM_CYEDGE )
SPEW_SYSMET( SM_CXSMICON )
SPEW_SYSMET( SM_CYSMICON )
SPEW_SYSMET( SM_CYSMCAPTION )
SPEW_SYSMET( SM_CXSMSIZE )
SPEW_SYSMET( SM_CYSMSIZE )
SPEW_SYSMET( SM_CXMENUSIZE )
SPEW_SYSMET( SM_CYMENUSIZE )
SPEW_SYSMET( SM_CXMINIMIZED )
SPEW_SYSMET( SM_CYMINIMIZED )
SPEW_SYSMET( SM_CXMAXIMIZED )
SPEW_SYSMET( SM_CYMAXIMIZED )
SPEW_SYSMET( SM_CXDRAG )
SPEW_SYSMET( SM_CYDRAG )
}
void _ToggleStyle( CWnd* pwnd, DWORD dwStyle )
{
BOOL fStyle = pwnd->GetStyle() & dwStyle;
pwnd->ModifyStyle( fStyle ? dwStyle : 0,
fStyle ? 0 : dwStyle );
pwnd->SetWindowPos( NULL, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_DRAWFRAME );
}
void CMainFrame::OnMinimizeBox()
{
_ToggleStyle( this, WS_MINIMIZEBOX );
}
void CMainFrame::OnUpdateMinimizeBox(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetStyle() & WS_SYSMENU );
pCmdUI->SetCheck( GetStyle() & WS_MINIMIZEBOX );
}
void CMainFrame::OnMaximizeBox()
{
_ToggleStyle( this, WS_MAXIMIZEBOX );
}
void CMainFrame::OnUpdateMaximizeBox(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetStyle() & WS_SYSMENU );
pCmdUI->SetCheck( GetStyle() & WS_MAXIMIZEBOX );
}
void CMainFrame::OnSysMenu()
{
_ToggleStyle( this, WS_SYSMENU );
}
void CMainFrame::OnUpdateSysMenu(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( GetStyle() & WS_SYSMENU );
}
BOOL _MNCanClose(HWND hwnd)
{
BOOL fRetVal = FALSE;
TITLEBARINFO tbi = {sizeof(tbi)};
//---- don't use GetSystemMenu() - has user handle leak issues ----
if (GetTitleBarInfo(hwnd, &tbi))
{
//---- mask out the good bits ----
DWORD dwVal = (tbi.rgstate[5] & (~(STATE_SYSTEM_PRESSED | STATE_SYSTEM_FOCUSABLE)));
fRetVal = (dwVal == 0); // only if no bad bits are left
}
if ( !fRetVal && TESTFLAG(GetWindowLong(hwnd, GWL_EXSTYLE), WS_EX_MDICHILD) )
{
HMENU hMenu = GetSystemMenu(hwnd, FALSE);
MENUITEMINFO menuInfo;
menuInfo.cbSize = sizeof(MENUITEMINFO);
menuInfo.fMask = MIIM_STATE;
if ( GetMenuItemInfo(hMenu, SC_CLOSE, FALSE, &menuInfo) )
{
fRetVal = !(menuInfo.fState & MFS_GRAYED) ? TRUE : FALSE;
}
}
return fRetVal;
}
void CMainFrame::OnUpdateCloseBtn(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( _MNCanClose(m_hWnd) );
}
void CMainFrame::OnCloseBtn()
{
HMENU hMenu = ::GetSystemMenu(m_hWnd, FALSE);
if( hMenu )
{
MENUITEMINFO mii;
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID|MIIM_STATE;
if( GetMenuItemInfo(hMenu, SC_CLOSE, FALSE, &mii ) )
{
if( TESTFLAG(mii.fState, MF_DISABLED) )
{
mii.fState &= ~MF_DISABLED;
}
else
{
mii.fState |= MF_DISABLED;
}
SetMenuItemInfo(hMenu, SC_CLOSE, FALSE, &mii);
SetWindowPos( NULL, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_DRAWFRAME );
}
DestroyMenu(hMenu);
}
}
void CMainFrame::OnAltIcon()
{
HICON hIcon = NULL;
m_fAltIcon = !m_fAltIcon;
if( m_fAltIcon )
{
if( !m_hAltIcon )
m_hAltIcon = LoadIcon( AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ALTICON) );
hIcon = m_hAltIcon;
}
else
{
if( !m_hIcon )
m_hIcon = LoadIcon( AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME) );
hIcon = m_hIcon;
}
if( hIcon )
{
SendMessage( WM_SETICON, ICON_BIG, (LPARAM)hIcon );
}
}
void CMainFrame::OnUpdateAltIcon(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_fAltIcon );
}
void CMainFrame::OnAltTitle()
{
m_fAltTitle = !m_fAltTitle;
LPCTSTR pszTitle = NULL;
if( m_fAltTitle )
{
if( m_csAltTitle.IsEmpty() )
m_csAltTitle.LoadString( IDS_ALTTEXT );
pszTitle = m_csAltTitle;
}
else
{
if( m_csTitle.IsEmpty() )
m_csTitle.LoadString( IDR_MAINFRAME );
pszTitle = m_csTitle;
}
if( pszTitle )
SetWindowText( pszTitle );
}
void CMainFrame::OnUpdateAltTitle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_fAltTitle );
}
void CMainFrame::OnDcAppcompat()
{
m_fDcAppCompat = ! m_fDcAppCompat;
if( m_fDcAppCompat )
m_fDfcAppCompat = FALSE;
SetWindowPos( NULL, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_DRAWFRAME );
}
void CMainFrame::OnUpdateDcAppcompat(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_fDcAppCompat);
}
void CMainFrame::OnDfcAppcompat()
{
m_fDfcAppCompat = ! m_fDfcAppCompat;
if( m_fDfcAppCompat )
m_fDcAppCompat = FALSE;
SetWindowPos( NULL, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_DRAWFRAME );
}
void CMainFrame::OnUpdateDfcAppcompat(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_fDfcAppCompat);
}
void CMainFrame::OnNcPaint()
{
if( m_fDcAppCompat || m_fDfcAppCompat )
{
RECT rc, rcCaption;
GetWindowRect(&rc);
OffsetRect(&rc, -rc.left, -rc.top );
int cxFrame = GetSystemMetrics( SM_CXSIZEFRAME );
int cyFrame = GetSystemMetrics( SM_CYSIZEFRAME );
int cyCaption = GetSystemMetrics( SM_CYCAPTION );
rcCaption = rc;
rcCaption.left += cxFrame;
rcCaption.right -= cxFrame;
rcCaption.top += cyFrame;
rcCaption.bottom = rcCaption.top + cyCaption;
HDC hdc = ::GetWindowDC(*this);
if( hdc )
{
if( m_fDcAppCompat )
{
DrawCaption( *this, hdc, &rcCaption, DC_GRADIENT|DC_ICON|DC_SMALLCAP|DC_TEXT|0x1000 );
}
else if( m_fDfcAppCompat )
{
int cxEdge = GetSystemMetrics(SM_CXEDGE);
int cyEdge = GetSystemMetrics(SM_CYEDGE);
int cxSize = GetSystemMetrics(SM_CXSIZE);
InflateRect(&rcCaption, -cxEdge, -cyEdge);
rcCaption.left = rcCaption.right - cxSize;
CMDIFrameWnd::OnNcPaint();
DrawFrameControl( hdc, &rcCaption, DFC_CAPTION, DFCS_CAPTIONCLOSE );
}
::ReleaseDC(*this, hdc);
}
}
else
{
CMDIFrameWnd::OnNcPaint();
}
}
void CMainFrame::DoMinMaxStress()
{
// Set up restored position as 1/2 screen size:
int cxScrn = GetSystemMetrics(SM_CXSCREEN);
int cyScrn = GetSystemMetrics(SM_CYSCREEN);
ShowWindow( SW_SHOWNORMAL );
SetWindowPos( NULL,
cxScrn/4, cyScrn/4,
cxScrn/2, cyScrn/2,
SWP_NOZORDER|SWP_NOACTIVATE );
// Make note of SHOWNORMAL window pos
WINDOWINFO wiNormal0, wiNormal, wiTest;
wiNormal.cbSize = wiTest.cbSize = sizeof(wiNormal);
GetWindowInfo( m_hWnd, &wiNormal0 );
int nCmdShowTest = SW_MINIMIZE;
do
{
MSG msg;
while( PeekMessage( &msg, m_hWnd, 0, 0, PM_REMOVE ) )
{
if( WM_KEYDOWN == msg.message && VK_ESCAPE == msg.wParam )
{
m_fMinMaxStress = FALSE;
break;
}
TranslateMessage( &msg );
DispatchMessage( &msg );
}
ShowWindow( nCmdShowTest );
GetWindowInfo( m_hWnd, &wiTest );
m_pwiNormal0 = &wiNormal0;
ShowWindow( SW_SHOWNORMAL );
m_pwiNormal0 = NULL;
GetWindowInfo( m_hWnd, &wiNormal );
if( RECTWIDTH(&wiNormal.rcWindow) != RECTWIDTH(&wiNormal0.rcWindow) ||
RECTHEIGHT(&wiNormal.rcWindow) != RECTHEIGHT(&wiNormal0.rcWindow) )
{
OutputDebugString( TEXT("MDITEST: SW_SHOWNORMAL size mismatch!!!\n") );
DebugBreak();
}
nCmdShowTest = nCmdShowTest==SW_MINIMIZE ? SW_MAXIMIZE : SW_MINIMIZE;
} while( m_fMinMaxStress );
m_fMinMaxStress = FALSE;
}
void CMainFrame::OnMinMaxStress()
{
m_fMinMaxStress = !m_fMinMaxStress;
if( m_fMinMaxStress )
{
DoMinMaxStress();
}
}
void CMainFrame::OnUpdateMinMaxStress(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_fMinMaxStress);
}
void CMainFrame::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
if( m_fMinMaxStress && m_pwiNormal0 )
{
if( 0 == (lpwndpos->flags & SWP_NOSIZE) )
{
if( lpwndpos->cx != RECTWIDTH(&m_pwiNormal0->rcWindow) ||
lpwndpos->cy!= RECTHEIGHT(&m_pwiNormal0->rcWindow) )
{
OutputDebugString( TEXT("MDITEST: WM_WINDOWPOSCHANGING SW_SHOWNORMAL size mismatch!!!\n") );
DebugBreak();
}
}
}
CMDIFrameWnd::OnWindowPosChanging(lpwndpos);
// TODO: Add your message handler code here
}