|
Hello,
I'm trying to create an interface (in CView) with solid shapes that are custom CWnd derived controls - I want a result much like the shapes that you can add and manipulate in powerpoint, word etc. However I'm having bother with Z-Order. I can rearrange the Z-Order using SetWindowPos() but:
If a shape(CWnd) gets put at the bottom of the Z-order it obscures windows that are above it (at the top) of the z-order.
If I put a shape(CWnd)at the top of the z-order it receives mouse-clicks but is obscured by shapes below it in the Z-order.
What I want is for a shape that is at the top of the Z-order to be drawn so it obscures those below it AND accepts the mouse click - just as happens in Powerpoint, Word etc.
Perhaps I am missing something about this Z-order business 'cos it doesn't seem logical to me!?
Any help would be greatly appreciated
AGBIRT
|
|
|
|
|
ummmmmmm
dunno about making the shapes separate windows
i would maintain a list of shapes and z-orders for the current view and draw them correctly (painters algorithm) in the OnPaint() handler
"there is no spoon" biz stuff about me
|
|
|
|
|
Hi!
I created a dialog with a button. When I press that button the thread is started (it opens a dialog with progress bar and abort button - it's basically to show the progress of some lenghty operation that can be aborted (something like Copy in Total Commander).
The code works fine in Debug mode, but it doesn't work in Release mode (you have to set: Property Pages for project->C/C++->Optimization->Optimization to Disabled (/0d), so that it works.
Can anyone explain me why is that?
Here is a code I wrote:
//header of CthreadprogressdlgDlg
afx_msg void OnBnClickedButton1();
LRESULT EndWorkDlg(WPARAM, LPARAM);
CWorkDlg dlg; //the dialog with progress bar and abort button
//implementation
BEGIN_MESSAGE_MAP(CthreadprogressdlgDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_MESSAGE(WORK_END_DLG, EndWorkDlg) //THIS
END_MESSAGE_MAP()
void CthreadprogressdlgDlg::OnBnClickedButton1()
{
dlg.DoModal();
}
LRESULT CthreadprogressdlgDlg::EndWorkDlg(WPARAM, LPARAM)
{
dlg.EndDialog(IDOK);
return 0;
}
//WorkDlg header
afx_msg void OnBnClickedOk();
bool work;
static UINT Go( LPVOID pParam );
//WorkDlg implementation
BOOL CWorkDlg::OnInitDialog()
{
CDialog::OnInitDialog();
AfxBeginThread(Go, static_cast<LPVOID>(this), THREAD_PRIORITY_NORMAL); //this
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CWorkDlg::OnBnClickedOk()
{
work = false;
}
UINT CWorkDlg::Go( LPVOID pParam )
{
CWorkDlg *pD = static_cast<CWorkDlg*>(pParam);
while(pD->work) //some long long operation (and the progress bar shows how long it is)
{
}
pD->GetParent()->SendMessage(WORK_END_DLG);
pD->work = true; //reset, so that it will run the next time.
return 0;
}
Does maybe anyone know a better way to do this?
|
|
|
|
|
When you say it works fine, how do you know? You haven't included the CWorkDlg class, but I assume Go() isn't a static function, in which case it can't be used as a thread function. But your biggest problem is worker threads don't have access to the CWnd* objects in the handle map of the main thread. So pD->GetParent()->SendMessage(WORK_END_DLG); is unlikely to work. Also using SendMessage() from a worker thread to the main app thread is not a good idea at all as you can get into deadlock situations.
I suggest you do lots of reading on multithreading as it is a difficult and complex area which is fraught with problems for the unitiated. You'll find articles here on CP which will help.
Oh and when you post code use the pre, code format toolbar options and the 'Do not treat <'s as HTML tags' or <> buttons which all make your code a lot more readable.
Neville Franks, Author of ED for Windows. Free Trial at <a href="http://www.getsoft.com">www.getsoft.com</a>
|
|
|
|
|
I agree 100%... And yes avoid SendMessage() bewcause of problems with deadlock situations. The GUI can cause a deadlock that has nothing to do with your events or mutexes...
John
|
|
|
|
|
I've made some modifications to the program:
work thread in CWorkDlg doesn't send message anymore, it just says dlg->EndDialog(IDOK) (it works fine too)
I didn't find any memory leaks or something like that. It exits fine. Everything works ok.
It's not that of a complex thing:
One dialog (the main one) is for gathering data. When all data is gathered you start the long calculations -> Another dialog is created (dialog with progress bar and abort button). When the calculation finishes the dialog closes or you can abort it and it's closed then. That's it. Any ideas how to do that?
The problem is here (like I described before):
The code works fine in Debug mode, but it doesn't work in Release mode (you have to set: Property Pages for project->C/C++->Optimization->Optimization to Disabled (/0d), so that it works.
And another abnormality I found:
If I leave Optimization on speed (default for release) and I add some code into the while(pD->work) loop, then it also exits fine.
I would be very grateful if someone could help.
I'd like to send a project somewhere so that you all that are willing to help could see.
Where can I do that?
|
|
|
|
|
I'm afraid you are totally kidding yourself if you think whatever problems you are seeing have something to do with Debug vs. Release Build. It is just dumb luck that it is working in a Debug build. Apologies if this sounds harsh, but multithreading is really quite difficult to do and unless it is done properly you and your users will have nothing but problems.
You can't use any CWnd* derived objects in your worker thread, so dlg->EndDialog(IDOK) is no better than SendMessage(). The only safe way to work with another threads Windows is to *only* use HWND's to access them, and only ever use PostMessage(). All you say is "doesn't work" which is quite useless really.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
One solution is PostMessage(). Another solution is SendNotifyMessage().
Kuphryn
|
|
|
|
|
#include <afxwin.h>
class cwinmain : public CFrameWnd
{
public:
cwinmain();
DECLARE_MESSAGE_MAP()
};
cwinmain::cwinmain()
{
Create(NULL, "Title");
}
class capp : public CWinApp
{
public:
BOOL InitInstance();
};
BOOL capp::InitInstance()
{
m_pMainWnd=new cmainwin;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return true;
}
BEGIN_MESSAGE_MAP(cmainwin,CFrameWnd)
END_MESSAGE_MAP()
capp app;
==========================
whenever i tried to compile above code in vc++ 6 compiled sucessfully
but it shows 4 error while linking so what r the likely problem
plz help me i m new to this world
..@>
/( )\
^ ^
|
|
|
|
|
What errors did you get?
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
#include <afxwin.h>
class cwinmain : public CFrameWnd
{
public:
cwinmain();
DECLARE_MESSAGE_MAP()
};
cwinmain::cwinmain()
{
Create(NULL, "Title");
}
class capp : public CWinApp
{
public:
BOOL InitInstance();
};
BOOL capp::InitInstance()
{
m_pMainWnd=new cmainwin;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return true;
}
BEGIN_MESSAGE_MAP(cmainwin,CFrameWnd)
END_MESSAGE_MAP()
capp app;
==========================
whenever i tried to compile above code in vc++ 6 compiled sucessfully
but it shows 4 error while linking so what r the likely problem
plz help me i m new to this world
..@>
/( )\
^ ^
|
|
|
|
|
ehm.... it would be useful if u post the linker errors here!
Don't try it, just do it!
|
|
|
|
|
Dear ALL,
I am developing an application in MFC VC++ Version 6.0 for Windows 2000. And I need the functionality to restore all the deleted files (only files which go in to the Recycle Bin) in my application.
Is there any API provided by Microsoft to "restore all files from recycle bin" or can you please suggest other alternative ?
Thanks.
Regards,
Rohit Dhamija
|
|
|
|
|
|
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
As to the above, I don't know what effections they can have on the other places
Can you tell me their important position in the MFC AppiWizard process, or what is in the charge of them? And how do they do that?
Thanks for your attention!
|
|
|
|
|
if you're performing a DEBUG build, then it redefines the new keyword to use the DEBUG_NEW macro. Basically, this adds in extra error checking when allocating and freeing memory, and enables the memory leak display that gets displayed by VS when you finish debugging a program.
The THIS_FILE[] character array stores the current name of the file. This allows you to know the name of the current file in a form that can be manipulated. The __FILE__ macro contains the name of the file, but it is constant and can't be used everywhere that a non-constant array can.
Hope this helps,
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
All those codes are valid when performing a debug build, do you think so?
Does they work like:
1.Define "new" by "DEBUG_NEW" when detecting the building mode is debug
Is that to say, "new" will always be replaced with "DEBUG_NEW", I think, DEBUG_NEW maybe contains some extra error checking codes, isn't it?
2.#undef THIS_FILE. Is it to avoid conflicting with the later same name
or THIS_FILE is something to be used in a release build and it can't be used in a debug build?
3.why use "THIS_FILE[]" to substitute "THIS_FILE", can we use "THIS_FILE" directly? In the meantime, I have not see THIS_FILE[] used in another place
|
|
|
|
|
hi,
we all know the ascii equivalent of character 'A' is 0x41. so its 8 byte. whereas a unicode character is a wide character (2 bytes per character). So in unicode "A" has the value 0x0041.
I have a chinese unicode character "Âí". I don't know how to get its unicode equivalent (the value look like this 0x5c0b). Does anybody help me? Please.
Thanks in advance,
|
|
|
|
|
Manikandan wrote:
I have a chinese unicode character "Âí". I don't know how to get its unicode equivalent (the value look like this 0x5c0b).
It's a horse, man. The value could be between $250 and $1250 depending on his/her ability to run.
|
|
|
|
|
the codes are as follows:
APPBARDATA abd;
abd.cbSize = sizeof(APPBARDATA);
abd.uEdge = ABE_RIGHT;
abd.lParam = TRUE;
abd1.hWnd = m_hWnd;
if(!SHAppBarMessage(ABM_SETAUTOHIDEBAR, &abd))
AfxMessageBox("Register failed");
It's a dialog based application and the return value shows that registration succeeds.But the window has no auto-hide effect.Please tell me why?
Thank you.
Thanks for your answer.
|
|
|
|
|
At the end of debugging, the debugger is showing me:
Detected memory leaks!
Dumping objects ->
{44} normal block at 0x00BC2638, 33 bytes long.
Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD
{43} normal block at 0x00BC25D0, 40 bytes long.
Data: < |L > 14 7C 4C 10 16 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
Looking at above signals, how can i find out that which part of my code is causing memory leakage. To my best knowledge i've not used "new" anywhere, still the debugger is giving these things.
|
|
|
|
|
You will need to use _CrtSetDbgFlag and _CrtSetBreakAlloc.
Magnus
|
|
|
|
|
Hi all
how i can retrieved thread handle from ID one
Thanks
|
|
|
|
|
If you mean you have a thread ID, and you want a thread handle, look up OpenThread .
|
|
|
|
|
Thanks.
But OpenThread only for Win2000 or i wrong??
And else how i can recognize which thread launch current thread.
Actually i want create COM object which will be able suspend
clients thread.
|
|
|
|