forcing repaint after CDC::TextOut function
-
Where is this code ? is in the OnPaint function of the dialog ?
Maximilien Lincourt Your Head A Splode - Strong Bad
No, it's not in the OnPaint function. I am drawing text on the screen at different parts of the program, after the user clicks certain buttons.
-
No, it's not in the OnPaint function. I am drawing text on the screen at different parts of the program, after the user clicks certain buttons.
Well, that's your problem. When the user clicks to trigger a draw, you need to modify some state data in your object. The OnPaint should then interpret what that data means, and provide an up-to-date set of paint operations. To trigger the repaint, invalidate your window. Steve S Developer for hire
-
No, it's not in the OnPaint function. I am drawing text on the screen at different parts of the program, after the user clicks certain buttons.
Like Chris said you need to move that to the OnPaint message. void CDialog::OnPaint(...) { if (m_bDisplayThankYou) { DrawThankYou(pDC); } }
-
Well, that's your problem. When the user clicks to trigger a draw, you need to modify some state data in your object. The OnPaint should then interpret what that data means, and provide an up-to-date set of paint operations. To trigger the repaint, invalidate your window. Steve S Developer for hire
I think I understand what you mean, but let me check. In the OnPaint() command of my dlg class, I need to have it check to see if, say a boolean value is true? If so, then do what? Also, what do you mean by... "To trigger the repaint, invalidate your window"
-
I think I understand what you mean, but let me check. In the OnPaint() command of my dlg class, I need to have it check to see if, say a boolean value is true? If so, then do what? Also, what do you mean by... "To trigger the repaint, invalidate your window"
why you dont use these function in wm_paint_**
**_
whitesky
-
why you dont use these function in wm_paint_**
**_
whitesky
what do you mean by this? I have tried... PostMessage(WMPAINT,0,0), but that didn't work either.
-
Where is this code ? is in the OnPaint function of the dialog ?
Maximilien Lincourt Your Head A Splode - Strong Bad
OK, Here is what I have tried now.... When the user clicks the button to trigger the drawing of text, I set a boolean value to true (RegKeyAvail). And I also implemented this... void CMartinPhDDlg::OnPaint() { CPaintDC dc(this); // device context for painting if(RegKeyAvail){ dc.SelectObject(&Welcome_font); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(COLORREF RGB(255,0,0)); dc.TextOut(30,30, "WELCOME"); Welcome_font.DeleteObject(); } if (IsIconic()) {.... However, now the text isn't showing up at all. I know that the OnPaint is being called because I have set breakpoints in there and the functions walks through the dc.TextOut call, but does nothing......
-
OK, Here is what I have tried now.... When the user clicks the button to trigger the drawing of text, I set a boolean value to true (RegKeyAvail). And I also implemented this... void CMartinPhDDlg::OnPaint() { CPaintDC dc(this); // device context for painting if(RegKeyAvail){ dc.SelectObject(&Welcome_font); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(COLORREF RGB(255,0,0)); dc.TextOut(30,30, "WELCOME"); Welcome_font.DeleteObject(); } if (IsIconic()) {.... However, now the text isn't showing up at all. I know that the OnPaint is being called because I have set breakpoints in there and the functions walks through the dc.TextOut call, but does nothing......
goodoljosh1980 wrote:
dc.SetTextColor(COLORREF RGB(255,0,0));
that compiles? and, where do you create Welcome_font ? Do the chickens have large talons?
-
goodoljosh1980 wrote:
dc.SetTextColor(COLORREF RGB(255,0,0));
that compiles? and, where do you create Welcome_font ? Do the chickens have large talons?
Yeah, it compiles... That is how I set the color of the text I want. The Welcome_font is a member variable of the main dialog and is created in the BOOL CMartinPhDDlg::OnInitDialog() { CDialog::OnInitDialog(); GetWindowRect(m_rect); //Hide all diagrams to begin with top_diagram.ShowWindow(0); Intro_Stylus_Diagram.ShowWindow(0); Welcome_font.CreateFont(90, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DECORATIVE, "Times New Roman");
-
Yeah, it compiles... That is how I set the color of the text I want. The Welcome_font is a member variable of the main dialog and is created in the BOOL CMartinPhDDlg::OnInitDialog() { CDialog::OnInitDialog(); GetWindowRect(m_rect); //Hide all diagrams to begin with top_diagram.ShowWindow(0); Intro_Stylus_Diagram.ShowWindow(0); Welcome_font.CreateFont(90, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DECORATIVE, "Times New Roman");
are you calling Invalidate() UpdateWindow() after you set the boolean? By the way, don't delete the font object in the OnPaint method if it is not being recreated there. You are creating the font object once in your OnInitDialog but then deleting it everytime OnPaint runs.
-
are you calling Invalidate() UpdateWindow() after you set the boolean? By the way, don't delete the font object in the OnPaint method if it is not being recreated there. You are creating the font object once in your OnInitDialog but then deleting it everytime OnPaint runs.
I was calling Invalidate() in the OnPaint... Once I moved it...the text showed up and it doesn't get erased!!! THANKS TO EVERYONE!
-
I was calling Invalidate() in the OnPaint... Once I moved it...the text showed up and it doesn't get erased!!! THANKS TO EVERYONE!
-
That's because OnPaint is eventually called as a result of Invalidate(). By putting an invalidate in there, you said "I've drawn (it's valid)", swiftly followed by "it's invalid again". :) Steve S Developer for hire
If that were true, couldn't I just put an Invalidate() in the program when I wanted it to repaint itself? That is, I call my TextOut functions...then tell it to Invalidate() (which eventually calls OnPaint())????
-
are you calling Invalidate() UpdateWindow() after you set the boolean? By the way, don't delete the font object in the OnPaint method if it is not being recreated there. You are creating the font object once in your OnInitDialog but then deleting it everytime OnPaint runs.
Thank you for the help. I do have an additional question, now though. I have a number of screens (100s of them) that I am going to be drawing line by line. Instead of having my OnPaint with all those boolean checks, can I call a function with CPaintDC as a member to draw them "outside" of the OnPaint()? Thanks again. Josh
-
what do you mean by this? I have tried... PostMessage(WMPAINT,0,0), but that didn't work either.
-
Thank you for the help. I do have an additional question, now though. I have a number of screens (100s of them) that I am going to be drawing line by line. Instead of having my OnPaint with all those boolean checks, can I call a function with CPaintDC as a member to draw them "outside" of the OnPaint()? Thanks again. Josh
Yes you can. Pass the dc as a parameter to the method. AliR. Visual C++ MVP
-
OK, Here is what I have tried now.... When the user clicks the button to trigger the drawing of text, I set a boolean value to true (RegKeyAvail). And I also implemented this... void CMartinPhDDlg::OnPaint() { CPaintDC dc(this); // device context for painting if(RegKeyAvail){ dc.SelectObject(&Welcome_font); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(COLORREF RGB(255,0,0)); dc.TextOut(30,30, "WELCOME"); Welcome_font.DeleteObject(); } if (IsIconic()) {.... However, now the text isn't showing up at all. I know that the OnPaint is being called because I have set breakpoints in there and the functions walks through the dc.TextOut call, but does nothing......
goodoljosh1980 wrote:
if(RegKeyAvail){
This check is actually not necessary. Much like the view renders whatever the document has in it, the
OnPaint()
handler should draw whatever value is in a member variable. If that value starts out as blank, so be it.void CMartinPhDDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.SelectObject(&Welcome_font);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(COLORREF RGB(255,0,0));
dc.TextOut(30,30, m_strText); // m_strText is set in various other methods// don't call DeleteObject() on a font that is currently selected into a DC Welcome\_font.DeleteObject();
}
"Money talks. When my money starts to talk, I get a bill to shut it up." - Frank
"Judge not by the eye but by the heart." - Native American Proverb
-
If that were true, couldn't I just put an Invalidate() in the program when I wanted it to repaint itself? That is, I call my TextOut functions...then tell it to Invalidate() (which eventually calls OnPaint())????
Invalidate is a function that cause the window to redraw itself. But all it does is call the OnPaint method, which didn't know anything about your drawings on the dc. Everytime OnPaint gets called, it gets a clean dc to draw on, OnEraseBkgnd makes sure of that, and your TextOut stuff would be gone with it. That's why everyone told you that your text drawing need to be called from within the OnPaint method. AliR. Visual C++ MVP
-
what do you mean by this? I have tried... PostMessage(WMPAINT,0,0), but that didn't work either.
No You can declare WM_PAINT in your program and insert your functions to it(use form dc)_**
**_
whitesky