win32toolbar.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 1,556 行 · 第 1/3 页
CPP
1,556 行
TBBUTTONINFOW info = {0}; info.dwMask = TBIF_STYLE ; info.cbSize = sizeof(info); SendMessage( hwnd_, TB_GETBUTTONINFOW, tme->getItem()->getIndex(), (LPARAM)&info ); if ( tme->getItem()->isGrouped() ) { info.fsStyle |= TBSTYLE_GROUP; } else { info.fsStyle &= ~TBSTYLE_GROUP; } SendMessage( hwnd_, TB_SETBUTTONINFOW, tme->getItem()->getIndex(), (LPARAM)&info ); } else { TBBUTTONINFOA info = {0}; info.dwMask = TBIF_STYLE ; info.cbSize = sizeof(info); SendMessage( hwnd_, TB_GETBUTTONINFOA, tme->getItem()->getIndex(), (LPARAM)&info ); if ( tme->getItem()->isGrouped() ) { info.fsStyle |= TBSTYLE_GROUP; } else { info.fsStyle &= ~TBSTYLE_GROUP; } SendMessage( hwnd_, TB_SETBUTTONINFOA, tme->getItem()->getIndex(), (LPARAM)&info ); } } break; case ToolbarItem::tbCheckChanged : { ToolbarModelEvent* tme = (ToolbarModelEvent*)e; if ( System::isUnicodeEnabled() ) { TBBUTTONINFOW info = {0}; info.dwMask = TBIF_STYLE ; info.cbSize = sizeof(info); if ( SendMessage( hwnd_, TB_GETBUTTONINFOW, tme->getItem()->getIndex(), (LPARAM)&info ) >= 0 ) { if ( tme->getItem()->isChecked() ) { info.fsStyle |= TBSTYLE_CHECK; } else { info.fsStyle &= ~TBSTYLE_CHECK; } int i = SendMessage( hwnd_, TB_SETBUTTONINFOW, tme->getItem()->getIndex(), (LPARAM)&info ); } else { int err = GetLastError(); } } else { TBBUTTONINFOA info = {0}; info.dwMask = TBIF_STYLE ; info.cbSize = sizeof(info); if ( SendMessage( hwnd_, TB_GETBUTTONINFOA, tme->getItem()->getIndex(), (LPARAM)&info ) >= 0 ) { if ( tme->getItem()->isChecked() ) { info.fsStyle |= TBSTYLE_CHECK; } else { info.fsStyle &= ~TBSTYLE_CHECK; } int i = SendMessage( hwnd_, TB_SETBUTTONINFOA, tme->getItem()->getIndex(), (LPARAM)&info ); } else { int err = GetLastError(); } } } break; case ToolbarItem::tbItemControlAdded : { ToolbarModelEvent* tme = (ToolbarModelEvent*)e; Control* addedControl = NULL; if ( System::isUnicodeEnabled() ) { TBBUTTONINFOW info = {0}; info.dwMask = TBIF_STYLE; info.fsStyle = TBSTYLE_SEP ; info.cbSize = sizeof(info); index = tme->getItem()->getIndex(); SendMessage( hwnd_, TB_SETBUTTONINFOW, index, (LPARAM)&info ); addedControl = tme->getItem()->getItemControl(); Rect r = addedControl->getBounds(); memset( &info, 0, sizeof(info) ); info.dwMask = TBIF_SIZE; info.cbSize = sizeof(info); info.cx = r.getWidth(); SendMessage( hwnd_, TB_SETBUTTONINFOW, index, (LPARAM)&info ); } else { TBBUTTONINFOA info = {0}; info.dwMask = TBIF_STYLE; info.fsStyle = TBSTYLE_SEP ; info.cbSize = sizeof(info); index = tme->getItem()->getIndex(); SendMessage( hwnd_, TB_SETBUTTONINFOA, index, (LPARAM)&info ); addedControl = tme->getItem()->getItemControl(); Rect r = addedControl->getBounds(); memset( &info, 0, sizeof(info) ); info.dwMask = TBIF_SIZE; info.cbSize = sizeof(info); info.cx = r.getWidth(); SendMessage( hwnd_, TB_SETBUTTONINFOA, index, (LPARAM)&info ); } resizeToolbarItems(); currentlyModifyingItem_ = true; RECT tbRect = {0}; if ( SendMessage( hwnd_, TB_GETITEMRECT, index, (LPARAM)&tbRect ) ) { tme->getItem()->internal_setBounds( Rect(tbRect.left,tbRect.top,tbRect.right,tbRect.bottom) ); Container* container = this->peerControl_->getContainer(); if ( NULL != container ) { container->add( addedControl ); addedControl->setBounds( &Rect(tbRect.left,tbRect.top,tbRect.right,tbRect.bottom) ); addedControl->setVisible( true ); } else { throw RuntimeException( MAKE_ERROR_MSG_2("No container found - unable to add control to toolbar") ); } } currentlyModifyingItem_ = false; } break; case ToolbarItem::tbDimensionsChanged : { ToolbarModelEvent* tme = (ToolbarModelEvent*)e; if ( System::isUnicodeEnabled() ) { TBBUTTONINFOW info = {0}; info.dwMask = TBIF_SIZE ; info.cbSize = sizeof(info); Rect r = *tme->getItem()->getBounds(); info.cx = r.getWidth(); SendMessage( hwnd_, TB_SETBUTTONINFOW, tme->getItem()->getIndex(), (LPARAM)&info ); } else { TBBUTTONINFOA info = {0}; info.dwMask = TBIF_SIZE ; info.cbSize = sizeof(info); Rect r = *tme->getItem()->getBounds(); info.cx = r.getWidth(); SendMessage( hwnd_, TB_SETBUTTONINFOA, tme->getItem()->getIndex(), (LPARAM)&info ); } resizeToolbarItems(); } break; case ToolbarItem::tbAdded : { ToolbarModelEvent* tme = (ToolbarModelEvent*)e; bool val = ((Toolbar*)peerControl_)->getShowButtonCaptions(); insertToolbarButton( tme->getItem()->getIndex(), tme->getItem(), val ); } break; case ToolbarItem::tbRemoved : { ToolbarModelEvent* tme = (ToolbarModelEvent*)e; SendMessage( hwnd_, TB_DELETEBUTTON, tme->getItem()->getIndex(), 0 ); resizeToolbarItems(); } break; case ToolbarItem::tbStateChanged : { ToolbarModelEvent* tme = (ToolbarModelEvent*)e; long state = tme->getItem()->getState(); if ( System::isUnicodeEnabled() ) { TBBUTTONINFOW info = {0}; info.cbSize = sizeof(info); if ( state == ToolbarItem::tisSeparator ) { info.dwMask = TBIF_STYLE | TBIF_SIZE; info.fsStyle = TBSTYLE_SEP ; info.cx = 5; } else { if ( state & ToolbarItem::tisPressed ) { if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_CHECKED ; } } if ( state & ToolbarItem::tisGrouped ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_GROUP ; } if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_CHECK ; } if ( state & ToolbarItem::tisEnabled ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_ENABLED ; } else { info.dwMask |= TBIF_STATE ; info.fsState &= ~TBSTATE_ENABLED ; } } SendMessage( hwnd_, TB_SETBUTTONINFOW, tme->getItem()->getIndex(), (LPARAM)&info ); } else { TBBUTTONINFOA info = {0}; info.cbSize = sizeof(info); if ( state == ToolbarItem::tisSeparator ) { info.dwMask = TBIF_STYLE | TBIF_SIZE; info.fsStyle = TBSTYLE_SEP ; info.cx = 5; } else { if ( state & ToolbarItem::tisPressed ) { if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_CHECKED ; } } if ( state & ToolbarItem::tisGrouped ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_GROUP ; } if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_CHECK ; } if ( state & ToolbarItem::tisEnabled ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_ENABLED ; } else { info.dwMask |= TBIF_STATE ; info.fsState &= ~TBSTATE_ENABLED ; } } SendMessage( hwnd_, TB_SETBUTTONINFOA, tme->getItem()->getIndex(), (LPARAM)&info ); } } break; case ToolbarItem::tbIndexChanged : { } break; default : { } break; }}void Win32Toolbar::resizeToolbarItems( int startAt ){ int buttonCount = SendMessage( hwnd_, TB_BUTTONCOUNT, 0, 0 ); int index = (startAt >= 0) ? startAt : 0; for (index=0;index<buttonCount;index++ ) { RECT tbRect = {0}; if ( SendMessage( hwnd_, TB_GETITEMRECT, index, (LPARAM)&tbRect ) ) { TBBUTTONINFO info = {0}; info.cbSize = sizeof(info); info.dwMask |= TBIF_LPARAM; SendMessage( hwnd_, TB_GETBUTTONINFO, index, (LPARAM)&info ); ToolbarItem* item = (ToolbarItem*)info.lParam; item->internal_setBounds( Rect(tbRect.left,tbRect.top,tbRect.right,tbRect.bottom) ); } }}void Win32Toolbar::insertToolbarButton( const ulong32& index, ToolbarItem* item, bool showCaption ){ currentlyModifyingItem_ = true; TBBUTTON btn = {0}; if ( System::isUnicodeEnabled() ) { btn.dwData = (DWORD)item; btn.iBitmap = item->getImageIndex(); String caption = item->getCaption(); if ( item->getUseLocaleStrings() ) { caption = System::getCurrentThreadLocale()->translate( caption ); } VCFChar* tmp = new VCFChar[caption.size()+2]; caption.copy( tmp, caption.size() ); tmp[caption.size()] = 0; tmp[caption.size()+1] = 0; btn.iString = SendMessage( hwnd_, TB_ADDSTRINGW, (WPARAM) 0, (LPARAM) (LPSTR) tmp); buttonCaptionsMap_[caption] = btn.iString; if ( buttonCaptionsMap_.size() == 1 ) { SendMessage(hwnd_, TB_AUTOSIZE, 0, 0 ); } if ( !showCaption ) { btn.iString = -1; } btn.fsState = TBSTATE_ENABLED; btn.fsStyle = TBSTYLE_BUTTON /*| TBSTYLE_AUTOSIZE */; btn.idCommand = index; if ( !SendMessage( hwnd_, TB_INSERTBUTTONW, (WPARAM) index, (LPARAM)&btn ) ) { int err = GetLastError(); } TBBUTTONINFOW info = {0}; //info.dwMask = TBIF_IMAGE; info.cbSize = sizeof(info); if ( !SendMessage( hwnd_, TB_GETBUTTONINFOW, 0, (LPARAM)&info ) ) { int err = GetLastError(); } info.dwMask |= TBIF_LPARAM; info.lParam = (LPARAM)item; long state = item->getState(); if ( state == ToolbarItem::tisSeparator ) { info.dwMask = TBIF_STYLE | TBIF_SIZE; info.fsStyle = TBSTYLE_SEP ; info.cx = 5; } else { if ( state & ToolbarItem::tisPressed ) { //info.dwMask |= TBIF_STATE ; //info.fsState |= TBSTATE_PRESSED ; if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_CHECKED ; } } if ( state & ToolbarItem::tisGrouped ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_GROUP ; } if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_CHECK ; } if ( state & ToolbarItem::tisEnabled ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_ENABLED ; } else { info.dwMask |= TBIF_STATE ; info.fsState &= ~TBSTATE_ENABLED ; } } if ( NULL != item->getItemControl() ) { Rect bounds = item->getItemControl()->getBounds(); info.cx = bounds.getWidth(); info.dwMask = TBIF_STYLE | TBIF_SIZE; info.fsStyle = TBSTYLE_SEP ; } //info.iImage = I_IMAGECALLBACK; SendMessage( hwnd_, TB_SETBUTTONINFOW, index, (LPARAM)&info ); delete [] tmp; } else { btn.dwData = (DWORD)item; btn.iBitmap = item->getImageIndex(); String caption = item->getCaption(); if ( item->getUseLocaleStrings() ) { caption = System::getCurrentThreadLocale()->translate( caption ); } AnsiString ansiCaption = caption; char* tmp = new char[ansiCaption.size()+2]; ansiCaption.copy( tmp, ansiCaption.size() ); tmp[ansiCaption.size()] = 0; tmp[ansiCaption.size()+1] = 0; btn.iString = SendMessage( hwnd_, TB_ADDSTRINGA, (WPARAM) 0, (LPARAM) (LPSTR) tmp); buttonCaptionsMap_[ansiCaption] = btn.iString; if ( buttonCaptionsMap_.size() == 1 ) { SendMessage(hwnd_, TB_AUTOSIZE, 0, 0 ); } if ( !showCaption ) { btn.iString = -1; } btn.fsState = TBSTATE_ENABLED; btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE ; btn.idCommand = index; if ( !SendMessage( hwnd_, TB_INSERTBUTTONA, (WPARAM) index, (LPARAM)&btn ) ) { int err = GetLastError(); } TBBUTTONINFOA info = {0}; //info.dwMask = TBIF_IMAGE; info.cbSize = sizeof(info); if ( !SendMessage( hwnd_, TB_GETBUTTONINFOA, 0, (LPARAM)&info ) ) { int err = GetLastError(); } info.dwMask |= TBIF_LPARAM; info.lParam = (LPARAM)item; long state = item->getState(); if ( state == ToolbarItem::tisSeparator ) { info.dwMask = TBIF_STYLE | TBIF_SIZE; info.fsStyle = TBSTYLE_SEP ; info.cx = 5; } else { if ( state & ToolbarItem::tisPressed ) { //info.dwMask |= TBIF_STATE ; //info.fsState |= TBSTATE_PRESSED ; if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_CHECKED ; } } if ( state & ToolbarItem::tisGrouped ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_GROUP ; } if ( state & ToolbarItem::tisChecked ) { info.dwMask |= TBIF_STYLE ; info.fsStyle |= TBSTYLE_CHECK ; } if ( state & ToolbarItem::tisEnabled ) { info.dwMask |= TBIF_STATE ; info.fsState |= TBSTATE_ENABLED ; } else { info.dwMask |= TBIF_STATE ; info.fsState &= ~TBSTATE_ENABLED ; } } if ( NULL != item->getItemControl() ) { Rect bounds = item->getItemControl()->getBounds(); info.cx = bounds.getWidth(); info.dwMask = TBIF_STYLE | TBIF_SIZE; info.fsStyle = TBSTYLE_SEP ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?