|
Hi, all,
Let's say math is not my strong subject.
That said, can anyone explain to me how to pack a floating point value into a 4 byte char array?
Any help would be much appreciated.
Thanks in advance.
|
|
|
|
|
You should use a union.
union FloatConverter
{
float fValue;
char Bytes[4];
};
|
|
|
|
|
Thanks for the info.
What I was actually looking for is something along the lines of char bytes[4] = float.
or possibly send it to a memory file and read back into a character array. I just have no clue as to how it should be done.
|
|
|
|
|
P1P3R wrote: What I was actually looking for is something along the lines of char bytes[4] = float.
A union will do this. It's actually quite simple. Each member in the union occupies the same memory space. So anything you put into the float will show up in the char array. Anything you put into the char array will effect the float.
union FloatConverter
{
float fValue;
char Bytes[4];
};
void Test()
{
FloatConverter converter;
converter.fValue = 1.23;
char floatByte0 = converter.Bytes[0];
char floatByte1 = converter.Bytes[1];
char floatByte2 = converter.Bytes[2];
char floatByte3 = converter.Bytes[3];
}
|
|
|
|
|
I did not know this. Will give it try.
many thanks.
|
|
|
|
|
Hm... I got a weird weird problem. I subclassed the Systray Clock window but the WM_LBUTTONDOWN message ain't comming through my window procedure, the one I subclassed it to. This is really something 'cause subclassing is meant to direct ALL messages to me, but that message simply ... doesn't get here. What could be wrong?? I receive other messages as WM_PAINT and the subclassing is perfect since I already use it for other purposes.
Could this be a hint?
SetClassLong(pcwps->hwnd, GCL_STYLE, GetClassLong(hwndSystrayClockWindow, GCL_STYLE) & ~CS_DBLCLKS)
What does "& ~" do anyway? I haven't been programming in C++ for such a long time and I am unfamiliar with that construction. Is it meant to subtract an attribute from that window's Class Bits?
Pffff... weird stuff goin' on here... ::- |.
-= E C H Y S T T A S =-
The Greater Mind Balance
|
|
|
|
|
Hi,
the "& ~" construction means to remove the class style CS_DBLCLKS from the window. But this isn't necessarily the source of your problem. MSDN says the following:
>> If a window does not have the CS_DBLCLKS style, Windows sends
the following message sequence to the window: WM_LBUTTONDOWN,
WM_LBUTTONUP, WM_LBUTTONDOWN, and WM_LBUTTONUP.
>> If a window does have the CS_DBLCLKS style, Windows sends the
following message sequence: WM_LBUTTONDOWN, WM_LBUTTONUP,
WM_LBUTTONDBLCLK, and WM_LBUTTONUP. That is, the second
WM_LBUTTONDOWN message is replaced by a WM_LBUTTONDBLCLK
message.
So I guess the problem is located somewhere else.
regards,
mykel
If they give you lined paper, write the other way!
|
|
|
|
|
Yeah, I read the MSDN too... pretty friggin strange. Thanks for the explanation about & ~.
-= E C H Y S T T A S =-
The Greater Mind Balance
|
|
|
|
|
Beah this sucks and it's stupid. I can't beleive it. I just don't get those messages. Beah. I'm gonna put myself a hook there and story over. Nobody messes with hooks anyway, they rule. I don't like loading the system but a tiny HH_MOUSE on explorer.exe won't kill anybody :- D.
It's 3:18 AM and nobody answers... so I'll just do it like this since in about 12 hours I gotta release this stuff I'm working at. I'll check this topic after that... maybe some wise guy here has a clue why those stupid messages don't get in the WndProc that I made for the Systray Clock.
-= E C H Y S T T A S =-
The Greater Mind Balance
|
|
|
|
|
When the WM_NCHITTEST message (which always precedes the other mouse messages) is sent to the clock window, it returns the value HTTRANSPARENT, causing Windows to send the message to its parent, a window of class "TrayNotifyWnd". This also returns HTTRANSPARENT, so the message is sent to its parent, a window of class "Shell_TrayWnd". This window returns HTBORDER, indicating a click in the non-client area, so Windows then sends a WM_NCLBUTTONDOWN to the Shell_TrayWnd window - the child windows are treated as being transparent and do not receive the mouse click messages. The Shell_TrayWnd window is the one that actually receives and processes the mouse click messages.
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"
|
|
|
|
|
Hi Ryan : ). Actually, I got that one subclassed too and I don't get nothing there either, beleive it or not. I solved my stuff with a mouse hook over explorer.exe but this isn't a solution I would accept if I would have alternatives. Unfortunately, I don't. Is it possible to make the TrayClockWClass accept mouse events?? Possibly chaning its class style ???? I don't know...
-= E C H Y S T T A S =-
The Greater Mind Balance
|
|
|
|
|
Are you checking for WM_NCLBUTTONDOWN messages? You won't get WM_LBUTTONDOWN messages because the clock window is setup to be in the non-client area of the tray window.
You could make the clock accept mouse events by overriding WM_NCHITTEST and return HTCLIENT from it, except then its standard functionality would not work.
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"
|
|
|
|
|
I ain't getting no messages. Here's my check:
LRESULT CALLBACK WndProcTaskBar (HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)<br />
{<br />
switch (wParam)
{ <br />
case WM_LBUTTONDOWN:<br />
case WM_LBUTTONUP:<br />
case WM_LBUTTONDBLCLK:<br />
case WM_NCLBUTTONDOWN:<br />
case WM_NCLBUTTONUP:<br />
..........
TaskBar being, of course, Shell_TrayWnd. Oh well, I guess I can play around with WM_NCHITTEST... thanks for the help once again, this ain't the first time you helped me :- ).
-= E C H Y S T T A S =-
The Greater Mind Balance
|
|
|
|
|
Just out of interest, what's your default case doing? Is it calling DefWindowProc() or CallWindowProc() with the previous (unsubclassed) window procedure? It should be doing the latter if you want to retain functionality.
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"
-- modified at 4:21 Wednesday 25th January, 2006
|
|
|
|
|
All my cases (Systray Clock, TaskBar, Systray Window) are CallWindowProc with the handle returned when I subclassed via SetWindowLong....
Hm, as far as I see the hook isn't even as good as I thought. It has a few minor problems. But if I have no choice I'll keep it. I think I will soon try that HTCLIENT thingy that you mentioned. But right now I can't 'cause I gotta release on my head and just a few more hours to deliver it. (it's the second Beta of the freeware application I'm working on and I'm giving it to some more friends to use and report bugs ::- D ).
-= E C H Y S T T A S =-
The Greater Mind Balance
-- modified at 6:19 Wednesday 25th January, 2006
|
|
|
|
|
Someone who knows how to subclass properly
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"
|
|
|
|
|
Yeah, not that it would help me much apparently ::- S.
-= E C H Y S T T A S =-
The Greater Mind Balance
|
|
|
|
|
We just moved to Visual Studio 2005, and previously we were using a manifest file to make our vc6 apps look ala Windows Xp theme.
1. First of all, what the heck is this manifest file? Does it really do anything useful?
2. What is the correct way to use it for apps created in vc2005?
3. Is there any way to get menus to look half decent without integrating one of the xp-style menu implementations found here in CodeProject?
Cheers and thanks!
swine
[b]yte your digital photos with [ae]phid [p]hotokeeper - www.aephid.com.
|
|
|
|
|
1 - as well as turning themes on, it specifies which versions of dlls your app uses.
2 - in your linker properties, you can get a manifest auto generated and embedded in your app
3 - Themes don't really do much for menus, they certainly don't add stuff like icons, which you could get from a library like Ultimate Toolbox, or possibly from samples on CP.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Christian Graus wrote: 1 - as well as turning themes on, it specifies which versions of dlls your app uses.
2 - in your linker properties, you can get a manifest auto generated and embedded in your app
Christian, have any links for dealing with distrusting apps created in VS2005? Something like "Here dummy, it takes two minutes to set your app up for distribution"?
Any help is apprecated.
Thank You
|
|
|
|
|
Ok so i have my manifest file being generated to "$(IntDir)\$(TargetFileName).intermediate.manifest". How do I enable the themes? I imported this project from vc6, so it doesn't have it on by default.
Thanks
swine
[b]yte your digital photos with [ae]phid [p]hotokeeper - www.aephid.com.
|
|
|
|
|
// MainFrame.cpp
#include "MainFrame.h"
#include <stdlib.h> // for __min() "2 underscores"
#define ID_SB 210 // All child windows require an
// identifier. Not used here.
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// message calls this function
ON_WM_PAINT() // void OnPaint()
ON_WM_LBUTTONDOWN() // void OnLButtonDown(...)
ON_WM_RBUTTONDOWN() //Left Button Down Add************
ON_WM_SIZE() // void OnSize(...)
ON_WM_CHAR() // void OnChar(...)
END_MESSAGE_MAP()
CMainFrame::CMainFrame() // Constructor
{
// Step 1: Register a window class if wish
// Step 2: Create the window
Create(NULL, "Ex06a_StatusBar & Shapes",
WS_OVERLAPPEDWINDOW,
CRect(0,0,360,250));
// Step 3: Create a status bar
myStatusBar.Create (WS_CHILD | WS_VISIBLE,
CRect(1,2, 1,2), this, ID_SB);
int rtEdges[] = {45,140,250}; // Right edge of panes
myStatusBar.SetParts (3,rtEdges);
// Step 4: Create Pens, Brushes, Fonts, etc
penReg.CreatePen (PS_SOLID, 10, RGB(0,0,255));
// Step 5: Initialize application variables
nPts = 0;
ShapeKind = 'L';
CenterWindow();
};
void CMainFrame::OnPaint()
{
CPaintDC dc (this);
dc.TextOut (1,1,"Click left button repeatedly. Press L, B, P");
CString s;
s.Format("# pts:%d", nPts);
myStatusBar.SetText (s,0,0);
s.Format ("Shape(L,B,P): %c", ShapeKind);
myStatusBar.SetText(s,2,SBT_POPOUT);
if (nPts <= 1)
return;
dc.SelectObject (&penReg);
switch (ShapeKind)
{
case 'L':
dc.Polyline (ShapePts, nPts);
break;
case 'P':
dc.SelectStockObject(LTGRAY_BRUSH);
dc.Polygon (ShapePts,nPts);
break;
case 'B':
if ((nPts - 4) % 3 == 0)
dc.PolyBezier(ShapePts,nPts);
else
{ // use max legal # of pts
int n = (nPts - 4)/3;
int NPts = __min(n*3 + 4, nPts);
dc.PolyBezier(ShapePts,NPts);
// then draw polyline
dc.SelectStockObject (BLACK_PEN);
dc.Polyline (ShapePts,nPts);
}
break;
default:
break;
}
}
void CMainFrame::OnLButtonDown (UINT nFlags,
CPoint pt)
{
if (nPts >= 99) // array full
return;
else
{
ShapePts[nPts] = pt;
nPts++;
CString s;
s.Format("Last pt d, %d)",pt.x, pt.y);
myStatusBar.SetText (s,1,SBT_NOBORDERS);
Invalidate();
}
}
void CMainFrame::OnChar (UINT nChar,
UINT nRep, UINT nFlags)
{
TCHAR ch = (TCHAR)nChar;
ch = toupper(ch);
if (ch == 'D')
{
if (nPts> 0) nPts--;
}
else
{
ShapeKind = ch;
if (ShapeKind == 'L' ||
ShapeKind == 'P' ||
ShapeKind == 'B')
; // okay, go on
else
ShapeKind = 'L';
}
Invalidate();
}
void CMainFrame::OnSize (UINT nType,
int cx, int cy)
{
// Done so statusbar moves to window bottom.
// Needed in older versions of Win95.
myStatusBar.MoveWindow(0,1,2,3); // coords ignored
}
void CMainFrame::OnRButtonDown (UINT nFlags,
CPoint pt)
{
Invalidate();
UpdateWindow();
}
Note: Code above was to erase the window whenever the right button on the mouse is "clicked" doesn't work, any ideas? Sid Kraft
Sid
|
|
|
|
|
It will repaint the window. If you want to erase the current shape, you need to change ShapeKind first.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
If I high-light some text in a window and right-click the mouse, there will be a popup menu with items like copy, cut, paste, etc.
If I know the handle of the window, how to get the handle of the popup menu? I know about the GetMenu API, does it do what I want?
This is for a non-MFC app. Please note that I don't want to create a new menu, just needs the handle of the existing popup menu.
Thanks.
My articles and software tools
|
|
|
|
|
|