|
Chris, I'm a newbie to this deep API functions, all the information I've got from an external API is just this BITMAPINFOHEADER* pHeader, nothing more and I need only HBITMAP to extract from them, do not care by which method, my interest is to set a button picture with this bitmap, and that's all!
So let me understand correctly: to obtain the correct HBITMAP do I need extra info, the BITMAPINFOHEADER provideed is not sufficent?
best wishes!
Ioan
|
|
|
|
|
Ionut Codrut wrote: all the information I've got from an external API is just this BITMAPINFOHEADER* pHeader, nothing more
that's all you need.
what happens if you use the code i posted ?
|
|
|
|
|
I have used your code as below:
BITMAPINFOHEADER *pHeader;
pHeader = (BITMAPINFOHEADER *)(odImage.bmp.begin() );
if(!pHeader)
return TRUE;
HBITMAP hbm;
// how many colors in this DIB?
int nColors = pHeader->biClrUsed ? pHeader->biClrUsed : 1 << pHeader->biBitCount;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)pHeader ;// make cast from BITMAPINFOHEADER!
LPVOID lpDIBBits;
if( bmInfo.bmiHeader.biBitCount > 8 )
{
lpDIBBits = (LPVOID)((UINT32 *)(bmInfo.bmiColors +
bmInfo.bmiHeader.biClrUsed) + ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
}
else
{
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
}
void *ppvBits = NULL;
hbm = CreateDIBSection(NULL,
(LPBITMAPINFO)pHeader,
DIB_RGB_COLORS,
&ppvBits,
NULL,
0);
m_TestBitButtonCtrl.SetBitmap(hbm);
I'm still got a black bitmap, HBITMAP is not NULL (checked with debug!).
Strange!
What I'm wrong?
Ioan
|
|
|
|
|
what are the values in the BITMAPINFOHEADER struct ?
|
|
|
|
|
|
those all look fine.
what happens if you use the CreateDIBitmap function instead of CreateDIBSection ?
|
|
|
|
|
Chris, the results seem to be the same, a black bitmap. Anyway in both cases it seems that there is something wrong with HBITMAP itself. I have attach a picture for that.
http://www.cnc-router.ro/temp/Screen1.JPG[^]
|
|
|
|
|
what do you get if you draw the original DIB (try StretchDIBits)
|
|
|
|
|
I'm struggle to implement it!
Keep you informed ASAP
|
|
|
|
|
I try this code:
int iRet = StretchDIBits(NULL,
// destination rectangle
0, 0, bmInfo.bmiHeader.biWidth, bmInfo.bmiHeader.biHeight,
// source rectangle
0, 0, bmInfo.bmiHeader.biWidth, -bmInfo.bmiHeader.biHeight,
ppvBits,
&bmInfo,
DIB_RGB_COLORS,
SRCCOPY);
But the function generates me an errror..
|
|
|
|
|
that first parameter has to be a valid DC (NULL is not a valid DC)
|
|
|
|
|
I have checked again CreateDIBitmap and I finally got the correct bitmap displaying on my button, so your code works just perfect!
Thank you very much for your time offered to me!
Best regards!
Ioan
|
|
|
|
|
|
Ok, so after trying for hours on end to get things working correctly I am posting here.
I am new to programming and trying to learn. Please provide me with clarification of how I have this screwed up. Also, please include how I can fix this. I learn through practicals.
Also, I have changed things so many times trying to call the function correctly with assigning the correct arguments but I am just so confused at this point I am asking for help.
#define _WIN32_WINNT (0x0601)
#include <windows.h>
#include <winbase.h>
#include <winreg.h>
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
DWORD pdwQuotaAllowed, pdwQuotaUsed;
GetSystemRegistryQuota(&pdwQuotaAllowed, &pdwQuotaUsed);
DWORD dwFlags;
RegGetValue(&dwFlags);
cout << pdwQuotaAllowed << endl;
cout << pdwQuotaUsed << endl;
return 0;
}
|
|
|
|
|
As a newbie to programming I would strongly caution you not to do anything to the registry. If you corrupt an entry you could end up with a totally unusable system.
As to the code you posted you need to read the MSDN documentation for details of how to use particular functions, e.g RegGetValue()[^] needs a lot more parameters than you offered. Once again, I would suggest you find something less likely to damage your system to learn on.
txtspeak is the realm of 9 year old children, not developers. Christian Graus
|
|
|
|
|
We can set task manager always on top by check options -> always on top
is that possible we can set our application window always on top
Trioum
|
|
|
|
|
You could create the window using WS_EX_TOPMOST , or use SetWindowPos()[^] to make an existing window have the always-on-top style.
|
|
|
|
|
See also somediscussions here[^].
txtspeak is the realm of 9 year old children, not developers. Christian Graus
|
|
|
|
|
I would like to update my CListCtrl at specific counts. I have tryed the following code and it does not update the control until the main loop is finished. What am I missing?
for(long x = 0; x != 1000;x++)
{
int iCount = 1000;
int a;
for ( long loop =0; loop != 100;loop++)
{
m_list.InsertItem(0,"Loop test");
}
m_list.UpdateData();
// test delay
do
{
a++;
} while(iCount--);
}
Any constructive help on subject is as always appreciated.
Thanks for reading.
Vaclav
|
|
|
|
|
What does UpdateData() do? The MSDN page[^] doesn't mention such a method.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
"CWnd::UpdateData
This method initializes data in a dialog box, or retrieves and validates dialog data."
To be truthful I am not sure if it does anything in my test case.
I was just trying to make it work for me. It works same wihtout it - the list updates on completion of the loop only.
I vaguely recall using it when I have been accessing (different) list control from functions and not in the loop like this time. It did update the list then.
I am currently looking onto LVITEM and see if it can be used.
Thanks for your input.
Vaclav
|
|
|
|
|
the documentation says it works for dialog box (update variables associated with controls with DDX macros) , not for lists or other controls.
Watched code never compiles.
|
|
|
|
|
Vaclav_Sal wrote: To be truthful I am not sure if it does anything in my test case.
Exactly the reason why you should not be using it. There are a few exceptions to this, but this is definitely not one of them.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Ah, that UpdateData, i belive that is only used on dialogs, i mean, you use it to move data between controls on a dialog and data members assigned to them, you usually don't use UpdateData on controls themselfs. Anyways, now i am a bit confused about what you are trying to achieve...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
Basically, I have nested loops changing one COM parameter at a time, outputing simple command ( 5 bytes ) to a serial device ( ham radio ) and reading the response ( frequency ). If the response is valid ( numeric characters ) I assume that the COM setup is correct.
The entire process ( about 80 steps) is displayed in a list control for about 2 seconds ( time for the hardware to react).
The code I used here was just to get the display working after each setup is completed.
The UpdateData was incorrect way to accomplish this( see last entry in thread).
Vaclav
|
|
|
|