|
Andre Massada wrote:
I use the celebre memDC to avoid flickering
Are you refering to http://www.codeproject.com/gdi/flickerfree.asp[^] or did you roll your own?
I wrote a tool a while ago that works great for figuring out what is going on with memory DCs and bitmaps. Check it out at http://www.codeproject.com/tools/imageviewer.asp[^]
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
http://www.codeproject.com/gdi/flickerfree.asp[^] - that's the one
|
|
|
|
|
I've tried it, but it tells me that ShowDC(memDC) is not defined, even if
i added the macro definition and the include line.
My OnPaint() looks like below. Is there anything worng with it ?
void CDecDlg::OnPaint()
{
if (IsIconic())
{
//CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CPaintDC dc(this);
CRect rcClient;
GetClientRect(rcClient);
dc.SetMapMode(MM_HIENGLISH);
CMemDC pDC(&dc);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<wparam>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
pDC.DrawIcon(x, y, m_hIcon);
}
else
{
CTrayDialog::OnPaint();
}
//MovieWindowed.Repaint();
}
... well ?
|
|
|
|
|
Andre Massada wrote:
I've tried it, but it tells me that ShowDC(memDC) is not defined, even if
i added the macro definition and the include line.
Are you including it in the *.cpp file that you called ShowDC() from? There is no reason that I can think of the ShowDC() would not be defined.
I use it all the time with absolutely no problems.
Andre Massada wrote:
... well ?
Other than the fact that it does absolutely nothing but call CTrayIcon::OnPaint()?
Put a breakpoint somewhere in your code and try to trace it. You will find it is never called.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
I know .. it makes no sens for either why it says that is not defined from what i've looked.
You seem to know your way around these drawing things. Do you know some articles or something usefull about what should i do in "OnPaint " (i mean i have absolutely no clue on what should i write there). Any tip will be usefull. Thanks alot in advance.
|
|
|
|
|
Maybe PJ Arends could give us a hint ?
|
|
|
|
|
To avoid flickering, you have to set the return value of OnEraseBkgnd to FALSE: this will avoid your dialog to be erased by the MFC framework, which causes the flickering.
But once you return FALSE on OnEraseBkgnd, then you have to draw yourself the background of your dialog box when painting it.
Typically the OnPaint method wil begin like this (in the general case):
void CMyWnd::OnPaint()
{
CPaintDC dc(this);
CRect clipRect;
if(dc.GetClipBox(&clipRect) == NULLREGION)
return;
CMemDC pDC(&dc, clipRect);
pDC->FillSolidRect(clipRect, ::GetSysColor(COLOR_ACTIVEBORDER));
...
}
Note: you should never call directly the base class method during OnPaint: the way to do it is to use the function DefWindowProc
DefWindowProc(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), 0);
Собой остаться дольше...
|
|
|
|
|
Thanks ... so that's what i have to do. That i understud. What i did not get is 2 things:
1. I don't need to init the clipRect with a GetClientRect(clipRect) ?
2. Should i use DefWindowProc(WM_PAINT, (WPARAM) pDC->GetSafeHdc(), 0) in a MFC application ? I've tested and saw that it needs no declaration, but where do i write the actual code for it?(the help for this is like 1/2page)
(BTW ... with your code on OnPaint and the return value of OnEraseBkgnd set to FALSE the flickering still persists)
Please let me know if you have ANY ideea.
|
|
|
|
|
1- The method CDC::GetClipBox will give you the rectangle to draw. The clipping region will be equal to the client area if everything needs to be redrawn.
2- I use DefWindowProc in some MFC code, like in a class derived from CListCtrl. You will also find this function in the sources of the MFC library. DefWindowProc is part of the Win32 API,and enables to call the default processing for the message.
Andre Massada wrote:
the flickering still persists
If the flickering still occurs, it could mean that something else is drawing on your dialog box. Another question is, what is flickering, is it the dialog box itself or the controls embedded in the dialog box?
Собой остаться дольше...
|
|
|
|
|
KaЯl wrote:
what is flickering, is it the dialog box itself or the controls embedded in the dialog box?
No, it's not the dialog box that flickers, some of the contrlols(picture control, some text controls). Do i have to control the flickering for each of them ? (the weird part is that if i do nothing on my OnPaint and return FALSE on OnEraseBkgnd, the background does not refreshes, but ALL the flickering is gone and the controls are OK)
|
|
|
|
|
So, you were right, the problem isn't that simple! The problem comes from the controls embedded in the dialog box, and how to redraw them, knowing than some like the static controls don't draw the background by themselves.
If we want to do the painting of the dialog box through the CmyDialog::OnPaint method, then we have to paint everything by ourselves (forget what I said about DefWindowProc, I was wrong, the MFC architecture doesn't use the WPARAM of the WM_PAINT message, it won't use the DC we are providing so we can't use the base class), the dialog box and its child windows. Sadly, I didn't found yet an easy solution to indicate to the child windows how to use the MemDC we build
Собой остаться дольше...
|
|
|
|
|
I'm using Visual C++.net 2002. I'm using CIni in an MFC from this site. http://www.codeproject.com/cpp/CIni.asp#xx909443xx. The problem I'm having is I Can declare the CStringArray in the function. Pass it to GetKeyNames. I'm unable to access any of the elements in the Array. Don't know If I'm declaring the array correct or not. I've tried to declare the CStringArray variable using the variable wizard. This allows me to access the elements but I'm unable to pass the array to GetKeyNames. Sort of new with C++ MFC. Any help would be great. This is the code so far. What I'm tring to do is get a list of the Keys in a section and display them in a Edit Control. Tried to get an anwser from the site forum but no response. Any help would be great.
void CRunProgramDlg::OnBnClickedOk()<br />
{<br />
<br />
<br />
<br />
<br />
<br />
LPTSTR Current = NULL;<br />
DWORD dwBuffer = 100;<br />
CString ArrayString;<br />
<br />
m_FindKey.SetSize(32,0);<br />
<br />
CStringArray ProfileSearch[1];<br />
<br />
CIni ini;<br />
ini.SetPathName("C:\\amrtemp\\file2.ini");<br />
ini.GetKeyNames("Routing Indicator",Current,dwBuffer);<br />
<br />
ini.GetKeyNames("Routing Indicator",m_FindKey);<br />
<br />
ini.GetKeyNames("Routing Indicator",ProfileSearch);<br />
<br />
<br />
<br />
<br />
<br />
ArrayString = m_FindKey.GetAt(1);<br />
<br />
ArrayString = ProfileSearch[1];<br />
<br />
m_strBrowse = ini.GetString("Routing Indicator", ArrayString,"Dev");<br />
<br />
<br />
<br />
UpdateData(FALSE);<br />
I'm at a loss I don't think I'm declaring the variables correctly.
|
|
|
|
|
nigma_x wrote:
Tried to get an anwser from the site forum but no response.
Patience young grasshopper.
You posted on friday afternoon. The author is probably away for the weekend.
nigma_x wrote:
//CStringArray declared in the function set array to 1
CStringArray ProfileSearch[1];
//When using this CStringArray in ProfileSearch I don't recieve an error here
ini.GetKeyNames("Routing Indicator",ProfileSearch);
ProfileSearch is a pointer to an array of one CStringArray objects.
nigma_x wrote:
//When using this CStringArray in GetKeyNames recieve error
// error C2664: 'void CIni::GetKeyNames(LPCTSTR,CStringArray *)
// const' : cannot convert parameter 2 from 'CStringArray' to 'CStringArray *
ini.GetKeyNames("Routing Indicator",m_FindKey);
You need to pass a pointer. try
ini.GetKeyNames("Routing Indicator", <font color=#ff0000>&</font>m_FindKey);
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
|
Can anyone give me some tips about saving some variables in registry and retrieve them afterwards ?
|
|
|
|
|
http://www.codeproject.com/system/#Registry[^]
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
|
hi i am trying to draw a number in a rectangle however the rectagle is fairly small and i want the text to fit how do i shrink the font size so its not larger than the rectangle?
dc.Draw3dRect(rc, yellow, yellow);
dc.SetTextColor(black);
dc.DrawText(str, rc, DT_SINGLELINE|DT_LEFT);
|
|
|
|
|
You need to create Font instance in your class's header file and then create the font using its CreateFont(...) function. Then in your wm_paint event handler, you type something along the lines of:
dc.SelectObject(&m_font);
Good luck on your projects.
Happy Programming and may God Bless!
"Your coding practices might be buggy, but your code is always right."
Internet::WWW::CodeProject::bneacetp
N-Tech Productions
http://www.n-tp.com/
|
|
|
|
|
You have to create a new font and select into the device context before calling Drawtext . CreatePointFont is the easiest (although limited) way to create the font.
dc.Draw3dRect(rc, yellow, yellow);
dc.SetTextColor(black);
int points = rc.Height() * 10;
CFont newFont;
newFont.CreatePointFont(points, "Arial", &dc);
CFont *defFont = dc.SelectObject(&newFont);
dc.DrawText(str, rc, DT_SINGLELINE | DT_LEFT);
dc.SelectObject(defFont);
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
I am attempting to add processes into view class in document / view setup by creating multiple inheritance into the view class. ( I need to process each view from common menu.) I followed the sample in MSDN "TN016: Using C++ Multiple Inheritance with MFC" but it will not compile.
I am getting "... : error C2660: 'new' : function does not take 3 parameters" at IMPLEMENT_DYNCREATE(CCCImageView, CScrollView).
The difference between MSDN sample and mine code is the macro IMPLEMENT_DYNACREATE used in the "primary" base class.
MSDN uses IMPLEMENT_DYNAMIC.
My next step is to see how these macros differ.I have not done that yet.
Any suggestion how to debug this?
How can I step thru the macro?
Appreciate any help.
Vaclav
|
|
|
|
|
Sounds like the difference between new and DEBUG_NEW . The debug version of new takes three parameters. I am sure it has to do with the standard code:
#ifdef _DEBUG
#define new DEBUG_NEW
etc that is placed at the top of every cpp file.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
Thanks, you are correct.
I guess the real question is why did it showed up when I added multiple inheritance to the class. Time to check the macro itself.
Vaclav
|
|
|
|
|
|
Yes, it does say that, but only if the additional class has same base class.
I am just adding my own abstract class to add new precedures to the view class. I am actually trying to find an easy way to determine an active view so I can modify it. So far I found several ways to do that, but all of them require the actuall view class (cast) to work properly. The "normal" MFC code always returns CView class pointer which is pretty useless in my case.
It seem this note writer missed some important "details".
Thanks for you help.
Vaclav
|
|
|
|