|
|
//
// AGRP.CPP
// Tool Attributes Display Group
//
// Copyright Microsoft 1998-
//
// PRECOMP
#include "precomp.h"
// Class name
static const TCHAR szAGClassName[] = "T126WB_AGRP";
//
// Page Control child IDs
// Index is PGC_ value
//
static UINT_PTR g_uPageIds[NUM_PAGE_CONTROLS] = { IDM_PAGE_FIRST, IDM_PAGE_PREV, IDM_PAGE_ANY, IDM_PAGE_NEXT, IDM_PAGE_LAST, IDM_PAGE_INSERT_AFTER };
//
// WbAttributesGroup()
//
WbAttributesGroup::WbAttributesGroup(void) { int i;
m_hwnd = NULL;
for (i = 0; i < NUM_PAGE_CONTROLS; i++) { m_uPageCtrls[i].hbmp = NULL; m_uPageCtrls[i].hwnd = NULL; }
m_hPageCtrlFont = NULL; m_cxPageCtrls = DEFAULT_PGC_WIDTH;
m_hwndFontButton = NULL; }
//
// ~WbAttibutesGroup()
//
WbAttributesGroup::~WbAttributesGroup(void) { int i;
if (m_hwnd != NULL) { ::DestroyWindow(m_hwnd); ASSERT(m_hwnd == NULL); }
::UnregisterClass(szAGClassName, g_hInstance);
//
// Delete control bitmaps
//
for (i = 0; i < NUM_PAGE_CONTROLS; i++) { if (m_uPageCtrls[i].hbmp) { ::DeleteBitmap(m_uPageCtrls[i].hbmp); m_uPageCtrls[i].hbmp = NULL; } }
if (m_hPageCtrlFont != NULL) { ::DeleteFont(m_hPageCtrlFont); m_hPageCtrlFont = NULL; }
}
//
// Create()
//
BOOL WbAttributesGroup::Create ( HWND hwndParent, LPCRECT lpRect ) { SIZE size; RECT rectCG; RECT rectFSG; TCHAR szFOBStr[256]; HFONT hOldFont; HDC hdc; int i; BITMAP bmpInfo; int x, cx; int yLogPix; WNDCLASSEX wc;
ASSERT(m_hwnd == NULL);
// Register our class
ZeroMemory(&wc, sizeof(wc)); wc.cbSize = sizeof(wc); wc.style = 0; wc.lpfnWndProc = AGWndProc; wc.hInstance = g_hInstance; wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wc.lpszClassName = szAGClassName;
if (!::RegisterClassEx(&wc)) { ERROR_OUT(("WbAttributesGroup::Create register class failed")); return(FALSE); }
// Create the window
if (!::CreateWindowEx(0, szAGClassName, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, lpRect->left, lpRect->top, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, hwndParent, NULL, g_hInstance, this)) { ERROR_OUT(("Couldn't create WbAttributesGroup window")); return(FALSE); }
ASSERT(m_hwnd != NULL);
//
// Create the page control button bitmaps
//
if (!RecolorButtonImages()) { ERROR_OUT(("Error getting page button bitmaps")); return(FALSE); }
hdc = ::CreateCompatibleDC(NULL); yLogPix = ::GetDeviceCaps(hdc, LOGPIXELSY); ::DeleteDC(hdc);
//
// Create the font for the edit field and buttons
//
::GetObject(m_uPageCtrls[PGC_LAST].hbmp, sizeof(BITMAP), &bmpInfo); m_hPageCtrlFont = ::CreateFont(-bmpInfo.bmHeight, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DFA_OVERRIDE, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "Arial" ); if (!m_hPageCtrlFont) { ERROR_OUT(("WbPagesGroup::Create - couldn't create font")); return(FALSE); }
//
// Create the child controls in inverse order, right to left
//
x = lpRect->right;
for (i = NUM_PAGE_CONTROLS - 1; i >= 0; i--) { x -= BORDER_SIZE_X;
switch (i) { case PGC_ANY: cx = (3*PAGEBTN_WIDTH)/2; break;
case PGC_FIRST: case PGC_LAST: // make button fit bitmap width + standard border
::GetObject(m_uPageCtrls[i].hbmp, sizeof(BITMAP), &bmpInfo); cx = bmpInfo.bmWidth + 2*::GetSystemMetrics(SM_CXFIXEDFRAME); // standard button border
break;
default: cx = PAGEBTN_WIDTH; break;
}
x -= cx;
if (i == PGC_ANY) { m_uPageCtrls[i].hwnd = ::CreateWindowEx(WS_EX_CLIENTEDGE, _T("EDIT"), NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_NUMBER | ES_CENTER | ES_MULTILINE, x, 2*BORDER_SIZE_Y, cx, PAGEBTN_HEIGHT, m_hwnd, (HMENU)g_uPageIds[i], g_hInstance, NULL);
if (!m_uPageCtrls[i].hwnd) { ERROR_OUT(("Couldn't create PGRP edit field")); return(FALSE); }
::SendMessage(m_uPageCtrls[i].hwnd, EM_LIMITTEXT, MAX_NUMCHARS, 0); ::SendMessage(m_uPageCtrls[i].hwnd, WM_SETFONT, (WPARAM)m_hPageCtrlFont, 0); } else { m_uPageCtrls[i].hwnd = ::CreateWindowEx(0, _T("BUTTON"), NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | BS_BITMAP, x, 2*BORDER_SIZE_Y, cx, PAGEBTN_HEIGHT, m_hwnd, (HMENU)g_uPageIds[i], g_hInstance, NULL);
if (!m_uPageCtrls[i].hwnd) { ERROR_OUT(("Couldn't create PGRP button ID %x", g_uPageIds[i])); return(FALSE); }
::SendMessage(m_uPageCtrls[i].hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_uPageCtrls[i].hbmp); } }
m_cxPageCtrls = lpRect->right - x;
SetPageButtonNo(PGC_FIRST, 1); SetPageButtonNo(PGC_LAST, 1);
//
// Create the color palette
//
m_colorsGroup.GetNaturalSize(&size); rectCG.left = BORDER_SIZE_X; rectCG.right = rectCG.left + size.cx; rectCG.top = BORDER_SIZE_Y; rectCG.bottom = rectCG.top + size.cy;
if (!m_colorsGroup.Create(m_hwnd, &rectCG)) { ERROR_OUT(("Couldn't create CGRP window")); return(FALSE); }
//
// Create the font button.
// Now calculate the real size of the button
//
hdc = ::GetDC(m_hwnd); if (!hdc) return(FALSE);
hOldFont = SelectFont(hdc, (HFONT)::GetStockObject(DEFAULT_GUI_FONT));
::LoadString(g_hInstance, IDS_FONTOPTIONS, szFOBStr, 256); ::GetTextExtentPoint(hdc, szFOBStr, lstrlen(szFOBStr), &size);
SelectFont(hdc, hOldFont); ::ReleaseDC(m_hwnd, hdc);
size.cx += 4 * BORDER_SIZE_X; size.cy += 4 * BORDER_SIZE_Y;
m_hwndFontButton = ::CreateWindowEx(0, _T("BUTTON"), szFOBStr, WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHBUTTON, rectCG.right + SEPARATOR_SIZE_X, 2*BORDER_SIZE_Y, max(size.cx, FONTBUTTONWIDTH), max(size.cy, FONTBUTTONHEIGHT), m_hwnd, (HMENU)IDM_FONT, g_hInstance, NULL);
if (!m_hwndFontButton) { ERROR_OUT(("Couldn't create FONT button")); return(FALSE); }
::SendMessage(m_hwndFontButton, WM_SETFONT, (WPARAM)::GetStockObject(DEFAULT_GUI_FONT), FALSE);
return(TRUE); }
//
// RecolorButtonImages()
//
BOOL WbAttributesGroup::RecolorButtonImages(void) { int i; HBITMAP hbmpNew;
//
// This creates button bitmaps tied to the 3D colors, and clears the old
// ones/sets the new ones if the buttons are around.
//
for (i = 0; i < NUM_PAGE_CONTROLS; i++) { // No bitmaps for the edit field
if (i == PGC_ANY) continue;
hbmpNew = (HBITMAP)::LoadImage(g_hInstance, MAKEINTRESOURCE(g_uPageIds[i]), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR | LR_DEFAULTSIZE); if (!hbmpNew) { ERROR_OUT(("AG::RecolorButtonImages faile to load bitmap ID %d", g_uPageIds[i])); return(FALSE); }
// Set the new one
if (m_uPageCtrls[i].hwnd != NULL) { ::SendMessage(m_uPageCtrls[i].hwnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmpNew); }
// Delete the old one
if (m_uPageCtrls[i].hbmp != NULL) { ::DeleteBitmap(m_uPageCtrls[i].hbmp); }
// Save this one
m_uPageCtrls[i].hbmp = hbmpNew;
// Put the page number on top
if (m_uPageCtrls[i].hwnd != NULL) { if (i == PGC_FIRST) { SetPageButtonNo(i, 1); } else if (i == PGC_LAST) { SetPageButtonNo(i, 1); } } }
return(TRUE); }
//
//
// Function: GetNaturalSize
//
// Purpose: Return the natural size of the attributes group
//
//
void WbAttributesGroup::GetNaturalSize(LPSIZE lpsize) { SIZE sizeCG; SIZE sizeFSG; RECT rc;
m_colorsGroup.GetNaturalSize(&sizeCG);
if (!m_hwndFontButton) { sizeFSG.cx = FONTBUTTONWIDTH; sizeFSG.cy = FONTBUTTONHEIGHT; } else { ::GetWindowRect(m_hwndFontButton, &rc); sizeFSG.cx = rc.right - rc.left; sizeFSG.cy = rc.bottom - rc.top; }
// m_cxPageCtrls includes BORDER_SIZE_X on right side
lpsize->cx = BORDER_SIZE_X + sizeCG.cx + SEPARATOR_SIZE_X + sizeFSG.cx + SEPARATOR_SIZE_X + m_cxPageCtrls;
sizeFSG.cy = max(sizeFSG.cy, PAGEBTN_HEIGHT) + BORDER_SIZE_Y; lpsize->cy = BORDER_SIZE_Y + max(sizeCG.cy, sizeFSG.cy) + BORDER_SIZE_Y; }
//
// IsChildEditField()
//
BOOL WbAttributesGroup::IsChildEditField(HWND hwnd) { return(hwnd == m_uPageCtrls[PGC_ANY].hwnd); }
//
// GetCurrentPageNumber()
//
UINT WbAttributesGroup::GetCurrentPageNumber(void) { return(::GetDlgItemInt(m_hwnd, IDM_PAGE_ANY, NULL, FALSE)); }
//
// SetCurrentPageNumber()
//
void WbAttributesGroup::SetCurrentPageNumber(UINT number) { ::SetDlgItemInt(m_hwnd, IDM_PAGE_ANY, number, FALSE); }
//
// SetLastPageNumber()
//
void WbAttributesGroup::SetLastPageNumber(UINT number) { SetPageButtonNo(PGC_LAST, number); }
//
// EnablePageCtrls()
//
void WbAttributesGroup::EnablePageCtrls(BOOL bEnable) { int i;
for (i = 0; i < NUM_PAGE_CONTROLS; i++) { ::EnableWindow(m_uPageCtrls[i].hwnd, bEnable); }
//
// Insert is enabled if we are synced and didn't reach the limit
//
::EnableWindow(m_uPageCtrls[PGC_INSERT].hwnd, g_pDraw->IsSynced() && (g_numberOfWorkspaces < 256) ? bEnable : FALSE);
}
//
// EnableInsert()
//
void WbAttributesGroup::EnableInsert(BOOL bEnable) { ::EnableWindow(m_uPageCtrls[PGC_INSERT].hwnd, bEnable); }
//
// AGWndProc()
//
LRESULT CALLBACK AGWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; WbAttributesGroup * pag = (WbAttributesGroup *)::GetWindowLongPtr(hwnd, GWLP_USERDATA);
switch (message) { case WM_NCCREATE: pag = (WbAttributesGroup *)(((LPCREATESTRUCT)lParam)->lpCreateParams); ASSERT(pag);
pag->m_hwnd = hwnd; ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pag); goto DefWndProc; break;
case WM_NCDESTROY: ASSERT(pag); pag->m_hwnd = NULL; break;
case WM_SIZE: ASSERT(pag); pag->OnSize((UINT)wParam, (short)LOWORD(lParam), (short)HIWORD(lParam)); break;
case WM_COMMAND: ASSERT(pag); pag->OnCommand(GET_WM_COMMAND_ID(wParam, lParam), GET_WM_COMMAND_CMD(wParam, lParam), GET_WM_COMMAND_HWND(wParam, lParam)); break;
default: DefWndProc: lResult = DefWindowProc(hwnd, message, wParam, lParam); break; }
return(lResult); }
//
//
// Function: OnSize
//
// Purpose: The tool window has been resized
//
//
void WbAttributesGroup::OnSize(UINT, int, int) { RECT rc; int i; int x; RECT rcT;
//
// We haven't created our children yet.
//
if (!m_uPageCtrls[0].hwnd) return;
::GetClientRect(m_hwnd, &rc); x = rc.right - m_cxPageCtrls;
//
// Move the page controls to be right justified.
//
for (i = 0; i < NUM_PAGE_CONTROLS; i++) { // Get width of control
::GetWindowRect(m_uPageCtrls[i].hwnd, &rcT); rcT.right -= rcT.left;
::MoveWindow(m_uPageCtrls[i].hwnd, x, 2*BORDER_SIZE_Y, rcT.right, PAGEBTN_HEIGHT, TRUE);
//
// Move to the next one
//
x += rcT.right + BORDER_SIZE_X; }
//
// The color palette and font button are left justified, no need to
// move them.
//
}
//
// SetPageButtonNo()
//
// Updates the page text in the first/last button
//
void WbAttributesGroup::SetPageButtonNo(UINT pgcIndex, UINT uiPageNumber ) { HDC hdc; BITMAP bmpInfo; HBITMAP hbmp; HFONT hOldFont; HBITMAP hOldBitmap; RECT rectNumBox; TCHAR NumStr[16]; TEXTMETRIC tm; HWND hwndButton;
MLZ_EntryOut(ZONE_FUNCTION, "WbAttributesGroup::SetPageButtonNo");
hwndButton = m_uPageCtrls[pgcIndex].hwnd; hbmp = m_uPageCtrls[pgcIndex].hbmp;
ASSERT(hwndButton); ASSERT(hbmp); ASSERT(m_hPageCtrlFont);
::GetObject(hbmp, sizeof (BITMAP), (LPVOID)&bmpInfo);
hdc = ::CreateCompatibleDC(NULL); hOldFont = SelectFont(hdc, m_hPageCtrlFont); hOldBitmap = SelectBitmap(hdc, hbmp); ::GetTextMetrics(hdc, &tm);
rectNumBox.left = 10; rectNumBox.top = -(tm.tmInternalLeading/2); rectNumBox.right = bmpInfo.bmWidth; rectNumBox.bottom = bmpInfo.bmHeight;
SelectBrush(hdc, ::GetSysColorBrush( COLOR_3DFACE ) ); ::SetTextColor(hdc, ::GetSysColor( COLOR_BTNTEXT ) ); ::SetBkColor(hdc, ::GetSysColor( COLOR_3DFACE ) );
::PatBlt(hdc, rectNumBox.left, rectNumBox.top, rectNumBox.right - rectNumBox.left, rectNumBox.bottom - rectNumBox.top, PATCOPY);
wsprintf(NumStr, "%d", uiPageNumber); ::DrawText(hdc, NumStr, -1, &rectNumBox, DT_CENTER);
SelectFont(hdc, hOldFont); SelectBitmap(hdc, hOldBitmap);
::DeleteDC(hdc);
::InvalidateRect(hwndButton, NULL, TRUE); ::UpdateWindow(hwndButton); }
//
//
// Function: DisplayTool
//
// Purpose: Display a tool in the attributes group
//
//
void WbAttributesGroup::DisplayTool(WbTool* pTool) { SIZE size;
// Display the colors group if necessary
if (!pTool->HasColor()) { ::ShowWindow(m_colorsGroup.m_hwnd, SW_HIDE); } else { // Change the color button to match the tool
m_colorsGroup.SetCurColor(pTool->GetColor());
// If the group is currently hidden, show it
if (!::IsWindowVisible(m_colorsGroup.m_hwnd)) { ::ShowWindow(m_colorsGroup.m_hwnd, SW_SHOW); } }
// Display the widths group if necessary
if( (!pTool->HasWidth()) || (!g_pMain->IsToolBarOn()) ) { ::ShowWindow(g_pMain->m_WG.m_hwnd, SW_HIDE); } else { UINT uiWidthIndex = pTool->GetWidthIndex();
// If the width index isn't valid, then pop up all the buttons
if (uiWidthIndex < NUM_OF_WIDTHS) { // Tell the widths group of the new selection
g_pMain->m_WG.PushDown(uiWidthIndex); }
// If the group is currently hidden, show it
if (!::IsWindowVisible(g_pMain->m_WG.m_hwnd)) { ::ShowWindow(g_pMain->m_WG.m_hwnd, SW_SHOW); } }
// The font sample group is visible for text and select tools
if (!pTool->HasFont()) { ::ShowWindow(m_hwndFontButton, SW_HIDE); } else { if (!::IsWindowVisible(m_hwndFontButton)) { ::ShowWindow(m_hwndFontButton, SW_SHOW); } } }
//
//
// Function: Hide.
//
// Purpose: Hide the tool attributes bar.
//
//
void WbAttributesGroup::Hide(void) { if (m_colorsGroup.m_hwnd != NULL) ::ShowWindow(m_colorsGroup.m_hwnd, SW_HIDE);
if (m_hwndFontButton != NULL) ::ShowWindow(m_hwndFontButton, SW_HIDE); }
//
//
// Function: SelectColor
//
// Purpose: Set the current color
//
//
void WbAttributesGroup::SelectColor(WbTool* pTool) { if (pTool != NULL) { pTool->SetColor(m_colorsGroup.GetCurColor()); } }
//
// This forwards all button commands to our main window
//
void WbAttributesGroup::OnCommand(UINT id, UINT cmd, HWND hwndCtl) { switch (id) { case IDM_PAGE_FIRST: case IDM_PAGE_PREV: case IDM_PAGE_NEXT: case IDM_PAGE_LAST: case IDM_PAGE_INSERT_AFTER: case IDM_FONT: if (cmd == BN_CLICKED) { ::PostMessage(g_pMain->m_hwnd, WM_COMMAND, GET_WM_COMMAND_MPS(id, cmd, hwndCtl)); } break;
case IDM_PAGE_ANY: if (cmd == EN_SETFOCUS) { ::SendMessage(hwndCtl, EM_SETSEL, 0, (LPARAM)-1); ::SendMessage(hwndCtl, EM_SCROLLCARET, 0, 0); } else if(cmd == EN_MAXTEXT) { ::PostMessage(g_pMain->m_hwnd, WM_COMMAND, GET_WM_COMMAND_MPS(id, cmd, hwndCtl)); } break; } }
|