#include #include char ToolBar::szClassName[]="Rocinante"; char ToolBar::szMenuName[]={'\0'}; ToolBar::ToolBar(HWND hParent,String caption) : mButtons(0), mButtonDown(FALSE), mIsDestroyed(FALSE), mWindowWidth(0), mCaption(caption), mhParent(hParent), mhInstance(Main::processInstance()) { registerClass(); ::CreateWindow((LPSTR)szClassName,(LPSTR)mCaption, WS_CHILD|WS_CAPTION, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,WindowHeight, mhParent,(HMENU)0x01,mhInstance,(LPSTR)this); synchronizeToolBar(); Show(SW_HIDE); Update(); } ToolBar::~ToolBar() { for(int i=0;iMaxButtons)return FALSE; if(0==(mButton[mButtons].mhBitmap=::LoadBitmap(mhInstance,(LPSTR)bmpString)))return FALSE; mButton[mButtons].mMessage=message; mButton[mButtons].mwParam=wParam; mButton[mButtons].mlParam=lParam; ::GetObject(mButton[mButtons].mhBitmap,sizeof(BITMAP),(LPSTR)&bitmapInfo); if(!mButtons) ::SetRect((RECT FAR *)&mButton[mButtons].mRect,0,0,bitmapInfo.bmWidth,bitmapInfo.bmHeight); else SetRect((RECT FAR *)&mButton[mButtons].mRect,mButton[mButtons-1].mRect.right,0,mButton[mButtons-1].mRect.right+bitmapInfo.bmWidth,bitmapInfo.bmHeight); setWidth(LastVisible); if(::IsWindowVisible(GetHandle()))::InvalidateRect(GetHandle(),&mButton[mButtons].mRect,FALSE); mButtons++; return TRUE; } void ToolBar::LeftButtonDown(WORD xPos,WORD yPos) { mButtonDown=isInButton(xPos,yPos); if(!HIWORD(mButtonDown))return; Paint(LOWORD(mButtonDown)); ::SetCapture(GetHandle()); } void ToolBar::LeftButtonUp() { if(!HIWORD(mButtonDown))return; ::InvalidateRect(GetHandle(),&mButton[LOWORD(mButtonDown)].mRect,FALSE); ::UpdateWindow(GetHandle()); ::PostMessage(GetParent(GetHandle()),mButton[LOWORD(mButtonDown)].mMessage, mButton[LOWORD(mButtonDown)].mwParam,mButton[LOWORD(mButtonDown)].mlParam); mButtonDown=FALSE; ::ReleaseCapture(); } void ToolBar::mouseMove(WORD xPos,WORD yPos) { DWORD mouseOverButton; if(!mButtonDown)return; mouseOverButton=isInButton(xPos,yPos); if(!HIWORD(mouseOverButton)) { ::InvalidateRect(GetHandle(),&mButton[LOWORD(mButtonDown)].mRect,FALSE); mButtonDown=FALSE; ::ReleaseCapture(); } else if(LOWORD(mouseOverButton)!=LOWORD(mButtonDown)) { ::InvalidateRect(GetHandle(),&mButton[LOWORD(mButtonDown)].mRect,FALSE); mButtonDown=FALSE; ::ReleaseCapture(); } } DWORD ToolBar::isInButton(WORD xPos,WORD yPos)const { for(int i=0;i= mButton[i].mRect.left && xPos<=mButton[i].mRect.right) && (yPos>=mButton[i].mRect.top && yPos<=mButton[i].mRect.bottom)) return (i+0x10000UL); } return 0; } void ToolBar::setWidth(Position position) { RECT parentRect; POINT cP; mWindowWidth=0; for(int i=0;i