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 + -
显示快捷键?