Forum
Please
Log In
to post a new message or reply to an existing one. If you are not registered, please
register.
NOTE: Some forums may be read-only if you are not currently subscribed to
our technical support services.
Subject |
Author |
Date |
|
melcaun shin
|
Sep 1, 2008 - 7:52 PM
|
|
|
Technical Support
|
Sep 4, 2008 - 12:53 PM
|
|
|
melcaun shin
|
Sep 2, 2008 - 7:36 PM
|
|
|
Technical Support
|
Sep 2, 2008 - 11:42 AM
|
|
|
melcaun shin
|
Sep 9, 2008 - 12:42 AM
|
|
|
melcaun shin
|
Sep 2, 2008 - 7:36 PM
|
|
|
howard liu
|
Sep 1, 2008 - 9:32 AM
|
Hi, I have implemented prof-ui based advanced tool bar in the user interface of my application. These prof-ui based advanced tool bars are dockable in nature.This user interface has more than one tool bar within an interface. Under certain scenario these tools bars swaps their position. I would like to make these advanced tool bars pinned or non-dockable type Basically would want to have advanced prof-ui sytle tool bar and make them pinned (non-dockable or non-movable). How do I achieve this Thanks Howard
|
|
Technical Support
|
Sep 1, 2008 - 11:14 AM
|
Please invoke the following line code to make all the control bar non-re-dockable:CExtControlBar::g_bLockAllBars = false;
|
|
tera tera
|
Aug 31, 2008 - 10:06 PM
|
Hello. I want to let only upper and under sides dock in ControlBar.
|
|
Technical Support
|
Sep 23, 2008 - 5:47 AM
|
We didn’t include this feature into the drag-n-dropping algorithm for control bars. In fact, it’s hardly possible to restrict position of any control bar to particular sides of the main frame window because the user can dock control bars into tabbed group and the tabbed group can contain bars with different location restrictions. As result, it’s hardly possible to determine where this tabbed group can be docked and where not. The same problem is with complex floating mini frame windows contain many resizable control bars inside.
|
|
tera tera
|
Sep 19, 2008 - 12:52 AM
|
|
|
tera tera
|
Aug 31, 2008 - 8:11 PM
|
|
|
Technical Support
|
Sep 3, 2008 - 1:04 PM
|
We have modified your header cell initialization code for row header cells at left to fix the problem: for ( iRec = 0 ; iRec < 10 ; iRec++ )
{
pExtGridCellHeader =
STATIC_DOWNCAST(
CExtGridCellHeader,
m_pMuGrid->GridCellGetOuterAtLeft(
0,
iRec,
RUNTIME_CLASS(CExtGridCellHeader)
)
);
// pExtGridCellHeader->ExtentSet ( 15 );
pExtGridCellHeader->ExtentSet ( 18 );
pExtGridCellHeader->ExtentSet( 17, -1 );
pExtGridCellString =
STATIC_DOWNCAST(
CExtGridCellString,
m_pMuGrid->GridCellGet(
0,
iRec,
0,
0,
RUNTIME_CLASS(CExtGridCellString)
)
);
csStr.Format(" AAAA %d" , iRec );
pExtGridCellString->TextSet( csStr );
} This problem actually is not a problem. Your grid row height is simply very small. As a result the bounds of in-pace activated grid cell editor window become outside grid cell bounds.
|
|
Kevin Murray
|
Aug 29, 2008 - 2:18 PM
|
Followed the steps indicated here: http://www.prof-uis.com/prof-uis/tech-support/support-forum/toolbar-button-with-drop-down-arrow-and-list-2692.aspx#@lt;/p>
The button(s) show up as separated drop downs, my dynamically created menus show up as well. However, any attempt to use the button in a customize case fails. In the customize Commands window, the buttons show up in the list with the glyph indicating they are drop downs. If you put a copy of the drop button on another toolbar, though, only the main icon is copied, the drop down portion is not. Am I missing a step here? K.
|
|
Technical Support
|
Sep 1, 2008 - 3:22 AM
|
You can find an example of the split button embedded into a customizable toolbar in the DrawCli sample. This button allows you to select the line width. Please compare your code with that of that sample. Please note, the command you are inserting into menus on-the-fly is not customizable and should not be visible in the customize mode.
|
|
tera tera
|
Aug 29, 2008 - 2:05 AM
|
Hello. When I push DelKey many times, the cell does Assert.
|
|
Technical Support
|
Sep 3, 2008 - 1:02 PM
|
Thank you for reporting this issue. To fix it, please update the source code for the following method: bool CExtGridWnd::OnGbwBeginEdit(
LONG nVisibleColNo,
LONG nVisibleRowNo,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType,
const RECT & rcCellExtra,
const RECT & rcCell,
const RECT & rcInplaceControl,
bool bContinueMsgLoop,
__EXT_MFC_SAFE_LPCTSTR strStartEditText
)
{
ASSERT_VALID( this );
if( CExtGridBaseWnd::OnGbwBeginEdit(
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl, bContinueMsgLoop, strStartEditText
)
)
return true;
if( CExtPopupMenuWnd::IsMenuTracking() )
CExtPopupMenuWnd::CancelMenuTracking();
CWnd::CancelToolTips();
DWORD dwBseStyle = BseGetStyle();
if( nColType < 0 && (dwBseStyle&__EGWS_BSE_EDIT_CELLS_OUTER_L) == 0L )
return false;
else if( nColType > 0 && (dwBseStyle&__EGWS_BSE_EDIT_CELLS_OUTER_R) == 0L )
return false;
else if( nRowType < 0 && (dwBseStyle&__EGWS_BSE_EDIT_CELLS_OUTER_T) == 0L )
return false;
else if( nRowType > 0 && (dwBseStyle&__EGWS_BSE_EDIT_CELLS_OUTER_B) == 0L )
return false;
else if( nColType == 0 && nRowType == 0 && (dwBseStyle&__EGWS_BSE_EDIT_CELLS_INNER) == 0L )
return false;
static CExtGridCell * g_pEditCell = NULL;
bool bDoMsgLoop = true;
if( m_hWndInplaceControl != NULL )
{
if( ! bContinueMsgLoop )
return false;
HWND hWndInplaceControl = m_hWndInplaceControl;
m_hWndInplaceControl = NULL;
if( hWndInplaceControl != NULL )
{
bDoMsgLoop = false;
if( ::IsWindow(hWndInplaceControl) )
::DestroyWindow( hWndInplaceControl );
}
}
CRect rcActivate( rcInplaceControl );
if( rcActivate.left >= rcActivate.right || rcActivate.top >= rcActivate.bottom )
{
if( ! GridCellRectsGet( nColNo, nRowNo, nColType, nRowType, NULL, NULL, NULL, &rcActivate )
)
{
g_pEditCell = NULL;
return false;
}
if( rcActivate.IsRectEmpty() )
{
g_pEditCell = NULL;
return false;
}
}
CExtGridCell * pCellToEdit = GridCellGet( nColNo, nRowNo, nColType, nRowType );
if( pCellToEdit == NULL )
return false;
ASSERT_VALID( pCellToEdit );
ASSERT( pCellToEdit->IsKindOf(RUNTIME_CLASS(CExtGridCell)) );
ASSERT_VALID( pCellToEdit->DataProviderGet() );
g_pEditCell = pCellToEdit;
m_hWndInplaceControl =
g_pEditCell->OnInplaceControlCreate(
*this, nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcActivate, m_nHelperLastEditedColNo, m_nHelperLastEditedRowNo
);
if( m_hWndInplaceControl == NULL || ( ! ::IsWindow( m_hWndInplaceControl ) ) )
{
m_hWndInplaceControl = NULL;
g_pEditCell = NULL;
DWORD dwCellStyle = pCellToEdit->GetStyle();
if( (dwCellStyle&__EGCS_CHK_MASK) == 0 )
{
if( (dwCellStyle&__EGCS_BUTTON_DROPDOWN) != 0 )
{
bool bEnabled = false;
if( pCellToEdit->OnQueryButtonInfo(
INT(CExtGridCell::__EBTT_DROPDOWN), this, nColNo, nRowNo,
nColType, nRowType, &bEnabled
)
)
{
if( bEnabled )
{
pCellToEdit->OnButtonPressed(
*this, INT(CExtGridCell::__EBTT_DROPDOWN), rcCellExtra, rcCell,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType
);
return true;
}
}
}
}
return false;
}
m_nHelperLastEditedColNo = nColNo;
m_nHelperLastEditedRowNo = nRowNo;
if( ! bDoMsgLoop )
return true;
CWinThread * pThread = ::AfxGetThread();
ASSERT_VALID( pThread );
if( strStartEditText != NULL )
{
bool bSetText = true;
TCHAR strClassName[512];
::GetClassName( m_hWndInplaceControl, strClassName, 512 );
if( _tcslen( strClassName ) > 0 )
{
__EXT_MFC_STRLWR( strClassName, 512 );
if( _tcsstr( strClassName, _T("edit") ) != NULL
|| _tcsstr( strClassName, _T("riched") ) != NULL
|| _tcsstr( strClassName, _T("sysipaddress32") ) != NULL
)
{
bSetText = false;
bool bRelpaceSel = true;
HWND hWndInplaceControl = m_hWndInplaceControl;
if( _tcsstr( strClassName, _T("sysipaddress32") ) != NULL )
{
for( HWND hWnd = ::GetWindow( m_hWndInplaceControl, GW_CHILD );
hWnd != NULL;
hWnd = ::GetWindow( hWnd, GW_HWNDNEXT )
)
{
ASSERT( hWnd != NULL );
ASSERT( ::IsWindow(hWnd) );
if( ::GetFocus() == hWnd )
{
hWndInplaceControl = hWnd;
break;
}
}
CExtGridCellIPAddress * pCellIP = DYNAMIC_DOWNCAST( CExtGridCellIPAddress, g_pEditCell );
if( pCellIP != NULL )
{
CIPAddressCtrl * pWnd = DYNAMIC_DOWNCAST( CIPAddressCtrl, CWnd::FromHandlePermanent( m_hWndInplaceControl ) );
if( pWnd != NULL )
{
DWORD dwIPAddress = 0;
pCellIP->GetAddress( dwIPAddress );
TCHAR chr = strStartEditText[ 0 ];
DWORD nField0 = DWORD( chr - _T(’0’) );
DWORD nField1 = (DWORD) SECOND_IPADDRESS( dwIPAddress );
DWORD nField2 = (DWORD) THIRD_IPADDRESS( dwIPAddress );
DWORD nField3 = (DWORD) FOURTH_IPADDRESS( dwIPAddress );
dwIPAddress = DWORD( MAKEIPADDRESS( nField0, nField1, nField2, nField3 ) );
pWnd->SetAddress( dwIPAddress );
::SendMessage( hWndInplaceControl, EM_SETSEL, WPARAM(1), LPARAM(1) );
bRelpaceSel = false;
}
}
}
if( bRelpaceSel )
{
::SendMessage( hWndInplaceControl, EM_SETSEL, WPARAM(0), LPARAM(-1) );
::SendMessage( hWndInplaceControl, EM_REPLACESEL, WPARAM(TRUE), LPARAM(strStartEditText) );
}
}
}
if( bSetText )
::SetWindowText( m_hWndInplaceControl, strStartEditText );
}
HWND hWndGrid = m_hWnd;
bool bStopFlag = false;
for( MSG msg;
m_hWndInplaceControl != NULL
&& ::IsWindow( m_hWndInplaceControl )
&& ::IsWindowVisible( m_hWndInplaceControl )
&& ::IsWindow( hWndGrid )
&& (!bStopFlag)
&& (g_pEditCell != NULL)
;
)
{
if( ! ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
{
if( m_hWndInplaceControl == NULL
|| ( ! ::IsWindow( m_hWndInplaceControl ) )
|| ( ! ::IsWindow( hWndGrid ) )
|| bStopFlag
|| g_pEditCell == NULL
)
break;
LONG nIdleCounter = 0L;
for( nIdleCounter = 0L;
g_pEditCell->OnInplaceControlIdle( m_hWndInplaceControl, *this, nIdleCounter );
nIdleCounter ++
)
{
ASSERT_VALID( g_pEditCell );
}
if( CExtGridWnd::g_bEnableOnIdleCalls )
{
for( nIdleCounter = 0L;
pThread->OnIdle(nIdleCounter);
nIdleCounter ++
);
}
::WaitMessage();
continue;
}
switch( msg.message )
{
case WM_KILLFOCUS:
if( msg.hwnd == m_hWndInplaceControl )
bStopFlag = true;
break;
case WM_CANCELMODE:
case WM_ACTIVATEAPP:
case WM_SYSCOMMAND:
case WM_SETTINGCHANGE:
case WM_SYSCOLORCHANGE:
bStopFlag = true;
break;
case WM_COMMAND:
if( (HIWORD(msg.wParam)) == 0 || (HIWORD(msg.wParam)) == 1 )
bStopFlag = true;
break;
case WM_CAPTURECHANGED:
if( (HWND)msg.wParam != m_hWndInplaceControl )
bStopFlag = true;
break;
case WM_LBUTTONUP:
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_NCLBUTTONUP:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONDBLCLK:
case WM_NCRBUTTONUP:
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONDBLCLK:
case WM_NCMBUTTONUP:
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONDBLCLK:
case WM_CONTEXTMENU:
if( msg.hwnd != m_hWndInplaceControl && (!::IsChild( m_hWndInplaceControl, msg.hwnd )) )
bStopFlag = true;
break;
default:
if( ( ! bStopFlag )
&& WM_KEYFIRST <= msg.message
&& msg.message <= WM_KEYLAST
&& ( msg.hwnd != m_hWndInplaceControl
|| (!::IsChild( m_hWndInplaceControl, msg.hwnd ))
)
)
{
bool bAlt =
( (::GetAsyncKeyState(VK_MENU)&0x8000) != 0 )
? true : false;
bool bCtrl =
( (::GetAsyncKeyState(VK_CONTROL)&0x8000) != 0 )
? true : false;
bool bShift =
( (::GetAsyncKeyState(VK_SHIFT)&0x8000) != 0 )
? true : false;
if( ! bAlt )
{
if( bCtrl
&& (!bShift)
&& ( int(msg.wParam) == VK_INSERT
|| int(msg.wParam) == int( _T(’C’) )
)
)
{
LRESULT lResult = 0L;
g_pEditCell->OnInplaceControlWindowProc(
lResult, msg.message, msg.wParam, msg.lParam, msg.hwnd, *this,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl
);
::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
if( msg.message == WM_KEYDOWN )
::SendMessage( msg.hwnd, WM_COPY, 0, 0 );
continue;
}
if( ( bCtrl && (!bShift) && int(msg.wParam) == int( _T(’V’) ) )
|| ( (!bCtrl) && bShift && int(msg.wParam) == VK_INSERT )
)
{
LRESULT lResult = 0L;
g_pEditCell->OnInplaceControlWindowProc(
lResult, msg.message, msg.wParam, msg.lParam, msg.hwnd, *this,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl
);
::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
if( msg.message == WM_KEYDOWN )
::SendMessage( msg.hwnd, WM_PASTE, 0, 0 );
continue;
}
if( ( bCtrl && (!bShift) && int(msg.wParam) == int( _T(’X’) ) )
|| ( (!bCtrl) && bShift && int(msg.wParam) == VK_DELETE )
)
{
LRESULT lResult = 0L;
g_pEditCell->OnInplaceControlWindowProc(
lResult, msg.message, msg.wParam, msg.lParam, msg.hwnd, *this,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl
);
::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
if( msg.message == WM_KEYDOWN )
{
if( ( g_pEditCell->GetStyle() & __EGCS_READ_ONLY ) == 0 )
::SendMessage( msg.hwnd, WM_CUT, 0, 0 );
else
::SendMessage( msg.hwnd, WM_COPY, 0, 0 );
}
continue;
}
if( bCtrl && (!bShift) && int(msg.wParam) == int( _T(’A’) ) )
{
LRESULT lResult = 0L;
g_pEditCell->OnInplaceControlWindowProc(
lResult, msg.message, msg.wParam, msg.lParam, msg.hwnd, *this,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl
);
::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
if( msg.message == WM_KEYDOWN )
::SendMessage( msg.hwnd, EM_SETSEL, 0, -1 );
continue;
}
if( (!bCtrl) && (!bShift) && int(msg.wParam) == VK_DELETE )
{
if( msg.message != WM_CHAR )
{
LRESULT lResult = 0L;
g_pEditCell->OnInplaceControlWindowProc(
lResult, msg.message, msg.wParam, msg.lParam, msg.hwnd, *this,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl
);
::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
if( msg.message == WM_KEYDOWN )
{
LPTSTR strEmpty = _T("");
INT nSelStart = 0, nSelEnd = 0;
::SendMessage( msg.hwnd, EM_GETSEL, reinterpret_cast < WPARAM > ( &nSelStart ), reinterpret_cast < LPARAM > ( &nSelEnd ) );
bool bReplace = true;
if( nSelStart == nSelEnd )
{
INT nReplaceEnd = nSelStart + 1;
CString s;
CWnd::FromHandle( msg.hwnd )->GetWindowText( s );
INT nTextLength = INT( s.GetLength() );
if( 0 <= nSelStart && nSelStart < nTextLength )
{
TCHAR chr = s.GetAt( nSelStart );
if( chr == _T(’\r’) || chr == _T(’\n’) )
nReplaceEnd ++;
::SendMessage( msg.hwnd, EM_SETSEL, WPARAM( nSelStart ), LPARAM( nReplaceEnd ) );
}
else
bReplace = false;
}
if( ( g_pEditCell->GetStyle() & __EGCS_READ_ONLY ) != 0 )
bReplace = false;
if( bReplace )
::SendMessage( msg.hwnd, EM_REPLACESEL, 1, reinterpret_cast < LPARAM > ( strEmpty ) );
}
continue;
}
}
}
if( ( (!bAlt) && bCtrl && (!bShift) && int(msg.wParam) == int( _T(’Z’) ) )
|| ( bAlt && (!bCtrl) && (!bShift) && int(msg.wParam) == VK_BACK )
)
{
LRESULT lResult = 0L;
g_pEditCell->OnInplaceControlWindowProc(
lResult, msg.message, msg.wParam, msg.lParam, msg.hwnd, *this,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType,
rcCellExtra, rcCell, rcInplaceControl
);
::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
if( msg.message == WM_KEYDOWN )
::SendMessage( msg.hwnd, WM_UNDO, 0, 0 );
continue;
}
}
break;
}
if( bStopFlag )
break;
if( ! pThread->PumpMessage() )
break;
}
g_pEditCell = NULL;
if( ! ::IsWindow( hWndGrid ) )
return true;
ASSERT( CWnd::FromHandlePermanent(hWndGrid) == this );
ASSERT_VALID( this );
m_nHelperLastEditedColNo = -1L;
m_nHelperLastEditedRowNo = -1L;
if( m_hWndInplaceControl != NULL )
{
if( ::IsWindow(m_hWndInplaceControl) )
{
if( ::GetCapture() == m_hWndInplaceControl )
::ReleaseCapture();
::ShowWindow( m_hWndInplaceControl, SW_HIDE );
::SetFocus( m_hWnd );
}
m_hWndInplaceControl = NULL;
}
return true;
}
|
|
tera tera
|
Sep 2, 2008 - 6:32 PM
|
Please answer it
I am troubled.
|
|
Robert Webb
|
Aug 28, 2008 - 8:23 PM
|
Is it possible to have a ribbon bar, a menu, and toolbars together in one app? We may offer a choice of one or the other, but at least for now in our in-house version we’d like to have both to help with development. The problem I’m having is in the ordering of commands. Ribbon bar must be created first, before menu/toolbars/control bars. But it seems that CExtCustomizeSite::EnableCustomization() must be called after menus and control bars are created and before the ribbon bar is created, leading to a paradox. If CExtCustomizeSite::EnableCustomization() is called before control bars are created, CExtCustomizeSite::CustomizeStateSerialize() hits an ASSERT because the number of control bars already created (currently 0) doesn’t match the number read from the registry. If CExtCustomizeSite::EnableCustomization() is called after the ribbon bar is created, then CExtToolControlBar::OnCustomizeRegisterBar() asserts because it gets called twice for the ribbon bar. Once during the ribbon bar creation, and again via CExtCustomizeSite::EnableCustomization(). After clicking through all the asserts it does actually pop up and work though. Can CExtCustomizeSite::EnableCustomization() even be used effectively in a ribbon bar project? Thanks,
Rob.
|
|
Technical Support
|
Dec 23, 2008 - 9:15 AM
|
We are sorry for delay with this reply. We received your project and sent its fixed version back to you by email.
|
|
Technical Support
|
Sep 1, 2008 - 10:56 AM
|
Thank you for the interesting question. The ribbon bar control works as a standalone customizable set of toolbars and menus. The CExtRibbonBar class is based on both CExtMenuControlBar and CExtCustomizeSite classes. Although its is possible to create two UI types inside one main frame window at the same time, ribbon UI and toolbar/menu bar UI (customizable or not), it is easier to create and initialize only a ribbon bar or only toolbars and the menu bar at one time. These two UI types will have absolutely independent state data. The customize site created and initialized for toolbars and menus will not intersect with the internal customize site of ribbon bar. Their states should be serialized into different registry locations or different files.
It’s also possible to create both UI types at the same time. But ribbon bar’s functionality conflicts with that of the menu bar. For example, the ALT key pressing (VK_MENU ) should be used both for keyboard navigation in the menu bar and key tip-based navigation in the ribbon bar. If the ribbon bar and menu bar are created at the same time, you should keep visible only one of them and perform message pre-translation only into one of them. Of course, the ribbon bar should be created before other control bars are. This will allow it to occupy the outer part of the main frame window which is closest to the caption.
We can take a look at your source code and clarify what’s wrong. But generally, your main frame window initialization should be similar to any Prof-UIS sample application with customizable toolbars and menus where creation of the ribbon bar control is inserted at beginning of the CMainFrame::OnCreate() method.
|
|
Robert Webb
|
Dec 18, 2008 - 7:02 PM
|
Hi again, This is going back a while, but I still need a way forward. I have sent you an email with a test project attached, showing the assertion that occurs when customizable tool bars and ribbon bars are used together, plus the fact that the tool bars can’t be properly customized at all. I had thought that the conflict was between ribbon and menu, but it now seems that the problem still exists when no menu is created, so the conflict is really between customizable tool bars and the ribbon bar. Surely ribbon bar and customizable tool bars should be expected to be used together? Thanks,
Rob.
|
|
tera tera
|
Aug 27, 2008 - 10:37 PM
|
Hello. Only a specific tab wants to display an X button.
|
|
Technical Support
|
Sep 1, 2008 - 11:01 AM
|
You should apply the __ETWI_EX_NO_CLOSE_ON_TAB extended tab item style to the tab items which should not display "x" button.
|
|
Dongsik Chae
|
Aug 27, 2008 - 2:50 AM
|
Dear, I reffered the article "Prof-UIS Grid Brief Overview". And subclassed ’CExtGridCellButton’ as follows. But the compiler issues the errors; error C2061: syntax error : identifier ’pMalloc’ at IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton ); error C2665: ’CExtGridCell::operator new’ : none of the 2 overloads could convert all the argument types
could be ’void *CExtGridCell::operator new(size_t,IMalloc *,bool)’ at // class declaration class CExtGridCellButtonNoti : public CExtGridCellButton {
public:
DECLARE_DYNCREATE( CExtGridCellButtonNoti );
IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton );
CExtGridCellButtonNoti (
CExtGridDataProvider * pDataProvider = NULL
)
: CExtGridCellButton( pDataProvider )
{
}
virtual ~CExtGridCellButtonNoti ()
{
}
#ifdef _DEBUG
virtual void AssertValid() const
{
CExtGridCell::AssertValid();
}
virtual void Dump( CDumpContext & dc ) const
{
CExtGridCell::Dump( dc );
}
#endif // _DEBUG
...
|
|
Dongsik Chae
|
Aug 27, 2008 - 2:50 AM
|
Dear, I reffered the article "Prof-UIS Grid Brief Overview". And subclassed ’CExtGridCellButton’ as follows. But the compiler issues the errors; error C2061: syntax error : identifier ’pMalloc’ at IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton ); error C2665: ’CExtGridCell::operator new’ : none of the 2 overloads could convert all the argument types
could be ’void *CExtGridCell::operator new(size_t,IMalloc *,bool)’ // class declaration class CExtGridCellButtonNoti : public CExtGridCellButton {
public:
DECLARE_DYNCREATE( CExtGridCellButtonNoti );
IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton );
CExtGridCellButtonNoti (
CExtGridDataProvider * pDataProvider = NULL
)
: CExtGridCellButton( pDataProvider )
{
}
virtual ~CExtGridCellButtonNoti ()
{
}
#ifdef _DEBUG
virtual void AssertValid() const
{
CExtGridCell::AssertValid();
}
virtual void Dump( CDumpContext & dc ) const
{
CExtGridCell::Dump( dc );
}
#endif // _DEBUG
...
|
|
Dongsik Chae
|
Aug 27, 2008 - 2:50 AM
|
Dear, I reffered the article "Prof-UIS Grid Brief Overview". And subclassed ’CExtGridCellButton’ as follows. But the compiler issues the errors; error C2061: syntax error : identifier ’pMalloc’ at IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton ); error C2665: ’CExtGridCell::operator new’ : none of the 2 overloads could convert all the argument types
could be ’void *CExtGridCell::operator new(size_t,IMalloc *,bool)’ // class declaration class CExtGridCellButtonNoti : public CExtGridCellButton {
public:
DECLARE_DYNCREATE( CExtGridCellButtonNoti );
IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton );
CExtGridCellButtonNoti (
CExtGridDataProvider * pDataProvider = NULL
)
: CExtGridCellButton( pDataProvider )
{
}
virtual ~CExtGridCellButtonNoti ()
{
}
#ifdef _DEBUG
virtual void AssertValid() const
{
CExtGridCell::AssertValid();
}
virtual void Dump( CDumpContext & dc ) const
{
CExtGridCell::Dump( dc );
}
#endif // _DEBUG
...
|
|
Technical Support
|
Aug 27, 2008 - 11:42 AM
|
You should insert the IMPLEMENT_ExtGridCell_Clone( CExtGridCellButtonNoti, CExtGridCellButton ); line of code before definition of the debug version of MFC’s new operator.
|
|
Dongsik Chae
|
Aug 27, 2008 - 4:14 AM
|
Solved. The reason is... #ifdef _DEBUG
#define new DEBUG_NEW
#endif ˆ_ˆ;;;
|
|
Hans Peter Miedeck
|
Aug 26, 2008 - 7:35 AM
|
Hello, can you help me? I have to programm a gantt chart for my project. Do you have a subclass from CExtGridWnd which fits this problem?
|
|
Technical Support
|
Aug 26, 2008 - 10:32 AM
|
Unfortunately we have no ready-to use chart control. But you could use the grid window to create the chart like you need. Some of columns and/or rows in the grid window can be used for text cells implementing headers and/or captions which let the user recognize data displayed on the chart. The rest of columns are allocated by chart cells. You probably need to code your own small grid cell class. Such a grid cell could paint part of each chart line. Some grid cells will be completely clear, some completely covered by chart lines and some only partially covered on left/right. So, each grid cell should know which part of which chart line it represents. The CExtGridCell::OnPaintBackground() and CExtGridCell::OnPaintForeground() virtual methods receiving row/column numbers in parameters. So, each grid cell knows where it’s located. You will need to compute an intersection of each chart cell with each line of chart before painting the surface of your small grid cell class. You will also need to decide which range of data is covered by each column in the grid window. This data range can be optionally configurable parameter of the chart control based on our grid control. We can help you with coding such control or even code it for the next Prof-UIS version if you provide us with more details about it.
|
|
Hans Peter Miedeck
|
Aug 27, 2008 - 2:38 AM
|
Dear Support, I need only a control like the Timeline by Windows Movie Maker. I would like to move or/and expand the bars in the x-axis but not in the y-axis. Thanks for you offer to help me.
|
|
Offer Har
|
Aug 25, 2008 - 12:51 PM
|
Dear support, This is a bug I reported a couple of months ago in 2.83, which was not there in 2.82, even sent you a clip showing how in 2.83, you can get to a scenario in which you resize a flating bar, the mouse cursor and the the dragged window frame are not at the same location, which is very confusing. I will send you via mail two things:
1. The clip to refresh your memory
2. A sample application that reproduce this problem After compiling (in debug) and running the application do this: 1. Open 10 documents (each one moves a blue square on a red background)
2. Tile them
3. Group the 3 floating dialogs together into one tab.
4. Detach one of the dialog from the tab
5. Quickly resize it’s bottom frame to make it higher. You’ll see that the frame of the bar and the mouse are not at the same position. Please let me know if you have any problems reproducing it, and please fix for 2.84, this bug prevented us from swithcing to 2.83 Thanks
Ron. This is a screenshot from the application when the bug happens:
|
|
Technical Support
|
Aug 26, 2008 - 1:10 PM
|
It looks like we fixed this problem. Thank you. Please update the source code for the following method: void CExtMiniDockFrameWnd::_ResizingStart(
UINT nHitTest,
const CPoint & point
)
{
ASSERT( m_nResizingMode == HTNOWHERE );
ASSERT( IsWindowVisible() );
CPoint pointCurrentCursorPos = point;
ScreenToClient( &pointCurrentCursorPos );
CExtPopupMenuWnd::CancelMenuTracking();
CWnd::CancelToolTips();
CExtControlBar * pExtBar = GetControlBarExt();
ASSERT_VALID( pExtBar );
if( ! pExtBar->_FloatStateChangingIsEnabled( pExtBar ) )
return;
if( ( ! pExtBar->_IsShowContentWhenDragging() ) && pExtBar->IsFixedMode() )
{
m_nResizingMode = HTNOWHERE;
pExtBar->m_pDockContext->StartResize(nHitTest, point);
return;
}
switch( nHitTest )
{
case HTLEFT:
case HTRIGHT:
case HTTOP:
case HTTOPLEFT:
case HTTOPRIGHT:
case HTBOTTOM:
case HTBOTTOMLEFT:
case HTBOTTOMRIGHT:
m_nResizingMode = nHitTest;
break;
default:
return;
}
#ifdef _DEBUG
int nPos = 1;
CControlBar * pDebugDummyBar = NULL;
while( pDebugDummyBar == NULL && nPos < m_wndDockBar.m_arrBars.GetSize() )
pDebugDummyBar = reinterpret_cast < CExtDockBar & > ( m_wndDockBar ) . GetDockedControlBar( nPos++ );
ASSERT( pDebugDummyBar != NULL );
ASSERT_KINDOF( CExtControlBar, pDebugDummyBar );
ASSERT( pDebugDummyBar->m_pDockContext != NULL );
ASSERT( (m_wndDockBar.m_dwStyle & CBRS_FLOAT_MULTI) == 0 );
#endif
ASSERT( pExtBar == pDebugDummyBar );
ASSERT( pExtBar->m_pDockContext != NULL );
if( ! pExtBar->IsFixedMode() )
ModifyStyle( __REMOVED_NONFIXMODE_STYLES, 0 );
BringWindowToTop();
CExtMouseCaptureSink::SetCapture( GetSafeHwnd() );
GetWindowRect( &m_rcWndResizingStart );
HWND hWndExtBar = pExtBar->m_hWnd;
pExtBar->OnControlBarPositionChange( pExtBar, CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING, true, false );
_ResizingUpdateState( pointCurrentCursorPos );
pExtBar->OnControlBarPositionChange( pExtBar, CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING, false, false );
while( m_nResizingMode != HTNOWHERE )
{
::WaitMessage();
MSG msg;
while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
{
bool bStop = false;
switch( msg.message )
{
case WM_ACTIVATEAPP:
case WM_COMMAND:
bStop = true;
break;
default:
if( WM_KEYFIRST <= msg.message && msg.message <= WM_KEYLAST )
bStop = true;
break;
case WM_MOUSEMOVE:
if( _ResizingIsInProgress() )
{
PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE);
for( ; PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_NOREMOVE); )
PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE);
if( ::GetCursorPos( &pointCurrentCursorPos ) )
{
_ResizingUpdateState( pointCurrentCursorPos );
pExtBar->OnControlBarPositionChange( pExtBar, CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING, false, false );
}
continue;
}
break;
}
if( (!bStop) && CExtMouseCaptureSink::GetCapture() != GetSafeHwnd() )
bStop = true;
if( bStop )
{
_ResizingEnd();
if( ::IsWindow( hWndExtBar ) )
pExtBar->OnControlBarPositionChange( pExtBar, CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING, false, true );
return;
}
if( !AfxGetThread()->PumpMessage() )
{
PostQuitMessage(0);
return;
}
}
if( CExtControlBar::g_bEnableOnIdleCalls )
{
for( LONG nIdleCounter = 0L; ::AfxGetThread()->OnIdle(nIdleCounter); nIdleCounter ++ );
}
}
if( ::IsWindow( hWndExtBar ) )
pExtBar->OnControlBarPositionChange( pExtBar, CExtControlBar::__ECBPC_FLOATING_FRAME_RESIZING, false, true );
}
|
|
Offer Har
|
Aug 26, 2008 - 2:19 PM
|
Problem solved! Thanks.
|
|
Offer Har
|
Aug 25, 2008 - 7:21 AM
|
Hi, We have a simple MDI application, and we run it on NVidia dual view. The application is defined to show maximized pMainFrame->ShowWindow(SW_SHOWMAXIMIZED); We do this: 1) Put the shortcut on the left (main) monitor 2) Put the shortcut on the right monitor When we run from the left monitor, the application opens on the left monitor, maximized, and all is well. When we run it from the right monitor, the application opens on the right monitor, maximzied (according to the icons on the top right corner...) but does not occupies the whole area of the monitor (seems like it leaves space for the start menu...) Few issues: 1) Why does it starts on the right monitor at all? If it saves the location, it should starte always on the left monitor. 2) Why does it leave space for the start menu? it is very confising and looks very weird that the application is ’maximized’ but is not. Please fix for version 2.84 You can reproduce this with the test MDI application I sent you. Thanks, Ron.
|
|
Technical Support
|
Aug 28, 2008 - 12:32 PM
|
We used SDI sample and v.2.83 on dual monitor (main on left is 1400x1050, secondary on right is 1280x1024) Windows XP SP3, NVidia 7600 Go video card, LG M1 Pro computer. We removed the HKEY_CURRENT_USER\Software\Foss\SDI registry each time before starting this application. That means the main frame window placement was not restored. We created a shortcut on the desktop, we tried to place it on both monitor before starting the application. Each time it starts on the same monitor where shortcut is. The maximization works OK and the maximized window always appears on the correct monitor. If we do not remove the registry settings, the main frame window appears restored on the same monitor where it was closed. So, we found no problems. The incorrect maximization behavior on the multi monitor systems amy be because of:
1) You are using the SetWindowPlacement() API for your main frame window at startup and the specified window placement parameters were composed incorrectly.
2) You are handling the WM_GETMINMAXINFO standard Windows message and fill the min/max information coordinates incorrectly.
3) You perform any other incorrect window position changing using SetWindowPos() , DeferWindowPos() and/or MoveWindow() APIs somewhere at initialization steps.
The first two cases can provide you with ability to manipulate with initial position of your main frame window and allow you to forcibly show it maximized on the primary monitor with x=0 and y=0 coordinates of top/left corner when your application runs for the first time.
|
|
Offer Har
|
Aug 28, 2008 - 2:17 PM
|
Dear Support, I sent you a sample application that reproduce this bug. You know exactly what I do, because I sent you all the sources... just run teh application I sent you, which is an MDI application created bythe MFC wizard and you will see the problem, none of the things you wrote are done in my application, and you already have it running. Please run my application (which you already compiled and ran) and you will see the problems. Regards, Ron.
|
|
Technical Support
|
Sep 2, 2008 - 11:57 AM
|
Yes, we confirm that the problem really occurs in your test application. But only in the test application you provided. In fact, we sent you a modified (fixed) version of your test app and our comments several days ago (on 26th of August). This fixed version behaves exactly like any of our sample applications.
|
|
Offer Har
|
Sep 2, 2008 - 12:02 PM
|
Dear Support, your modified application did not fully solve all the probelms I reported (and I replied on the 26th with these comments) a) If I double-click the application icon on the right monitor, it opens on the right monitor - can’t I have it open always on the left monitor (this happens even if I close it on the left monitor)
b) If I open the application from the right window, you can clearly see that the status bar is missing a few pixels at the bottom, which it doesn’t if I open on the left window
c) If I double-click the title bar (restore) the application goes to the left monitor, even if it opened maximized on the right monitor, this is very confusing.
|
|
Technical Support
|
Sep 5, 2008 - 6:24 AM
|
Please download the following ZIP file and unpack it over installed Prof-UIS folder:
CExtNCW-maximization-fix.zip
This ZIP file includes an improved version of the CExtNCW template class. Now maximization, restoring, system command processing and window resizing work in a absolutely differently way because the WM_GETMINMAXINFO message is handled by skinned windows more correctly. You should not encounter skinned windows problem on any monitors.
|
|
Offer Har
|
Aug 26, 2008 - 5:39 AM
|
Dear Support,
a) If I double-click the application icon on the right monitor, it opens on the right monitor - can’t I have it open always on the left monitor (this happens even if I close it on the left monitor, which means the position data is saved)
b) If I open the application from the right window, you can clearly see that the status bar is missing a few pixels at the bottom, which it doesn’t if I open on the left window
b) If I double-click the title bar (restore) the application goes to the left monitor. this is very confusing.
Regards,
Ron.
|
|
Offer Har
|
Aug 25, 2008 - 7:11 AM
|
Hi, We’ve been trying to apply this style to out MDI application with no success. After setting this template to the child frame, Tile and Cascade stop to function correctly.
We created a simple MDI application using MFC wizard, and added the templates to main frame and child frame - that’s all we did... The regenerate the bug, all you have to do is this: 1) Run the application
2) Maximize the child frame opened
3) Create a second child frame (using the File->New)
4) Try tile & cascade. If you remove the template from the child frame, it all works fine. I will e-mail you the test project, which is basicaly a defulat MFC MDI application with Prof-UIS added to it. Please try and fix this for version 2.84 Thanks,
Ron. This is how it looks: Good tile and cascade: Bad tile & cascade, when child frame is using CExtNCW
|
|
Technical Support
|
Sep 9, 2008 - 2:15 PM
|
This source code update can be used for patching 2.83. You should simply overwrite both .../Prof-UIS/Include/ExtNcFrame.h and .../Prof-UIS/Src/ExtNcFrame.cpp files when unpacking ZIP file, rebuild required Prof-UIS 2.83 library configurations and your project(s).
|
|
Offer Har
|
Sep 9, 2008 - 3:08 PM
|
Thanks - will try it out.
|
|
Offer Har
|
Sep 4, 2008 - 12:19 PM
|
Are you going to fix this bug? I even sent you a saple application to reproduce it, and you don’t even bother telling me if you were able to reproduce it. Please do so ASAP!
|
|
Technical Support
|
Sep 6, 2008 - 9:01 AM
|
|
|
Offer Har
|
Sep 9, 2008 - 9:31 AM
|
I’m still using 2.83.... will wait for official 2.84 version release, or can you make this fix available for 2.83?
|
|
Oliver Rogall
|
Aug 25, 2008 - 2:06 AM
|
Hi, the CExtScrollBar does not work correctly, when I reverse the function of the mouse buttons with the Windows option ’Switch primary and secondary buttons’ in Mouse Properties dialog box. All other controls works fine, only the CExtScrollBar does not respond to the right button! Thanks
|
|
Technical Support
|
Aug 25, 2008 - 6:41 AM
|
|
|
howard liu
|
Aug 23, 2008 - 1:13 AM
|
Hi, I have colored an user interface in my application. The Drawitem( ) is not getting called in a status bar whenever there are any changes. How to overcome this situation Thanks, Ranga
|
|
Technical Support
|
Aug 25, 2008 - 6:55 AM
|
The CExtStatusControlBar window in Prof-UIS is based on the standard status bar common control. But our status bar is completely re-painted from scratch. Please override the virtual methods of the CExtStatusControlBar class if you want to re-paint its parts:
- CExtStatusControlBar::OnPaintEntireBackground() - paints the entire background of the status bar - CExtStatusControlBar::OnErasePaneBackground() - paints the background of a status pane - CExtStatusControlBar::OnPaintPane() - paint the foreground of a status pane - CExtStatusControlBar::OnPaintSeparator() - paint a separator between panes
|
|
armond glover
|
Aug 21, 2008 - 2:28 AM
|
Hi, We tried to download Prof-UIS 2.83 today. The download was successfuly completed. However, the size of the downloaded file was 12MB. It was not possible to unzip the file. We tried serveral times with the same result. On the other side, the download of sample code (19MB) was successful. So we do not think that the problem is on our side. Please advise. Kind regards, Robert/ Armond
|
|
Technical Support
|
Aug 21, 2008 - 12:04 PM
|
Please contact us by email (at support@prof-uis.com). We will tell you how you can download 2.83 via ftp.
|
|
tera t
|
Aug 21, 2008 - 2:21 AM
|
Hello. Prof uses VARIANT.
If it is COleVariant, a description becomes easy Why are you?
The reason to use VARIANT for?
|
|
Technical Support
|
Aug 24, 2008 - 12:02 PM
|
You can learn how to use CExtGridCellVariant cells from the ProfUIS_Controls and SimpleGrids samples.
|
|
Technical Support
|
Aug 21, 2008 - 1:29 PM
|
The VARIANT data structure is defined in OLE Automation API. That is why we used this type as is. The COleVariant class in the MFC library and the CComVariant class in the ATL library are designed as wrapper classes with additional functionality which we don’t need. Our CExtGridCellVariant grid cell class has the VARIANT data structure in the list of base class members and includes all the required APIs for using the VARIANT ’s internal data formats as data of grid cell. So you should be able to assign any objects of wrapper classes around VARIANT data structure from our VARIANT -based grid cell objects. Besides our CExtGridCellVariant grid cell class includes support for 64-bit numeric types on old Windows OS versions and additional helper APIs which are needed for using VARIANT data inside grid cells.
|
|
tera t
|
Aug 21, 2008 - 6:16 PM
|
Hello. There had better be an interlocking movement sample program of COleVariant and CExtGridCellVariant?
|
|
Hans Peter Miedeck
|
Aug 20, 2008 - 12:50 AM
|
hello, i have, since 2 days, visual studio 2008 standard, bevor i had visual c++ .net and everything has work good. Now i become this error. into my project properties are all things correct like in your FAQ. All things was working under visual c++ .net. please help me.
|
|
Hans Peter Miedeck
|
Oct 15, 2009 - 2:24 AM
|
Dear sirs and madams,
After a year I would again dare to switch to Visual Studio 2008. Unfortunately, I still have the same problem.
Can you help me?
|
|
Technical Support
|
Oct 15, 2009 - 12:59 PM
|
The …/Prof-UIS/Include folder should be specified in the include folders list of your Visual Studio settings or as additional include path in your project’s settings. That’s all required. Of course, please also check the …/Prof-UIS/Include folder has the Resource sub folder and you can find the …/Prof-UIS/Include/Resources/Resource.h file in it.
|
|
Hans Peter Miedeck
|
Aug 21, 2008 - 5:41 AM
|
Dear sir, the prof-uis path is included in the Include Directories under Project Properties....
|
|
Technical Support
|
Aug 21, 2008 - 1:27 PM
|
Unfortunately we don’t have the same version of Visual Studio. Could you provide us with remote desktop access to computer where this problem occurs?
|
|
Technical Support
|
Aug 21, 2008 - 5:31 AM
|
Please make sure that the path to Prof-UIS Include directory is added to the Include directories list.
|
|