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 |
|
Offer Har
|
Dec 30, 2008 - 9:56 PM
|
How about moving to a better forum engine?... This one is very popular, I’m sure you met it: http://www.phpbb.com/#@lt;/p>
|
|
Technical Support
|
Jan 2, 2009 - 3:07 PM
|
We agree that phpbb would certainly be a better solution but at the moment we cannot promise you that we will replace the current engine with phpbb or yaf. Sorry.
|
|
Offer Har
|
Jan 4, 2009 - 9:52 PM
|
Just do your best I think that a lot of popular forums use phpbb or yaf, and my experience with them is much better this this forum.
|
|
Offer Har
|
Dec 26, 2008 - 7:56 AM
|
Dear Support, I have this piece of code:
void CMyControlBar::Show()
{
CSize szDesiredSize;
CPoint pt (0,0);
SetInitDesiredSizeFloating(szDesiredSize);
SetInitDesiredPosFloating(pt);
FloatControlBar(pt);
pMainFrm->RecalcLayout();
pMainFrm->SendMessage(WM_NCPAINT);
pMainFrm->ShowControlBar(this, TRUE, FALSE);
CSize sz = GetSizeFloating();
CRect rc;
GetClientRect(rc);
} My problem is that neither sz nor rc contain the real client area size. How can I get the real client area size of a control bar? Thanks, Ron.
|
|
Technical Support
|
Dec 29, 2008 - 8:11 AM
|
The GetClientRect() API returns the real size of window client area. Please provide us with more details about your task. What you have initially and what should be done?
|
|
Offer Har
|
Dec 29, 2008 - 8:15 AM
|
What I get in the GetClientRect is 2 pixels bigger then the actual client rect. you can see the explanation in my attached screenshot + what happens to my inner control. The thing is that I replace the control in a control-bar, and I have resize it, or else it does not resturcture itself internally. I resize it with the parameters in GetClientRect , which provides me the wrong size.
|
|
Offer Har
|
Dec 26, 2008 - 10:30 AM
|
Here is an example of the problem I have. I have to resize my control inside the contol-bar, otherwise it does not re-position its internal structure correctly, so I call this line:
m_pCtrl->SetWindowPos(NULL,0,0,rc.Width(), rc.Height(), SWP_NOZORDER|SWP_NOMOVE); The problem can be shown in the picture below:
|
|
Rado Manzela
|
Dec 26, 2008 - 6:18 AM
|
Thank you for new version, I was looking forward message box class, but I need to have bugs fixed before I can switch to new version. Can you please fix this please? 1. when I click to some item in tree, it is selected and focused. When I quickly click to another item, instead of moving focus and selection it is just expanded (it works almost like double click).
2. This is what I’ve wrote to you about 2 or 3 times before but received no answer. I have tre grid class defined like this: class CChildView : public CExtPPVW < CExtTreeGridWnd >. When I invoke print preview, the last column on the page is truncated (when there is more columns than can fit on one page). There must be some bug, that column should be placed on next page.
3. this is more like new feature maybe for next version. The serialization is unusable for storing data for next program run. It contains raw data with no version information so when I have stored options for example for CExtGridCellFont and then the program is upgraded and new version is using new version of Prof-uis, reading the options fails with exception in better case, or with messed data.
I hope you’ll release some patch with bug fixes. Thank you.
|
|
Technical Support
|
Dec 26, 2008 - 2:32 PM
|
1) We failed to reproduce this issue. You can find a CExtTreeGridWnd window in the FilteredGrids sample. We clicked it many times and always selection was moved correctly from row to row. Please provide us with more details about how we should click it.
2) The fix was not included into 2.84. We can provide you with the download for the latest stable 2.85 where the coordinate system computations for enhanced metafile painting was rewritten from scratch. The page metafiles are now measured correctly. Here is the ZIP file with sample projects:
http://www.prof-uis.com/download/forums/tmp/FixedPrintPreview285.zip
3) We need more details about this. Prof-UIS serialization methods really were version depended many versions and many years ago. We didn’t change any data at least formats last several versions.
|
|
Rado Manzela
|
Dec 28, 2008 - 12:51 PM
|
1) 2) Print preview looks better, but I would need sources :) I’ve tried filtered grids sample / filtered tree grid :
- shrink wilman kala and frankenversand, then start quickly clicking alternating on them, when time between click is as short as doubleclick, it will expand last item instead just moving focus. 3) deserializing of CExtGridCellFont in 2.84 throws exception on data serialized in 2.82 (while deserializing color data, it was changed)
|
|
Technical Support
|
Dec 31, 2008 - 2:55 AM
|
The double click events are emulated in the beginning of the CExtGridBaseWnd::OnLButtonDown() method. We modified beginning of this method and added mouse position checking code to fix the tree row expanding issue:
void CExtGridBaseWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
ASSERT_VALID( this );
if( m_eMTT != __EMTT_NOTHING )
{
SendMessage( WM_CANCELMODE );
if( m_eMTT != __EMTT_NOTHING )
return;
} // if( m_eMTT != __EMTT_NOTHING )
UINT nRepCnt = 1;
static clock_t g_nLastClock = 0;
static HWND g_hWndLastClick = NULL;
static CPoint g_ptLastClick(-32767,-32767);
CPoint ptLastClick = point;
ClientToScreen( &ptLastClick );
clock_t nCurrClock = ::clock();
if( g_hWndLastClick == m_hWnd
&& g_ptLastClick == ptLastClick
)
{
clock_t nDiff = (clock_t)::abs( nCurrClock - g_nLastClock );
clock_t nDoubleClickTime = (clock_t)::GetDoubleClickTime();
if( nDiff <= nDoubleClickTime )
nRepCnt = 2;
}
g_ptLastClick = ptLastClick;
g_hWndLastClick = m_hWnd;
g_nLastClock = nCurrClock;
HWND hWndOwn = m_hWnd, hWndFocus = ::GetFocus();
if( ( hWndFocus != m_hWnd ) && ( m_nMouseActivateCode == MA_ACTIVATE || m_nMouseActivateCode == MA_ACTIVATEANDEAT ) )
{ // check MDI child frame activation explicitly
bool bIsMDIChildWindow = false;
. . .
We have checked the source code of the CExtGridCellFont::Serialize() method. It’s exactly the same in Prof-UIS 2.82 and 2.84. The problem is outside the CExtGridCellFont class. The CExtGridCellFont class class is based on the CExtGridCellEx class. The CExtGCF < CExtGCC < CExtGridCell > > class is derived from the CExtGridCellEx class in Prof-UIS 2.82. It’s derived from the CExtGCJ < CExtGCF < CExtGCC < CExtGridCell > > > class in Prof-UIS 2.84. The new CExtGCJ template decorator class adds the cell join feature support to grid cell objects. The CExtGCJ::Serialize() virtual method invokes the CExtGCJ::SerializeJoin() for serialization of joined cell region information. The CExtGCJ::Serialize() method adds new information into serialized stream in Prof-UIS 2.84. This information is not waited by Prof-UIS 2.82. So, we confirm this is the version dependent compatibility issue. If you strongly need to keep 2.82 format compatibility, then you can implement the CExtGCJ::SerializeJoin() virtual method with empty body in your CExtGridCellFont -derived class.
|
|
Rado Manzela
|
Jan 4, 2009 - 10:53 AM
|
Thank you, the fix works.
|
|
tera tera
|
Dec 24, 2008 - 6:17 PM
|
Hello. When I add 300 dialog to CExtTabPageContainerFlatWnd.
Drawing of UI becomes abnormally slow.
Please teach good improvement plan. I sent a sample program by an email.
|
|
Technical Support
|
Dec 26, 2008 - 2:09 PM
|
If you allocate 10000 GDI handles, Windows will start using the "System" proportional font everywhere. So, you should not allocated 10000 GDI handles. Approximately the same we can say about allocating 300 tab pages. Besides, keeping 300 items in the single line tab control is not a a user friendly design. This design should be replaced with something else. For instance, you can use a list box inside tab control and created only one page window which corresponds to the selected list box item.
|
|
tera tera
|
Dec 26, 2008 - 7:47 PM
|
Hello. >This design should be replaced with something else.
>For instance, you can use a list box inside tab control and created only one page window which corresponds to the selected list box item. In order that I simplify a story, I showed such an example.
Actually, it is used in the following examples.
I change only the display of the grid, Even suggestion of the substitute plan is good.
I want a sample.
|
|
Technical Support
|
Dec 29, 2008 - 8:32 AM
|
You are using too many tabs. If you do not trust our point of view, then please read what Microsoft recommends for people who creates too much tabs:
http://msdn.microsoft.com/en-us/library/aa511493.aspx
Here is the part of the Windows User Experience Interaction Guidelines document (http://msdn.microsoft.com/en-us/library/aa511258.aspx) referred above:
- Use horizontal tabs if: * The window has seven or fewer tabs. * All the tabs fit on one row, even when the user interface (UI) is localized. - Use vertical tabs if: * The property window has eight or more tabs. * Using horizontal tabs would require more than one row. - Don’t nest tabs or combine horizontal tabs with vertical tabs. Instead, reduce the number of tabs, use only vertical tabs, or use another control such as a drop-down list. - Don’t scroll horizontal tabs. Horizontal scrolling isn’t readily discoverable. You may scroll vertical tabs, however. - For tabs on a resizable window or pane, put a scrollbar, when needed, on the page, not the window or pane. The tabs should always be visible and not scroll out of view. - Make sure the tabs look like tabs and not another type of control. - Don’t use product logos for tab graphics. Tabs aren’t for branding.
|
|
tera tera
|
Dec 26, 2008 - 7:28 PM
|
Hello. >If you allocate 10000 GDI handles, Windows will start using the "System" proportional font everywhere. Will the reason why CPU processing becomes slow be that Windows uses a lot of proportional font?
I made 300 dialogues without using CExtTab.
The CPU processing does not seem to become slow. CExtTab uses CPU time in large quantities?
|
|
Technical Support
|
Dec 29, 2008 - 8:31 AM
|
The handle count is the problem. You created 300 dialogs which have 300 HWND handles. If each dialog has at least 3 child windows, the total count of handles will be 1200. This is too many.
|
|
tera tera
|
Jan 4, 2009 - 6:37 PM
|
Hello. I make plural tabs , Can it be always called only one CWnd?
|
|
Technical Support
|
Jan 6, 2009 - 12:23 PM
|
|
|
tera tera
|
Jan 6, 2009 - 4:47 PM
|
Hello. I ask for a sample code. Thanks,
|
|
Technical Support
|
Jan 8, 2009 - 10:14 AM
|
Please provide us with more details about the test project you need. Should it be dialog-based or frame-based? Where dynamically created tab pages should appear in it?
|
|
tera tera
|
Jan 8, 2009 - 5:10 PM
|
Hello. >Should it be dialog-based or frame-based?
dialog-based >Where dynamically created tab pages should appear in it?
It is a tab sticking to custom control. Thanks,
|
|
Technical Support
|
Jan 9, 2009 - 8:37 AM
|
Here is the test project:
http://www.prof-uis.com/download/forums/TestDynamicTabPageContainer.zip
We created a new CExtDynamicTabPageContainerWnd class for you. We tried to make it very similar to Prof-UIS tab page container windows. But it does not keep page windows for all the tab items. The CExtDynamicTabPageContainerWnd::OnCreatePageWindow() virtual method is invoked for creating page window for selected tab item. The page window of previously selected tab item is destroyed automatically.
|
|
tera tera
|
Jan 14, 2009 - 1:57 AM
|
Hello. Thank veryˆ2 much.
|
|
tera tera
|
Dec 30, 2008 - 12:06 AM
|
Hello. Make only a multiplex tab, Will it be possible for one CWnd( CExtGrid ) to be displayed?
I want a sample. Thank you
|
|
Technical Support
|
Dec 31, 2008 - 2:57 AM
|
You can create a CExtGridWnd window as a child of any other window. What do you mean by the multiplex tab window in your question?
|
|
tera tera
|
Dec 24, 2008 - 7:40 PM
|
Hello. The MFC program does not use the CPU processing time in large quantities even if I make 300 dialog (grid) by a normal MFC program.
I am troubled.
Please teach a good method.
|
|
Offer Har
|
Dec 24, 2008 - 2:36 PM
|
A pop-up menu does not have an ID, so I don’t know how to identify it... Thanks, Ron.
|
|
Offer Har
|
Dec 26, 2008 - 7:49 AM
|
Do you have any idea if they are going to fix it in VC10...? Because neither of the suggestions can work for me, I though if using the first child of this popup menu, will it work? Thanks for the preview of the new cool cells... one question - I also need UTM - will you be able to add it as well?
|
|
Technical Support
|
Dec 29, 2008 - 8:08 AM
|
We are not sure the menus in VC10 will be different. The Win32 menu resources were designed many years ago, before Win95... It’s easier to code our own menu designed similar to the toolbar/menu customization subsystem.
|
|
Offer Har
|
Dec 29, 2008 - 8:12 AM
|
What do you mean by: ’It’s easier to code our own menu designed similar to the toolbar/menu customization subsystem.’? Also - Because neither of the suggestions can work for me, I though if using the first child of this popup menu, will it work?
|
|
Technical Support
|
Dec 26, 2008 - 2:48 AM
|
The popup sub menus have IDs only in the customizable menus based on the command tree nodes, because each CExtCustomizeCmdTreeNode command node has ID. The simple and non-customizable menus have submenu items without IDs because Win32 menu resource format does not support this. So, you should know the index to remove. Alternatively you can search menu item by text or by ID of some neighborhood item.
We remember you interested in geographic controls some time ago:
http://www.prof-uis.com/download/forums/GeoControls_BIN.zip
|
|
Offer Har
|
Dec 24, 2008 - 7:24 AM
|
Dear Support, I see that there is a feature to add tooltips to cells, but I’m not sure how to use it (OnInitToolTip , OnGetToolTipText , OnGbwTooltip , OnAdvancedPopupMenuTipWndGet etc etc - not sure exactly who does what...) Can you please add a tutorial how to implement and what features does it hold? Thanks & happy holidays, Ron.
|
|
Technical Support
|
Dec 24, 2008 - 1:34 PM
|
The grid cells can display tooltips and expand tips. Expand tips are displayed over grid cell and allow to see the grid cell completely. Tooltips are displayed near grid cell (like tooltips near toolbar buttons). Tooltips also allow to see text of grid cell completely. Both tooltips and expand tips are displayed for grid cells which have partially visible text. Both does not display anything additional. The expand tips are typically used for data cells. The tooltips are typically used for header cells. It’s not possible to use both tooltip and expand tip with one grid cell. The set of __EGBS_EX_CELL_TOOLTIPS*** and __EGBS_EX_CELL_EXPANDING*** styles can be applied to the grid control using the grid’s SiwModifyStyle() method for turning on tooltips and/or expand tips for grid cells in different areas of the grid control. The expand tips and appropriate styles have higher priority.
The method in your question are related to tooltips. They are invoked automatically and display text of the grid cell which does not display its text completely. We guess you should not be interested in overriding these methods. So, please explain us details about your task.
|
|
Nicholas Vezirgiannis
|
Dec 24, 2008 - 5:08 AM
|
Hello,
I would like to ask you a question regarding the CExtGridWnd object. I am working on VS2005 MFC with profuis 2.8.2. I have created a class called CProdGridWnd derived from CExtGridWnd. Also I Created a Dialog Template with a Custom control (Class ProfUIS-ScrollItemWindow) which I use to put the grid in.
That works fine on a normal dialog box.
But If I try to use your CExtResizableDialog combined with CExtControlBar to convert this dialog into a dockable window in a document-view MFC project, the grid is invisible. In fact if I put any other control on the form it works fine, but the area of the custom control that includes the grid is just white. The peculiar thing is that other than that the grid works. When clicking randomly on that white area the grid events run and with a double click, an edit box appears with the data of the cell under it to change. When changing it and pressing enter, the OnGridCellInputComplete event runs as it should, but the cell and the data just typed disappear again. Could you help me make the Grid Control visible again? I tried to combine 2 of your examples the Dialog View in the SDIDOCVIEW project and the CExtGridWnd in ProfUIS_Controls project. I would like to attach the small test project I created so that you can see the problem. Please send me an email to dbalotis@bsi.gr to send you this project. The code bellow are the most important parts of the test project. I would appreciate your answer the soonest possible and thank you for your time in advance. Merry Xmas
<File GridDlg.h>
class CProdGridWnd : public CExtWFF < CExtGridWnd >
{
public:
CProdGridWnd();
~CProdGridWnd();
protected:
CExtScrollBar m_wndScrollBarH, m_wndScrollBarV;
virtual CScrollBar * GetScrollBarCtrl( int nBar ) const;
virtual void PreSubclassWindow(); virtual void OnGbwFocusChanged(const POINT & ptOldFocus, const POINT & ptNewFocus); virtual void OnGridCellInputComplete(CExtGridCell & _cell, LONG nColNo, LONG nRowNo, INT nColType, INT nRowType, HWND hWndInputControl);
}; //////////////////////////////////////////////////////////////////////////////////////////////////
// CGridDlg dialog
class CGridDlg : public CExtResizableDialog //CDialog
{
DECLARE_DYNAMIC(CGridDlg) public:
CProdGridWnd m_wndProdGrid;
CGridDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CGridDlg();
// Dialog Data
enum { IDD = IDD_RESIZABLE_GRID_DIALOG }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint(); DECLARE_MESSAGE_MAP()
}; --------------------------------------------------------------------------------------------------
<part of File GridDlg.cpp>
BOOL CGridDlg::OnInitDialog() // here we fill the grid
{
CExtResizableDialog::OnInitDialog();
AddAnchor( IDC_GRID, __RDA_LT, __RDA_RB ); bool bRedraw = true;
m_wndProdGrid.OuterRowCountTopSet( 1L, bRedraw );
m_wndProdGrid.OuterColumnCountLeftSet( 1L, bRedraw );
m_wndProdGrid.OuterColumnCountRightSet( 1L, bRedraw );
m_wndProdGrid.OuterColumnWidthSet( true, 0L, 14 );
m_wndProdGrid.OuterColumnWidthSet( false, 0L, 14 ); m_wndProdGrid.NoHideSelectionSet( true, bRedraw );
m_wndProdGrid.SubtractSelectionAreasSet( true, bRedraw );
m_wndProdGrid.LbExtSelectionSet( true );
m_wndProdGrid.GridLinesHorzSet( true, bRedraw );
m_wndProdGrid.GridLinesVertSet( true, bRedraw );
m_wndProdGrid.HoverEventsSet( true, true );
m_wndProdGrid.MultiAreaSelectionSet( false );
m_wndProdGrid.HoverHighlightSet( true, false, false, false, true, true ); m_wndProdGrid.SiwModifyStyle(
(__ESIS_STH_PIXEL|__ESIS_STV_ITEM) // item scroll window styles
| __EGBS_SFB_CELLS // selection/focus type
| __EGBS_RESIZING_CELLS_OUTER // enable row/column resizing
| __EGBS_RESIZING_CELLS_INNER
| __EGBS_DYNAMIC_RESIZING // resize rows/columns on-the-fly
,
0,
bRedraw
);
m_wndProdGrid.BseModifyStyleEx(
__EGBS_BSE_EX_DBLCLK_BEST_FIT_ROW // do best fit sizing on double clicks over column divider
| __EGBS_BSE_EX_DBLCLK_BEST_FIT_COLUMN // do best fit sizing on double clicks over row divider
,
__EGWS_BSE_EX_DEFAULT,
bRedraw
);
m_wndProdGrid.SiwModifyStyleEx(
__EGBS_EX_CELL_TOOLTIPS_INNER
| __EGBS_EX_CELL_EXPANDING_INNER
| __EGWS_EX_PM_COLORS
| __EGBS_EX_CORNER_AREAS_3D
,
0,
bRedraw
); CString tempstr;
LONG nColNo, nColCount = 5;
m_wndProdGrid.ColumnAdd( nColCount, false );
for( nColNo = 0L; nColNo < nColCount; nColNo++ )
{
CExtGridCellHeader * pCell =
STATIC_DOWNCAST(
CExtGridCellHeader,
m_wndProdGrid.GridCellGetOuterAtTop(
nColNo,
0L,
RUNTIME_CLASS(CExtGridCellHeader)
)
);
tempstr.Format(_T("TestCol%d"), nColNo+1);
pCell->TextSet( tempstr );
pCell->ExtentSet( 100 );
pCell->ModifyStyle( __EGCS_TA_HORZ_LEFT );
pCell->FontWeightSet( FW_BOLD );
}
////////////////////////////////// FILL WITH ROWS ///////////////////////////////////////
bRedraw = true; LONG nRowNo, nRowCount = 10;
m_wndProdGrid.RowAdd( nRowCount, bRedraw );
for( nRowNo = 0L; nRowNo < nRowCount; nRowNo++ )
{
CExtGridCellHeader * pCellLeft =
STATIC_DOWNCAST(
CExtGridCellHeader,
m_wndProdGrid.GridCellGetOuterAtLeft(
0L,
nRowNo,
RUNTIME_CLASS(CExtGridCellHeader)
)
);
pCellLeft->ExtentSet( 20 );
pCellLeft->ModifyStyle(
__EGCS_HDR_FOCUS_ARROW_RESERVE_SPACE
|__EGCS_HDR_FOCUS_ARROW_DISPLAY
|__EGCS_TA_HORZ_RIGHT
);
CExtGridCellHeader * pCellRight =
STATIC_DOWNCAST(
CExtGridCellHeader,
m_wndProdGrid.GridCellGetOuterAtRight(
0L,
nRowNo,
RUNTIME_CLASS(CExtGridCellHeader)
)
);
pCellRight->ModifyStyle(
__EGCS_HDR_FOCUS_ARROW_RESERVE_SPACE
|__EGCS_HDR_FOCUS_ARROW_DISPLAY
|__EGCS_TA_HORZ_RIGHT
);
} nColCount = 5;
for( nColNo = 0L; nColNo < nColCount; nColNo++ )
{
for( LONG nRowNo = 0L; nRowNo < nRowCount; nRowNo++ )
{
if (nColNo != 4)
{
CExtGridCellString * pCellString =
STATIC_DOWNCAST(
CExtGridCellString,
m_wndProdGrid.GridCellGet(
nColNo,
nRowNo,
0,
0,
RUNTIME_CLASS(CExtGridCellString)
)
);
} else {
CExtGridCellCheckBox * pCellCheckBox =
STATIC_DOWNCAST(
CExtGridCellCheckBox,
m_wndProdGrid.GridCellGet(
nColNo,
nRowNo,
0,
0,
RUNTIME_CLASS(CExtGridCellCheckBox)
)
);
}
}
}
//////////////////////////////// FILL WITH TEST DATA ////////////////////////////////////
CString temp;
//LONG nRowNo, nRowCount = 10;
//LONG nColNo, nColCount = 5; for( nColNo = 0L; nColNo < nColCount; nColNo++ )
{
for( LONG nRowNo = 0L; nRowNo < nRowCount; nRowNo++ )
{
if (nColNo != 4)
{
CExtGridCellString * pCellString =
STATIC_DOWNCAST(
CExtGridCellString,
m_wndProdGrid.GridCellGet( nColNo, nRowNo )
);
temp.Format(_T("Cell %d-%d"), nColNo+1, nRowNo+1);
pCellString->TextSet( temp );
} else {
CExtGridCellCheckBox * pCellCheckBox =
STATIC_DOWNCAST(
CExtGridCellCheckBox,
m_wndProdGrid.GridCellGet( nColNo, nRowNo )
);
pCellCheckBox->SetCheck(0);
}
}
}
return TRUE; // return TRUE unless you set the focus to a control
}
--------------------------------------------------------------------------------------------------
<File MainFrm.h>
#include "GridDlg.h" class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame) // Attributes
public:
CExtControlBar m_wndResizableBarGrid; //PROF-UIS Objects
CExtWRB < CGridDlg > m_wndResizableDlgGrid;
// Operations
public: // Overrides
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif protected: // control bar embedded members // Generated message map functions
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
afx_msg void OnUpdateControlBarMenu(CCmdUI* pCmdUI);
afx_msg BOOL OnBarCheck(UINT nID);
}; -------------------------------------------------------------------------------------------------- <part of File MainFrm.cpp> int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if( !m_wndResizableBarGrid.Create(
_T("Table Data"),
this,
ID_VIEW_PRODGRID,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER
|CBRS_TOOLTIPS
|CBRS_FLYBY
|CBRS_SIZE_DYNAMIC
|CBRS_HIDE_INPLACE )
)
{
TRACE0("Failed to create m_wndResizableBarGrid\n");
return -1; // fail to create
} if( !m_wndResizableDlgGrid.Create(IDD_RESIZABLE_GRID_DIALOG, &m_wndResizableBarGrid) )
{
TRACE0("Failed to create m_wndResizableBarDlg\n");
return -1; // fail to create
} m_wndResizableDlgGrid.ShowSizeGrip( FALSE );
m_wndResizableBarGrid.EnableDocking( CBRS_ALIGN_ANY );
if( !CExtControlBar::FrameEnableDocking(this) )
{
ASSERT( FALSE );
return -1;
} m_wndResizableBarGrid.DockControlBar( AFX_IDW_DOCKBAR_BOTTOM, 1, this ); return 0;
}
--------------------------------------------------------------------------------------------------
|
|
Nicholas Vezirgiannis
|
Jan 27, 2009 - 4:23 AM
|
In the same code as above, I want to show and hide the grid by showing or hiding the entire Resizable Dialog Control Bar as follows:
m_wndResizableBarGrid.ShowWindow(SW_SHOW); //or SW_HIDE
RecalcLayout();
This works just fine, but if the user decides to close the Control Bar by clicking on the X on the top right corner and the Control bar is not docked somewhere, the command above will not show it ever again. I have to close and reopen my application for it to function again.
Any ideas.
Thanks in advance.
|
|
Technical Support
|
Jan 27, 2009 - 11:37 AM
|
You should never invoke the ShowWindow() method of any control bar. Please invoke the CFrameWnd::ShowControlBar() method instead.
|
|
Nicholas Vezirgiannis
|
Jan 28, 2009 - 1:44 AM
|
Thanks again that worked fine.
|
|
Technical Support
|
Dec 24, 2008 - 1:34 PM
|
Please remove the CExtWFF template class from your grid window class declaration. The CExtGridWnd class is a flicker free control (written from scratch) which does not need the CExtWFF template. We send you e-mail. If you didn’t receive it, then you can simply write us e-mail to the support mail box at this web site.
|
|
Nicholas Vezirgiannis
|
Jan 5, 2009 - 1:48 AM
|
Thanks. That worked just fine.
|
|
Michael Galperin
|
Dec 24, 2008 - 12:14 AM
|
I’m on Vista Ultimate OS. I have both VS 6 and VS 2008. Open Sample "Solution for Visual Studio 9.0 (2008) - Win32 platform"
1. Make ProfUIS_Controls sample project your Startup project
2. Edit resource and open IDD_PROFUIS_CONTROLS_DIALOG
3. Resize it to allow room for an active X (media player) control
4. Right-click and "Insert an Active/X control..."
5. Pick "Windows Media Player"
6. Compile, and Run
7. The embedded Windows Media Player does not appear! Now open the "Workspace for Visual Studio 6 with SP6"
1. Make ProfUIS_Controls sample project your Startup project
2. Edit resource and open IDD_PROFUIS_CONTROLS_DIALOG
3. (The "Windows Media Player" is already there since we’ve arleady added above)
4. Compile, and Run
5. The embedded Windows Media Player appears!
Actually, the error in my project is more fatal because I’m using SubclassDlgItem() which ASSERTS. If I change to DDX_Control, it does not have an error message but the control is nowhere to be seen (just like above).
Your help will be much appreciated!
Ferdie
|
|
Technical Support
|
Dec 26, 2008 - 2:48 AM
|
We would like to provide you with additional information about the problem. If you try to play with the Disabled , enabled and WindowlessVideo properties of the Windows Media Player ActiveX control, then it may start working in the MFC 4.2 - based old version in the same way like it does in the MFC 9.0 - based modern version. It really looks like the modern version somehow switches video player into windowless mode and it’s not possible to change this mode even from code. We also noticed, that if we open the ActiveX properties dialog of the Windows Media Player control in Visual Studio 2008 (click the last toolbar button inside the property grid), change something, click OK or Apply and open properties dialog again, then not all the properties were applied. This is not happen in Visual C++ 6.0 IDE. But the small standalone test project displays the Windows Media Player ActiveX control well. So, the really working right now solution can be the following: create new child dialog and player control inside it, then create the child dialog inside other dialog. This will let the player control live inside small and friendly dialog. This also allows to avoid any potentially possible conflicts between player control and its neighborhood controls.
|
|
Michael Galperin
|
Dec 29, 2008 - 7:14 PM
|
Thank you very much for looking into my problem. In my application, the media player is contained in CExtResizeableDialog which is a page inserted into a CExtTabPageContainerWhidbeyWnd. So for now, I replaced the CExtResizeableDialog into just play CDialog. The control is now being displayed, BUT the problem is that I can’t resize the media player to fill the client area. One indicator that something is still not right is the m_hwnd member of the active/X container is still NULL. So I can’t use CWnd::MoveWindow. I also I tried using ResizeAxControl() - using IOlObject::SetExtent( DVASPECT_CONTENT, size) I found in Prof-UIS forums. It does not work either. In summary, the control shows up but I cannot resize it. Help!
|
|
Technical Support
|
Dec 31, 2008 - 2:56 AM
|
|
|
Michael Galperin
|
Dec 31, 2008 - 10:26 AM
|
It works! Thank you. So the solution to my problem is: 1. Use CDialog instead of CExtResizeableDialog
2. Resize the media player activeX object using IOleInplaceObject::SetObjectRects() Here is my function, which is called from my dialog’s OnSize() handler: bool CMyDialog::ResizeAxControl( CWnd & wndAxControl, int cx, int cy )
{
ASSERT_VALID( this );
IUnknown * pUnknown = wndAxControl.GetControlUnknown();
if( pUnknown == NULL )
return false;
IOleInPlaceObject * pOleInplaceObject = NULL;
hr = pUnknown->QueryInterface( __uuidof(IOleInPlaceObject), (LPVOID*)&pOleInplaceObject );
if( hr != S_OK )
return false;
ASSERT( pOleInplaceObject != NULL );
CRect rect(0,0,cx,cy);
hr = pOleInplaceObject->SetObjectRects( &rect, &rect );
pOleInplaceObject->Release(); // release is not required because there was no AddRef()
// pUnknown->Release();
return ( hr == S_OK ) ? true : false;
}
|
|
Technical Support
|
Dec 24, 2008 - 1:35 PM
|
We confirm this issue. We reproduced it using the test projects from this ZIP file:
http://www.prof-uis.com/download/forums/tmp/TestMediaPlayer.zi
Please note, the player on dialog tries to play the following URL:
http://media.rockstargames.com/flies/xbox360/640x360.wmv
The file is played with MFC 9.0-based version of the project but the player controls are not visible. It looks like the Windows Media Player control is not well compatible with double buffered painting of its parent dialog. But we did not found why this problem occurs with MFC 9.0 only. We will try to find a solution. But in any case, the Media Player control created inside standalone child dialog should not have such problem.
|
|
Michael Galperin
|
Dec 24, 2008 - 2:24 PM
|
Yes, I noticed that it still can play. However, I am not able to resize to fit my dialog because the control has NULL m_hwnd. Furthermore, my application needs the controls. Thank you very much for looking into it. I hope you get inspired with the holiday to come up with a solution soon.
|
|
Paul Boswell
|
Dec 23, 2008 - 10:58 AM
|
I saw that you had a post earlier about creating a CExtGridCell with an icon and text. However, it didn’t contain quite enough information for me to implement it: http://www.prof-uis.com/prof-uis/tech-support/support-forum/cextpropertygridctrl-how-to-add-a-cell-that-has-both-a-string-and-a-bitmapicon-4149.aspx#@lt;/p>
I would like to add the icons as per the first method described where each CExtGridCell keeps track of its own icons. In the post, the technical support person recommended overriding the IconGet function so that it returns the desired icon. So I overrode the function, but when the overridden CExtGridCell is displayed, the IconGet function is never called. What’s missing? By the way - the search bar on the support forum page seems to only search keywords with the "OR" operation (maybe there is a way to search that I don’t know about?) . So if you want to narrow your results, the only thing you can do is reduce the number of words you enter in. That makes it very time consuming to find the answer you’re looking for because you have to enter in single words that could be quite broad. Just a suggestion.
|
|
Paul Boswell
|
Dec 23, 2008 - 11:57 AM
|
It looks like I can override IconGet() just fine, but the function is really only called within the base class (CExtGridCell::OnPaintForeground) anyway, so my override isn’t doing anything. Do you have any ideas for how to make this work?
|
|
Technical Support
|
Dec 24, 2008 - 1:30 PM
|
You can use the following methods of CExtGridCell to get the icon: virtual CExtCmdIcon * IconGet();
const CExtCmdIcon * IconGet() const;
Please ensure you have overridden the first method because the second one is not virtual. The IconGet() virtual method is really invoked when the icon should be painted but it’s also invoked from the following virtual method: virtual CSize IconGetSize() const;
You can override the IconGetSize() virtual method if you need to make the icon area smaller or larger. The icon area inside the grid cell is never used as a clickable or selectable area. So the icon is just a visual element. The IconGetSize() method is used for computing the size of the icon and the CExtGridCell::OnPaintIcon() method is used for painting the icon. You can implement the IconGetSize() and CExtGridCell::OnPaintIcon() virtual methods and draw something inside the icon area. For instance, the CExtGridCellColor color picker cell draws a color box instead of an icon and the CExtGridCellFontFaceName font name picker cell draws a font preview.
|
|
Offer Har
|
Dec 23, 2008 - 10:28 AM
|
I have a popup menu with one level only (no sub-menu items) I need to remove some of the items in it. I tried to implement the CExtPopupBaseWnd::g_nMsgPrepareMenu message, and did this:
LRESULT CMyView::OnExtMenuPrepareMenu( WPARAM wParam, LPARAM lParam )
{
lParam; // unused parameter
CExtPopupMenuWnd::MsgPrepareMenuData_t * pData =
reinterpret_cast < CExtPopupMenuWnd::MsgPrepareMenuData_t * > ( wParam );
ASSERT( pData != NULL );
CExtPopupMenuWnd * pPopup = pData->m_pPopup;
ASSERT( pPopup != NULL );
INT nToRemove = pPopup->ItemFindPosForCmdID(ID_TO_REMOVE);
{
if (-1!=nToRemove)
{
pPopup->ItemRemove(nToRemove);
}
}
pData->m_bMenuChanged = true;
return 1L;
} But, I keep on getting - 1 in nToRemove . I’m sure the command is there. Any ideas? am I doing something wrong? Thanks, Ron.
|
|
Technical Support
|
Dec 24, 2008 - 8:36 AM
|
You can try using the following test version of the CMyView::OnExtMenuPrepareMenu method in debug session: LRESULT CMyView::OnExtMenuPrepareMenu( WPARAM wParam, LPARAM lParam )
{
lParam;
CExtPopupMenuWnd::MsgPrepareMenuData_t * pData =
reinterpret_cast < CExtPopupMenuWnd::MsgPrepareMenuData_t * > ( wParam );
ASSERT( pData != NULL );
CExtPopupMenuWnd * pPopup = pData->m_pPopup;
ASSERT( pPopup != NULL );
INT nIndex, nCount = pPopup->ItemGetCount();
TRACE( "\r\n\r\nTRACING MENU COMMANDS (BEGIN) ====================\r\n" );
for( nIndex = 0; nIndex < nCount; nIndex ++ )
{
const CExtPopupMenuWnd::MENUITEMDATA & mi = pPopup->ItemGetInfo( nIndex );
UINT nCmdID = mi.GetCmdID();
TRACE3( "index = %d, ID = %d, equal to ID_TO_REMOVE = %s\r\n", nIndex, nCmdID, nCmdID == ID_TO_REMOVE ? "YES" : "NO" );
}
TRACE( "TRACING MENU COMMANDS (END) ====================\r\n\r\n\r\n" );
return 1L;
}
The Output window in your Visual Studio will show the real content of your single level popup menu.
|
|
Offer Har
|
Dec 24, 2008 - 2:34 PM
|
Thanks... that helped! had the wrong ID
|
|
Paul Boswell
|
Dec 23, 2008 - 8:09 AM
|
Is there any way to add an icon to the CExtPropertyGridComboBoxBar?
|
|
Technical Support
|
Dec 24, 2008 - 8:02 AM
|
Thank you for the interesting question. The CExtPropertyGridComboBoxBar displays a list of the CExtPropertyStore property store objects inserted into the property grid control. A property store has only the name property, which is a single line text string. Which icons should be displayed in the combo box? Should we add the icon property to the CExtPropertyStore class and regard your question as a feature request? If yes, then it would be reasonable also to provide the icon property to all the property values and property categories and display it inside the property grid in the name column. This means the icon should be added into the CExtPropertyItem class which is the base of the CExtPropertyStore , CExtPropertyCategory and CExtPropertyValue classes.
|
|
Lars Mohr
|
Dec 23, 2008 - 2:06 AM
|
Great work! Release 2.84 is fantastic. You guys did a great job. I wish you and your familie merry christmas and happy new year.
|
|
Technical Support
|
Dec 24, 2008 - 7:56 AM
|
Thank you for your kind words. Merry Christmas and Happy Holidays!
|
|
Offer Har
|
Dec 23, 2008 - 8:51 AM
|
Same from us - thank you for the release and happy holidays.
|
|
Technical Support
|
Dec 24, 2008 - 8:00 AM
|
Merry Christmas and Happy Holidays to you and your team.
|
|
Anil Siddhpura
|
Dec 22, 2008 - 10:16 PM
|
Hi, How to add one extra row at the end of report, which should be saperate from all other rows & it is not under any column header?
|
|
Technical Support
|
Dec 24, 2008 - 1:36 PM
|
The report grid control does not support footer rows. It supports only header row and data rows. Please provide us with more details about your task.
|
|
Anil Siddhpura
|
Dec 22, 2008 - 10:13 PM
|
Hi, I found problem in printpreview of CExtReportGrid. I generated report using CExtReportGrid class. But when i do printpreview, some of data of report is being loss in printpreview. i.e. I have records from 1 to 100 in my report & if i do printpreview then it display 1 to 27 records in 1st page & the 2nd page starts from record no. 41. So it was data loss of 13 rows at each page break. I refer the ReportGrid Sample provided by Prof-Uis, but the same thing is happening in it. So please help me ASAP. Regards, Apurv
|
|
Technical Support
|
Dec 24, 2008 - 1:37 PM
|
Please let us know which printer model was used as the default printer when you encountered the problem with report grid?
|
|
Offer Har
|
Dec 22, 2008 - 9:53 PM
|
|
|
Technical Support
|
Dec 26, 2008 - 2:47 AM
|
All the OnToolHitTest() virtual methods in all the Prof-UIS classes are similar to the CWnd::OnToolHitTest() virtual method:
http://msdn.microsoft.com/en-us/library/xbwysc9f(VS.80).aspx
The hit testing result is item identifier or -1 if there is no tooltip should appear. If tooltip should appear, then you should specify tooltip text allocated in the dynamic memory using the _tcsdup() API or the LPSTR_TEXTCALLBACK pseudo string pointer which will make the tooltip control sending the TTN_NEEDTEXT message. The last case is enough obsolete is not supported by Prof-UIS themed tooltips. The returned item identifier can be any positive value if tooltip is not displayed by toolbar button. Of course you should specify rectangle for displaying tooltip in the TOOLINFO data structure:
http://msdn.microsoft.com/en-us/library/bb760256(VS.85).aspx
The _tcsdup() API simply allocates memory buffer using good classic malloc() and copies specified string into it:
http://msdn.microsoft.com/en-us/library/y471khhc(VS.80).aspx
Do not worry about the allocated memory. If the request for tooltip text is came from MFC, then MFC will de-allocate this memory using the free() API automatically. If it’s came from Prof-UIS, then the themed tooltip control will copy the tooltip text and free the specified memory even before the tooltip window appears on the screen.
|
|
Offer Har
|
Dec 27, 2008 - 1:21 PM
|
Dear Support, I was able to show the tool-tip - I had to put something in pTI->rect - does it matter what I put there? Another problem - if the control-bar does not have focus, the tip is not displayed - the OnToolHitTest is called, but the tool-tip is not displayed - is it on purpose or is it a bug? I do need to see the tooltip even when it’s not the focus window. Also - the tool-tip are the dull yellow one - can I change it to be the more modern one? Thanks, Ron.
|
|
Offer Har
|
Dec 27, 2008 - 8:27 AM
|
Dear Support, I still have problems makeing it work: - What is the ID I should return from the function, any number is good?
- How do I know that the point is over the title and not the close button for esample?
- How do I compute the rectangle for the tooltip, and why should I even do it?
I tried to do this:
__EXT_MFC_INT_PTR CMyControlBar::OnToolHitTest(CPoint point,TOOLINFO * pTI) const{ char buffer[] = "This is the buffer text";char *newstring; newstring = _strdup( buffer );pTI->lpszText = newstring;return 1;}
But saw nothing...
|
|
Technical Support
|
Dec 29, 2008 - 8:21 AM
|
We created a small application:
http://www.prof-uis.com/download/forums/TestBarCaptionTip.zip
The identifier value is required as hit-testing result. The -1 identifier means tooltip should not be displayed. The rectangle for tooltip tracking is the required parameter of tooltip tracking algorithm. Tooltip window hides itself automatically when the mouse pointer leaves the rectangle.
|
|
Offer Har
|
Dec 31, 2008 - 5:07 AM
|
Dear Support, Thank-you very much for the demo, there are a couple of things that are not clear: 1) When the control-bar if floating, the tip is not displayed in your ap[plication - why is that? 2) The location of the tip is always at the same place on the X axir of the control-bar, and not the location of the cursor- why is that? 3) I see you use CExtCTA to make the tips cool - how to use this class? I could not find any mention of it in the help Thanks & Happy new year, Ron
|
|
Technical Support
|
Dec 24, 2008 - 7:59 AM
|
Yes. You should implement the CExtControlBar::OnToolHitTest() virtual method. By default this method allows all the caption buttons to display their tooltips. The CExtBarNcAreaButton::DoDefaultReflectForToolHitTest() method fills the hit testing information data structure with tooltip data. Your method should do the same for entire caption or its part which should have tooltip.
|
|
Offer Har
|
Dec 24, 2008 - 1:36 PM
|
Dear Support, It’s not very clear to me what we’re supposed to do... Tried to override OnToolHitTest , but no idea what to do there. Also, this function is not mentioned in the help. Thanks, Ron.
|
|
Offer Har
|
Dec 22, 2008 - 9:11 PM
|
Dear Support, When tiling MDI child windows there are 3 magenta points on both top corner of the active child window: Please remove them.. Thanks, Ron.
|
|
Technical Support
|
Dec 24, 2008 - 8:06 AM
|
We cannot reproduce this issue using the DRAWCLI and MDI sample applications both on Windows XP and Windows Vista. We guess the problem can be reproduced if we implement some message handlers in the MDI child frame class.
|
|
Offer Har
|
Dec 22, 2008 - 5:09 PM
|
Dear Support What happen now that my views receive some resize events and all their center is moved when I switching view from the MDI tab for example. Is there any chance to get this working like it did in 2.82? We are currently releasing products with 2.82 and this bug is not there. This is for us a major problem and we don’t know how to use the library like this. Please help us solve this issue ASAP. We were planning on moving to 2.84 early January, because of some bug fixes and new feature, but with this bug we cannot do it. Thanks, Ron.
|
|
Technical Support
|
Dec 24, 2008 - 7:59 AM
|
The WM_SIZE message during MDI child frame activation is generated by Windows not by Prof-UIS. The only thing we can do is to hide flicker during MDI child frame activation. Prof-UIS 2.84 hides this flicker in all the cases excepting one case which even happen not in all the applications: the MDI tabs based MDI child frame selection. To fix this issue please update the source code of the CExtTMWI::OnTabWndSelectionChange() method:
virtual bool OnTabWndSelectionChange(
LONG nOldItemIndex,
LONG nNewItemIndex,
bool bPreSelectionTest
)
{
#if (!defined __EXT_MFC_NO_CUSTOMIZE)
CExtCustomizeSite * pSite =
CExtCustomizeSite::GetCustomizeSite( m_hWnd );
if( pSite != NULL
&& pSite->IsCustomizeMode()
)
return false;
#endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
bool bRetVal =
_BT::OnTabWndSelectionChange( nOldItemIndex, nNewItemIndex, bPreSelectionTest );
if( (!m_bInSyncLayout) && (!bPreSelectionTest) && (!m_bDragging))
{
ASSERT( bRetVal );
HWND hWnd = (HWND)ItemLParamGet( nNewItemIndex );
if( hWnd != NULL && ::IsWindow(hWnd) )
{
// FrameFeatures does not use CMDIFrameWnd
HWND hWndMdiArea = _GetHwndMdiArea();
if( hWndMdiArea != NULL )
{
::SendMessage( hWndMdiArea, WM_SETREDRAW, 0, 0 );
HWND hWndAlreadyActive = (HWND)
::SendMessage( hWndMdiArea, WM_MDIGETACTIVE, 0, 0 );
if( hWndAlreadyActive != hWnd )
::SendMessage( hWndMdiArea, WM_MDIACTIVATE, (WPARAM)hWnd, 0 );
::SendMessage( hWndMdiArea, WM_SETREDRAW, 1, 0 );
::SetWindowPos(
hWndMdiArea, NULL, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER
|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_FRAMECHANGED
);
} // if( hWndMdiArea != NULL )
} // if( hWnd != NULL && ::IsWindow(hWnd) )
} // if( (!m_bInSyncLayout) && (!bPreSelectionTest) )
else
{
HWND hWndMdiArea = _GetHwndMdiArea();
if( hWndMdiArea != NULL )
::SetWindowPos(
hWndMdiArea, NULL, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER
|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_FRAMECHANGED
);
} // else from if( (!m_bInSyncLayout) && (!bPreSelectionTest) )
return bRetVal;
}
|
|
Offer Har
|
Dec 24, 2008 - 1:34 PM
|
Thanks - that solved the flicker problem. Is there anyway to add an hourglash when swithcing view or to have some globar variable that will tell me that we’re in the of views switching so that I will stop doing the hard-work in these useless WM_SIZE messages? My problem now is that views switching still takes up noticeable time, and it fells that the system hangs...
|
|
Technical Support
|
Dec 26, 2008 - 2:47 AM
|
The MDI child frame activation is performed via sending WM_MDIACTIVATE message to the MDI client area:
http://msdn.microsoft.com/en-us/library/ms644911(VS.85).aspx
Then the MDI client area window switches the active child frame window and sends this message to child frames. So, you need to subclass the window procedure of the MDI client area window to catch the WM_MDIACTIVATE message. This procedure is already subclassed by the CExtMenuControlBar class (and derived from it classes like CExtRibbonPage and CExtRibbonBar ). The CExtMenuControlBar is derived from the CExtHookSink class and implements the CExtHookSink::OnHookWndMsg() virtual method. You should override this method in your CExtMenuControlBar -derived class and show the waiting cursor on the WM_MDIACTIVATE message. You will also need to implement the CExtHookSink::OnPostHookWndMsg() virtual method for restoring cursor.
class CYourMenuBar : public CExtMenuControlBar
{
protected:
CWaitCursor * m_pWaitCursor;
public:
CYourMenuBar ()
: m_pWaitCursor( NULL )
{
}
~CYourMenuBar()
{
if( m_pWaitCursor != NULL )
delete m_pWaitCursor;
}
protected:
virtual bool OnHookWndMsg( LRESULT & lResult, HWND hWndHooked, UINT nMessage, WPARAM & wParam, LPARAM & lParam )
{
if( hWndHooked == _GetHwndMdiArea() && nMessage == WM_MDIACTIVATE )
m_pWaitCursor = new CWaitCursor;
return CExtMenuControlBar::OnHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
}
virtual void OnPostHookWndMsg( LRESULT lResult, HWND hWndHooked, UINT nMessage, WPARAM wParam, LPARAM lParam )
{
if( m_pWaitCursor != NULL && hWndHooked == _GetHwndMdiArea() && nMessage == WM_MDIACTIVATE )
{
delete m_pWaitCursor;
m_pWaitCursor = NULL;
}
CExtMenuControlBar::OnPostHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
}
};
Please note, the method above will show the show the waiting cursor when your application activates the MDI child frame window by its handle. This happens when you clicking tab item on the MDI tab control or selecting menu item from Window button of menu bar. The MDI frames can also be switched using MDI window sequence. This happen when you pressing Ctrt+Tab, Ctrt+Shift+Tab and Ctrt+F6 key combinations. The improved menu bar which you see above will not show the waiting cursor on cyclic MDI frame activation. If you need the waiting cursor during cyclic MDI child frame activation, then the class above should be improved and it should catch the WM_MDINEXT message: class CYourMenuBar : public CExtMenuControlBar
{
protected:
CWaitCursor * m_pWaitCursor;
public:
CYourMenuBar ()
: m_pWaitCursor( NULL )
{
}
~CYourMenuBar()
{
if( m_pWaitCursor != NULL )
delete m_pWaitCursor;
}
protected:
virtual bool OnHookWndMsg( LRESULT & lResult, HWND hWndHooked, UINT nMessage, WPARAM & wParam, LPARAM & lParam )
{
if( ( nMessage == WM_MDIACTIVATE || nMessage == WM_MDINEXT )
&& hWndHooked == _GetHwndMdiArea()
)
m_pWaitCursor = new CWaitCursor;
return CExtMenuControlBar::OnHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
}
virtual void OnPostHookWndMsg( LRESULT lResult, HWND hWndHooked, UINT nMessage, WPARAM wParam, LPARAM lParam )
{
if( m_pWaitCursor != NULL
&& ( nMessage == WM_MDIACTIVATE || nMessage == WM_MDINEXT )
&& hWndHooked == _GetHwndMdiArea()
)
{
delete m_pWaitCursor;
m_pWaitCursor = NULL;
}
CExtMenuControlBar::OnPostHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
}
};
We think the last one works better and displays the waiting cursor in all the often occurred cases but not in all the 100% cases. The MDI child frames sometimes become created and destroyed. If you are closing the MDI child frame window, then the next MDI child frame under it will become active and this will take the same time as active frame selection or cyclic switching. The same is related for newly created frame. Besides, the newly created time may require some additional time for initialization in your real application. So, we should improve the second version of menu bar once more: class CYourMenuBar : public CExtMenuControlBar
{
protected:
CWaitCursor * m_pWaitCursor;
public:
CYourMenuBar ()
: m_pWaitCursor( NULL )
{
}
~CYourMenuBar()
{
if( m_pWaitCursor != NULL )
delete m_pWaitCursor;
}
protected:
virtual bool OnHookWndMsg( LRESULT & lResult, HWND hWndHooked, UINT nMessage, WPARAM & wParam, LPARAM & lParam )
{
if( ( nMessage == WM_MDIACTIVATE || nMessage == WM_MDINEXT || nMessage == WM_MDICREATE || nMessage == WM_MDIDESTROY )
&& hWndHooked == _GetHwndMdiArea()
)
m_pWaitCursor = new CWaitCursor;
return CExtMenuControlBar::OnHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
}
virtual void OnPostHookWndMsg( LRESULT lResult, HWND hWndHooked, UINT nMessage, WPARAM wParam, LPARAM lParam )
{
if( m_pWaitCursor != NULL
&& ( nMessage == WM_MDIACTIVATE || nMessage == WM_MDINEXT || nMessage == WM_MDICREATE || nMessage == WM_MDIDESTROY )
&& hWndHooked == _GetHwndMdiArea()
)
{
delete m_pWaitCursor;
m_pWaitCursor = NULL;
}
CExtMenuControlBar::OnPostHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
}
};
|
|
Offer Har
|
Dec 22, 2008 - 9:01 PM
|
The bug is that WM_SIZE is called when this views switch is done - this is not supposed to be called, because it is passed with the restore size values, so I do some computations that changes the center of the view according to this wrong size. In any case, the call to WM_SIZE also slows down the views switching, because I do a lot of computations in this function, and there is no need to it to be called, because the size did not really change.
|
|
Offer Har
|
Dec 22, 2008 - 8:39 AM
|
|
|
Technical Support
|
Dec 24, 2008 - 8:04 AM
|
Thank you for reporting a very interesting and complicated issue. To fix it, please update the source code for the following methods: void CExtTreeGridCellNode::_ContentWeight_IncrementNonExpanded(
ULONG nWeight
)
{
ASSERT_VALID( this );
ASSERT( m_nContentWeightExpanded <= m_nContentWeightAll );
m_nContentWeightAll += nWeight;
CExtTreeGridCellNode * pNodeParent = TreeNodeGetParent();
if( pNodeParent != NULL )
pNodeParent->_ContentWeight_IncrementNonExpanded( nWeight );
}
void CExtTreeGridCellNode::TreeNodeHiddenSet(
CExtTreeGridDataProvider & _DP,
bool bHide
)
{
ASSERT_VALID( this );
ASSERT_VALID( (&_DP) );
ASSERT_KINDOF( CExtTreeGridDataProvider, (&_DP) );
bool bHidden = TreeNodeHiddenGet();
if( ( bHidden && bHide ) || ( (!bHidden) && (!bHide) ) )
return;
if( bHide )
{
if( TreeNodeIsDisplayed() )
{
ULONG nOffset = TreeNodeCalcOffset( true, false );
if( nOffset != ULONG(-1L) )
{
ASSERT( _DP.m_arrGridVis[ nOffset ] == this );
INT nCountToRemove = _ContentWeight_Get( true );
_DP.m_arrGridVis.RemoveAt( nOffset, nCountToRemove + 1 );
CExtTreeGridCellNode * pNodeParent = TreeNodeGetParent();
if( pNodeParent != NULL )
{
ASSERT_VALID( pNodeParent );
pNodeParent->_ContentWeight_Decrement( nCountToRemove + 1, true );
}
}
}
ModifyStyleEx( __EGCS_EX_HIDDEN_TREE_NODE, 0 );
} // if( bHide )
else
{
ModifyStyleEx( 0, __EGCS_EX_HIDDEN_TREE_NODE );
if( TreeNodeIsDisplayed() )
{
ULONG nOffset = TreeNodeCalcOffset( true, false );
if( nOffset != ULONG(-1L) )
{
m_nContentWeightAll = ULONG( m_arrChildren.GetSize() );
INT nCountToInsert = _ContentWeight_CalcVisible();
_DP.m_arrGridVis.InsertAt( nOffset, NULL, nCountToInsert + 1 );
_DP.m_arrGridVis.SetAt( nOffset, this );
nOffset ++;
_Content_FillVisibleArray( _DP.m_arrGridVis, nOffset );
CExtTreeGridCellNode * pNodeParent = TreeNodeGetParent();
if( pNodeParent != NULL )
{
ASSERT_VALID( pNodeParent );
pNodeParent->_ContentWeight_Increment( nCountToInsert + 1, true );
}
}
}
} // else from if( bHide )
}
|
|
Offer Har
|
Dec 24, 2008 - 2:29 PM
|
|
|
Offer Har
|
Dec 22, 2008 - 10:08 AM
|
I am sending you a sample application that reproduces the bug via mail.
|
|
Offer Har
|
Dec 21, 2008 - 8:22 AM
|
Hi, I set my grid like this:
SiwModifyStyle(__EGBS_SFB_FULL_ROWS,__EGBS_SFB_MASK|__EGBS_GRIDLINES_V);
BseModifyStyleEx(__EGBS_BSE_EX_EAL_RIGHT_H); The problem is that after the last column, one pixel is not drawn:
|
|
Technical Support
|
Dec 22, 2008 - 3:00 PM
|
Thank you for reporting this bug. It’s specific to grid windows based on full row selection model. To fix it, please update the source code for the following method: void CExtGridBaseWnd::OnGbwPaintCell(
CDC & dc,
LONG nVisibleColNo,
LONG nVisibleRowNo,
LONG nColNo,
LONG nRowNo,
const RECT & rcCellExtra,
const RECT & rcCell,
const RECT & rcVisibleRange,
DWORD dwAreaFlags,
DWORD dwHelperPaintFlags
) const
{
ASSERT_VALID( this );
ASSERT( dc.GetSafeHdc() != NULL && nColNo >= 0 && nRowNo >= 0 );
if( rcCell.right <= rcCell.left || rcCell.bottom <= rcCell.top )
return;
ASSERT( rcCellExtra.right >= rcCellExtra.left );
ASSERT( rcCellExtra.bottom >= rcCellExtra.top );
ASSERT( rcCellExtra.left <= rcCell.left );
ASSERT( rcCellExtra.top <= rcCell.top );
ASSERT( rcCellExtra.right >= rcCell.right );
ASSERT( rcCellExtra.bottom >= rcCell.bottom );
nVisibleColNo; nVisibleRowNo; rcVisibleRange; rcCellExtra;
bool bHoverByColumn = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_COLUMN) != 0 ) ? true : false;
bool bHoverByRow = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_ROW) != 0 ) ? true : false;
bool bHighlightedBySelectedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_COLUMN) != 0 ) ? true : false;
bool bHighlightedBySelectedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) != 0 ) ? true : false;
bool bHighlightedByFocusedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN) != 0 ) ? true : false;
bool bHighlightedByFocusedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) != 0 ) ? true : false;
bool bFocusedControl = ( (dwHelperPaintFlags&__EGCPF_FOCUSED_CONTROL) != 0 ) ? true : false;
bool bHighlightPressing = ( (dwHelperPaintFlags&(__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN|__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW)) != 0 ) ? true : false;
INT nColType = 0;
INT nRowType = 0;
if( ( dwAreaFlags & __EGBWA_OUTER_LEFT ) != 0 )
nColType = -1;
else
if( ( dwAreaFlags & __EGBWA_OUTER_RIGHT ) != 0 )
nColType = 1;
if( ( dwAreaFlags & __EGBWA_OUTER_TOP ) != 0 )
nRowType = -1;
else
if( ( dwAreaFlags & __EGBWA_OUTER_BOTTOM ) != 0 )
nRowType = 1;
COLORREF clrBack = OnGbwQueryBackColor( dc, nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType, dwAreaFlags, dwHelperPaintFlags );
if( clrBack != COLORREF( -1L )
&& (! bHighlightPressing )
)
dc.FillSolidRect(
&rcCell,
clrBack
);
if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
{
DWORD dwSiwStyleEx = SiwGetStyleEx();
if( (dwSiwStyleEx&__EGWS_EX_PM_COLORS) != 0
&& (dwHelperPaintFlags&__EGCPF_SIMPLIFIED_RENDERING_TARGET) == 0
)
{
if( PmBridge_GetPM()->Grid_PaintHeaderBackground( dc, rcCell, nColNo, nRowNo, nColType, nRowType, dwAreaFlags, dwHelperPaintFlags, (CObject*)this ) )
return;
}
bool bDefaultDrawing = true;
if( (dwSiwStyleEx&__EGWS_EX_USE_THEME_API) != 0 )
{
if( g_PaintManager.m_UxTheme.IsControlsThemed()
&& g_PaintManager.m_UxTheme.OpenThemeData( GetSafeHwnd(), L"HEADER" ) != NULL )
{
INT nStateID = 0;
if( bHighlightPressing )
nStateID = HIS_PRESSED;
else if( bHoverByColumn && bHoverByRow )
nStateID = HIS_HOT;
else
nStateID = HIS_NORMAL;
ASSERT( nStateID != 0 );
if( g_PaintManager.m_UxTheme.DrawThemeBackground( dc.GetSafeHdc(), HP_HEADERITEM, nStateID, &rcCell, &rcCell ) == S_OK
)
bDefaultDrawing = false;
g_PaintManager.m_UxTheme.CloseThemeData( true );
}
} // if( (dwSiwStyleEx&__EGWS_EX_USE_THEME_API) != 0 )
if( bDefaultDrawing )
{
if( clrBack != COLORREF( -1L ) )
dc.FillSolidRect( &rcCell, clrBack );
else if( bHighlightPressing )
{
CRect rcHighlightPressing( rcCell );
if( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN) != 0 )
rcHighlightPressing.DeflateRect( 0, 0, 1, 0 );
if( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW) != 0 )
rcHighlightPressing.DeflateRect( 0, 0, 0, 1 );
dc.FillSolidRect(
&rcHighlightPressing, // &rcCell
OnSiwGetSysColor( COLOR_3DDKSHADOW )
);
}
else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
dc.FillRect( &rcCell, &( OnSiwGetLighterOrDarkerBrush( -3 ) ) );
else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
dc.FillRect( &rcCell, &( OnSiwGetLighterOrDarkerBrush( -2 ) ) );
else if( bHoverByColumn || bHoverByRow )
{
if( nColType == 0 || nRowType == 0 )
dc.FillRect( &rcCell, &( OnSiwGetLighterOrDarkerBrush( -1 ) ) );
}
else
{
if( (dwSiwStyleEx&(__EGWS_EX_PM_COLORS|__EGWS_EX_USE_THEME_API|__EGBS_EX_CORNER_AREAS_3D|__EGBS_EX_CORNER_AREAS_CURVE))
== (__EGBS_EX_CORNER_AREAS_3D|__EGBS_EX_CORNER_AREAS_CURVE)
&& (
dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_OUTER_TOP)
|| dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_OUTER_BOTTOM)
|| dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_OUTER_TOP)
|| dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_OUTER_BOTTOM)
)
)
{
}
else
{
COLORREF clrLT = OnSiwGetSysColor( COLOR_3DHIGHLIGHT );
COLORREF clrRB = OnSiwGetSysColor( COLOR_3DSHADOW );
dc.Draw3dRect( &rcCell, clrLT, clrRB );
}
}
} // if( bDefaultDrawing )
} // if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
else
{
ASSERT( nRowNo >= 0 && nColNo >= 0 );
if( clrBack != COLORREF( -1L ) )
dc.FillSolidRect( &rcCell, clrBack );
else if( bHighlightPressing )
{
CRect rcHighlightPressing( rcCell );
if( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN) != 0 )
rcHighlightPressing.DeflateRect( 0, 0, 1, 0 );
if( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW) != 0 )
rcHighlightPressing.DeflateRect( 0, 0, 0, 1 );
dc.FillSolidRect(
&rcHighlightPressing, // &rcCell
OnSiwGetSysColor( COLOR_3DDKSHADOW )
);
} // if( bHighlightPressing )
else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
dc.FillRect( &rcCell, &( OnSiwGetLighterOrDarkerBrush( 3 ) ) );
else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
dc.FillRect( &rcCell, &( OnSiwGetLighterOrDarkerBrush( 2 ) ) );
else if( bHoverByColumn || bHoverByRow )
dc.FillRect( &rcCell, &( OnSiwGetLighterOrDarkerBrush( 1 ) ) );
bool bGridLinesHorz = false, bGridLinesVert = false;
if( ! bHighlightPressing )
{
bGridLinesHorz =
OnGbwQueryCellGridLines(
true, dc,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo,
rcCellExtra, rcCell, rcVisibleRange, dwAreaFlags, dwHelperPaintFlags
);
bGridLinesVert =
OnGbwQueryCellGridLines(
false, dc,
nVisibleColNo, nVisibleRowNo, nColNo, nRowNo,
rcCellExtra, rcCell, rcVisibleRange, dwAreaFlags, dwHelperPaintFlags
);
} // if( ! bHighlightPressing )
if( bFocusedControl || NoHideSelectionGet() )
{
if( (!bHighlightPressing) && SelectionGetForCellPainting( nColNo, nRowNo ) )
{
COLORREF clrHighLight = OnSiwGetSysColor( bFocusedControl ? COLOR_HIGHLIGHT : COLOR_3DFACE );
dc.FillSolidRect( &rcCell, clrBack != COLORREF( -1L ) ? clrBack : clrHighLight );
} // if( (!bHighlightPressing) && SelectionGetForCellPainting( nColNo, nRowNo ) )
CPoint ptFocus = FocusGet();
DWORD dwBasicSelectionType = SiwGetStyle() & __EGBS_SFB_MASK;
if( dwBasicSelectionType != __EGBS_SFB_NONE
&& ( ptFocus.x == nColNo || ptFocus.y == nRowNo )
)
{
ASSERT(
dwBasicSelectionType == __EGBS_SFB_CELLS
|| dwBasicSelectionType == __EGBS_SFB_FULL_COLUMNS
|| dwBasicSelectionType == __EGBS_SFB_FULL_ROWS
);
DWORD dwScrollTypeH = SiwScrollTypeHGet();
DWORD dwScrollTypeV = SiwScrollTypeVGet();
LONG nColumnCount = ColumnCountGet();
LONG nRowCount = RowCountGet();
if( bFocusedControl )
{
if( (dwBasicSelectionType == __EGBS_SFB_CELLS
// || ( dwScrollTypeH == __ESIW_ST_VIRTUAL
// && dwScrollTypeV == __ESIW_ST_VIRTUAL
// )
)
&& ptFocus.x == nColNo
&& ptFocus.y == nRowNo
)
{
CRect rcCellFocus( rcCell );
rcCellFocus.DeflateRect( 0, 0, bGridLinesVert ? 1 : 0, bGridLinesHorz ? 1 : 0 );
OnSiwDrawFocusRect( dc, &rcCellFocus, (CObject*)this );
} // if( dwBasicSelectionType == __EGBS_SFB_CELLS ...
else if(
dwBasicSelectionType == __EGBS_SFB_FULL_COLUMNS
//&& dwScrollTypeH != __ESIW_ST_VIRTUAL
&& ptFocus.x == nColNo
)
{
LONG nRowFirst = 0, nRowLast = 0, nRowFirstOffset = 0;
OnGbwQueryVisibleRowRange( nRowFirst, nRowLast, nRowFirstOffset );
ASSERT( nRowFirst <= nRowLast );
CRect rcCellFocus( rcCell );
rcCellFocus.DeflateRect( 0, bGridLinesHorz ? -1 : 0, bGridLinesVert ? 1 : 0, 0 );
CRect rc( &rcCellFocus );
rc.right = rc.left;
if( ! bGridLinesHorz )
{
rc.bottom ++;
rc.top --;
}
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
rc = rcCellFocus;
rc.left = rc.right;
if( ! bGridLinesHorz )
{
rc.bottom ++;
rc.top --;
}
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
if( ( dwScrollTypeV != __ESIW_ST_VIRTUAL && nRowNo == 0 )
|| ( dwScrollTypeV == __ESIW_ST_VIRTUAL && nRowNo == nRowFirst )
)
{
rc = rcCellFocus;
rc.top ++;
rc.bottom = rc.top;
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
}
if( ( dwScrollTypeV != __ESIW_ST_VIRTUAL && nRowNo == (nRowCount-1) )
|| ( dwScrollTypeV == __ESIW_ST_VIRTUAL && nRowNo == nRowLast )
)
{
rc = rcCell;
rc.bottom --;
rc.top = rc.bottom;
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
}
} // else if( dwBasicSelectionType == __EGBS_SFB_FULL_COLUMNS ...
else if(
dwBasicSelectionType == __EGBS_SFB_FULL_ROWS
//&& dwScrollTypeV != __ESIW_ST_VIRTUAL
&& ptFocus.y == nRowNo
)
{
LONG nColFirst = 0, nColLast = 0, nColFirstOffset = 0;
OnGbwQueryVisibleColumnRange( nColFirst, nColLast, nColFirstOffset );
ASSERT( nColFirst <= nColLast );
CRect rcCellFocus( rcCell );
rcCellFocus.DeflateRect( bGridLinesVert ? -1 : 0, 0, 0, bGridLinesHorz ? 1 : 0 );
CRect rc( &rcCellFocus );
rc.bottom = rc.top;
if( !bGridLinesVert )
{
rc.right ++;
rc.left --;
}
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
rc = rcCellFocus;
rc.top = rc.bottom;
if( !bGridLinesVert )
{
rc.right ++;
rc.left --;
}
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
if( ( dwScrollTypeH != __ESIW_ST_VIRTUAL && nColNo == 0 )
|| ( dwScrollTypeH == __ESIW_ST_VIRTUAL && nColNo == nColFirst )
)
{
rc = rcCellFocus;
rc.left ++;
rc.right = rc.left;
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
}
if( ( dwScrollTypeH != __ESIW_ST_VIRTUAL && nColNo == (nColumnCount-1) )
|| ( dwScrollTypeH == __ESIW_ST_VIRTUAL && nColNo == nColLast )
)
{
rc = rcCell;
rc.right --;
rc.left = rc.right;
OnSiwDrawFocusRect( dc, &rc, (CObject*)this );
}
} // if( dwBasicSelectionType == __EGBS_SFB_FULL_ROWS ...
} // if( bFocusedControl )
} // if( dwBasicSelectionType != __EGBS_SFB_NONE ...
} // if( bFocusedControl || NoHideSelectionGet() )
if( bGridLinesHorz || bGridLinesVert )
{
COLORREF clrFace = OnGbwQueryGridLinesColor();
if( bGridLinesHorz )
{
dc.FillSolidRect( rcCell.left - 1, rcCell.top - 1, rcCell.right - rcCell.left + 1, 1, clrFace );
dc.FillSolidRect( rcCell.left - 1, rcCell.bottom - 1, rcCell.right - rcCell.left + 1, 1, clrFace );
} // if( bGridLinesHorz )
if( bGridLinesVert )
{
dc.FillSolidRect( rcCell.left - 1, rcCell.top, 1, rcCell.bottom - rcCell.top, clrFace );
dc.FillSolidRect( rcCell.right - 1, rcCell.top, 1, rcCell.bottom - rcCell.top, clrFace );
} // if( bGridLinesVert )
} // if( bGridLinesHorz || bGridLinesVert )
} // else from if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
}
|
|
tera tera
|
Dec 19, 2008 - 2:26 PM
|
|
|
Technical Support
|
Dec 26, 2008 - 2:15 PM
|
The skinned CExtScrollBar control behaved incorrectly in Prof-UIS 2.83 when the user clicked its page up scrolling area and line up button. This issue was fixed in 2.84. We are sorry. The above message should read as :
We have fixed the problem with page-up scrolling area in Prof-UIS 2.84. If not, then please let us know how to reproduce it step-by-step.
Anyway, we can upload the current snapshot, which is labeled as 2.85, to our ftp on your request.
|
|
tera tera
|
Dec 26, 2008 - 10:51 PM
|
Hello. >Anyway, we can upload the current snapshot, which is labeled as 2.85, to our ftp on your request. I want to obtain a revision.
When can I obtain it where?
|
|
Technical Support
|
Dec 29, 2008 - 2:12 PM
|
You can download the latest source code from our ftp server. We have just uploaded it.
|
|
Technical Support
|
Dec 24, 2008 - 7:58 AM
|
Pre-release versions can be requested via e-mail anytime you need some improvements, fixes or new features.
|
|
tera tera
|
Dec 25, 2008 - 5:08 PM
|
There is prof2.85 nowhere.
When is it uploaded?
|
|
Technical Support
|
Dec 22, 2008 - 3:08 PM
|
We have fixed the problem with page-up scrolling area in Prof-UIS 2.85. If not, then please let us know how to reproduce it step-by-step.
|
|
tera tera
|
Dec 22, 2008 - 3:23 PM
|
Where should I obtain 2.85?
There is not it in prof-uis-com either.
|
|