|
CFile file;<br />
<br />
if( !file.Open( _T("C:\\Temp.bmp"), CFile::modeWrite|CFile::modeCreate) )<br />
return bRet;<br />
<br />
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
<br />
<br />
int nColors = 1 << lpbi->biBitCount;<br />
<br />
hdr.bfType = ((WORD) ('M' << 8) | 'B');
hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );<br />
hdr.bfReserved1 = 0;<br />
hdr.bfReserved2 = 0;<br />
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize +<br />
nColors * sizeof(RGBQUAD));<br />
<br />
file.Write( &hdr, sizeof(hdr) );<br />
<br />
file.Write( lpbi, GlobalSize(hDIB) );<br />
<br />
file.Close();
|
|
|
|
|
thanks for repley
but i dont wanna write it down to a hard drive... i just wanna have it as a full .bmp file but in memory
you see i will proces 14 frames per sec.. so using the HDD will slow me down.. i need to compose those bitmap form the structures in memory , i mean put it in a buffer or something
|
|
|
|
|
so instead of writing it to hard drive, pass the buffer (pointer) to the recipient.
|
|
|
|
|
what buufer... u are using.,, File.Write method for writing header and then info
but i want to return a pointer to a buufer witch contains both header and info one after another..
where is the buffer of CFile??
|
|
|
|
|
hi,
i hav to implement a sliger for the GUI of my project in VC++
can u help me in its implementation plaese....
|
|
|
|
|
Have you seen this? Trackbar Control Reference[^]
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Use:
HWND hwndTrack = CreateWindowEx(..., TRACKBAR_CLASS, ...);
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Newbie question.
If an application has an SDK for C++, does it matter which version of VC++ I use to create an app using that SDK (as long as I am not using CLR in VS2005)? I am under the impression that it doesn't because it is still C++. On the other hand, I have heard there are some differences between the compilers, so I am not sure.
Thanks for your help with this simple (-minded) question
Brad
The secret to creativity is knowing how to hide your sources. - Albert Einstein
|
|
|
|
|
Yes it matters, to a point. The SDK may use features of C++ not available in earlier versions of VC++. In addition the link libraries have will have problems if not targeted to the version of C++ you are using. If the SDK ships with source code and make files, this isn't a big problem thought.
(I've had it go both ways; code from VC++ 2005 that chokes with VC++ 6.0 and 6.0/2003 code that chokes with 2005.)
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
BRShroyer wrote: On the other hand, I have heard there are some differences between the compilers, so I am not sure.
There are. VS2k5 is more stricter following c++ ISO standards. Which was biggest compain about VS6.0 . So you might find some code compiling. under previous version but not with VS2K5.
Refer this article by Stanley B. Lippman[^].
|
|
|
|
|
Hi there,
I am developing a map displaying system (similar to GPS) using GDI and unmanaged C++. I need to rotate the entire map (768x768) 12.5 times per second continuously. I am using SetWorldTransform() for rotation, but it seems to consume too much CPU (35-40% of dual 3.2GHz with 2GB RAM). Are there any other options that I can improve the performance?
Thanks.
Best,
Jun
|
|
|
|
|
Maybe the GDI it's not the best option. Have a look to DirectX or OpenGL.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Hmmm - the following code using GDI+ in a window uses 3%-5% cpu on a dual Xeon 3.2GHz machine:
Gdiplus::Bitmap SrcBitmap(L"C:\\test768768.bmp", FALSE);
Graphics DstGraphics(*this);
REAL angle = 0.0f;
for (int i = 0; i < 125; ++i)
{
DstGraphics.ResetTransform();
DstGraphics.RotateTransform(angle);
DstGraphics.TranslateTransform(450.0f, 450.0f, MatrixOrderAppend);
DstGraphics.DrawImage(&SrcBitmap, -384, -384, SrcBitmap.GetWidth(), SrcBitmap.GetHeight());
angle += 10.0f;
if (angle >= 360.0f)
angle -= 360.0f;
::Sleep(70);
}
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Mark Salsbery wrote: dual Xeon 3.2GHz machine
Good hardware!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
I like it alot although the SATA bus sits unused
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Thanks for posting, Mark.
Yes, GDI+ would be a better alternative. My problem is that I have to use GDI, not GDI+. I am using a third-party API library to load special image formats. That libray was GDI-based. I thought about mixing GDI/GDI+, but hesitated to do so thus far.
Best,
Jun
|
|
|
|
|
Once the image is loaded, what format is it in?
Those CPU usage numbers seem a tad high for 12.5fps, even using straight GDI.
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
As an example, even this totally un-optimized GDI code uses about 18% CPU (GDI+ only used to
load the bitmap - it's converted to a HBITMAP) ...
Gdiplus::Color clr(0xF0,0xF0,0xF0);
HBITMAP bmp;
if (Gdiplus::Ok == SrcBitmap.GetHBITMAP(clr, &bmp))
{
HDC hDestDC = ::GetDC(*this);
HDC hMemDC = ::CreateCompatibleDC(hDestDC);
::SetGraphicsMode(hDestDC, GM_ADVANCED);
HGDIOBJ hOldBitmap = ::SelectObject(hMemDC, (HGDIOBJ)bmp);
REAL angle = 0.0f;
for (int i = 0; i < 125; ++i)
{
static REAL pi = 3.1415926535f;
REAL angleradians = (angle * pi) / 180.0f;
REAL anglesin = ::sin(angleradians);
REAL anglecos = ::cos(angleradians);
XFORM XForm;
XForm.eM11 = anglecos;
XForm.eM12 = anglesin;
XForm.eM21 = -anglesin;
XForm.eM22 = anglecos;
XForm.eDx = 450.0f;
XForm.eDy = 450.0f;
::SetWorldTransform(hDestDC, &XForm);
::BitBlt(hDestDC, -384, -384, SrcBitmap.GetWidth(), SrcBitmap.GetHeight(), hMemDC, 0, 0, SRCCOPY);
angle += 5.0f;
if (angle >= 360.0f)
angle -= 360.0f;
::Sleep(20);
}
::SelectObject(hMemDC, hOldBitmap);
::DeleteDC(hMemDC);
::ReleaseDC(*this, hDestDC);
::DeleteObject((HGDIOBJ)bmp);
}
-- modified at 11:03 Thursday 8th March, 2007
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Actually my code is very similar to yours here, except that I call SetWorldTransform() twice, one with the rotation matrix and the other with the unit matrix. Maybe that is where I can improve. I will definitely try it out tomorrow (It's 10:30 PM now and I don't have the code at home). I'll post the outcome...Thanks again.
Best,
Jun
|
|
|
|
|
I have tested the same thing, but it still eats up ~35% of Dual 3.2GHz CPUs. My code is listed in the following, which basically does the same thing:
void CRotateDlg::OnBnClickedButton1()
{
UINT nClassStyle = CS_OWNDC;
CString m_ClassName = AfxRegisterWndClass ( nClassStyle,
NULL,
(HBRUSH)GetStockObject(BLACK_BRUSH),
LoadIcon(NULL, IDI_APPLICATION));
LONG winExtStyle = WS_EX_TOPMOST;
LONG winStyle = WS_POPUP | WS_VISIBLE | CS_OWNDC;
HWND hWnd=::CreateWindowEx( winExtStyle,
m_ClassName,
"",
winStyle,
0, 0, 768, 768,
NULL, NULL, NULL, NULL);
CDC *m_pDC = new CDC();
m_pDC->Attach(::GetDC(hWnd));
CDC *m_pBufferDC = 0;
CBitmap m_bitmap;
if(!m_pBufferDC)
{
m_pBufferDC = new CDC();
}
m_pBufferDC->CreateCompatibleDC(m_pDC);
m_bitmap.LoadBitmapA(IDB_BITMAP1);
m_pBufferDC->SelectObject(m_bitmap);
double angle = 0.0f;
for(int i = 0; i < 100; i++)
{
angle += 0.1f;
float cosine= (float) cos(DEG2RAD(-angle));
float sine = (float) sqrt(1.0 - cosine*cosine);
m_pDC->SetGraphicsMode(GM_ADVANCED);
const int xr = 384;
const int yr = 384;
XFORM xform = { cosine, sine,
-sine, cosine,
xr-xr*cosine+yr*sine,
yr-yr*cosine-xr*sine};
m_pDC->SetWorldTransform( &xform );
m_pDC->BitBlt( 0, 0, 768, 768,
m_pBufferDC,
0, 0,
SRCCOPY);
m_pDC->ModifyWorldTransform(&xform, MWT_IDENTITY);
Sleep(20);
}
m_pDC->Detach();
delete m_pBufferDC, m_pDC;
}
Best,
Jun
|
|
|
|
|
There's alot of math going on in the loop that could be optimized.
The angle could be kept in radians so it doesn't have to be converted from degrees every
iteration.
The translation value (eDx,eDx in the XFORM struct) maybe doesn't need to be calculated every
iteration.
The m_pDC->ModifyWorldTransform(&xform, MWT_IDENTITY); isn't necessary in the loop.
I know you're using a third-party bitmap format but if it's drawable with GDI then using GDI+
should be trivial and can cut the CPU usage alot.
The video card and driver can influence the performance as well. My machine that I'm testing is
same CPUs/speed with a ATI FireGL V3100 128MB video adapter.
I'm goig to try your code on my machine - I'll report the findings
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Mark,
I have implemented the mixed GDI/GDI+ approach to my project and it works well. The CPU usage reduces to ~10%. I didn't expect GDI+ gives such a boost. Thanks for help.
Best,
Jun
|
|
|
|
|
Jun Du wrote: I have implemented the mixed GDI/GDI+ approach to my project and it works well. The CPU usage reduces to ~10%.
Excellent! I didn't realize GDI+ was significantly faster either
Cheers,
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
My project have a list control and each item(colume and row) have data inside.
I want to map message when user double click at each item, and the program show the data that user have double click.
What the message that happen when user double click at each item and how to get the data from the item?
|
|
|
|
|
Do you need to NM_DBLCLK and NM_CLICK ?
|
|
|
|
|