|
Khathar wrote: is it possible? if yes please let me know..
Yes it's possible.
have a look at MFC Grid control 2.26[^].
Watched code never compiles.
|
|
|
|
|
|
Hello,
i try to write large text in to CComboBox field, but the max text length is limited by the CComboBox width !!!
But i need to imput larger text as the width of the combo box, when i write my text, the cursor moves to the right!!??
If i read large string from a file, this can be showed in the combo box, only if i try to write them by my self its limited!?
Can any one help me how to solve this??
Thanx for any help!
Arrin
|
|
|
|
|
Sorry
i solve this, its simple setting on the properties CBS_AUTOHSCROLL
Arrin
|
|
|
|
|
Hi All
I am useing worker thread in Dialog base Application.In Dialog I have a Static Control and Button.I try to set some values in Static Control.I have got some GUI Error application and CtlColor color change auto.As well as Control move from fixed position.I am doing like this
CWinThread *Testing;
UINT InsertThread ( LPVOID p );
UINT InsertThread ( LPVOID p )
{
CTestDlg *Get=( CTestDlg *)p;
Get->Example();
return 0;
}
void CTestDlg::OnBnClickedButton4()
{
Test = AfxBeginThread(InsertThread, (LPVOID) this,THREAD_PRIORITY_NORMAL,0,0);
}
void CTestDlg:: Example()
{
int count=0;
For(int i=0;i<10000;i++)
{
Count++;
CString show="";
show.Format("%d",count);
m_showvalues.SetWindowText(show);
}
}
I also use
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) and OnEraseBkgnd(CDC* pDC) for change background color(Dialog and CtlColor).
How can i solve GUI Problem?
Please help me.
|
|
|
|
|
MsmVc wrote: How can i solve GUI Problem?
Never never access GUI elements in another thread than the GUI thread. This is a recipe for disaster. One way to solve your problem is instead to access the static control directly in your thread, you simply send a user defined message to your dialog. In the handler of this message, you update your control. This way, this is the UI thread that still accesses the control. More info and examples here[^]
|
|
|
|
|
MsmVc wrote: How can i solve GUI Problem?
You could pass the HDC and the client rectangle of the static control at your thread
to draw (only) there from the thread directly...
virtual void BeHappy() = 0;
|
|
|
|
|
can you give me some example?
|
|
|
|
|
If you would have taken the time to look at the article I linked to, you could see that there's an example in the section "Worker threads and the GUI II: Don't touch the GUI".
It's been a while that you are posting questions about threads and you still miss some basic concepts. Don't you think it could be interesting for you to read some good article (like the one I linked to you) about the subject ? Otherwise, you'll come asking questions here again and again and never really learn how to do it the proper way.
|
|
|
|
|
Try it :
class CCtrlDrawContext
{
CClientDC* m_pcCtrlDC;
CRect m_cCtrlRect;
public:
CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect);
~CCtrlDrawContext();
const CRect& GetRect() { return m_cCtrlRect; };
CDC* GetDC() { return m_pcCtrlDC; };
};
CCtrlDrawContext::CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect)
: m_pcCtrlDC(pcDC), m_cCtrlRect(cRect)
{
}
CCtrlDrawContext::~CCtrlDrawContext()
{
delete m_pcCtrlDC;
m_pcCtrlDC = NULL;
}
...
void CYourDialog::OnButtonClick()
{
CRect cStaticRect;
m_cwndStatic.GetClientRect(cStaticRect);
AfxBeginThread((AFX_THREADPROC) ThreadLoop,
new CCtrlDrawContext(new CClientDC(&m_cwndStatic),
cStaticRect));
}
UINT CYourDialog::ThreadLoop(LPVOID lpParam)
{
if (lpParam) {
CCtrlDrawContext* pcContext = (CCtrlDrawContext*) lpParam;
for (int i = 0; i < 10; ++) {
pcContext->GetDC()->FillSolidRect(pcContext->GetRect(),
i % 2 ?
RGB(0, 200, 128) :
RGB(0, 255, 0));
::GdiFlush();
::Sleep(500);
}
delete pcContext;
pcContext = NULL;
}
}
virtual void BeHappy() = 0;
modified on Friday, April 16, 2010 6:22 AM
|
|
|
|
|
An improvement: place ::GdiFlush();
after the drawing step in your loop
virtual void BeHappy() = 0;
|
|
|
|
|
As I said in my previous reply, never touch a UI control in outside of its own thread. This will result in a disaster.
|
|
|
|
|
I am not sure
that I understand your word "touch" -
see the code above - it is working
virtual void BeHappy() = 0;
|
|
|
|
|
By touch I mean manipulating any UI related element.
Eugen Podsypalnikov wrote: it is working
Did you test it ? If it works, you are lucky. But it is any way an extremly bad practice. I suggest you read the section "Worker threads and the GUI II: Don't touch the GUI" in the article I mentioned earlier to have a bit more information.
|
|
|
|
|
Cedric Moonen wrote: Did you test it ?
Not only me...
(The technique of the backgound updating is really wide-used today,
for example, when a main thread has other things to do... )
virtual void BeHappy() = 0;
|
|
|
|
|
IMHO he didn't really touch the GUI, i.e. there are no notifications to controls in his code.
Uhm...After second sight, I think there are...(but I suppose you may remove them).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks for example....
I want to know about this line.
CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect);
Can i pass these two parameter manual?i cann't understand example which is given by you?Please explain more details.
|
|
|
|
|
MsmVc wrote: Can i pass these two parameter manual?
Yes, for example,
as it shown in the function void CYourDialog::OnButtonClick()
virtual void BeHappy() = 0;
|
|
|
|
|
Sorry i am not geting what you want to tell me.
I think this part is header file.
class CCtrlDrawContext
{
CClientDC* m_pcCtrlDC;
CRect m_cCtrlRect;
public:
CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect);
~CCtrlDrawContext();
cons CRect& GetRect() { return cRect; };
CDC* GetDC() { return m_pcCtrlDC; };
};
Now my code is
class CTestDlg : public CDialog
{
public:
CTestDlg(CWnd* pParent = NULL);
How can i pass this parameter
CClientDC* pcDC, const CRect& cRect
Please help me
|
|
|
|
|
For example :
void CYourDialog::OnButton4Click()
{
CRect cStaticRect;
m_cwndStatic.GetClientRect(cStaticRect);
AfxBeginThread((AFX_THREADPROC) ThreadLoop,
new CCtrlDrawContext(new CClientDC(&m_cwndStatic),
cStaticRect));
}
virtual void BeHappy() = 0;
|
|
|
|
|
i add your code but error show here
parnew CCtrlDrawContext(new CClientDC(&m_cwndStatic), cStaticRect));
Error
error C2661: 'CTestDlg::CTestDlg' : no overloaded function takes 2 arguments
|
|
|
|
|
Please see your starting post -
you have to modify your void CTestDlg::OnBnClickedButton4()
(the Context class could be placed in the same *.cpp file,
but above the CTestDlg implementation)
virtual void BeHappy() = 0;
|
|
|
|
|
Now i place code in .cpp file and all code give by you.Still i am getting error.
error C2039: 'GetRect' : is not a member of 'CTestDlg
|
|
|
|
|
Try the following :
0. Repair the state of your project (see your starting post)
1. Place the new context class at the top of your cpp, after the include block
2. Modify your OnClick function
3. Modify your ThreadLoop function
virtual void BeHappy() = 0;
|
|
|
|
|
Sorry it's not working for me.
But i want to say once again Thanks for Discussion.
|
|
|
|