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 |
|
Chun Pong Lau
|
Apr 1, 2008 - 2:30 AM
|
Dear Support, Would you show me how to change the size of the docked control bars on the fly (when i click at a button)? I cannot do this using SetBarSize and RecalcLayout.
Thanks Chunpong
|
|
Chun Pong Lau
|
Apr 6, 2008 - 7:38 PM
|
Dear Support, I have tried what you suggest but still fail to change the docked control bar size. Would you let me know how i can give you a test project? Thanks CP
|
|
Technical Support
|
Apr 5, 2008 - 9:37 AM
|
There are a set of CExtControlBar::SetInitDesiredSize***() methods that allow you to specify the desired size. But please note that there is no guaranty that the size will be exactly the same as you specified when the control bar is docked together with other control bars in the same row or column. This is because in this case the control bars affect each other’s positions and sizes.
To change the size of a docked control bar, you should additionally invoke the CControlBar::CalcDynamicLayout() API and specify LM_COMMIT in its parameter. For instance, the following code specifies the height of 50 pixels for a horizontally docked control bar: INT nDesired = 50;
pMainFrame->m_wndBarTop.SetInitDesiredSizeHorizontal( CSize( 32767, nDesired ) );
pMainFrame->m_wndBarTop.CalcDynamicLayout( nDesired, LM_HORZDOCK|LM_COMMIT );
pMainFrame->RecalcLayout();
|
|
Chun Pong Lau
|
Apr 6, 2008 - 7:37 PM
|
Dear Support, I have tried it but fail to change the size of docked control bars. How can i give you a test
|
|
Chun Pong Lau
|
Apr 6, 2008 - 7:37 PM
|
Dear Support, I have tried it but fail to change the size of docked
|
|
Chun Pong Lau
|
Apr 6, 2008 - 7:37 PM
|
Dear Support, I have tried it but fail to change the size of
|
|
Chun Pong Lau
|
Apr 6, 2008 - 7:37 PM
|
Dear Support, I have tried
|
|
Chun Pong Lau
|
Apr 6, 2008 - 7:37 PM
|
|
|
Chun Pong Lau
|
Apr 1, 2008 - 2:27 AM
|
Dear Support, When i quit the application, i want to save the existing size and position of the control bars so that the same layout can be retrieved next time i enter the application using the g_CmdManager->SerializeState. However, it fails to restore the layout when i enter the application next time. Would you provide a solution for me? Thanks ChunPong
|
|
Technical Support
|
Apr 7, 2008 - 9:40 AM
|
|
|
Technical Support
|
Apr 5, 2008 - 9:42 AM
|
Saving or loading to/from the registry happens when you use the CExtControlBar::ProfileBarStateSave() /CExtControlBar::ProfileBarStateLoad() methods. If CExtControlBar::ProfileBarStateLoad() returns false , that means that the ui state has not been previously saved (i.e. when you start your application for the first time). In this case, you should dock your control bars initially yourself. if( ! CExtControlBar::ProfileBarStateLoad(
this,
pApp->m_pszRegistryKey,
pApp->m_pszProfileName,
pApp->m_pszProfileName,
&m_dataFrameWP
)
)
{
// MAKE THE INITIAL LAYOUT HERE
}
|
|
Chun Pong Lau
|
Apr 6, 2008 - 8:59 AM
|
Dear Support, I have aleady done what you suggest in my program with 2.82. However, it just fails to restore the saved controlbars persistence. How can i give you a test project? Thanks CP
|
|
Offer Har
|
Mar 31, 2008 - 3:46 PM
|
I have a cell with an ellipsis button, which I customize its color & text by over-riding OnPaintButton :
void CExtGridMyCell::OnPaintButton(
const RECT & rcButton,
INT nButtonType, // e_button_type_t
bool bPressed,
bool bHovered,
bool bFocused,
bool bEnabled,
const CExtGridWnd & wndGrid,
CDC & dc,
LONG nVisibleColNo,
LONG nVisibleRowNo,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType,
const RECT & rcCellExtra,
const RECT & rcCell,
const RECT & rcVisibleRange,
DWORD dwAreaFlags,
DWORD dwHelperPaintFlags) const
{
if (__EBTT_ELLIPSIS==nButtonType)
{
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
((CObject*)this),
true,
rcButton,
m_bGreen? GREEN_SYMBOL : RED_SYMBOL,
NULL,
false,
bHovered,
bPressed,
false,
bEnabled,
true,
false,
false,
CExtPaintManager::__ALIGN_HORIZ_CENTER|CExtPaintManager::__ALIGN_VERT_CENTER,
NULL,
false,
0,
false);
_ppbd.m_clrForceTextNormal = m_bGreen? RGB(0,192,0) : RGB(255,0,0);
wndGrid.PmBridge_GetPM()->PaintPushButton(dc, _ppbd);
return;
}
CExtGridBaseCell::OnPaintButton(
rcButton,
nButtonType,
bPressed,
bHovered,
bFocused,
bEnabled,
wndGrid,
dc,
nVisibleColNo,
nVisibleRowNo,
nColNo,
nRowNo,
nColType,
nRowType,
rcCellExtra,
rcCell,
rcVisibleRange,
dwAreaFlags,
dwHelperPaintFlags);
} This works fine in all other themes, but in CExtPaintManagerOffice2007_R2_Obsidian::PaintPushButton there is a flag bInvertNormalTextColor which makes the text being drawn in white and not in the color I provided (line 38402):
if( bInvertNormalTextColor )
_ppbd.m_clrForceTextNormal = RGB(255,255,255); Why is this? Can I just remove this line?
|
|
Offer Har
|
Apr 3, 2008 - 8:51 AM
|
Dear Support, I found out where this change I;ve done take effect: Now all my top lever menu titles are black on black. You use this flag to invert teh default black to white in the black themes, but by this you override the user’s request for a specific color. The color should not be inverted when the user request a specific color like in my case. I guess this is a bug in the implementation of the CExtPaintManagerOffice2007_R2_Obsidian theme , and you need to address it please. Regards, Ron.
|
|
Offer Har
|
Mar 31, 2008 - 3:50 PM
|
Just to clarify - I commented these two lines, and didn’t see any problems in the look&feel of my application. So what is the purpose of this flag? Thanks, Ron.
|
|
Offer Har
|
Mar 31, 2008 - 2:31 PM
|
Dear Support, We need to merge cells in the column header row. How can this be done? Thanks, Ron.
|
|
Technical Support
|
Apr 2, 2008 - 8:33 AM
|
We need at least to implement the printing and print preview for joined cells. Besides, the cell join feature requires modification of most of the other features: column width/row height best fitting, sorting and even simple row/column removing. We supposed to release the new version a few weeks ago, but we are still testing it. We can provide you with the latest snapshot anytime.
|
|
Technical Support
|
Apr 1, 2008 - 12:51 PM
|
|
|
Offer Har
|
Apr 1, 2008 - 12:59 PM
|
Looks great! When is 2.83 going to be released? any new date?
|
|
tera t
|
Mar 31, 2008 - 1:20 AM
|
Hello. Closing buttons of MDI are not displayed. Prof-UIS 2.82 Prof-UIS 2.70
|
|
Technical Support
|
Mar 31, 2008 - 8:11 AM
|
Thank you for your report. We have already fixed this.
|
|
Chris Anderson
|
Mar 30, 2008 - 11:18 PM
|
hi, We recently integrated prof-uis v283 , and the combo box doesn’t work any more. I found out that several new "ProfUIS-NCSB_ScrollContainer" windows are created as the child window of combo box window. When are these Scroll Container windows created ? Any flags or switches to control them? thanks
|
|
Technical Support
|
Mar 31, 2008 - 8:09 AM
|
v.2.83 introduces support for skinned scroll bars in common controls. We have tested all three types of combo boxes with embedded CExtScrollBar windows and found no problems. The scroll bar windows are created on-the-fly when they need to be displayed for the first time on the screen. So we need more details about the type of combo box you are using. What should we do to reproduce the problem?
|
|
tera t
|
Mar 30, 2008 - 8:21 PM
|
Hello. CExtTabMdiOneNoteWnd is bug report.
The indication point of the tab becomes strange when I perform NewFile in succession. void CMainFrame::OnFileNew()
{
int iRec;
for ( iRec = 0 ; iRec < 5 ; iRec++ ){
CDocManager * pDocManager;
pDocManager = AfxGetApp()->m_pDocManager;
pDocManager->OnFileNew();
}
}
http://www.yukai.jp/~ifreeta/20080331/DRAWCLI.LZH
|
|
Technical Support
|
Mar 31, 2008 - 8:13 AM
|
Our MDI tab control does not control the order of MDI child frames. It displays tab items in the same order as the order of MDI child frame windows order inside the MDI client area window. So, your code simply affects the MDI client area window behavior and, as a result, tab items become inserted in a different order.
The CExtTMWI::_SyncAllItems() virtual method performs synchronization of MDI tab control with MDI interface. You can override this method and initialize all the tab items in your preferred order.
|
|
tera t
|
Mar 31, 2008 - 6:23 PM
|
Hello. When I want to open a childframe continually.
Should I remodel _SyncAllItems?
|
|
Technical Support
|
Apr 1, 2008 - 4:31 AM
|
The _SyncAllItems() method simply removes the tab items which correspond to the destroyed MDI child frames and creates tab items for new MDI child frames.
Your _SyncAllItems() method should be similar to the original one, but it should invoke the ItemInsert() method with different parameters for inserting new tab items at desired locations.
|
|
tera t
|
Mar 30, 2008 - 8:31 PM
|
But when I add the following order.
void CMainFrame::OnFileNew()
{
int iRec;
for ( iRec = 0 ; iRec < 5 ; iRec++ ){
CDocManager * pDocManager;
pDocManager = AfxGetApp()->m_pDocManager;
pDocManager->OnFileNew();
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage(&msg, NULL, 0, 0)){
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} } First of all?
It is displayed definitely.
|
|
Malcolm D
|
Mar 30, 2008 - 6:14 PM
|
I’ve been looking at implementing the customisation for toolbars, menus etc, along with other GUI features (from our current system which doesn’t yet use ProfUIS for most things). Currently it seems settings related to customisation, as well as toolbar/controlbar positions get saved in the registry under "CURRENT USER". I can see that the key can be changed to say LOCAL_MACHINE etc. I was wondering what Ideas you had for the ability for a client to customise their setup and have it used the same way over multiple machines? Though some settings might be made per user. Also will it work to have some settings on a per user basis and some settings on a machine basis.e.g. can you have the menu and toolbar customisation on a per machine basis, but have positions of toolbars and menu statistics as per user. MFC ofen has problems (as it seems profUIS does too) if certain things are changed (e.g. toolbar removed via code) and then the toolbar position settings are loaded - Is something like this likely to happen if we have different settings stored in the way suggested above.
|
|
Malcolm D
|
Mar 31, 2008 - 4:58 PM
|
Thanks for mentioning the Archive based methods - I think that’s what I want.
On the other issue, is it possible to be saving the customisation and the toolbar locations separately.e.g Have one file (per machine) for the customisation settings, and then have multiple files (one per user) for the toolbar positions. Will this cause problems if I then go and add or remove toolbars, and then swith users - will the other user files be out of sink because a toolbar was added or deleted?
|
|
Technical Support
|
Apr 1, 2008 - 4:33 AM
|
The customization subsystem allows users to create and remove toolbars dynamically (not only change the content of existing toolbars and menus) when the control bar state persistence algorithms require exact matching between the control bars created in the main frame window and the state data for loading. So, you should load the state of the customization subsystem first because this algorithm creates a dynamic number of toolbars and only then load the state of control bars. So, you don’t have any reason to manage the state of these two subsystems independently from each other. But, if you disable creation of dynamic toolbars in the Toolbars page of the Customize dialog, then you can manage two states independently.
|
|
Malcolm D
|
Apr 1, 2008 - 6:27 PM
|
Just to give you an idea of the purpose I am asking the question. Our product is often used in a situation where an office or company will customise the application to suit their needs, and then set up all the installations of this to be the same accross all their machines. But they probably want to allow the flexibility of uses choosing their own layout etc.
According to what you are saying, if a change is made to the number of toolbars (and number of items on toolabs?) then I can’t use an out of sync control bar layout state. I am thinking that if I store some unique identifier with the both the archives. If the user makes a customisation change, then the archive for this is saved with a new identifier - I would only save when I detect they make a change. Then when a user loads this new change, and they controlbar state doens’t match, then we just revert to the default layout. They can then save a new controlbar state.
Does this sound like it would work?
Also, do toolbars from a "tear-off menu" cause a problem here?
Also does the loading of the command manager settings dependant on the customisation settings in the same way the controlbar setttings are?
|
|
Technical Support
|
Apr 3, 2008 - 12:48 PM
|
The serialized data format for all the Prof-UIS components does not depend on a Prof-UIS version. So, the same project with customizable toolbars and menus can be compiled with different Prof-UIS versions using 32-bit or 64-bit target. A state saved by a 32-bit application can be loaded by a 64-bit version of the same application and vice versa. But customization subsystem by default requires matching between commands and basic toolbars created in the main frame window and state data. It’s possible to allocate and use dynamic commands as it is demonstrated in the Pluggable sample. This application scans for plugin DLLs and allocates commands for each of them. The number of available DLLs can be different during each next start of the Pluggable sample because it tracks the dynamic plugin commands. It’s also possible to let the ProfAuto library do hard work relating to dynamic command support. This library provides a set of COM wrapper objects for customizable toolbars and menus. This is convenient if you are going to create extensible applications and code plugins using some scripting language which supports COM objects (OLE automation). There is a <span class="newgreen">ActiveScripts</a> sample that demonstrates how to use the active scripting library for running Java Script or VB Script code which modifies customizable toolbars and menus and handles command events. This approach is similar to VBA (Visual Basic for Applications) integration inside MS Office programs.
|
|
Technical Support
|
Mar 31, 2008 - 11:45 AM
|
You will need to use the state persistence of three Prof-UIS subsystems: customize site, control bars and command manager. Let us review all three systems:
1) The following methods of the CExtCustomizeSite class can be used for implementing the state persistence of customization subsystem: bool CustomizeStateLoad(
__EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USER\Software
__EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%
__EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%\%sSectionNameProfile%
HKEY hKeyRoot = HKEY_CURRENT_USER,
bool bEnableThrowExceptions = false
);
bool CustomizeStateSave(
__EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USER\Software
__EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%
__EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%\%sSectionNameProfile%\%sSectionNameProfile%
HKEY hKeyRoot = HKEY_CURRENT_USER,
bool bEnableThrowExceptions = false
);
virtual bool CustomizeStateSerialize(
CArchive & ar,
bool bEnableThrowExceptions = false
); 2) The following static methods of the CExtControlBar class can be used for implementing the state persistence of control bars created inside a frame window: static bool ProfileBarStateLoad(
CFrameWnd * pFrame,
__EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USER\Software
__EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%
__EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%\%sSectionNameProfile%
LPWINDOWPLACEMENT pFrameWp = NULL, // need serialize frame’s WP
bool bSerializeFixedBarsState = true,
bool bSerializeResizableBarsState = true,
HKEY hKeyRoot = HKEY_CURRENT_USER,
bool bEnableThrowExceptions = false
);
static bool ProfileBarStateSave(
CFrameWnd * pFrame,
__EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USER\Software
__EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%
__EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%\%sSectionNameProfile%\%sSectionNameProfile%
LPWINDOWPLACEMENT pFrameWp = NULL, // need serialize frame’s WP
bool bSerializeFixedBarsState = true,
bool bSerializeResizableBarsState = true,
HKEY hKeyRoot = HKEY_CURRENT_USER,
bool bEnableThrowExceptions = false
);
static bool ProfileBarStateSerialize(
CArchive & ar,
CFrameWnd * pFrame,
LPWINDOWPLACEMENT pFrameWp = NULL, // need serialize frame’s WP
bool bSerializeFixedBarsState = true,
bool bSerializeResizableBarsState = true,
bool bEnableThrowExceptions = false
); 3) The following methods of the CExtCmdManager class can be used for implementing state persistence of the command manager: bool SerializeState(
__EXT_MFC_SAFE_LPCTSTR sProfileName,
__EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USER\Software
__EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USER\Software\%sSectionNameCompany%
bool bSave,
HKEY hKeyRoot = HKEY_CURRENT_USER,
bool bEnableThrowExceptions = false
);
bool SerializeState(
__EXT_MFC_SAFE_LPCTSTR sProfileName,
CArchive & ar,
bool bEnableThrowExceptions = false
); In all cases there are two types of methods: registry related methods and CArchive -based methods. The registry related methods are based on CArchive -based methods. So, you can serialize the state of each subsystem using a file on disk, a memory buffer or any other external data storage. The StateInFile sample demonstrates how to implement the state persistence for control bars using a file on disk. Both MFC and Prof-UIS require the exact match between the state data and the set of control bars created in the frame window. So, you can serialize the state of all the subsystems and add some data specific for your application which describes its UI version for detecting very strong improvements.
|
|
Malcolm D
|
Mar 30, 2008 - 5:06 PM
|
HI I get a hang when I try to drag out the UI Theme menu in the sample Style editor. 1. I go to the UITheme menu under view menu. I start dragging the menu out to become a toolbar => the current Theme toolbar disappears, and the menu I am dragging turns into a toolbar 2. I then move back to the menu, and the toolbar turns back into the submenu. 3. I them release the mouse => It has now a hang, with the dragging arrow cursor. 4. I switch to another application -> get crash (see below)
bool
CExtPopupMenuWnd::TEAROFFNOTIFICATON::OnHookWndMsg() __PROF_UIS_MANAGE_STATE;if( m_hWndHelperFloat != NULL
&& ::IsWindow( m_hWndHelperFloat ) ) { ASSERT_VALID( m_pPopup ); (crash here m_pPopup->m
|
|
Technical Support
|
Mar 31, 2008 - 11:39 AM
|
Thank you for reporting this issue. We have already fixed it. Please drop us an e-mail to the support mail box at this web site so we can provide you with the source update.
|
|
Offer Har
|
Mar 30, 2008 - 4:38 PM
|
I am using ExtentSet to hide columns in the grid. It works well, but when I navigate in the grid with the arrow, the focus is moved to the hidden column, so I lose the focus. Is there a better way to hide columns? If not, is there a way to make the focus skip the hidden column?
|
|
Technical Support
|
Apr 16, 2008 - 4:56 AM
|
It’s really not a problem to implement pseudo-hidden grid cells based on a dedicated grid cell style. We added it to our to-do list.
|
|
Offer Har
|
Apr 16, 2008 - 5:00 AM
|
Can you please explain what you mean? What we are talking about is that when a column is hidden, there must be a way to un-hide that specific column - I think this is the missing functionality. It is not clear to me whet you mean by: pseudo-hidden grid cells based on a dedicated grid cell style.
|
|
Technical Support
|
Apr 17, 2008 - 3:38 AM
|
We have just implemented an __EGCS_EX_INVISIBLE extended grid cell style which allows you to hide a grid cell. This style does not remove the grid cell so you can access it through the methods of CExtGridWnd . So any such a cell invisible and it is not painted/printed and does not affect the user input.
The current implementation of hidden rows/columns in the CExtGridWnd class was designed for row/column filtering feature. For instance, the filtering algorithm for rows assumes all rows are initialy visible. It traverses the rows and determines which of them should become hidden depending on the filtering rules. When the filtering rules change for rows, the algorithm shows all rows before applying these new rules.
|
|
Technical Support
|
Mar 31, 2008 - 11:48 AM
|
You can hide a column by setting its width to zero only in the grids that are based on the full row focus/selection. The universal method, which allows you to hide a column universally, is CExtGridWnd::ColumnHide() .
|
|
Offer Har
|
Mar 31, 2008 - 11:58 AM
|
This function is in the Help file of 2.82. I cannot find any ColumnUnHide function to go along with the ColumnHide - how should I unhide the column when I want to show it back?
|
|
Offer Har
|
Apr 8, 2008 - 9:31 AM
|
Dear Support, Any answers? I cannot find any ColumnUnHide function to go along with the ColumnHide - how should I unhide the column when I want to show it back? How do I un-hide a hidden column? Please add these function to the help of 2.83.
|
|
Technical Support
|
Apr 10, 2008 - 10:43 AM
|
The CExtGridWnd class uses accumulative row/column hiding/displaying APIs. You can invoke the CExtGridWnd::ColumnHide() method many times and then invoke CExtGridWnd::ColumnUnHideAll() in order to restore the visible state of all previously hidden columns.
|
|
Offer Har
|
Apr 10, 2008 - 10:50 AM
|
I don’t want to un-hide all - I want to un-hide a specific column.
|
|
Offer Har
|
Mar 30, 2008 - 12:03 PM
|
I have a grid, in which I need to highlight certain cells from some rules.
I do it by calling BackColorSet on those cells. I only set the __ECS_NORMAL state, because I do want the focus cell to be distinguished. My problem is when the grid loses focus - the focus cell is displayed in the normal back-color (default is white) and not in the colot is set as its background color for normal display. It seems that this cell still have the focus attributes, but is painted as a normal cell. It would be wiser that if the grid has not focus, and the focus cell does not look differently then other cell, that it would be painted with the normal back color, and not some color I don’t even know where to set.
Below are two images depicting the problem:
|
|
Offer Har
|
Mar 31, 2008 - 12:01 PM
|
Dear Support, I will try this out at the grid level, however, how do I set the back color for a focus cell when the grid has no focus? and why isn’t it one of the 4 __ECC*** values? Ron.
|
|
Technical Support
|
Apr 1, 2008 - 4:28 AM
|
The virtual methods we mentioned in our previous answer in this thread will be invoked during painting of all the visible grid cells independently of the the focused state of the grid window.
We would like to keep the custom coloring constants as simple as possible. Typically they are needed for highlighting some specific part of the grid window and they do their work. Of course, we can increase the number of these constants at least by eight times: for selected and/or focused state of grid cells with intersection with the focused state of grid control. But we are not sure if this would be convenient to specify such a number of colors for each grid cell.
|
|
Offer Har
|
Apr 1, 2008 - 6:10 AM
|
Keeping is simple as possible would mean that the back color of a focused cell when the grid has no focus would be taken from the same color set for a normal cell - currently the user cannot set this color for the cell at all when calling BackColorSet . I did however solve my problem using OnGridCellQueryBackColor as you suggested and having this test in it for the focus cell:
CPoint ptFocus = FocusGet();
// If in focus row, and not focus cell, or grid has no focus:
if (nRowNo==ptFocus.y && (nColNo!=ptFocus.x || (__EGCPF_FOCUSED_CONTROL&dwHelperPaintFlags)==0))
{
return MY_CUSTOM_COLOR;
} This line colors the current row with a custom color, leaving the focus cell with its color if the grid have focus. Thanks, Ron.
|
|
Technical Support
|
Mar 31, 2008 - 11:57 AM
|
The following methods allow you to customize how a certain cell(s) looks (you should override them): the CExtGridCell::OnQueryTextColor() / CExtGridCell::OnQueryBackColor() methods in your grid cell class (at a cell level) or the CExtGridWnd::OnGridCellQueryTextColor() / CExtGridWnd::OnGridCellQueryBackColor() virtual method in your grid window class (at a grid level). The dwHelperPaintFlags parameter in both methods contain a set of __EGCPF_*** flags that describe the details about the state of a grid cell and a grid window.
|
|
Offer Har
|
Mar 28, 2008 - 9:37 AM
|
Dear Support, I have an edit control in a CExtResizableDialog dialog with these properties: When the dialog is resized, the text in the control flickers heavily. The dialog have the clip attributes set, so this is not the problem. I am using the CExtPaintManagerOffice2007_Black paint manager. Any ideas? Ron.
|
|
Technical Support
|
Apr 8, 2008 - 12:15 PM
|
Yes we reproduced it. Thank you for reporting this. But it seems this is the case when the windows of common controls library are handled in a special way. We are still looking for a solution to this problem
|
|
Offer Har
|
Apr 8, 2008 - 12:18 PM
|
What do you mean by a ’special way’?
|
|
Technical Support
|
Apr 8, 2008 - 12:51 PM
|
Here is a scenario. You decide to implement a CButton -derived class (or a CWnd -derived class) in which you have a WM_PAINT message handler. You create a dialog with several buttons and subclass some or all of them with your button class which implements custom painting of the button’s window surface. You run this test application and try to traverse the buttons with the TAB key, focus them with mouse clicks, switch from the dialog window to some other application and back. In most cases and enough often, you will see the default looking button windows instead of those painted with your code. It’s not possible to repaint buttons only by handling the WM_PAINT message because it’s not invoked in all cases. This is what we call a "special" way. The same special things occur with other common controls. In the case of buttons, we created the CExtButton class and several classes derived from it (like a radio, check and hyperlink) and in all of them a custom drawn button type is used and appropriate behavior is implemented. For instance, in the case of our push buttons which are in fact custom drawn buttons, we had to handle mouse and keyboard events for emulating the push button behavior. Very fortunately the custom drawn buttons are never become painted by default and not through the WM_PAINT message. We have no such chances in the case of combo box common control. We can create some window inside the combo box to hide these bad painting problems, but this does not look like a good solution.
|
|
Technical Support
|
Mar 31, 2008 - 12:02 PM
|
The WS_CLIPCHILDRE|WS_CLIPSIBLINS styles applied to a dialog window is the first condition for implementing a flicker-free dialog window. The second one is a z-order adjustment: please ensure that the z-order of windows like group boxes and static frames is larger than z-orders of other dialog controls.
|
|
Offer Har
|
Mar 31, 2008 - 12:12 PM
|
Shouldn’t the SubclassChildControls be enough for group boxes? I add it in all OnInitDialog functions. I don’t have any group boxes or static controls in the dialog. Please note that this is a multi-line edit control. If I remove the multi-line there is no flicker at all. I’m sure you can reporduce it easily.
|
|
Offer Har
|
Apr 8, 2008 - 9:29 AM
|
Dear Support, Where you able to reproduce this flicker problem? It should not be too complicated. Regards, Ron.
|
|
Pierre MEDART
|
Mar 27, 2008 - 11:47 AM
|
We use the CExtTabMdiWhidbeyWnd. We have an issue when we close the latest doc/view. After that, from time to time (I know it sounds ackward) we loose one click... For example if we click on the title bar and try to move the window, the application is not moving on the desktop (it is not maximized ;-) ) Any clue ? We use the 2.82 version of the toolkit.
|
|
Pierre MEDART
|
Apr 2, 2008 - 4:20 AM
|
We got a call stack... The issue seems to be that the TabWnd enters in Hover while (I guess) it should be destroying itself... we close our last doc (any type, 3 different type of frames). This forces a CExtMouseCaptureSink::SetCapture( m_hWnd ) hence our troubles (loosing the first click etc) What would you suggest? ProfUIS282nd.dll!CExtTabWnd::OnTabWndMouseTrackingHoverStart(long nHitTest=0xfffffff9) Line 5351 C++
ProfUIS282nd.dll!CExtTMWI<CExtTabWhidbeyWnd>::OnTabWndMouseTrackingHoverStart(long nHitTest=0xfffffff9) Line 1813 C++
ProfUIS282nd.dll!CExtTabWnd::_ProcessMouseMove(unsigned int nFlags=0x00000000, CPoint point={...}) Line 5170 + 0x16 bytes C++
ProfUIS282nd.dll!CExtTabWnd::OnMouseMove(unsigned int nFlags=0x00000000, CPoint point={...}) Line 5305 + 0x1e bytes C++
mfc80d.dll!CWnd::OnWndMsg(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240, long * pResult=0x0012edf0) Line 2169 C++
mfc80d.dll!CWnd::WindowProc(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 1741 + 0x20 bytes C++
> ProfUIS282nd.dll!CExtTabWnd::WindowProc(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 2140 C++
ProfUIS282nd.dll!CExtTMWI<CExtTabWhidbeyWnd>::WindowProc(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 2217 C++
mfc80d.dll!AfxCallWndProc(CWnd * pWnd=0x04ccefac, HWND__ * hWnd=0x000b0b22, unsigned int nMsg=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 240 + 0x1c bytes C++
mfc80d.dll!AfxWndProc(HWND__ * hWnd=0x000b0b22, unsigned int nMsg=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 389 C++
mfc80d.dll!AfxWndProcBase(HWND__ * hWnd=0x000b0b22, unsigned int nMsg=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 411 + 0x15 bytes C++
user32.dll!_InternalCallWinProc@20() + 0x28 bytes
user32.dll!_UserCallWinProcCheckWow@32() + 0xb7 bytes
user32.dll!_DispatchMessageWorker@8() + 0xdc bytes
user32.dll!_DispatchMessageA@4() + 0xf bytes
mfc80d.dll!AfxInternalPumpMessage() Line 183 C++
mfc80d.dll!CWinThread::PumpMessage() Line 896 C++
FRC.exe!FFiREApp::PumpMessage() Line 237 + 0xb bytes C++
mfc80d.dll!CWinThread::Run() Line 625 + 0xd bytes C++
mfc80d.dll!CWinApp::Run() Line 894 C++
mfc80d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f10, int nCmdShow=0x00000005) Line 47 + 0xd bytes C++
FRC.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f10, int nCmdShow=0x00000005) Line 33 C++
FRC.exe!__tmainCRTStartup() Line 589 + 0x35 bytes C
FRC.exe!WinMainCRTStartup() Line 414 C
0511a167()
mscorwks.dll!_CallDescrWorker@20() + 0x1f bytes
mscorwks.dll!_CallDescrWorker@20() + 0x1f bytes
FRC.exe!__NULL_IMPORT_DESCRIPTOR() + 0x25e3 bytes Unknown
FRC.exe!__NULL_IMPORT_DESCRIPTOR() + 0x187e8 bytes Unknown
|
|
Technical Support
|
Apr 3, 2008 - 11:49 AM
|
We still cannot reproduce this problem. We would like to ask you to do the following:
1) Find the CExtTMWI::OnTabWndClickedButton() method in the ../Prof-UIS/Include/ExtTabWnd.h file. The class implements MDI tab control’s functionality.
2) Find the following code in this method: ::PostMessage(
hWndMdiChild,
WM_SYSCOMMAND,
SC_CLOSE,
MAKELONG( point.x, point.y )
); This code closes the active MDI child window when the "X"-button on the right side of the MDI tab control is pressed. 3) Insert the following line immediately before PostMessage() is called: ::ReleaseCapture(); We would like to know whether the problem is solved. If not, then please also try to insert the following instead of ReleaseCapture() : SendMessage( WM_CANCELMODE );
|
|
Technical Support
|
Mar 31, 2008 - 12:16 PM
|
The difference between the Whidbey tabs (MDI or simple) and other tabs is only the style of tab items and tab control background. So, if the problem exists, it can be reproduced using any other MDI tabs. We checked our sample applications with MDI tabs (DRAWCLI and ProfStudio) but failed to reproduce the problem. We tried to close the last document using Ctrl+F4, X in the menu bar, X in the MDI tab control, X in a tab item, the Close command in the system menu of MDI child frame window and the Close button in the MDI windows dialog. Would you help us reproduce the problem or send us a test project?
|
|
Pierre MEDART
|
Apr 2, 2008 - 4:20 AM
|
We got a call stack... The issue seems to be that the TabWnd enters in Hover while (I guess) it should be destroying itself... we close our last doc (any type, 3 different type of frames). This forces a CExtMouseCaptureSink::SetCapture( m_hWnd ) hence our troubles (loosing the first click etc) What would you suggest? ProfUIS282nd.dll!CExtTabWnd::OnTabWndMouseTrackingHoverStart(long nHitTest=0xfffffff9) Line 5351 C++
ProfUIS282nd.dll!CExtTMWI<CExtTabWhidbeyWnd>::OnTabWndMouseTrackingHoverStart(long nHitTest=0xfffffff9) Line 1813 C++
ProfUIS282nd.dll!CExtTabWnd::_ProcessMouseMove(unsigned int nFlags=0x00000000, CPoint point={...}) Line 5170 + 0x16 bytes C++
ProfUIS282nd.dll!CExtTabWnd::OnMouseMove(unsigned int nFlags=0x00000000, CPoint point={...}) Line 5305 + 0x1e bytes C++
mfc80d.dll!CWnd::OnWndMsg(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240, long * pResult=0x0012edf0) Line 2169 C++
mfc80d.dll!CWnd::WindowProc(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 1741 + 0x20 bytes C++
> ProfUIS282nd.dll!CExtTabWnd::WindowProc(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 2140 C++
ProfUIS282nd.dll!CExtTMWI<CExtTabWhidbeyWnd>::WindowProc(unsigned int message=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 2217 C++
mfc80d.dll!AfxCallWndProc(CWnd * pWnd=0x04ccefac, HWND__ * hWnd=0x000b0b22, unsigned int nMsg=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 240 + 0x1c bytes C++
mfc80d.dll!AfxWndProc(HWND__ * hWnd=0x000b0b22, unsigned int nMsg=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 389 C++
mfc80d.dll!AfxWndProcBase(HWND__ * hWnd=0x000b0b22, unsigned int nMsg=0x00000200, unsigned int wParam=0x00000000, long lParam=0x000c0240) Line 411 + 0x15 bytes C++
user32.dll!_InternalCallWinProc@20() + 0x28 bytes
user32.dll!_UserCallWinProcCheckWow@32() + 0xb7 bytes
user32.dll!_DispatchMessageWorker@8() + 0xdc bytes
user32.dll!_DispatchMessageA@4() + 0xf bytes
mfc80d.dll!AfxInternalPumpMessage() Line 183 C++
mfc80d.dll!CWinThread::PumpMessage() Line 896 C++
FRC.exe!FFiREApp::PumpMessage() Line 237 + 0xb bytes C++
mfc80d.dll!CWinThread::Run() Line 625 + 0xd bytes C++
mfc80d.dll!CWinApp::Run() Line 894 C++
mfc80d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f10, int nCmdShow=0x00000005) Line 47 + 0xd bytes C++
FRC.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f10, int nCmdShow=0x00000005) Line 33 C++
FRC.exe!__tmainCRTStartup() Line 589 + 0x35 bytes C
FRC.exe!WinMainCRTStartup() Line 414 C
0511a167()
mscorwks.dll!_CallDescrWorker@20() + 0x1f bytes
mscorwks.dll!_CallDescrWorker@20() + 0x1f bytes
FRC.exe!__NULL_IMPORT_DESCRIPTOR() + 0x25e3 bytes Unknown
FRC.exe!__NULL_IMPORT_DESCRIPTOR() + 0x187e8 bytes Unknown
|
|
Technical Support
|
Apr 3, 2008 - 11:46 AM
|
We still cannot reproduce this problem. We would like to ask you to do the following:
1) Find the CExtTMWI::OnTabWndClickedButton() method in the ../Prof-UIS/Include/ExtTabWnd.h file. The class implements MDI tab control’s functionality.
2) Find the following code in this method: ::PostMessage(
hWndMdiChild,
WM_SYSCOMMAND,
SC_CLOSE,
MAKELONG( point.x, point.y )
); This code closes the active MDI child window when the "X"-button on the right side of the MDI tab control is pressed. 3) Insert the following line immediately before PostMessage() is called: ::ReleaseCapture(); We would like to know whether the problem is solved. If not, then please also try to insert the following instead of ReleaseCapture() : SendMessage( WM_CANCELMODE );
|
|
Pierre MEDART
|
Apr 1, 2008 - 11:08 AM
|
Hard to build a sample solution where we can reproduce the issue. We have that issue only with the TabMdi |X| button (close all, Ctrl+F4, etc work fine). But not always! If we click on the cross and move the mouse it works fine. If we click on the cross but don’t move the mouse during few seconds (3 is enough) we jump to that weird state.
|
|
Technical Support
|
Apr 3, 2008 - 11:46 AM
|
We still cannot reproduce this problem. We would like to ask you to do the following:
1) Find the CExtTMWI::OnTabWndClickedButton() method in the ../Prof-UIS/Include/ExtTabWnd.h file. The class implements MDI tab control’s functionality.
2) Find the following code in this method: ::PostMessage(
hWndMdiChild,
WM_SYSCOMMAND,
SC_CLOSE,
MAKELONG( point.x, point.y )
); This code closes the active MDI child window when the "X"-button on the right side of the MDI tab control is pressed. 3) Insert the following line immediately before PostMessage() is called: ::ReleaseCapture(); We would like to know whether the problem is solved. If not, then please also try to insert the following instead of ReleaseCapture() : SendMessage( WM_CANCELMODE );
|
|
Pierre MEDART
|
Mar 31, 2008 - 10:31 AM
|
Using Spy++, it seems that the application stops receiving any SetCursor msg or the MessagePump stops working. If we press on Alt Key + expand a menu -> application is responsive If we just press on Alt key -> still in a bad state... Any idea?
|
|
Adam Keadey
|
Mar 27, 2008 - 11:03 AM
|
Is there a way to always check the docking window while floating to make sure it on the screen. With two monitors displaying. I move the docking window to the secondary monitor. Close the application to save the profile state. Turn off the secondary monitor in display settings ie changin the overall screen resolution. Open the application and docking window is now on the other monitor that is no longer active.
|
|
Technical Support
|
Apr 2, 2008 - 1:04 PM
|
We failed to reproduce this bug. The control bars appear on the first monitor on application restart after switching off the second monitor in our tests. Could you please provide us with a description of exact steps and configuration details for testing?
1) How many monitors to use? 2) Mutual monitor locations and screen resolutions of each. 3) Location of the primary monitor. 4) Location of the main frame and floating bars before turning off some of the monitors.
|
|
Malcolm D
|
Mar 26, 2008 - 10:46 PM
|
I was wondering how to allow the user to dynamically resize the tabbed toolbar.
|
|
Technical Support
|
Apr 9, 2008 - 7:54 AM
|
In the current implementation of tabbed toolbars, only full-row/full-column location is supported when they are docked and a persistent size when they are floating.
|
|
Malcolm D
|
Apr 9, 2008 - 7:19 PM
|
I would like to request this as a new feature, and/or ask for a way of allowing it to be resized when floating. Also is it possible to customise the toolbars on it? Thanks
|
|
Technical Support
|
Apr 3, 2008 - 12:50 PM
|
The tabbed control bar is an instance of the CExtDynTabControlBar window which is also a kind of the CExtControlBar window. If some CExtControlBar resizable control bar is inside a tabbed group, the CExtControlBar::_GetNearestTabbedContainer() method returns a valid non-NULL pointer to the CExtDynTabControlBar window. Both CExtControlBar simple bars and CExtDynTabControlBar dynamic tabbed group bars can be resized like demonstrated in the following sample:
ChangeFloatingSize.zip
|
|
Malcolm D
|
Apr 3, 2008 - 4:39 PM
|
Sorry, I think you mist have slightly misread my questions.
I was asking about the Tabbed "Toolbar" which is of class CExtTabbedToolControlBar- the one where you can tab between "toolbars". This one does not seem be resizeable by default at least. Is there a way to do this?
Thanks
|
|
Offer Har
|
Mar 26, 2008 - 3:08 PM
|
Dear Support, I have a CExtGridCellNumber cell, which I need to validate on edit (not min-max, but agains other cells values). I over-ride OnInplaceControlTextInputVerify , but this function is not called when the spin buttons are pressed. Note that I do not want to disable the spins (OnQueryEnabledIncrement and OnQueryEnabledDecrement ), but to catch the event when the number is changed, because I need to display an informative message when this invalid case happens. Regards, Ron.
|
|
Technical Support
|
Apr 5, 2008 - 9:49 AM
|
There are two options at the moment.
1) You can override the CExtGridCell::OnButtonPressing() virtual method. Please take a look at the original method’s code. In this method you can get access to the row and column number. There you can also find invocations of OnValueIncrement() and OnValueDecrement() methods. You can additionally put there your code.
2) When you press spin buttons the cell becomes focused, so if you are using a single row/cell selection model, you can use the CExtGridBaseWnd::FocusGet() method to get the focused row/column in the grid window. This method returns a CPoint object with the cell’s coordinates.
|
|
Offer Har
|
Apr 5, 2008 - 10:14 AM
|
Dear Support, Can you please add for the coming version passing of the parameters of grid, row & cell to the OnValueIncrement() and OnValueDecrement() methods? If you say they are invoked from the the CExtGridCell::OnButtonPressing() method, which does contain this information it does not seems to be too complicated. This is what I intend to do myself... If you want I can check it out and let you know if it works. Ron.
|
|
Technical Support
|
Apr 10, 2008 - 7:34 AM
|
We have modified grids code. Here are the details: modified in CExtGridCell:
virtual bool OnQueryEnabledIncrement(
const CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType
) const;
virtual bool OnQueryEnabledDecrement(
const CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType
) const;
virtual bool OnValueIncrement(
CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType
);
virtual bool OnValueDecrement(
CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType
);
virtual bool OnQueryButtonInfo(
INT nButtonType,
CExtGridWnd * pWndGrid = NULL,
LONG nColNo = 0,
LONG nRowNo = 0,
INT nColType = 0,
INT nRowType = 0,
bool * p_bEnabled,
bool * p_bPressed = NULL,
bool * p_bStayPressed = NULL,
UINT * p_nTimerElapseValue = NULL
) const;
bool IsButtonEnabled(
INT nButtonType, // e_button_type_t
CExtGridWnd * pWndGrid = NULL,
LONG nColNo = 0,
LONG nRowNo = 0,
INT nColType = 0,
INT nRowType = 0,
) const;
bool IsButtonPressed(
INT nButtonType, // e_button_type_t
CExtGridWnd * pWndGrid = NULL,
LONG nColNo = 0,
LONG nRowNo = 0,
INT nColType = 0,
INT nRowType = 0,
) const;
bool IsButtonStayPressed(
INT nButtonType, // e_button_type_t
CExtGridWnd * pWndGrid = NULL,
LONG nColNo = 0,
LONG nRowNo = 0,
INT nColType = 0,
INT nRowType = 0
) const;
modified in CExtGridCellVariant:
virtual bool OnValueIncrement(
LPVARIANT pvarValue,
CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType
);
virtual bool OnValueDecrement(
LPVARIANT pvarValue,
CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType
);
modified in CExtGridCellComboBox::
void _DoItemsIterate(
CExtGridWnd & wndGrid,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType,
HWND hWndInplaceControl,
bool bNext,
bool bSetSel = false
);
added into CExtGridWnd:
virtual bool OnGridHookCellQueryEnabledIncrement(
LONG nColNo,
LONG nRowNo,
LONG nColType,
LONG nRowType,
const CExtGridCell & _cell,
bool & bEnabled
) const;
virtual bool OnGridHookCellQueryEnabledDecrement(
LONG nColNo,
LONG nRowNo,
LONG nColType,
LONG nRowType,
const CExtGridCell & _cell,
bool & bEnabled
) const;
virtual bool OnGridHookCellValueIncrement(
LONG nColNo,
LONG nRowNo,
LONG nColType,
LONG nRowType,
CExtGridCell & _cell,
bool & bResult
);
virtual bool OnGridHookCellValueDecrement(
LONG nColNo,
LONG nRowNo,
LONG nColType,
LONG nRowType,
const CExtGridCell & _cell,
bool & bResult
);
virtual bool OnGridHookCellQueryButtonInfo(
INT nButtonType,
const CExtGridCell & _cell,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType,
bool * p_bEnabled,
bool * p_bPressed,
bool * p_bStayPressed,
UINT * p_nTimerElapseValue,
bool & bRetVal
) const;
|
|
Technical Support
|
Mar 28, 2008 - 6:07 AM
|
In this case, you can override OnValueIncrement() and OnValueDecrement() virtual methods instead of OnQueryEnabledIncrement() and OnQueryEnabledDecrement() .
|
|
Offer Har
|
Mar 28, 2008 - 6:09 AM
|
As I wrote before - I need to do cross-cells validations, and these function do not contain the information such as the col and row number and the grid ref, like the other functions: I would like to add that over-riding OnValueDecrement will not do, because I need information like in OnInplaceControlTextInputVerify - the row index, and the grid, because this I need to compare data between cells.
|
|
Technical Support
|
Mar 27, 2008 - 2:09 PM
|
You can move your validation code in one function that returns a Boolean result. Then override all three virtual methods OnInplaceControlTextInputVerify() , OnQueryEnabledIncrement() and OnQueryEnabledDecrement() and insert invocation of your validation function there. Pass the cell value to this function and return false if the value is non-valid and true otherwise. Then using the result, you will be able to choose what you need to do further in the overridden virtual methods.
|
|
Offer Har
|
Mar 27, 2008 - 3:46 PM
|
This implementation is problematic - I think that all user’s inputs should be handles in the same way. Why isn’t OnInplaceControlTextInputVerify called when the spin control buttons are pressed? This will solve all the problems. Let me know how fast you can implement this, or at least suggest an alternative solution, as this is of high urgency for us. Regards, Ron.
|
|
Offer Har
|
Mar 27, 2008 - 2:12 PM
|
I wrote that OnQueryEnabledIncrement and OnQueryEnabledDecrement are not good for me. The validation is extensive, and expensive in resources. so I want to do only when the button is clicked, not when the GUI decide to validate ths arrows, this is what I wrote above: Note that I do not want to disable the spins (OnQueryEnabledIncrement and OnQueryEnabledDecrement ), but to catch the event when the number is changed, because I need to display an informative message when this invalid case happens.
|
|
Technical Support
|
Mar 31, 2008 - 12:09 PM
|
We assume that built-in up/down buttons of grid cells can be used differently and not only for editing cells. The CExtGridCell::OnQueryEnabledIncrement() virtual method is called before CExtGridCell::OnValueIncrement() and CExtGridCell::OnQueryEnabledDecrement() before CExtGridCell::OnValueDecrement() virtual method. So, both the CExtGridCell::OnQueryEnabledIncrement() and CExtGridCell::OnQueryEnabledDecrement() virtual methods are verification methods which also affect the disabled state of up and down buttons inside the up/down cell part.
|
|
Offer Har
|
Mar 31, 2008 - 12:15 PM
|
Dear Support, Please - I need to get the event when a click is done and I need to get the grid and row & col information. An alternative is that when the value in the numeric cell is modified I will be able to catch it and get the grid row & col. I hope that you undersatdn that something is missing here..... I need to know when my cell’s value was changed and do so validations - and the only time I cannot do it is when the spin buttons are pressed. Ron.
|
|
Offer Har
|
Mar 26, 2008 - 4:04 PM
|
I would like to add that over-riding OnValueDecrement will not do, because I need information like in OnInplaceControlTextInputVerify - the row index, and the grid, because this I need to compare data between cells.
|
|
Offer Har
|
Mar 26, 2008 - 9:53 AM
|
??? Seems like nobody’s home for the past week.
|
|
Offer Har
|
Mar 26, 2008 - 2:13 PM
|
|
|
Technical Support
|
Mar 26, 2008 - 2:12 PM
|
Thank you for reporting the problem and the test application. We are working on a fix for the item hiding algorithm.
|
|
tera t
|
Mar 25, 2008 - 11:28 PM
|
Hello. In Drawcl2, I want to display an X.
In Drawcl1, I do not want to display an X.
Please teach a method.
Thanks,
|
|
tera t
|
Mar 28, 2008 - 1:58 AM
|
Hello. Only specific CMDIChildWnd does not want to display a closing button.
Please teach a way. Thanks,
|
|
Technical Support
|
Mar 31, 2008 - 5:51 AM
|
You can enable a Close button on each tab for the MDI tab window and then apply the __ETWI_EX_NO_CLOSE_ON_TAB style by invoking the CExtTabWnd::TAB_ITEM_INFO::ModifyItemStyle() method only for those tab items which should not display a Close buttons. This is applied both to simple tab controls and MDI tab controls of any style.
|
|
Technical Support
|
Mar 27, 2008 - 5:31 AM
|
If you apply the __ETWS_EX_CLOSE_ON_TABS style using the CExtTabWnd::ModifyTabWndStyle() method, then each tab item will have its own Close button. If you also apply __ETWS_EX_CLOSE_ON_SELECTED_ONLY , only the selected tab item will have the Close button.
|
|
Offer Har
|
Mar 25, 2008 - 10:51 AM
|
I have a tree. The tree contains two columns. the second columns is a numeric cell. When a numeric cell in the tree is updated, I need to update its parent numeric cell with that number. I over ride OnGridCellInputComplete for this, but I don’t know how to get the TREEITEM of that cell, so I cannot call ItemGetParent to reach its parent. Any advise? Ron.
|
|
Technical Support
|
Mar 26, 2008 - 12:07 PM
|
The CExtTreeGridWnd::ItemGetByVisibleRowIndex() converts a plain zero-based row index into a HTREEITEM handle. The CExtTreeGridWnd::ItemGetVisibleIndexOf() method converts a HTREEITEM handle into a plain zero-based row index. Please note it is not possible to get a plain row index of a tree item if at least one of its parent items is collapsed.
|
|
tera t
|
Mar 24, 2008 - 10:54 PM
|
Hello. The combo does not want a click to react.
Does it come true with OnGbwBeginEdit or OnClick?
|
|
Technical Support
|
Mar 27, 2008 - 5:30 AM
|
Would you let us know more details? Generally, if you need to handle built-in popup list box menu events of any grid cell, then you should use your own CExtGridCell -derived class and implement the required CExtGridCell::OnPopupListBox***() virtual method.
|
|