Re: Hide dialog at first
On 13 Nov., 16:40, Joseph M. Newcomer <newco...@flounder.com> wrote:
See below...
On Sat, 13 Nov 2010 04:40:54 -0800 (PST), mfc <mfcp...@googlemail.com> wr=
ote:
On 13 Nov., 01:35, Joseph M. Newcomer <newco...@flounder.com> wrote:
See my essay on dialog-based apps. Nish gracefully allowed me to inclu=
de his code on my
site, and he has a solution to this.
joe
On Fri, 12 Nov 2010 14:20:51 -0800 (PST), mfc <mfcp...@googlemail.com>=
wrote:
Hi,
how is it possible to hide a dialog at the beginning? I want to
acchieve that all controls are created in the OnInitDialog() method a=
s
well as painted in the OnPaint() method.
****
I don't understand any of this. You've just said, "I want Windows to w=
ork exactly as it
is designed to work" and I fail to see why this is a challenge.
*****
If the whole dialog is ready, I want to enable / show the dialog so
that all images are loaded and no flickering will be available. The
problem is that after the OnInitdialog method, Showwindow(SHOW) will
be always called.
****
This is a different question. Since you have not explained that there =
IS flickering, or
what is flickering, or anything else usable in helping suggest a solut=
ion, it is not
possible to suggest an answer.
You`re right, because if ShowWindow(SW_HIDE) is used the dialog won`t
be painted in the background. I have to load some pictures (png`s)
using GDI+ (I`ve also tried CImage) by a stream. All pictures are
available as a resource in the project and it seems to me that the
alogrithm to load this stream takes some time (http://
www.codeproject.com/KB/graphics/gditutorial.aspx).
****
I think you are confusing LOADING the image with DISPLAYING the image.
You can LOAD the image during OnInitDialog, and if you store it as a bitm=
ap, the display
of the image should take zero time. But if the loading is taking too l=
ong, then you can
defer it. HOW you defer it matters. For example, if you simply dela=
y loading the images,
you STILL block the message pump and the user STILL can't use the dialog =
because the user
interactions will be ignored while the images are loading. So this doe=
sn't solve the
delay problem very well. But if the goal is to get the dialog up and v=
isible in a hurry,
and then let the user watch the images appear, this is a psychological tr=
ick on the user,
and there should be no problem. What I would do here is that every ima=
ge would be loaded
by the program having done a PostMessage of a user-defined message to loa=
d the image.
Then, once you return from OnInitDialog, the dialog will be displayed. =
The OnPaint
handler needs to take care of the fact that if there is no image loaded, =
it should display
whitespace, otherwise it should display the image.
here are some steps to load the png image from the resource...
HRSRC hResource = ::FindResource(hInst, pName, pType);
DWORD imageSize = ::SizeofResource(hInst, hResource);
const void* pResourceData = ::LockResource(::LoadResource(hInst,
hResource));
m_hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
The area where the image should be displayed in the dialog is at first
white and after some time (maybe one second) the picture will be
displayed. If I try to use a bitmap (located as resource) LoadBitmap()
the time where the white background is shown is much shorter, but
still not good.
class CPictureCtrl :
public CStatic
{
protected:
CImageList m_ImageList;
CImage image;
BITMAP m_bitmap;
};
void CPictureCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
CRect m_rectBtn = lpDrawItemStruct->rcItem;
m_ImageList.DrawIndirect(pDC ,
0 ,
CPoint( m_rectBtn.le=
ft,m_rectBtn.top ),
idth) , (m_bitmap.bmHeight)),
CPoint( 0 , 0 ) ,
ILD_NORMAL);
}
****
This code assumes the imagelist is valid the first time the paint happens=
.. Is this really
true? If it isn't, what do you see happening?
****
BOOL CPictureCtrl::LoadImage(UINT id, LPCTSTR pType)
{
CBitmap bitmap;
if(!bitmap.LoadBitmap(IDB_BMP_TOPBORDER_SMALL))
return FALSE;
bitmap.GetObject( sizeof( m_bitmap ) , &m_bitmap );
if( m_ImageList.Create( m_bitmap.bmWidth , m_bitmap.bmHeight ,
ILC_COLORDDB, 1 , 2 ) )
{
m_ImageList.Add(&bitmap, &bitmap);
}
return TRUE;
}
****
I don't see anything wrong with this code at first glance, although you h=
ave failed to
indicate where it is called.
****
The LoadImage() method is called in the OnInitDialog() method of each
dialog.
If I jump from one dialog to another dialog I show the new dialog at
first and after that I hide the previous dialog; after that the new
dialog with all his images is painted (and it seems to me that this
steps takes some time, and because each dialog has the the same image-
structure (the images are equal in the size and their position) you
will see a flickering between the previous image and the new one...
pPage->ShowWindow(SW_SHOW);
pPage->EnableWindow(TRUE);
pPage2->ShowWindow(SW_HIDE);
pPage2->m_bActive = FALSE;
best regards
Hans