|
My program is a small GIS and I was using GDI to display maps and informations. Now I would like to use GDI+ and I didn't find any function to draw a pixel ? Do I have to use GDI to draw pixels and GDI+ to draw the other stuff ?
Thanks !
|
|
|
|
|
You can use Graphics.SetPixel, but it is quite slow. You can also use Bitmap.GetData, which returns a BitmapData object, whose Scan0 property is a pointer to the bitmap's data (in BGR format, not RGB format).
"Do unto others as you would have them do unto you." - Jesus
"An eye for an eye only makes the whole world blind." - Mahatma Gandhi
|
|
|
|
|
can't seem to add an about dialog to the system menu. (all I have is MOVE and CLOSE.
This is what I have done:
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
|
|
|
|
|
In .NET if I want my class to inherit from theinterface IDisposable, and also to be derived from a base class MyBaseCLass
Separately if I only were deriving from one I know it would be:
myDerivedClass:public MyBaseClass
and
myDerivedClass: public IDisposable
But how would I have both together (syntax)?
Appreciate your help,
ns
|
|
|
|
|
myDerivedClass : public MyBaseClass, public IDisposable
-Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
|
|
|
|
|
|
I just installed VC 6.0 (SP 5.) on a Win2000 PC and the compiler will not execute. Error says something about vcspawn.
NE1 have this problem or know of a solution?
|
|
|
|
|
[EDIT]oops, I forgot the correct directory is MSDEV98, not MSDEV.[/EDIT]
The installation probably failed to install VCSPAWN.EXE, which is the program used to control the compiler and linker. Just copy it directly off your CD into the "\Program Files\Microsoft Visual Studio\Common\MSDEV98\BIN\" directory.
Or, if you don't feel like that is a good solution (or the installation is more messed up than just that one file), just reinstall VC6.
Chris Richardson
You can stash and you can seize
In dreams begin, responsibilities U2 - Acrobat[^]
Stop being PC and accounting for everyone and his momma's timeframe. Just enjoy your - Rohit Sinha in the content-challenged thread
|
|
|
|
|
I am a C++ programmer trying to get familiar with VS 7.0 (I have previously been working in 6.0). I cannot seem to get any macro to work in VS 7.0. I had some from 6.0 that I tried to use and I have also tried using samples macros and nothing happens. I get an hour glass for a second or two and then nothing. Is there something I'm not aware of?
|
|
|
|
|
The object models changed dramatically between VC6 and VS.NET. I had to rewrite my macros from scratch.
This was less painful than you might think. A number of my macros were no longer necessary. For example, I had one that did a 'find and replace' in all of the open documents. That functionality is builtin now.
Software Zen: delete this;
|
|
|
|
|
I second that ... I had to rewrite most of mine from scratch too. Again, it wasn't too difficult and there were a few that were thrown out because the editor supported the functionality.
Good luck
Give me one more medicated peaceful moment
|
|
|
|
|
I am experiencing extremely slow performance when using the MFC CBitmap::CreateCompatibleBitmap() and CDC::BitBlt() to copy compatible bitmaps between device contexts. Sometimes the calls are extremely fast, as expected from the wealth of documentation that recommends using memory bitmaps to optimize graphics. However, they are frequently slow, meaning that a single call to the either method takes approximately 0.5 seconds (sometimes more), which is obvious to our applications’ users.
I need to understand why some calls to these two methods are so slow and what we can do to prevent this from happening.
The zip file I have attached contains a DevStudio 6.0 MFC application with a few lines of code added to show the problem.
Test Procedure.
1) Run the application.
2) Resize the view - larger windows fail sooner.
3) Use File/DC Test to bring up the test dialog
4) Press the Blit button repeatedly, and look at the time reported in the message on the dialog. After a while, it will suddenly be much slower.
Test Implementation.
The application stores a number of CDC's and CBitmap's that are all the same size and compatible with the CView's CDC. On the first blit button press there is one CDC/CBitmap pair, then two on the second, etc. Each time the button is pressed, the old CDC/CBitmap's are destroyed, and new ones are created. The first CDC is BitBlt’ed to the second, the second to the third, etc, and finally the top CDC is blitted to the screen. Basically, this is done in two simple functions, controlled from the dialog callback:
CDeviceContextBufferCollection::CreateBuffer() - 5 Lines of Code
CDeviceContextBufferCollection::Copy() - 7 Lines of Code
CDCDrawer::OnBlit() - < 20 Lines
All the other code is for house keeping, and there is not much of it. The application was created with the MFC application wizard and is largely unchanged.
The times for each method are measured using a high performance timer, and are shown on the dialog. The time for each BitBlt() is also measured and sent to the TRACE window and can be seen when debugging.
For the first few executions, both calls are fast. However, at some point their performance will degrade. The trace output will show that some BitBlt()s are still very fast and some now are very slow. Note that all of these timed BitBlt()s are from one memory bitmap to another (i.e. not to the screen) and all the CDC's and CBitmap's are compatible (i.e. there are no DIBs).
Sample Execution:
Machine Info: P4 1.4GHz, Screen size 1600x1200, 16-bit color depth, 512Mb memory, 512Mb graphics card.
With the application Maximized, trace window output:
BitBlt took 741.828920ms
BitBlt took 38.999929ms
BitBlt took 14.086707ms
This shows that one BitBlt() took almost 3/4 seconds; the other two were quick. The first one (the slow one) is copying between two memory bitmaps; the new one is also two memory bitmaps, but is faster, and the last time, which is the fastest, is between a memory bitmap and the screen.
With a smaller window more bitmaps have to be allocated before it fails:
BitBlt took 0.016483ms
BitBlt took 0.016483ms
BitBlt took 0.012571ms
BitBlt took 0.012292ms
BitBlt took 0.011733ms
BitBlt took 0.012013ms
BitBlt took 0.012013ms
BitBlt took 0.011733ms
BitBlt took 0.012013ms
BitBlt took 246.562622ms
BitBlt took 10.034516ms
BitBlt took 2.872153ms
Again, there are lots of fast BitBlt()s and one very slow one; BitBlt()ing to the screen remains fast at 3 ms.
Once a particular BitBlt() is slow, then copying between that pair of CDC will always be slow. This behaviour is not really shown by the test application, as the CDC's and CBitmap's are destroyed and recreated on each iteration. Once a 'slow' CBitmap has been allocated, then next one allocated will often be slow too, sometimes is fast.
These times are typical on my machine, when it has just been rebooted, and Task Manager shows memory usage at around 100Mb (on the 512Mb machine). Hence I do not believe it is memory fragmentation/virtual memory issue. When the CView is not maximized, each CBitmap is relatively small (< 1Mb) so allocating 20 or so should not be a big deal. The same issue is seen on a variety of machines / OSs, and general older machines fail sooner. When the performance is good, Task Manager does not register any CPU usage; as soon at it is bad, CPU usage goes to 100 %.
The same application has been run on several other computers. I discovered that the behavior is slightly different between the different machines. Some machines had the CreateCompatibleBitmap() method being always fast and the BitBlt() degrading in performance. Other machines had both methods equally bad.
The real application requires several memory bitmaps to optimize z-layer drawing, more than two. Our simple test application gives poor performance when two are allocated. Using memory bitmaps and compatible CDC's is described everywhere as a method of gaining good performance. What are we doing wrong?
Download dctest.zip (~28k)
: Dean 'Karnatos' Michaud
|
|
|
|
|
If I have a class C that is derived from classes A and B as follows:
class C : public A, public B
If I am inside of a member function of class A, is there any way to get a pointer to class B?
Gary Kirkham
A working Program is one that has only unobserved bugs
I thought I wanted a career, turns out I just wanted paychecks
|
|
|
|
|
Not automatically, since "A" has no idea that class "C" derived from it, let alone that "C" also derived from "B".
You'd have to pass in a pointer to a "B" into class "A" via a member function or something.
"When a man sits with a pretty girl for an hour, it seems like a minute. But let him sit on a hot stove for a minute and it's longer than any hour. That's relativity." - Albert Einstein
|
|
|
|
|
I agree, However in the deep dark recesses of the peanut I call a brain I seem to remember you could access the other class by offsetting the class A pointer by some amount. The classes are stored contigously in memory. I just can't remember the details.
Gary Kirkham
A working Program is one that has only unobserved bugs
I thought I wanted a career, turns out I just wanted paychecks
|
|
|
|
|
But That's an ugly hack!
Max.
Maximilien Lincourt
For success one must aquire one's self
|
|
|
|
|
Agreed
Gary Kirkham
A working Program is one that has only unobserved bugs
I thought I wanted a career, turns out I just wanted paychecks
|
|
|
|
|
B *b = static_cast <B *> (static_cast <C *> (this));
This assumes this is a pointer to A.
You do have to remember that in theory, this is very unsafe since it assumes that the member function is in fact being invoked from an instance of C. However, as long as that is the case, it works perfectly well.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
B *b = static_cast < B *> (static_cast< C *> (this));
That's a heck of a line of C++ !
Max.
Maximilien Lincourt
For success one must aquire one's self
|
|
|
|
|
Unfortunately, A doesn't know who C is...C could be any one of a number of classes.
Gary Kirkham
A working Program is one that has only unobserved bugs
I thought I wanted a career, turns out I just wanted paychecks
|
|
|
|
|
Oh well, that depends on C being well known. :/
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
why don't you do this:
class A {};
class B: public A {};
class C: public B {};
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|
|
I'm using the CreateProcess to run an application. Here's how I am calling it:
if (CreateProcess(cmd, cmdline,
NULL,
NULL,
TRUE,
0 /*CREATE_NEW_CONSOLE */,
NULL,
NULL,
&si,
&pi) != 0){
My problem is I'm passing in a command line option, but the option is NOT being sent to the application being run. The app runs and Create Process returns correctly, but the app I'm running just doesn't do what I want it to.
I've looked through the MSDN definition, but I haven't found a solution. I've tried everything it suggests, but it still doesn't work, not matter what command line option I put in there. None of them get passed in.
Anyone have any ideas or suggestions? Thanks!
|
|
|
|
|
merge the app string and the commandline string into one, put it instead of your command, set the commandline to NULL.
~RaGE();
|
|
|
|
|
I've already tried that as well. I've tried all the ways that MSDN suggest. When I use that method, I get an error 2, which means "The system cannot find the file specified." or ERROR_FILE_NOT_FOUND. But the file is there, and the path is correct.
I also tried adding the app name to the commandline string and setting the command to NULL, as well as having the command in there as well.
Any other ideas or suggestions?
|
|
|
|