|
Bizarre. I wouldn't expect that this would happen, since the WM_LBUTTONDOWN is sent to the edit control. The default processing will be for it to start handling a potential selection, I'd have thought, and it would then eat the message.
Have you tried using SPY++ on the edit window and/or the parent window to verify that it's not an odd interaction due to PreTranslate or anything strange?
(Apologies for what might seem like trying to teach egg-sucking to an aged matriarchal relative)
Steve S
|
|
|
|
|
Tried Spy++ and the parent is getting WM_LBUTTONDOWN etc. I also noticed a WM_PARENTNOTIFY sent to the parent, which may shed some light on this.
From the Docs:
"All child windows, except those that have the WS_EX_NOPARENTNOTIFY extended window style, send this message to their parent windows. By default, child windows in a dialog box have the WS_EX_NOPARENTNOTIFY style, unless the CreateWindowEx function is called to create the child window without this style."
My (derived) edit control is created dynamically, and isn't a child of a dialog. I'll try setting WS_EX_NOPARENTNOTIFY and see what happens.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
Neville Franks wrote:
My (derived) edit control is created dynamically, and isn't a child of a dialog. I'll try setting WS_EX_NOPARENTNOTIFY and see what happens.
Made no difference!!
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
Neville Franks wrote:
Tried Spy++ and the parent is getting WM_LBUTTONDOWN etc. I also noticed a WM_PARENTNOTIFY sent to the parent, which may shed some light on this.
The parent is getting WM_LBUTTONDOWN ? Do you have the WS_EX_TRANSPARENT style set? That is the only case I can think of where the parent will get mouse messages from a control, unless the parent has captured the mouse.
As for WS_EX_NOPARENTNOTIFY , I noticed in your other message you said it didn't work. Did you use ModifyStyleEx() to set it, or pass it to CreateEx() ? I'm not sure if that particular style can be set dynamically.
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"
|
|
|
|
|
Ryan Binns wrote:
Do you have the WS_EX_TRANSPARENT style set?
Nope. The mouse is captured in the parent on WM_LBUTTONDOWN and released in WM_LBUTTONUP, which is when I Show the previously created CEdit window.
Ryan Binns wrote:
Did you use ModifyStyleEx() to set it, or pass it to CreateEx()?
ModifyStyleEx( 0, WS_EX_NOPARENTNOTIFY, 0 );
I don't think this the problem though as it doesn't affect WK_KEYxxx msgs, which are also being sent to the parent.
I think the problem is that the parent isn't a Dialog and doesn't have the usual dialog message handling. I think I'll ditch CEdit and use the good old fashioned Win API to create an EDIT window.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
Just tried CreateEx( WS_EX_NOPARENTNOTIFY, ... ) and it made no difference.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
Neville Franks wrote:
I can't see how to reflect WM_LBUTTONDOWN, WM_KEYDOWN et.all.
Why do you need to?
ON_CONTROL_REFLECT_EX(EN_CHANGE, OnChange) should allow you to handle every case the CEdit needs to change. (Im not sure from the top of my head what about paste)
You can return TRUE to disallow the parent to handle EN_CHANGE.
As a sidenote, it escapes my why this is called 'reflection', as it obviously happens *before* the parent gets to see the message.
If you need a analogue from the realm of optics, I would say that you can set the control to be 'opaque' for the message.
Who is 'General Failure'? And why is he reading my harddisk?!?
|
|
|
|
|
How about creating a CEdEdit class which is nothing but a CWnd that hosts a CEdit ?
/ravi
Let's put "civil" back in "civilization"
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
Ravi Bhavnani wrote:
'03
How about creating a CEdEdit class which is nothing but a CWnd that hosts a CEdit?
Hi Ravi,
Yes that should work. I'm really going nuts here. All the sample apps I've got have a dialog as the parent of the CEdit. In my case the parent is a CWnd, whose parent is a Docking control bar. I don't know if the control bar has anything to do with my problems.
I'm sorely tempted to wind my brain back a few years and use the Win API to create an EDIT window, then all the MFC mapping stuff won't be an issue.
I'm heading to bed seeing its nearly 11pm here in Oz and I'm all coded out for one day. I'll sleep on it and hopefully wake up with some fresh ideas.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
I think you've answered already:
In my case the parent is a CWnd, whose parent is a Docking control bar
Control Bar message processing as I recall is not the same as Dialog message processing.
You are running on main application message pump that doesn't have IsDialogMessage.
I maybe wrong though. (as usual)
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
igor1960 wrote:
Control Bar message processing as I recall is not the same as Dialog message processing.
You are running on main application message pump that doesn't have IsDialogMessage.
Yes I think this is the problem. I am about to change from a CEdit to creating an EDIT window using the Windows SDK API. Msg's won't get sent to the parent then, and hopefully all of my problems will go away. Any thoughts?
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
Actually it's not CControlBar -- it's CDialogBar restrction.
Here it is from Technical Note 31:
CDialogBar
A dialog bar is a control bar that contains standard Windows controls. It acts like a dialog in that it contains the controls and supports tabbing between them. It also acts like a dialog in that it uses a dialog template to represent the bar.
A CDialogBar is used for the print-preview toolbar, which contains standard pushbutton controls.
Using a CDialogBar is like using a CFormView. You must define a dialog template for the dialog bar and remove all the styles except WS_CHILD. Note that the dialog must not be visible.
The control notifications for a CDialogBar will be sent to the parent of the control bar (just like toolbar buttons).
Sure, you can have different methods of attacking and resolving that problem:
However, because it's your container application that specifically put that CEdit in CDialogBar, I would assume that the right way to do it, would be to place the code into App or Frame.
So, I would be looking into for example overloading PreTranslateMessage of App or Frame. Something like that:
BOOL CYourApp::PreTranslateMessage(MSG* pMsg)
{
if (CWinApp::PreTranslateAppMessage(pMsg))
return TRUE;
....
...
if(((pMsg->message == WM_KEYDOWN)||(pMsg->message == WM_KEYUP))&&
(pMsg->wParam == VK_RETURN)) // whatever you want here
{
char szClassName[32];
if((GetClassName(pMsg->hwnd, szClassName, 32))&&
(_stricmp(szClassName, "Edit") == 0))
{
if(::IsChild(hWndYourControlBarHandlerHere, pMsg->hwnd))
{
SendMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
// or you may translate dispatch it right here -- up to you...
return TRUE;
}
}
....
Don't copy paste above though. I maybe wrong again (as usual).;P
Regards
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
That is curious. I just tried a dialog box with an edit control, put a WM_LBUTTONDOWN handler in the dialog box, and left-clicking in the edit box definitely does not go to the dialog box. Maybe the CEdit-derived class does something different? What other message handlers do you have in the edit class?
HPS HwndSpy - GUI developer's aid to visually
locate and inspect windows. For the month of August
only, use coupon code CP-81239 for 30% off.
|
|
|
|
|
HPSI wrote:
That is curious. I just tried a dialog box with an edit control, put a WM_LBUTTONDOWN handler in the dialog box, and left-clicking in the edit box definitely does not go to the dialog box.
Your right. That's what I see in sample "Dialog" based apps here. See my reply to Ravi.
The derived class only uses OnKillFocus().
This is the create code:
DWORD dwStyle = WS_BORDER | WS_CHILD | ES_AUTOHSCROLL;
CRect EditRect( 0, 0, 1, 1 );
if( CEdit::Create( dwStyle, EditRect, m_pTreeCtrlEdit->m_pTreeCtrl, 12345 ) )
; ....
The edit window gets resized and shown when required. The parent window is a class derived from CWnd. And it lives in a docked control bar.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
hi all
im using this function i found on msdn to check if im online
inline BOOL Online()
{
DWORD dwState = 0;
DWORD dwSize = sizeof(DWORD);
BOOL fRet = FALSE;
if(InternetQueryOption(NULL, INTERNET_OPTION_CONNECTED_STATE, &dwState, &dwSize))
{
if(dwState & INTERNET_STATE_DISCONNECTED_BY_USER)
fRet = TRUE;
}
return fRet;
}
however, when i compile im getting the below linking error
error LNK2019: unresolved external symbol __imp__InternetQueryOptionA@16 referenced in function "int __cdecl Online(void)" (?Online@@YAHXZ)
does ne1 have ne ideas
thanks
si
|
|
|
|
|
silly me was missing the line
#pragma comment(lib, "wininet.lib")
sorry 2 be a pain
si
|
|
|
|
|
But isn't it nice when someone finds their own answer and posts it, rather than just "It's OK, I fixed it"...
Steve S
|
|
|
|
|
Hi
I want to be able to change the color of the border of the group box into 'green' for example.
How can i achieve this? By subclassing?
Greetings
Jens
|
|
|
|
|
I've just had a quick look, and WM_CLTSTATIC isn't going to help you with this. So you are
going to have to subclass and override WM_PAINT at least. There are plenty of "flat" controls
on CP which can give you a starting place.
Maybe a small article on your discoveries could come out of it?
Iain.
|
|
|
|
|
Hi Iain
I've looked at some examples of CStatic controls being 'label fields'. Most of them are discussing the background color of text or control etc
But not how to color the border of the control.
Can you provide me with a good article about it or a code example?
Greetings
Jens
|
|
|
|
|
|
Please, this forum is only for Visual C++ related questions!
but, hi and welcome to CodeProject anyway!
Rickard Andersson
Here is my card, contact me later!
UIN: 50302279
Sonork: 37318
Interests: C++, ADO, SQL, Winsock, 0s and 1s
|
|
|
|
|
I load image file (.jgep) into picture control by using this code;
m_image.Load(m_SavePath);
m_CPicture.SetBitmap((HBITMAP)m_image);
This code is same with vb.net code:
picoriginal.Image = Image.FromFile(m_SavePath)
After that I need to cut a portion of the image and put it into another picture control with this code;
hdcDest = ::GetDC( CpThis->m_CpDest->GetSafeHwnd() );
hdcSrc = ::GetDC( CpThis->m_CpSource->GetSafeHwnd() );
::SelectObject( hdcSrc, CpThis->m_BackSurface.hBmp );
::StretchBlt(hdcDest,0,0,300,400,hdcSrc,pointlx,
pointly,cutwidth,cutheight,SRCCOPY);
::DeleteDC( hdcSrc );
::ReleaseDC( CpThis->m_CpDest->GetSafeHwnd(), hdcDest );
With this code the portion oh the image that have been cut is handle by hdcDest.
The problem is how I can save the cutting image into the new file(.jpeg)?
I can do it in vb. net by using this code;
picresult.Image.Save(Apath & "\result.jpg", Imaging.ImageFormat.Jpeg)
savebmap.Save(Apath & "\resultraw.raw")
How to translate this code into vc++ code?
Any idea to solve my problem, I apreciate it. Thanks.
|
|
|
|
|
GDI+ has functionality for this.
Steve S
[This signature space available for rent]
|
|
|
|
|
Thanks, I know it GDI+ can handle this but how to code it, I can get it, I have try so many times but cannot work. Now all the image data is in hdc but how to get from this into GDI+? Could you give some sample code, thanks.
|
|
|
|