Files
Work/mixer/Graphic.cpp
2024-08-07 09:16:27 -04:00

135 lines
4.8 KiB
C++

#include <mixer/graphic.hpp>
#include <common/resbmp.hpp>
#include <common/dib.hpp>
char Graphic::szClassName[]="Graphic";
Graphic::Graphic(GUIWindow &parentWnd,const String &strBitmapName,UINT controlID,UINT extraStyles,const Rect &initRect,const Font &bannerFont)
: mBannerFont(bannerFont), mParentWnd(parentWnd), mxIndent(Indent),
myBorder(::GetSystemMetrics(SM_CYDLGFRAME)<<1), mInitRect(initRect)
{
mRibbonBitmap=new ResBitmap(strBitmapName);
mRibbonBitmap.disposition(PointerDisposition::Delete);
mPaintHandler.setCallback(this,&Graphic::paintHandler);
mCreateHandler.setCallback(this,&Graphic::createHandler);
mDestroyHandler.setCallback(this,&Graphic::destroyHandler);
mSizeHandler.setCallback(this,&Graphic::sizeHandler);
mEraseBackgroundHandler.setCallback(this,&Graphic::eraseBackgroundHandler);
insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
insertHandler(VectorHandler::EraseBackgroundHandler,&mEraseBackgroundHandler);
mParentWnd.insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
registerClass();
createWindow(parentWnd,controlID,extraStyles);
}
Graphic::~Graphic()
{
removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
removeHandler(VectorHandler::EraseBackgroundHandler,&mEraseBackgroundHandler);
mParentWnd.removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
}
Graphic &Graphic::operator=(const Graphic &/*someGraphic*/)
{ // private implementation
return *this;
}
void Graphic::registerClass(void)
{
HINSTANCE hProcessInstance(processInstance());
WNDCLASS wndClass;
if(::GetClassInfo(hProcessInstance,szClassName,(WNDCLASS FAR *)&wndClass))return;
wndClass.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS|CS_OWNDC;
wndClass.lpfnWndProc =(WNDPROC)Window::WndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =sizeof(Graphic*);
wndClass.hInstance =hProcessInstance;
wndClass.hIcon =0;
wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground =(HBRUSH)::GetStockObject(BLACK_BRUSH);
wndClass.lpszMenuName =0;
wndClass.lpszClassName =szClassName;
::RegisterClass(&wndClass);
}
void Graphic::createWindow(GUIWindow &parentWindow,UINT controlID,UINT extraStyles)
{
if(!mInitRect.right())mInitRect.right(mRibbonBitmap->width());
if(!mInitRect.bottom())mInitRect.bottom(mRibbonBitmap->height());
::CreateWindowEx(0,(LPSTR)szClassName,(LPSTR)0,
WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|extraStyles,mInitRect.left(),mInitRect.top(),mInitRect.right(),mInitRect.bottom(),
parentWindow,(HMENU)controlID,processInstance(),(LPSTR)(Window*)this);
}
CallbackData::ReturnType Graphic::createHandler(CallbackData &someCallbackData)
{
if(!mRibbonBitmap->isOkay())return (CallbackData::ReturnType)FALSE;
myIndent=mBannerFont.charHeight()/4;
mPureDevice=new PureDevice(*this);
mPureDevice.disposition(PointerDisposition::Delete);
mDIBitmap=new DIBitmap(*mPureDevice,*mRibbonBitmap,*mRibbonBitmap);
mDIBitmap.disposition(PointerDisposition::Delete);
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType Graphic::destroyHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType Graphic::eraseBackgroundHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)TRUE;
}
CallbackData::ReturnType Graphic::sizeHandler(CallbackData &someCallbackData)
{
if(!mInitRect.right())width(mParentWnd.width());
myIndent=mBannerFont.charHeight()/4;
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType Graphic::paintHandler(CallbackData &someCallbackData)
{
if(!mRibbonBitmap.isOkay())return (CallbackData::ReturnType)FALSE;
PaintInformation *pPaintInfo=(PaintInformation*)someCallbackData.lParam();
mDIBitmap->copyBits(mRibbonBitmap->ptrData(),mRibbonBitmap->imageExtent());
mDIBitmap->usePalette(*mPureDevice,TRUE);
mDIBitmap->stretchBlt(*mPureDevice,Rect(0,0,width(),height()));
mDIBitmap->usePalette(*mPureDevice,FALSE);
mPureDevice->select((GDIObj)mBannerFont,TRUE);
mPureDevice->setTextColor(RGBColor(255,255,255));
mPureDevice->setBkMode(PureDevice::Transparent);
mPureDevice->textOut(indent(),myIndent,mCaptionString);
mPureDevice->select((GDIObj)mBannerFont,FALSE);
postPaint(*mPureDevice);
return (CallbackData::ReturnType)FALSE;
}
BOOL Graphic::setCaption(const String &captionString)
{
mCaptionString=captionString;
invalidate(FALSE);
return TRUE;
}
const String &Graphic::getCaption(void)const
{
return mCaptionString;
}
// **************************************************************************************************
// virtuals
void Graphic::postPaint(PureDevice &pureDevice)
{
}