|
ScreenToClient & ClientToScreen
|
|
|
|
|
I don't quite understand your answer but I have tried those methods and they don't work, I think it's because the region is in WINDOW coordinates and not client as stated in MSDN.
|
|
|
|
|
|
Thanks, can you post some example code, I still don't understand which coordinates need to be converted and the relationship between logical coordinates and screen/client coordinates.
The a preview of my functions:
<br />
GetCursorPos(&pt);<br />
<br />
GetWindowRgn(hwnd, hRgn);<br />
<br />
if ( PtInRegion(hRgn, pt.x, pt.y) != 0 )<br />
...<br />
else<br />
...<br />
|
|
|
|
|
When you do any type of drawing, for example LineTo(), MoveTo(), etc... that involves the device context (DC) - these functions assume you are passing logical coordinates. These functions are members of the device context (DC) which has its own set of coordinates (the logical coordinates). Your mapping mode (a property of the DC) determines the units of measurement when you draw something.
The coordinate data received from the mouse messages is, however, not in logical coordinate form. Thus, points passed to OnLButtonDown(), OnMouseMove(), etc... are in DEVICE UNITS, that is pixels. These are measured relative to the top left corner of the client area. These are called client coordinates. When you call InvalidateRect() the rectangle is assumed to be defined in terms of client coordinates.
If your mapping mode is MM_TEXT, then client coordinates and logical coordinates in the device context are both in units of pixels and so they are the SAME, as long as you don't scroll the window.
Thus to properly convert between coordinates there are two things you need to do:
1. Convert client coordinates that you get from the mouse to logical coordinates
2. Convert any bounding rectangles (regions, etc...) back to client coordinates (if, for example you want to call InvalidateRect())
Thus you could do something like this in OnLButtonDown() or OnMouseMove() handler:
<br />
void CMyView::OnLButtonDown()<br />
{<br />
CClientDC aDC(this);
OnPrepareDC(&aDC);
aDC.DPtoLP(&point);
<br />
}<br />
In the above, you obtain a DC for the current view by creating a CClientDC object and passing 'this' to the constructor. The advantage of CClientDC is that windows automatically releases the DC when the object goes out of scope. This is necessary because there are a liminted number of DC's in windows.
For a geometric shape (Rgn, Rect) I suppose you could try the following:
<br />
CClientDC aDC(this);<br />
OnPrepareDC(&aDC);<br />
<br />
CRect aRect = ;<br />
aDC.LPtoDP(aRect);<br />
InvalidateRect(aRect);<br />
OR
<br />
CRgn aRgn = ;<br />
aDC.LPtoDP(aRgn);<br />
<br />
if ( PtInRegion(hRgn, pt.x, pt.y) != 0 )<br />
...<br />
else<br />
...<br />
Thus, the coordinates should be properly converted...
Hope this helps.
|
|
|
|
|
Ok, explanation understood...I'm coding in Win32 so the code I didn't quite get fully. (Sorry for not stating this fact)
|
|
|
|
|
Just wanted to let you know I solved my problem and all it took was a ScreenToClient and one more little thing that MSDN forgot to mention thus leading to wasting of 15 hours of Yahooing and countless cigarettes:
GetWindowRgn(hRgn, pt.x, pt.y) is supposed to obtain a copy of a region but nowhere does it state that you should have created some kind of region with this handle already!!!!!!!!!!!!
Luckily I came across this on some website with some code example in a programming language I have never seen before that said to create a region first (doesn't matter what kind) and then call the function...I am really curious as to why MSDN thought this to be unimportant enough to mention???
Now does this create a resource leak? Who knows with this region stuff?
Thanks again for the help.
|
|
|
|
|
Glad you figured it out.
Good luck.
|
|
|
|
|
Hi, I'm trying to develop a program which saves/loads MS Outlook Express setting information, including user preference configuration data, POP3/SMTP account(s) information etc. By knowing that OE stores all those info in Windows registry, it's quite easy to save/load the particular REG keys, and I was actually doing well on saving/loading user preference configuration data.
The problem is lying on POP3/SMTP account(s) information, at first I found out the keys that stores account(s) info was under "HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager\Accounts" and wrote my program by that way, and it worked, but while I was doing more tests by creating some dummy users on my Win2000 and logging on as them and running the application, I saw the oddness, it sometimes stores account(s) info under "HKEY_CURRENT_USER\Identities\{########-####-####-####-############}\Software\Microsoft\Internet Account Manager\Accounts" (substituting the "##..." with user main identity), so I'm confused.
I did some more tests and found out that the key location is actually random between "HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager\Accounts" and "HKEY_CURRENT_USER\Identities\{########-####-####-####-############}\Software\Microsoft\Internet Account Manager\Accounts", say, in one user's registry it's here, and in the other user's registry it's there, and both users have exactly identical privilege and other settings, why is that?
My question is, is there any way I can programatically determine which one of the above two keys stores current user's POP3/SMPT account(s) information? Thanks a lot.
|
|
|
|
|
Hi, everyone!
Are there some free tools that can calculate the running time
of each function of a project? My project is a C/C++ project
that runs on WIN32 platform.
Thank in advance,
George
|
|
|
|
|
I have added a new entry to my menu and MFC has generated the ON_COMMAND entry for the item in its message map. Thats fine..
Now, how do I post a message in my application so that I can cause the same function to be called at my will ?.
I dont want to make I direct call as I dont want any return.
Thanks in advance.
|
|
|
|
|
Either SendMessage/PostMessage
YourWnd->SendMessage(WM_COMMAND, ID_MY_COMMAND, NULL);
|
|
|
|
|
Thanks very much..it was the WM_COMMAND bit I was missing..
Cheers
|
|
|
|
|
I have been having some trouble changing the parent of a CView object. I have a program which utilizes the CSplitterWnd to have two separate views. My intention is for users to undock a splitter view and make it a free floating window. The problem comes when I try and assign ownership of a CView class to another window.
I am using both a CView(when in a splitter) and a CWnd(when a toolbox) to wrap the main CView class containg application information. When i try and assign the CView class a new parent SetParent(wndToolBox) it works fine. However when it comes to sending click messages and such it crashes :/
in CView::OnMouseActivate
fails evaluating
ASSERT(pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame));
It seems that the the CView class which has had a new parent assigned has not been removed from the notification queue of its previous parent.
Is it even possible to dynamically reasign a CView class to another parent window without such errors occuring ??
Any help would be GREATLY appreciated
Thanks
|
|
|
|
|
Why not make floater child of CDialogBar, or CControlBar instead...
Also you probably should change / play with CChildFrame instead of CView....
But seriously, ControlBars designed just for that purpose...
Brian
|
|
|
|
|
How can i run some process in certain time intervals - under the timer ?
thanks !
|
|
|
|
|
|
No the point is to run function from my program periodically - at the time period, settled by user .. ?
|
|
|
|
|
Look up CWnd::SetTimer(), WM_TIMER, and/or timeSetEvent().
|
|
|
|
|
I want to verify internet connection from my application in VC++.
(Is it or not ?)
How ?
|
|
|
|
|
|
Hi Progman!
Try this small function:
long MyView::IsConnected()
{
unsigned long ulConnectionFlags = 1;
return InternetGetConnectedState(&ulConnectionFlags ,0);
}
To be sure you can add an attempt to open a site but I don’t think it is necessary.
You must add the #include "WININET.H" line and WININET.lib to your project.
|
|
|
|
|
If using a modem use:
RasEnumConnections(..) fn
and check for to see if the number of connection is > 0.
If checking to see if LAN is present then Ping a url.
I avoid InternetGetConnectedState(..) because it is not dynamic. ie Pull the LAN connection out of the wall and your icon on you computer shows it is disconnected but the InternetGetConnectedState(..)fn won't track it!
Art
|
|
|
|
|
i Have a few Wav resources in my VC++ project. And i want to merge it into one Wav file.
how can i do it ?
|
|
|
|
|