Re: Hide dialog at first
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> wr=
ote:
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 as
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 solution=
, 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).
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.left,m_rectBtn.top ),
CSize( (m_bitmap.bmWidth) , (m_bitmap.bmHeight)),
CPoint( 0 , 0 ) ,
ILD_NORMAL);
}
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;
}
In my later version I will have some more pictures loaded, therefore I
already use a imagelist.
best regards
Hans