Files
Work/common/INFOWIN.CPP
2024-08-07 09:09:36 -04:00

265 lines
8.1 KiB
C++

#include <common/infowin.hpp>
#include <common/purehdc.hpp>
char InfoWindow::smszClassName[]={"InfoWin"};
InfoWindow::InfoWindow(Window &parentWindow,WORD windowWidth,WORD windowHeight)
: mCreateHandler(this,&InfoWindow::createHandler),
mPaintHandler(this,&InfoWindow::paintHandler),
mDestroyHandler(this,&InfoWindow::destroyHandler),
mCloseHandler(this,&InfoWindow::closeHandler),
mIsDestroyed(FALSE), mParentWindow(parentWindow),
mhInfoFont(0), mCharHeight(0), mWindowWidth(windowWidth),
mWindowHeight(windowHeight)
{
createInfoFont();
#ifdef __FLAT__
mhInstance=(HINSTANCE)::GetWindowLong(mParentWindow,GWL_HINSTANCE);
#else
mhInstance=(HINSTANCE)::GetWindowWord(mParentWindow,GWW_HINSTANCE);
#endif
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
registerClass();
createInfoWindow();
}
void InfoWindow::setCaption(String captionString)
{
if(!captionString.isNull())::SetWindowText(*this,captionString);
}
void InfoWindow::createInfoFont()
{
TEXTMETRIC tm;
HFONT hOldFont;
int fontHeight;
HDC hDC(::GetDC(0));
fontHeight=::MulDiv(-10,::GetDeviceCaps(hDC,LOGPIXELSY),72);
mhInfoFont=::CreateFont(fontHeight,0,0,0,FW_BOLD,0,0,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,VARIABLE_PITCH|FF_SWISS,"Helv");
hOldFont=(HFONT)::SelectObject(hDC,mhInfoFont);
::GetTextMetrics(hDC,&tm);
::SelectObject(hDC,hOldFont);
::ReleaseDC(NULL,hDC);
mCharHeight=tm.tmHeight+tm.tmExternalLeading;
}
void InfoWindow::createInfoWindow(void)
{
RECT windowRect;
::SetRect(&windowRect,mTopLeftPoint.x(),mTopLeftPoint.y(),mWindowWidth,mWindowHeight);
::CreateWindow((LPSTR)smszClassName,(LPSTR)smszClassName,WS_CAPTION|WS_CHILD,
windowRect.left,windowRect.top,windowRect.right,windowRect.bottom,
mParentWindow,0x00,mhInstance,(LPSTR)(Window*)this);
return;
}
void InfoWindow::show(int showWindow)
{
if(showWindow){Window::show(SW_SHOW);update();}
else Window::show(SW_HIDE);
}
InfoWindow::~InfoWindow()
{
if(::IsWindow(*this))::DestroyWindow(*this);
if(mhInfoFont)::DeleteObject(mhInfoFont);
removeHandlers();
}
void InfoWindow::removeHandlers(void)
{
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
}
void InfoWindow::registerClass(void)
{
WNDCLASS wndClass;
if(::GetClassInfo(mhInstance,smszClassName,(WNDCLASS FAR *)&wndClass))return;
wndClass.style =CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc =(WNDPROC)Window::WndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =sizeof(InfoWindow*);
wndClass.hInstance =mhInstance;
wndClass.hIcon =0;
wndClass.hCursor =(HCURSOR)::LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground =(HBRUSH)::GetStockObject(LTGRAY_BRUSH);
wndClass.lpszMenuName =0;
wndClass.lpszClassName =smszClassName;
::RegisterClass(&wndClass);
}
CallbackData::ReturnType InfoWindow::createHandler(CallbackData &/*someCallbackData*/)
{
::SendMessage(*this,WM_NCACTIVATE,TRUE,0L);
return (CallbackData::ReturnType)TRUE;
}
CallbackData::ReturnType InfoWindow::paintHandler(CallbackData &someCallbackData)
{
PaintInformation *lpPaintInformation=(PaintInformation*)someCallbackData.lParam();
paint((PureDevice)*(lpPaintInformation));
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType InfoWindow::destroyHandler(CallbackData &/*someCallbackData*/)
{
mIsDestroyed=TRUE;
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType InfoWindow::closeHandler(CallbackData &/*someCallbackData*/)
{
::DestroyWindow(*this);
mIsDestroyed=TRUE;
return (CallbackData::ReturnType)FALSE;
}
void InfoWindow::paint(PureDevice &windowDevice)
{
RECT clientRect;
RECT tempRect;
HBRUSH hTempBrush;
::GetClientRect(*this,(RECT FAR *)&clientRect);
hTempBrush=::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
::FillRect((HDC)windowDevice,(RECT FAR*)&clientRect,hTempBrush);
::DeleteObject(hTempBrush);
hTempBrush=::CreateSolidBrush(::GetSysColor(COLOR_BTNSHADOW));
tempRect=clientRect;
tempRect.top+=HeightBorderValue;
tempRect.left+=WidthBorderValue;
tempRect.right-=WidthBorderValue;
tempRect.bottom=tempRect.top+1;
::FillRect((HDC)windowDevice,(RECT FAR*)&tempRect,hTempBrush);
tempRect=clientRect;
tempRect.left+=WidthBorderValue;
tempRect.right=tempRect.left+1;
tempRect.top+=HeightBorderValue;
tempRect.bottom-=HeightBorderValue;
::FillRect((HDC)windowDevice,(RECT FAR*)&tempRect,hTempBrush);
::DeleteObject(hTempBrush);
hTempBrush=::CreateSolidBrush(::GetSysColor(COLOR_BTNHIGHLIGHT));
tempRect=clientRect;
tempRect.bottom-=HeightBorderValue;
tempRect.top=tempRect.bottom-1;
tempRect.left+=WidthBorderValue;
tempRect.right-=WidthBorderValue;
::FillRect((HDC)windowDevice,(RECT FAR*)&tempRect,hTempBrush);
tempRect=clientRect;
tempRect.bottom-=HeightBorderValue;
tempRect.top+=HeightBorderValue;
tempRect.right-=WidthBorderValue;
tempRect.left=tempRect.right-1;
::FillRect((HDC)windowDevice,(RECT FAR*)&tempRect,hTempBrush);
::DeleteObject(hTempBrush);
combineLabelText();
}
void InfoWindow::makeBorderOffsetRect(RECT &borderRect,RECT &clientRect)const
{
borderRect=clientRect;
borderRect.top+=(HeightBorderValue+TextVertBorderOffset);
borderRect.bottom-=(HeightBorderValue+TextVertBorderOffset);
borderRect.left+=(WidthBorderValue+TextHorzBorderOffset);
borderRect.right-=(WidthBorderValue+TextHorzBorderOffset);
}
void InfoWindow::setLineText(WORD lineNumber,String lineText)
{
String tempString;
if(lineText.isNull()||!lineNumber)return;
--lineNumber;
if(lineNumber>=mLineText.size())return;
mLineText[lineNumber]=lineText;
if(lineNumber<mLabelText.size())tempString=mLabelText[lineNumber];
tempString+=lineText;
drawText(++lineNumber,tempString);
}
void InfoWindow::setLineText(Block<String> &lineText,WORD refreshDisplay)
{
size_t numLines((size_t)lineText.size());
mLineText.remove();
if(!numLines)return;
for(int itemIndex=0;itemIndex<numLines;itemIndex++)
if(!lineText[itemIndex].isNull())mLineText.insert(&lineText[itemIndex]);
if(refreshDisplay)combineLabelText();
}
void InfoWindow::setLabelText(Block<String> &labelText,WORD refreshDisplay)
{
size_t numLabels((size_t)labelText.size());
mLabelText.remove();
if(!numLabels)return;
for(int itemIndex=0;itemIndex<numLabels;itemIndex++)
if(!labelText[itemIndex].isNull())mLabelText.insert(&labelText[itemIndex]);
if(refreshDisplay)combineLabelText();
}
void InfoWindow::combineLabelText(void)
{
size_t numLines((size_t)mLineText.size());
size_t numLabels((size_t)mLabelText.size());
size_t numThings(numLines>numLabels?numLines:numLabels);
for(int itemIndex=0;itemIndex<numThings;itemIndex++)
{
String displayString;
if(itemIndex<numLabels)displayString+=mLabelText[itemIndex];
if(itemIndex<numLines)displayString+=mLineText[itemIndex];
if(!displayString.isNull())drawText(itemIndex+1,displayString);
}
}
void InfoWindow::drawText(WORD lineNumber,String lineText)
{
RECT clientRect;
RECT borderRect;
HFONT hOldFont;
PureDevice windowDevice;
if(!lineNumber)return;
windowDevice=*this;
::GetClientRect(*this,(RECT FAR *)&clientRect);
makeBorderOffsetRect(borderRect,clientRect);
hOldFont=(HFONT)::SelectObject(windowDevice,mhInfoFont);
::SetTextColor(windowDevice,::GetSysColor(COLOR_BTNTEXT));
::SetBkColor(windowDevice,::GetSysColor(COLOR_BTNFACE));
clientRect.top=(lineNumber*TextVertBorderOffset)+(mCharHeight*(lineNumber-1))+HeightBorderValue+1;
clientRect.left+=WidthBorderValue+TextHorzBorderOffset;
clientRect.bottom=clientRect.top+mCharHeight;
clientRect.right-=(WidthBorderValue+TextHorzBorderOffset);
if(clientRect.bottom<=borderRect.bottom+OffsetCaption)
::ExtTextOut(windowDevice,clientRect.left,clientRect.top,
ETO_OPAQUE|ETO_CLIPPED,&clientRect,(LPSTR)lineText,lineText.length(),0);
::SelectObject(windowDevice,hOldFont);
}
void InfoWindow::setLocation(const Point &topLeftPoint)
{
Point mTopLeftPoint;
mTopLeftPoint=topLeftPoint;
move(mTopLeftPoint);
}