|
The wording of you question needs work, but here is what you need.
SetBkMode(TRANSPARENT); (the text is drawn without drawing background).
If you need to be able to move the text around via draging then you will have to create a compatible bitmap of the appropriate size and draw the text on it then drag the bitmap around on top of whatever bitmap you are placing it on. In which case you will need to use the functions: GetTextExtent (to determine the size of the bitmap to create before drawing to it) and TransparentBlt (NT/Windows 2000) or some other method for drawing doing transparent blits. An example of one way to do transparent blits is in the code provided in CDibData and another in the MSDN library.
Good luck!
INTP
|
|
|
|
|
I use ado to connect the SQL Server in VC6.0!
what type will I create the image filed in SQL Server?
and how to store the image to database from an image file?
and how to get the image file from the database?
thanks!
|
|
|
|
|
Depends how big it is and how big the rest of the row is. If it's small and there won't be much other data in the row, you can get away with a varbinary column. Otherwise, use an image column. The limit on the size of a row in SQL Server 2000 is 8000 bytes.
To write to an image column, you need to use a Parameter on your Command , using the parameter type adLongVarBinary . Set the size of the parameter to the size of your image, and use AppendChunk to set the value of the parameter.
When you get the image data, use a Recordset as normal. You can use the ReadChunk method to get the image data a chunk at a time.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
to Mike Dimmick
If I get away with a varbinary column ,
how to write to a varbinary column and read from the column?
thanks!
|
|
|
|
|
I am trying to return a WCHAR* from a function.
The WCHAR* variable will be Marshalled to managed
code with Marshal.PtrToStringUni. If I don't new it
then PtrToStringUni returns the wrong result or nothing.
This does not work.
WCHAR* GetRecorderDriveLetter()
{
WCHAR drive[4] = {0};
m_hr = (*this)->GetRecorderDriveLetter(drive, 4);
return (drive);
}
This does.
WCHAR* GetRecorderDriveLetter()
{
WCHAR* drive = new WCHAR[4];
m_hr = (*this)->GetRecorderDriveLetter(drive, 4);
return (drive);
}
What I am worried about is a memory leak.
How does the memory get freed?
Thank You
Bo Hunter
|
|
|
|
|
Ok, the reason the first isn't working is because you are returning a pointer to local routine memory. This is memory on the stack. When the routine exits, the memory is removed from the stack and will soon contain other information.
In your second example, memory will need to be freed by the caller.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
1) Change the variable WCHAR drive[4] as a class member.
2) Or alter the function prototype into something like this:
some_return_type GetRecorderDriveLetter(WCHAR* pDrv);
Or even wrap the WCHAR array as an user type object (struct), then:
some_return_type GetRecorderDriveLetter(DriveObj& ref);
3) Or, just as Tim said,
// ......
WCHAR* pp = GetRecorderDriveLetter();
delete[] pp;
Maxwell Chen
|
|
|
|
|
I second Maxwell's second proposal: change the function to
HRESULT GetRecorderDriveLetter( WCHAR* pDrv ); and P/Invoke as follows:
[DllImport(DLL_NAME, CharSet=CharSet.Unicode, ExactSpelling=true)]
private static extern int GetRecorderDriveLetter( StringBuilder pDrv ); Make sure the StringBuilder you pass in has an appropriate Capacity for the called function.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
I am using Visual Studio.NET and the Visual C++ debugger all of a sudden started immediately hanging whenever it is invoked. I then have to control-alt-delete to shutdown VS. It isn't just the program I am trying to debug either because I have tryed to run the debugger on several other programs and the same thing is occuring. It has worked perfectly fine up to this point.
Has anyone else had this problem and if so, how did you resolve it?
Thanks in advance,
Josh
|
|
|
|
|
I have never heard about such a problem. You could try to "repair" your installation of visual studio using windowsinstaller.
Don't try it, just do it!
|
|
|
|
|
Using visual C++, can I monitor data on a serial port opened by another application?
I have an application that recieves data from a comm port. I want to write a program to idependently monitor the data that is recieved on this port, and (depending on the data) write it to a file. I don't have source to the application.
Is it possible to transparently view the data on a comm port like this?
I've tried using CreateFile() to get access to the port, but I get a "port in use" error.
Any help appreciated.
Thanks
Jim
|
|
|
|
|
IamJimW wrote:
I've tried using CreateFile() to get access to the port, but I get a "port in use" error
As far as I know, there's no way to do this. It's possible a replacement serial port driver could support something like this.
It's probably easier to use a 'breakout' program on another PC, listening to the RS-232 traffic via a 'Y' cable. Take a look at this[^], for example.
Software Zen: delete this;
|
|
|
|
|
Jim,
I don't know how to do this from Visual C++, but I believe that it can be done. A product that I purchased not too long ago does just that. It is called "Advanced Serial Port Monitor" and is available from here:
http://www.aggsoft.com/products/supercom/
I believe they also offer a software development kit that might be just what you need. The product is great too.
Robert
|
|
|
|
|
Check out PortMon at sysinternals.com
I don't think they give away the source, but they do talk in detail about inserting a driver to intercept such stuff. That is probably what you need.
Or you could brute-force it by reading the window displayed by PortMon. But that sure would be ugly!
Good luck!
|
|
|
|
|
Thanks everyone for your help.
It looks like a too-hard in VC++.
The solution looks to be one of the programs around that redirect the com port to an IP address, or use a cable splitter.
Jim
|
|
|
|
|
I have a c style function that calls windows api
to get the size of the menu item string.
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask = MIIM_TYPE;
mi.fType = MFT_STRING;
mi.dwTypeData=NULL;
GetMenuItemInfo(hMenu, 1, true, _mi);
This generates an Access violation in user32.dll.
How can I find out info or trap the exception in c
to see what is going on?
|
|
|
|
|
make sure you do zeromemory on the mi structure before you use it.
MSN Messenger.
prakashnadar@msn.com
Tip of the day of visual C++ IDE.
"We use it before you do! Visual C++ was developed using Visual C++"
|
|
|
|
|
Maybe I should clarify that I am trying to do this from another process.
void getMenuItem(HWND hWndMenu)
{
HMENU menu = GetMenu(hWndMenu);
MENUITEMINFO mi, *_mi; unsigned long pid;
HANDLE process;
GetWindowThreadProcessId(hWndMenu, &pid);
process=OpenProcess (PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
_mi=(MENUITEMINFO*)VirtualAllocEx(process, NULL, sizeof(MENUITEMINFO), MEM_COMMIT, PAGE_READWRITE);
ZeroMemory(&mi, sizeof(MENUITEMINFO));
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask = MIIM_TYPE;
mi.fType = MFT_STRING;
mi.dwTypeData=NULL;
WriteProcessMemory(process, _mi, &mi, sizeof(MENUITEMINFO), NULL);
// this fails GetMenuItemInfo(menu, 1, true, _mi);
ReadProcessMemory(process, _mi, mi, sizeof(MENUITEMINFO), NULL);
int size = mi.cch;
VirtualFreeEx(process, _mi, 0, MEM_RELEASE);
|
|
|
|
|
All,
I have created a combo box from the same set of parameters used to create a previous combo box. I hace verified that they have the same properties. Here are the properties. All "False" except where noted:
Data: empty box
ID: IDC_TRIGGERING
Owner Draw: No
Tabstop: True
Type: Drop List
Vertical Scrollbar: True
Visible: True
The idea is that I wish to present the user with a fixed list of values to choose from. The code to add items to the list is as follows:
nTriggerMode = GetPrivateProfileInt("Settings", "Triggering Mode", 0, "sdkdemo.ini");
lResult = SendMessage(GetDlgItem(hdlg, IDC_TRIGGERING), CB_ADDSTRING, 0, (long)"10");
lResult = SendMessage(GetDlgItem(hdlg, IDC_TRIGGERING), CB_ADDSTRING, 0, (long)"15");
SendMessage(GetDlgItem(hdlg, IDC_TRIGGERING), CB_ADDSTRING, 0, (long)"20");
SendMessage(GetDlgItem(hdlg, IDC_TRIGGERING), CB_SETCURSEL, nTriggerMode, 0);
The lResult variable is being incremented as the numbers are being added to the combo box, so that appears to be working. The value of nTriggerMode is pulled out of a file and whatever value it is set to initially (0, 1 or 2) successfully controls which of the three items is first shown in the display (10, 15 or 20).
Life is good...
Except, when I try and use the combo box by left clicking in the pulldown on the right of the box, nothing happens except that I get a narrow black line (1/16 inch) that appears under the combo box. The line then disappears when I click the pulldown again. The list of 3 items never appears.
I don't believe that I need to process messages for the combo box. The other application didn't. When I want to know what value the user has most recently entered I just do the following:
nTriggerMode = SendMessage(GetDlgItem(hdlg, IDC_TRIGGERING), CB_GETCURSEL, 0, 0);
Any ideas?
Robert
P.S. I am not using MFC in this code.
|
|
|
|
|
You need to set the size of the drop down list, for some idiotic reason it defaults to this zero value. At least, that's what happens when designing the dialog box using MFC. I have no idea how to do it in Win32, or even programatically, I always did it in the form designer.
Christian
I have drunk the cool-aid and found it wan and bitter. - Chris Maunder
|
|
|
|
|
Setting the size of the combo box is bit tricky if you havent done it before...
by default you can only resize horizontally... ifyou want to do vertical resizing click on the arrow key and then you can resize vertically.... (all this in form design view).
MSN Messenger.
prakashnadar@msn.com
Tip of the day of visual C++ IDE.
"We use it before you do! Visual C++ was developed using Visual C++"
|
|
|
|
|
Mr. Prakash,
Thanks, I found a similar answer in another thread, from another Indian guy
In the resource editor if you click in the middle of the combo box, blue squares appear on the left and right, allowing you to make the box wider or narrower. But, if you click on the pulldown itself, there is a single blue box in the bottom center. Grabbing that blue box and pulling it down defines what size the combo box is when initially displayed.
Too bad they don't say anything about this in the help area...
Actually, it is explained. It is under "Combo Boxes" then "sizing".
Robert
|
|
|
|
|
What's wrong with my code ?
CString PrintName;
PRINTER_INFO_1 PrintInfo[3];
LPDWORD pNeedSize;
LPDWORD pPrinters;
DWORD cbSize;
cbSize = sizeof(PrintInfo);
if ( EnumPrinters(PRINTER_ENUM_NAME,(LPTSTR)&PrintName,1,(LPBYTE)PrintInfo,cbSize,pNeedSize,pPrinters) != 0 )
{
this->MessageBox("SUCC");
}
else
{
int err = ::GetLastError();
this->MessageBox("fail");
}
d
|
|
|
|
|
One thing i can see is
CString PrintName;
...
EnumPrinters(PRINTER_ENUM_NAME,(LPTSTR)&PrintName,1,(LPBYTE)PrintInfo,cbSize,pNeedSize,pPrinters)
it should be
EnumPrinters(PRINTER_ENUM_NAME,PrintName.GetBuffer(100),1,(LPBYTE)PrintInfo,cbSize,pNeedSize,pPrinters)
Is there anyother error that you get ?
MSN Messenger.
prakashnadar@msn.com
Tip of the day of visual C++ IDE.
"We use it before you do! Visual C++ was developed using Visual C++"
|
|
|
|
|
I think you need to call EnumPrinters twice, the first time to find out how much memory is required to store the information returned, and the second time to actually get that information.
It probably doesn't work unless you allocate enough memory for the information returned.
Also, to enumerate all printers, use PRINTER_ENUM_LOCAL
refer MSDN for details
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_9fjn.asp[^]
sample code
DWORD dwSizeNeeded = 0;
DWORD dwPrinterCount = 0;
BOOL bEnumResult;
CString strErr;
HANDLE hProcessHeap = GetProcessHeap();
LPPRINTER_INFO_2 lpPrinterData;
EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &dwSizeNeeded, &dwPrinterCount);
if ((lpPrinterData = (LPPRINTER_INFO_2)HeapAlloc(hProcessHeap,
HEAP_ZERO_MEMORY, dwSizeNeeded)) == NULL)
{
return;
}
bEnumResult = EnumPrinters (PRINTER_ENUM_LOCAL,
NULL,
2,
(LPBYTE)lpPrinterData,
dwSizeNeeded,
&dwSizeNeeded,
&dwPrinterCount);
if (bEnumResult) {
if (dwPrinterCount == 0) {
HeapFree(hProcessHeap, 0, lpPrinterData);
return;
}
}
HeapFree(hProcessHeap, 0, lpPrinterData);
return;
|
|
|
|
|