|
Hi I'm planning a project where i'll use the MDI framework to describe a
factory floor/procudtion line. All the data from the Procudtion will be
recieved via UDP. I want my Document to contain all the data about the
production etc.
Now to my question: what would be the "correct" way to implement this
functionallity into the Doc/View arcitecture.
Give the Document a Thread that will pull data from the UDP,
store it and the notify the views.
or is there another way to gather data from the UDP that is better?
|
|
|
|
|
tom.schultz wrote:
Give the Document a Thread that will pull data from the UDP,
store it and the notify the views.
Sounds reasonable to me. Just beware if you haven't done any multi-threading before it can get pretty tricky, even more so with MFC.
Neville Franks, Author of ED for Windows www.getsoft.com and Surfulater www.surfulater.com "Save what you Surf"
|
|
|
|
|
I was reading up a bit on MSDN and they did not recommend using multi-threading and document view together.
But what do they know
I found a small test/case on the net. Documents and Timers, where they use a CWnd derviced class in the
document to recieve the timer event. That would also be a way to do this. That is: creating a class to
handle the rec/send events and just relay any data to the document.
BTW: Thanks for the input. I was a bit uncertain about my approach cause all info i found was based on
the fact that the view should be the only one to change the documents data. Not the document itself
Regards
Tom.Schultz
|
|
|
|
|
tom.schultz wrote:
I found a small test/case on the net. Documents and Timers, where they use a CWnd derviced class in the
document to recieve the timer event. That would also be a way to do this. That is: creating a class to
handle the rec/send events and just relay any data to the document.
I don't like the sound of that, in particular using CWnds with CDocument.
I use multi-threading quite heavilly in ED (see sig). In the Document I use a thread to read the file so the user can start viewing or editing large files straight away, without having to wait for the entire file to load. I also use threads for operations like find and find and replace which work at the document level.
Simply put it comes down too synchronization, and ensuring there aren't deadlocks. There are plenty of articles about this stuff around.
Surfulater (see sig) also uses threads in the Document to access its database.
Good luck.
Neville Franks, Author of ED for Windows www.getsoft.com and Surfulater www.surfulater.com "Save what you Surf"
|
|
|
|
|
Thank you. I'll have a look at those two programs and try to find more information before i proceede...
|
|
|
|
|
Can anyone let me know if the File, New(to create MDI Child windows) option in an MDI Application be disabled and the same functionality can be provided in a button click or some other event through code.
Thanx in advance
laiju
|
|
|
|
|
I have a tree ctrl with nodes having icons of different colours..
I have to set the background colour of text of each node with the same colour of the icon of that node. Pls help me to do this...
thnks in advance...
|
|
|
|
|
1. Derive your own class from CTreeCtrl
2. In CYourTreeCtrl::OnPaint()
- CPaintDC dc(this)
- create a compatible dc
- create a compatible bitmap and select it into the dc
- set clip region to be same as that in paint DC
- let the control do its default drawing by calling
CWnd::DefWindowProc( WM_PAINT, (WPARAM)yourMemDC.m_hDC, 0 )
- go through all the items in the tree and do what ever you need
(SetTextColor(), SetBkColor(), TextOut() in yourMemDC)
- at the end, BitBlt yourMemDC to the dc
- do not forget to free the resources )
SkyWalker
|
|
|
|
|
Hello everybody,
I have a problem with my last application.
I need to make a call to an external command line sw to elaborate a file and then process the same elaborated file.
I use this code:
exec_line.Format("app.exe %s %s", path_input, path_output);
UINT xxx = WinExec(exec_line, SW_HIDE);
if(fp = fopen(path_output,"rb"))
When I debug the app step by step everything works properly, but while executing in
runtime I get the error "...the memory could not be read..."
I thought the problem was that the fopen tries to access the file before it is "available"
on disk, so I used some patches like:
exec_line.Format("app.exe %s %s", path_input, path_output);
UINT xxx = WinExec(exec_line, SW_HIDE);
Sleep(200);
if(fp = fopen(path_output,"rb"))
or:
exec_line.Format("app.exe %s %s", path_input, path_output);
UINT xxx = WinExec(exec_line, SW_HIDE);
MessageBox("Dummy");
if(fp = fopen(path_output,"rb"))
but these are not clean solutions and do not work on all machines.
Do you know a method to solve this problem: I mean someway to "freeze" my aplication
until the command line has finished its tasks.
Thanks,
Marco.
|
|
|
|
|
My be my part of code can help you:
char * exec_line = "\"D:\\Programs\\Proba4\\Debug\\proba.exe\"";
STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = {0};
BOOL bSuccess;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
bSuccess = CreateProcess ( NULL, exec_line,
NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi );
WaitForSingleObject(pi.hProcess, 5000);
CloseHandle ( pi.hThread );
CloseHandle ( pi.hProcess );
|
|
|
|
|
Hello C++ ers,
Could anybody show me what should i refer/read before making an application
like adobe acrobat ? I think i will make a simple one.
It can be used to preview our print output (of course, multiple pages are also supported)
and we can also edit the text inside it (whatever text or image or any object).
Where can I start from ?
Regards,
Henky
12345
|
|
|
|
|
Why not have the "new" operator return a typed handle when you get memory on the heap (if you want it to)? And then use a "lock" operator to get a pointer to the memory, and the pointer is only valid within the scope of the function. Then on idle time, all memory is unlocked and can be compacted.
I wonder if there is a way of doing this by overiding the global new and delete operators and somehow checking for handle types?
In any case I think it would be better if the compiler was in on the action.
For instance you could declare a handle:
char* # hString;
hString = new char[80];
char* pString = lock hString;
strcpy( pString, "A String");
int len = strlen( pString );
And when you want to free the memory:
delete [] hString;
And when calling a member function:
CThisObject* # hThis = new CThisObject( data );
if( hThis )
hThis->DoThat();
is the same as:
CThisObject* # hThis = new CThisObject( data );
if( hThis )
{
CThisObject* p = lock hThis;
p->DoThat();
}
In any case, I'm sure die-hard C++ programmers would prefer managed memory along these lines instead of all the crap you have to deal with in .NET managed C++.
|
|
|
|
|
I am using visual studio .net and want to save a BMP file to JPG format. How to do this? Is there a sample code for reference?
Thanks.
|
|
|
|
|
if it's really just the file you'd like to convert manually (not code) just do it in Paint, but I'm not sure you can load jpg into the resources.
No hurries, no worries.
|
|
|
|
|
Sorry, I didn't express myself clearly, but I need to convert BMP to JPG in run time(within program). Is there any sample code in Visual studio?
Thanks a lot!
|
|
|
|
|
Hi,
use the intel jpeg library (ijl15.dll)
SkyWalker
|
|
|
|
|
MFC/Windows does not have this capability built-in.
you'll need to use a library like GDI+, CIXImage (available here on CP), ImgSource (my favorite ), or any of the other dozens of libraries out there.
Image Toolkits | Image Processing | Cleek
|
|
|
|
|
What is the main advantage of Virtual destructor?
Why don't we have virtual constructor when virtual destructor's are present?
Please help regarding this 2 questions.
Thanking you,
Neelesh K J Jain.
|
|
|
|
|
|
Neelesh K J Jain wrote:
What is the main advantage of Virtual destructor?
Imagine you have one base class (CBase) and one derived class (CChild that inherits from CBase). Now look at this piece of code:
CBase* pPtr = new CChild;<br />
....<br />
...<br />
delete pPtr;
Now, what would happens if the destructor wasn't virtual ? The only destructor that will be called is the destructor of the base class (pPtr is a pointer of type CBase*) and so your object may be not completelly cleaned. So, if you make your destructor virtual, the destructor of CChild will be called.
Neelesh K J Jain wrote:
Why don't we have virtual constructor when virtual destructor's are present?
Because when you create an instance of an object (like in the piece of code before), you know exactly which kind of class (CChild or CBase) you want to create. In fact this line: CBase* pPtr = new CChild can be explained as: first create an object of type CChild (the compiler knows exactly that he will need to call the constructor of CChild) and then store this pointer in pPtr.
So, here, no need for virtual constructors...
Hope this helps
|
|
|
|
|
dear all seniors:
I have a control about the use mouse to select an area , but I can't clear all the unselect area. There is some vestigital shadow when move the mouse from right to left.I don't have any idea to avoid this case. Please give me a hand, thank you very much. The code as beloow :
<br />
<br />
#if !defined(AFX_TESTMOUSEVIEW_H__25EE68BB_BD4B_4C4E_8731_90C45792A08E__INCLUDED_)<br />
#define AFX_TESTMOUSEVIEW_H__25EE68BB_BD4B_4C4E_8731_90C45792A08E__INCLUDED_<br />
<br />
#if _MSC_VER > 1000<br />
#pragma once<br />
#endif // _MSC_VER > 1000<br />
<br />
<br />
class CTestmouseView : public CView<br />
{<br />
protected:
CTestmouseView();<br />
DECLARE_DYNCREATE(CTestmouseView)<br />
<br />
public:<br />
CTestmouseDoc* GetDocument();<br />
CRect SelectArea,DisSelectArea;<br />
<br />
public:<br />
<br />
public:<br />
virtual void OnDraw(CDC* pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);<br />
protected:<br />
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);<br />
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);<br />
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);<br />
<br />
public:<br />
virtual ~CTestmouseView();<br />
#ifdef _DEBUG<br />
virtual void AssertValid() const;<br />
virtual void Dump(CDumpContext& dc) const;<br />
#endif<br />
<br />
protected:<br />
<br />
protected:<br />
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);<br />
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);<br />
afx_msg void OnMouseMove(UINT nFlags, CPoint point);<br />
DECLARE_MESSAGE_MAP()<br />
};<br />
<br />
#ifndef _DEBUG // debug version in testmouseView.cpp<br />
inline CTestmouseDoc* CTestmouseView::GetDocument()<br />
{ return (CTestmouseDoc*)m_pDocument; }<br />
#endif<br />
<br />
<br />
<br />
#endif // !defined(AFX_TESTMOUSEVIEW_H__25EE68BB_BD4B_4C4E_8731_90C45792A08E__INCLUDED_)<br />
<br />
<br />
#include "stdafx.h"<br />
#include "testmouse.h"<br />
<br />
#include "testmouseDoc.h"<br />
#include "testmouseView.h"<br />
<br />
#ifdef _DEBUG<br />
#define new DEBUG_NEW<br />
#undef THIS_FILE<br />
static char THIS_FILE[] = __FILE__;<br />
#endif<br />
<br />
<br />
IMPLEMENT_DYNCREATE(CTestmouseView, CView)<br />
<br />
BEGIN_MESSAGE_MAP(CTestmouseView, CView)<br />
ON_WM_LBUTTONDOWN()<br />
ON_WM_LBUTTONUP()<br />
ON_WM_MOUSEMOVE()<br />
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)<br />
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)<br />
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)<br />
END_MESSAGE_MAP()<br />
<br />
<br />
CTestmouseView::CTestmouseView()<br />
{<br />
SelectArea = CRect(0,0,0,0);<br />
DisSelectArea = SelectArea;<br />
}<br />
<br />
CTestmouseView::~CTestmouseView()<br />
{<br />
}<br />
<br />
BOOL CTestmouseView::PreCreateWindow(CREATESTRUCT& cs)<br />
{<br />
<br />
return CView::PreCreateWindow(cs);<br />
}<br />
<br />
<br />
void CTestmouseView::OnDraw(CDC* pDC)<br />
{<br />
CTestmouseDoc* pDoc = GetDocument();<br />
ASSERT_VALID(pDoc);<br />
CBrush WhiteBrush(RGB(255,255,255));<br />
CBrush LightGaryBrush(RGB(225,225,225));<br />
CBrush *OldBrush;<br />
<br />
if(DisSelectArea.Width() != 0)<br />
{<br />
OldBrush = pDC->SelectObject(&WhiteBrush);<br />
pDC->FillRect(DisSelectArea,&WhiteBrush);<br />
pDC->SelectObject(OldBrush);<br />
}<br />
if(SelectArea.Width() != 0)<br />
{<br />
OldBrush = pDC->SelectObject(&LightGaryBrush);<br />
pDC->FillRect(SelectArea,&LightGaryBrush);<br />
pDC->SelectObject(OldBrush);<br />
}<br />
}<br />
<br />
<br />
BOOL CTestmouseView::OnPreparePrinting(CPrintInfo* pInfo)<br />
{<br />
return DoPreparePrinting(pInfo);<br />
}<br />
<br />
void CTestmouseView::OnBeginPrinting(CDC* , CPrintInfo* )<br />
{<br />
}<br />
<br />
void CTestmouseView::OnEndPrinting(CDC* , CPrintInfo* )<br />
{<br />
}<br />
<br />
<br />
#ifdef _DEBUG<br />
void CTestmouseView::AssertValid() const<br />
{<br />
CView::AssertValid();<br />
}<br />
<br />
void CTestmouseView::Dump(CDumpContext& dc) const<br />
{<br />
CView::Dump(dc);<br />
}<br />
<br />
CTestmouseDoc* CTestmouseView::GetDocument()
{<br />
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestmouseDoc)));<br />
return (CTestmouseDoc*)m_pDocument;<br />
}<br />
#endif //_DEBUG<br />
<br />
<br />
void CTestmouseView::OnLButtonDown(UINT nFlags, CPoint point) <br />
{<br />
SetCapture();<br />
SelectArea.left = point.x;<br />
SelectArea.top = point.y;<br />
SelectArea.right = point.x;<br />
SelectArea.bottom = point.y+ 50;<br />
}<br />
<br />
void CTestmouseView::OnMouseMove(UINT nFlags, CPoint point) <br />
{<br />
if(nFlags == MK_LBUTTON)<br />
{<br />
if(point.x >= SelectArea.left)<br />
{<br />
if( point.x >= SelectArea.right)<br />
{<br />
SelectArea.right = point.x;<br />
}<br />
else if( point.x < SelectArea.right)<br />
{<br />
DisSelectArea.left = point.x;<br />
DisSelectArea.top = SelectArea.top;<br />
DisSelectArea.right = SelectArea.right;<br />
DisSelectArea.bottom = SelectArea.bottom;<br />
SelectArea.right = point.x;<br />
}<br />
}<br />
else if(point.x < SelectArea.left)<br />
{<br />
if(point.x < SelectArea.right)<br />
{<br />
SelectArea.right = point.x;<br />
}<br />
else if(point.x > SelectArea.right)<br />
{<br />
DisSelectArea.left = point.x;<br />
DisSelectArea.top = SelectArea.top;<br />
DisSelectArea.right =SelectArea.right;<br />
DisSelectArea.bottom = SelectArea.bottom;<br />
SelectArea.right = point.x;<br />
}<br />
}<br />
}<br />
InvalidateRect(DisSelectArea,FALSE);<br />
InvalidateRect(SelectArea,FALSE);<br />
UpdateWindow();<br />
}<br />
void CTestmouseView::OnLButtonUp(UINT nFlags, CPoint point) <br />
{<br />
ReleaseCapture();<br />
SelectArea.right = point.x;<br />
}<br />
|
|
|
|
|
I am trying to extract an embedded object from a RTF file.
I can extract the embedded object tag and corresponding data from the original RTF file, but I don't know how to make that into its own object outside of the RTF.
Any help would be appreciated.
|
|
|
|
|
how can i use file dll in visual c++ and open it to use it's contents
|
|
|
|
|
Are you wanting to know how to use exported functions or classes from the DLL?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
yes please......
by visual c++
|
|
|
|
|