|
The actual opening of the document is tied with the Folder Settings found from Windows Explorer. You insert a new file type binding into this long list to tell Windows that whenever user wants to open this type of file, it will start your program.
The problem you're describing indicates that your program's files are not functioning properly. Have you tried to start your program without opening a file ? Like, just by running it ?
Naturally, you should check the Folder Settings to make sure that the path located in there points to the correct destination where your program resides. Also, make sure that your source code can handle the opening of files. In the Windows world, when a document is double-clicked, Windows checks whether the file type has a binding, and if it does, it calls the specified program and issues the filename as the first parameter.
Hope this will help. If the problem is with some other type of a document (i.e. not your own), then post more details on the type of file etc..
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
The file opens properly when I do a File-Open from the menu. Everything in the registry appears to be proper. The file extension is associated with the correct executable. When I double-click the file it starts the program, gives the error message, and then fails to load the file.
Gary Kirkham
A working Program is one that has only unobserved bugs
I thought I wanted a career, turns out I just wanted paychecks
|
|
|
|
|
Hi there, i'm doing image processing in VC++6. How can i perform thresholding (converting color to b&w) on an image, as fast as possible? I'm able to do using GetPixel & SetPixel but it is too slow. Anyway i can access the pixels directly??
Here is the code
//Image width=height=Big=360 px
int Big=360;
//Create a DC for buffering image
CDC MemDC,*pDC;
CBitmap MemBitmap;
// Get Current DC from dialog box,
pDC = myDlg->GetDC();
MemDC.CreateCompatibleDC(pDC);
//
MemBitmap.CreateCompatibleBitmap(pDC,Big,Big);
CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);
//------------custom hardware function that draws image from camera to DC-----------//
imgPlot ((GUIHNDL)MemDC.GetSafeHdc(), (void *)ImaqBuffer, 0, 0, Big, Big, 410, 10, plotFlag));
//-------------------------------------------
//My thresholding function, which is very slow!!!
//check every pixel, if it is bigger than threshold then turn it black
//and white otherwise
//**********
for(int i=0;i<360;i++)
for(int j=0;j<360;j++)
{
if(MemDC->GetPixel(i,j)<=RGB(64,128,255))
MemDC->SetPixel(i,j,RGB(0,0,0));
else
MemDC->SetPixel(i,j,RGB(255,255,255));
}
pDC->BitBlt(10,10,Big,Big,&MemDC,0,0,SRCCOPY); //See Note 3
MemDC.SelectObject(pOldBitmap);
//---------------------------
The code is too slow for real time. How can i do thresholding faster?
|
|
|
|
|
Haven't messed with bitmaps in a while, but try GetBitmapBits(), which will give you an array of bytes containing the bitmap. Then run through this array changing values. Then call SetBitmapBits() with the modified array. This should be much faster.
____________________________________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. (Rich Cook)
|
|
|
|
|
Hi there, can you give me an example of using the GetBitmapBits()? I cant find any example on it.
|
|
|
|
|
This is copied from a test app I wrote (real quick, so don't be too critical - it works).
CPaintDC dc(this);
CRect cRect; GetClientRect( cRect );
int nWidth = cRect.Width();
int nHeight = cRect.Height();
CBitmap cBitmap;
cBitmap.LoadBitmap( IDB_BITMAP1 );
DWORD* pBuffer = new DWORD[ nWidth * nHeight ];
DWORD dwSize = cBitmap.GetBitmapBits( nWidth * nHeight,
pBuffer );
for ( int y = 0 ; y < nHeight ; y++ )
{
for ( int x = 0; x < nWidth ; x++ )
{
if ( *(pBuffer+x+nWidth*y) < RGB( 64, 128 , 256 ) )
{
*(pBuffer+x+nWidth*y) = 0;
}
else
{
*(pBuffer+x+nWidth*y) = 0x00FFFFFF;
}
}
}
cBitmap.SetBitmapBits( nWidth * nHeight ,
pBuffer );
CDC cMemDC;
cMemDC.CreateCompatibleDC( &dc );
cMemDC.SelectObject( &cBitmap );
dc.BitBlt( 0,
0,
nWidth,
nHeight,
&cMemDC,
0,
0,
SRCCOPY );
delete [] pBuffer;
|
|
|
|
|
Thanks a lot for the help. Looking at the code you gave me, seems that it would be faster than the one i just figured out, :P
i havent try your code yet, coz i just got wrote myself a working code. Here is the code that i wrote,
//the test image "bmptest.bmp" is a color bmp 360x360 pixels
------------------------------------------
CDC *pDC;
CDC memDCLoad;
CBitmap m_bmpBitmap;
pDC = this->GetDC();
CString m_sBitmap;
m_sBitmap="bmptest.bmp";
memDCLoad.CreateCompatibleDC(pDC);
HBITMAP hBitmap =(HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_sBitmap,IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_DEFAULTCOLOR);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
memDCLoad.SelectObject(&m_bmpBitmap);
pDC->BitBlt(0,0,360,360,&memDCLoad,0,0,SRCCOPY);
BYTE test[(4*360*360)];
void* pbBits = test;// One bit per pixel
m_bmpBitmap.GetBitmapBits(4*360*360, &pbBits);
for(int i=0;i<360*360;i++)
{
//BGR=000 //black
//BGR=255,255,255//white
int temp=i*4;
//test[temp+0]=0;//blue
//test[temp+1]=0;//green
//test[temp+2]=0;//red
//test[temp+3]=255;//padding
BYTE gray= (byte)(test[temp+2]*0.299
+test[temp+1]*0.587
+test[temp+0]*0.114);
if(gray<=230)
{
test[temp+0]=0;//blue
test[temp+1]=0;//green
test[temp+2]=0;//red
}
else
{
test[temp+0]=255;//blue
test[temp+1]=255;//green
test[temp+2]=255;//red
}
}
m_bmpBitmap.SetBitmapBits(4*360*360, &pbBits);
pDC->BitBlt(360,0,360,360,&memDCLoad,0,0,SRCCOPY);
|
|
|
|
|
My inner loop could be much simpler and faster:
for ( int x = 0 ; x < dwSize ; x++ )
{
if ( pBuffer[x] < RGB( 64, 128 , 256 ) )
{
pBuffer[x] = 0;
}
else
{
pBuffer[x] = 0x00FFFFFF;
}
}
I was thinking two-dimensions, but it's really just one one big buffer
|
|
|
|
|
The function for thresholding works extremely fast compared by using SetPixel and GetPixel. However, i got another problem now.
My camera (frame grabber) returns the captured image in a CDC object only. And not in a Cbitmap. A CDC object does not have SetBitmapbits and GetBitmapBits members, so i cant call those. I can only access pixels in CDC using GetPixel and SetPixel. (Correct me if i'm wrong). And using Get & SetPixel is too slow, hence i needed a faster algorithm which you came up with. To use getbitmapbits, the object must be a CBItmap.
However, my question is now, how to copy contents of a CDC/DC buffer or object (already contains data) to a CBitmap object for processing, and then back to CDC object?
//------------custom hardware function that draws image from camera to DC-----------//
imgPlot ((GUIHNDL)MemDC.GetSafeHdc(), (void *)ImaqBuffer, 0, 0, Big, Big, 410, 10, plotFlag));
//-------------------------------------------
MemDC is a DC. Now contains an image copied from the camera buffer (ImaqBuffer) using a driver function.
How to copy MemDC to a CBitmap and do the thresholding with the function you came up with?
After finishing, how to copy the CBitmap back to MemDC for plotting on window etc.
THanks for the great help.
|
|
|
|
|
try using MemDC.GetCurrentBitmap() which returns a pointer to a CBitmap. Then you can do the thresholding with it.
|
|
|
|
|
Thanks, i tried that (GetCurrentBitmap), and it is exactly what i needded. Thanks a lot! You're a genius! Guess it works! Thanks a lot.
I'll find u againg, if i've got problem.. haha :P
|
|
|
|
|
uus99 wrote:
The code is too slow for real time. How can i do thresholding faster?
Can you get the hardware to give you a pointer to the image data instead of ploting it to a dc?
John
|
|
|
|
|
On a tangent :
How did you come up with RGB(64,128,255) as a B&W threshold color ?
I would have expected to take the pixel color, get its grey value, and check that against a threshold value of 128 (or whatever).
e.g.
byte grey = (byte)(
(R * 0.299) +
(G * 0.587) +
(B * 0.114)
);
...cmk
Save the whales - collect the whole set
|
|
|
|
|
John
>>Can you get the hardware to give you a pointer to the image data instead of ploting it to a dc?
The pointer to the image buffer is (void *)ImaqBuffer, however, i do not know the structure of data in it. The only way i can access it is by plotting to DC.
>>I would have expected to take the pixel color, get its grey value, and check that against a threshold value of 128 (or whatever).
I know, my comparison is just too crude. Thanks. I'll try that, but i still have to check all the pixels using SetPixel & GetPixel which is too slow. I need it fast.
>>Haven't messed with bitmaps in a while, but try GetBitmapBits(), which will give you an array of bytes containing the bitmap. Then run through this array changing values. Then call SetBitmapBits() with the modified array. This should be much faster.
I havent try this, but i will. I'll see how fast it is.
Btw, i've tried this.
1. Open a color bmp from disk and change it to B&W using LR_MONOCHROME
2. Open a color bmp, load into DC and do setpixel and getpixel.
The first method is way faster.. How come? I need a way to convert that fast. But, i want to do everything in memory to overcome disk read overhead.
Although, in this case, the 1 method is still faster, although i'm reading from disk.
|
|
|
|
|
Try creating a monochrome bitmap, and do a BitBlt() from the colour one to the monochrome one - let Windows do all the work for you. It doesn't give you control over the threshold, but might be adequate for what you need.
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 want to modify the explorer.exe in xp
First,I modify the explorer.exe which in system32\dllcache,then modify the explorer in \windows,
system will notify me the file been modifyed,ask me whether resume the file.I know the system has a list
to point which files had been protected.How could I modify
the list so that I can modify the explorer.exe (any been protexted files) at will.
|
|
|
|
|
Uh... why do you want to modify explorer.exe? The only reason I can see modifing explorer.exe is malicious which is probably why you posted anonymously. If it isn't malicious you are gonna have to find a different way to do it.
Matt Newman
If you chose to continue this discussion, I am fully prepared to make you my bitch. I invite you to ask around, and you'll find out that I'm quite capable of doing so - John Simmons on Trolls
|
|
|
|
|
The files are protected for a simple reason: to prevent people from tampering with them. Even from a programmer's point of view, this is a good thing: no matter how badly your software bugged, it can't modify crucial things or endanger the operation of the system.
If you want to write an extension to the Windows Shell, see the Shell programming guide available here at CodeProject. If you want to write a completely new shell, see the source code of LiteStep.
If you just want to make the Shell do something it isn't normally supposed to do and in doing which may hamper it's operation, then you're out of luck: no can do.
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
Hi guys.
I'd like to show a dialog displaying a long amount of text, but I don't want to have the text in a text file, I'd like to have it in a resource.
What's the best way to do it?
How I have to store the information (text) in my app?
Do you know a class to do this?
Thanks a lot
Doc
|
|
|
|
|
Put a line like this in your projects .rc2 file:
RESOURCE_NAME TEXTFILE "res\\MyTextFile.txt"
Then to extract it in code:
CString target;
LoadResource(&target, "RESOURCE_NAME");
bool LoadResource(CString *script, const char* name)
{
bool bOK = false;
HRSRC hFRes = ::FindResource(AfxGetResourceHandle(), name, "TEXTFILE");
if (hFRes != NULL)
{
HANDLE hRes = ::LoadResource(AfxGetResourceHandle(), hFRes);
if (hRes != INVALID_HANDLE_VALUE)
{
char *lpRes = (char*)::LockResource(hRes);
DWORD size = SizeofResource(AfxGetResourceHandle(), hFRes);
CString format;
format.Format("%%.%1ds", size);
script->Format(format, lpRes);
::UnlockResource(hRes);
::FreeResource(hRes);
bOK = true;
}
}
return bOK;
}
Roger Allen - Sonork 100.10016
Roger Wright: Remember to buckle up, please, and encourage your friends to do the same. It's not just about saving your life, but saving the quality of life for those you may leave behind...
|
|
|
|
|
how can i make my own custom class wizard for vs.net 2003?
thanks and greets from austria
|
|
|
|
|
Erm..
I don't quite understand what you mean.. The VS.Net 2003 has a class wizard, though it is somewhat different from the ones which ship with VS version 6. The new wizard, I think, is vastly more powerful..
But, the only thing I am aware of is writing new application wizards. I don't know if you can replace the original Class Wizard in any way.. Perhaps there's another way to accomplish what you're after ?
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
I have created a socket using WSASocket function with the last parameter as Overlapped flag ie overlapped socket.
Then i have registered it for async. notification of the incoming connection using WSAAsyncSocket fn.(FD_ACCEPT). I am getting notification of the same. After accepting socket connection, i am making the accepted socket non-blocking using ioctlsocket fn. The last parameter specified is unsigned long int with the value as 1. Also i have registered for FD_WRITE notification using WSAAsyncSocket fn. which also make the socket as non-blocking socket. Now when i am pumping data on the accepted socket it is getting blocked if the client app. is reading the data slowly .. i have used WSASend fn to send the data on the network. The last two parameters of the fn is NULL. I should get WSAEWOULDBLOCK error if the send buffer of the transport layer is full but rather it is getting blocked .. i didn't understand why it is getting blocked ??
|
|
|
|
|
So everything works correctly if the client reads the data at normal speed?
I am not familiar with WSAAsyncSocket. Under non-blocking I/O model that utilizes OVERLAPPED I/O such as WSAEventSelect and IOCP, windows updates the process on the size of the actual buffer that has been sent to the remote system.
Kuphryn
|
|
|
|
|
In the debug mode i am restricting the client to read any data. The client is not reading any data but it receives the data at a very fast speed. I have specified NULL for the last two parameter of the WSASend fn.
|
|
|
|
|