Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

244 lines
6.0 KiB

/************************************************************************
* *
* PAGEPOS.CPP *
* *
* Copyright (C) Microsoft Corporation 1995 *
* All Rights reserved. *
* *
************************************************************************/
#include "stdafx.h"
#include "resource.h"
#include "pagepos.h"
#include "setwinpo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPagePos property page
CPagePos::CPagePos(CPropWindows *pOwner) :
CWindowsPage(CPagePos::IDD, pOwner)
{
m_cxScreen = GetSystemMetrics(SM_CXSCREEN);
m_cyScreen = GetSystemMetrics(SM_CYSCREEN);
}
void CPagePos::InitializeControls(void)
{
// Only the General tab can be selected if there are no windows.
ASSERT(m_pwsmag);
CButton *pCheck = (CButton *) GetDlgItem(IDC_CHECK_ABSOLUTE);
pCheck->SetCheck(!(m_pwsmag->grf & FWSMAG_ABSOLUTE));
InitializeSize();
}
static const char txtDefaultPos[] = "-1";
void STDCALL CPagePos::InitializeSize(void)
{
ASSERT(m_pwsmag);
char szBuf[20];
CEdit *pEdit = (CEdit*) GetDlgItem(IDC_TXT_LEFT);
if (m_pwsmag->grf & FWSMAG_X) {
_itoa(m_pwsmag->x, szBuf, 10);
pEdit->SetWindowText(szBuf);
}
else
pEdit->SetWindowText(txtDefaultPos);
pEdit = (CEdit*) GetDlgItem(IDC_TXT_TOP);
if (m_pwsmag->grf & FWSMAG_Y) {
_itoa(m_pwsmag->y, szBuf, 10);
pEdit->SetWindowText(szBuf);
}
else
pEdit->SetWindowText(txtDefaultPos);
pEdit = (CEdit*) GetDlgItem(IDC_TXT_WIDTH);
if (m_pwsmag->grf & FWSMAG_DX) {
_itoa(m_pwsmag->dx, szBuf, 10);
pEdit->SetWindowText(szBuf);
}
else
pEdit->SetWindowText(txtDefaultPos);
pEdit = (CEdit*) GetDlgItem(IDC_TXT_HEIGHT);
if (m_pwsmag->grf & FWSMAG_DY) {
_itoa(m_pwsmag->dy, szBuf, 10);
pEdit->SetWindowText(szBuf);
}
else
pEdit->SetWindowText(txtDefaultPos);
}
void CPagePos::SaveAndValidate(CDataExchange* pDX)
{
ASSERT(m_pwsmag);
// REVIEW (niklasb): should we validate against actual
// screen size if absolute coordinates are used?
#if 0
int xMax;
int yMax;
if (m_pwsmag->grf & FWSMAG_ABSOLUTE) {
xMax = m_cxScreen;
yMax = m_cyScreen;
}
else {
xMax = dxVirtScreen;
yMax = dyVirtScreen;
}
#else
const int xMax = dxVirtScreen;
const int yMax = dyVirtScreen;
#endif
GetPos(&m_pwsmag->x, FWSMAG_X,
IDC_TXT_LEFT, IDS_ERR_LEFT, pDX, xMax);
GetPos(&m_pwsmag->y, FWSMAG_Y,
IDC_TXT_TOP, IDS_ERR_TOP, pDX, yMax);
GetPos(&m_pwsmag->dx, FWSMAG_DX,
IDC_TXT_WIDTH, IDS_ERR_WIDTH, pDX, xMax);
GetPos(&m_pwsmag->dy, FWSMAG_DY,
IDC_TXT_HEIGHT, IDS_ERR_HEIGHT, pDX, yMax);
}
void CPagePos::GetPos(
UINT *pnRet, // address in which to return result
UINT uFlag, // bit in m_pwsmag->grf to set or clear
UINT idCtl, // id of the edit control
UINT idMsg, // error message or zero
CDataExchange *pDX, // object for flagging errors or NULL
int nMax // maximum value
)
{
ASSERT(m_pwsmag);
BOOL fTrans;
int nVal = GetDlgItemInt(idCtl, &fTrans, TRUE);
if (!fTrans || nVal < -1 || nVal > nMax) {
if (pDX) {
if (idMsg) {
char szMsg[256];
wsprintf(szMsg, GetStringResource(idMsg), nMax);
AfxMessageBox(szMsg, MB_OK);
}
pDX->PrepareEditCtrl(idCtl);
pDX->Fail();
}
}
else if (nVal >= 0) {
*pnRet = (UINT) nVal;
m_pwsmag->grf |= uFlag;
}
else
m_pwsmag->grf &= ~uFlag;
}
BEGIN_MESSAGE_MAP(CPagePos, CWindowsPage)
//{{AFX_MSG_MAP(CPagePos)
ON_BN_CLICKED(IDC_BUTTON_DEFAULT_POS, OnButtonDefaultPos)
ON_BN_CLICKED(IDC_CHECK_ABSOLUTE, OnCheckAbsolute)
ON_BN_CLICKED(IDC_BUTTON_SET_POS, OnButtonSetPos)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPagePos message handlers
void CPagePos::OnButtonDefaultPos()
{
ASSERT(m_pwsmag);
m_pwsmag->grf &= ~(FWSMAG_X | FWSMAG_Y | FWSMAG_DX | FWSMAG_DY);
InitializeSize();
}
void CPagePos::OnCheckAbsolute()
{
ASSERT(m_pwsmag);
// Get current size and position values.
SaveAndValidate(NULL);
CButton* pbtn = (CButton*) GetDlgItem(IDC_CHECK_ABSOLUTE);
if (!pbtn->GetCheck()) {
if (m_pOwner->m_options.fVersion3) { // not allowed with a version 3 help file
if (AfxMessageBox(IDS_NO_ABS_WITH_VER3, MB_YESNO, 0) == IDNO) {
pbtn->SetCheck(TRUE);
return;
}
else
m_pOwner->m_options.fVersion3 = FALSE;
}
if (!(m_pwsmag->grf & FWSMAG_ABSOLUTE)) {
if (m_pwsmag->grf & FWSMAG_X)
m_pwsmag->x = MulDiv(m_pwsmag->x, m_cxScreen, dxVirtScreen);
if (m_pwsmag->grf & FWSMAG_Y)
m_pwsmag->y = MulDiv(m_pwsmag->y, m_cyScreen, dyVirtScreen);
if (m_pwsmag->grf & FWSMAG_DX)
m_pwsmag->dx = MulDiv(m_pwsmag->dx, m_cxScreen, dxVirtScreen);
if (m_pwsmag->grf & FWSMAG_DY)
m_pwsmag->dy = MulDiv(m_pwsmag->dy, m_cyScreen, dyVirtScreen);
m_pwsmag->grf |= FWSMAG_ABSOLUTE;
InitializeSize();
}
}
else {
if (m_pwsmag->grf & FWSMAG_ABSOLUTE) {
if (m_pwsmag->grf & FWSMAG_X)
m_pwsmag->x = MulDiv(m_pwsmag->x, dxVirtScreen, m_cxScreen);
if (m_pwsmag->grf & FWSMAG_Y)
m_pwsmag->y = MulDiv(m_pwsmag->y, dyVirtScreen, m_cyScreen);
if (m_pwsmag->grf & FWSMAG_DX)
m_pwsmag->dx = MulDiv(m_pwsmag->dx, dxVirtScreen, m_cxScreen);
if (m_pwsmag->grf & FWSMAG_DY)
m_pwsmag->dy = MulDiv(m_pwsmag->dy, dyVirtScreen, m_cyScreen);
m_pwsmag->grf &= ~FWSMAG_ABSOLUTE;
InitializeSize();
}
}
}
void CPagePos::OnButtonSetPos()
{
ASSERT(m_pwsmag);
// Get current size and position values.
SaveAndValidate(NULL);
// Display "auto-sizer" window.
CSetWinPos cwinpos(m_pwsmag, this);
if (cwinpos.DoModal() == IDOK)
InitializeSize();
}
static const DWORD aHelpIDs[] = {
IDC_COMBO_WINDOWS, IDH_COMBO_WINDOWS,
IDC_CHECK_ABSOLUTE, IDH_ABSOLUTE_POSITIONS,
IDC_BUTTON_SET_POS, IDH_BUTTON_SET_POS,
IDC_BUTTON_DEFAULT_POS, IDH_BUTTON_DEFAULT_POSITIONS,
IDC_TXT_LEFT, IDH_TXT_POSITION,
IDC_TXT_TOP, IDH_TXT_POSITION,
IDC_TXT_WIDTH, IDH_TXT_POSITION,
IDC_TXT_HEIGHT, IDH_TXT_POSITION,
IDC_GROUP, (DWORD) -1L,
0, 0
};
const DWORD* CPagePos::GetHelpIDs()
{
return aHelpIDs;
}