|
Printer page has more pixels than dialog, I guess your problem is not resolution but pixelization. Try to make smooth magnification using SetStretchBltMode.
|
|
|
|
|
Thanks. Doesn't seem to be the solution though. Isn't it possible to pass the CDialog a device context with a higher resolution, and get it to draw it (avoiding the rasterization which occurs when stretching)?
Jonnie
|
|
|
|
|
I'm having problems using qsort on a CArray of pointers. I've read the CP article 'Using qsort on arrays of sequential data' but this doesn't sort pointers - it only mentions having to do a second level of casting when sorting pointers.
Here's a simplified version of what I'm doing:
header file
===========
// data to be sorted
class CFundData
{
public:
CFundData() {}
virtual ~CFundData() {}
CString m_sFundId;
CString m_sFundName;
};
// array of CFundData*
typedef CArray<CFundData*, CFundData*> CFundDataPtrArray;
// sorting functions
typedef int (*QSORT_FUNC_T)(const void*, const void*);
void SortFundData(CFundDataPtrArray& arrayFundData);
int __cdecl CompareFundData(const void* elem1, const void* elem2);
implementation file
===================
void Foo()
{
// array of CFundData*
CFundDataPtrArray arrayFundData;
// populate array with data
CFundData* pFD = NULL;
pFD = new CFundData; pFD->m_sFundId = "S100"; pFD->m_sFundName = "GHI";
arrayFundData.Add(pFD);
pFD = new CFundData; pFD->m_sFundId = "S200"; pFD->m_sFundName = "ABC";
arrayFundData.Add(pFD);
pFD = new CFundData; pFD->m_sFundId = "S300"; pFD->m_sFundName = "DEF";
arrayFundData.Add(pFD);
// sort the array
SortFundData(arrayFundData);
}
void SortFundData(CFundDataPtrArray& arrayFundData)
{
// sort array using qsort and the comparison
// function CompareFundData
if (arrayFundData.GetSize() > 0)
{
qsort((void*)arrayFundData[0], (size_t)arrayFundData.GetSize(),
sizeof(CFundData*), (QSORT_FUNC_T)CompareFundData);
}
}
int CompareFundData(const void* elem1, const void* elem2)
{
// comparision function to sort by FundName
CFundData* pFD1 = (CFundData*)elem1; // 'bad' first time called
CFundData* pFD2 = (CFundData*)elem2; // 'good' first time called
return pFD1->m_sFundName.Compare(pFD2->m_sFundName);
}
The first time CompareFundData is called pFD2 is ok (it's the first item in the array) but although pFD1 'looks' like the second item in the array, it is not a valid CFundData object.
I know I should probably be using the STL, but I don't want to bring it into the app for this 'simple' sort. Can anyone help?
Gavin
|
|
|
|
|
I would recommend using STL and a vector template.
May sound a pain, but is much easier than it seems and gets around loads of problems with CArray.
e.g.
#include <vector>
using namespace std;
vector<CFundData> vCFundData;
CFundData a, b, c;
vCFundData.push_back(b);
vCFundData.push_back(a);
vCFundData.push_back(c);
sort(vCFundData);
Also see STL Sort Article
Hope this helps.
Giles
|
|
|
|
|
I know I should probably be using the STL, but I don't want to bring it into the app for this 'simple' sort.
You really should, there's nothing wrong with bringing STL to an app however small that app is. Note also that STL sort algorithm will work with your CFundDataPtrArray s, no need to switch to std::vector s.
Anyway, your problem with how you're using qsort is that you need an extra layer of indirection. Do not pass pointers to qsort , pass it pointers to pointers. Here's how:
void SortFundData(CFundDataPtrArray& arrayFundData)
{
if (arrayFundData.GetSize() > 0)
{
qsort((void*)&arrayFundData[0],
(size_t)arrayFundData.GetSize(), sizeof(CFundData**),
(QSORT_FUNC_T)CompareFundData);
}
}
int CompareFundData(const void* elem1, const void* elem2)
{
CFundData** pFD1 = (CFundData**)elem1;
CFundData** pFD2 = (CFundData**)elem2;
return (*pFD1)->m_sFundName.Compare((*pFD2)->m_sFundName);
} Again, this would be greatly simplified by using STL sort , which is a generic soultion that will pay off in the long term.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thanks for your reply - the qsort now works a treat!
I've had a go at using the STL sort and vector:
// declare vector
vector<cfunddata*> vFD;
vector<cfunddata*>::iterator it;
// populate vector
...
// sort the vector
sort(vFD.begin(), vFD.end(), compareFundName);
// comparision function
bool compareFundName(const CFundData* lhs, const CFundData* rhs)
{
return lhs->m_sFundName < rhs->m_sFundName;
}
This works, and is definately neater than the qsort approach. Is this the best STL way? You mentioned using STL sort with CFundDataPtrArray, but I'm not sure how to do this.
Gavin
|
|
|
|
|
This works, and is definately neater than the qsort approach. Is this the best STL way? You mentioned using STL sort with CFundDataPtrArray, but I'm not sure how to do this.
This should do:
std::sort(
&arrayFundData[0],
(&arrayFundData[0])+arrayFundData.GetSize(),
compareFundName);
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Wow! That's very nice - I'll take it. Thanks for your help.
Gavin
|
|
|
|
|
Hi,
I cant find classwizard to handle messages as WM_CREATE ...
Where is it ??
|
|
|
|
|
The short answer is: it's gone.
The class wizard in VS .NET is replaced by the property grid. Simply open the cpp file of your class and then click on the property tab. You will see the events and messages in the grid.
// Fazlul
Get RadVC today! Play RAD in VC++
http://www.capitolsoft.com
|
|
|
|
|
Thankx
And handle messages WM_CREATE for control as button, static ??
...in the resource editor is the page "messages" disable for control ((
Wiizi
|
|
|
|
|
If you want to add handlers for dialog controls, you need to bring the dialog in the resource editor and then you should see the messages in the property grid.
// Fazlul
Get RadVC today! Play RAD in VC++
http://www.capitolsoft.com
|
|
|
|
|
Is not ClassWizzard in .NET
But if you are experimented programmer in VC++, don't need the Classwizzard ;););)
Carlos Antollini.
Sonork ID 100.10529 cantollini
|
|
|
|
|
?? I dont like writing too much code therefore i use (my fried)classwizard
Wiizi
|
|
|
|
|
How to add a menu item to the sysmenu in hWnd with sysmenu ID ID_SYSMENU?
The hWnd is another app that I've done, and my other app is to make it possible to add a menu item to my other app.
Can you illustrate a code for me!! I've been doing it for a while but can't get it to work...
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
How do i send a file over a tcp connection with a normal CSocket? or whats the easiest way to do this??
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
Hi Kuniva,
After you called the create and connect functions on the sockClient_ (client socket), do this
...
CSocketFile file_(&sockClient_);
CArchive outFile_(&file_,
CArchive::store);
outFile_ << xpto; // the data you want to send
note : this only works for stream connection
On server side you do the opposite :
... // do the accept and listen and ...
CSocketFile file_(&sockServer_);
CArchive inFile_(&file_,
CArchive::load);
inFile_ >> xpto;
for more examples, you could check the CHATSRVR and CHATTER on MSDN
or the site for good examples of socket programming http://www.sockets.com/
Cheers,
Joao Vaz
|
|
|
|
|
I have been working on an app for weeks now and I am in final stages of development. Suddenly things are going haywire.
The situation I am at is that variables in the app are changing without any code being called to cause the change. For example, BOOL value is set to FALSE in the constructor - I come to check it later in the app (having set a breakpoint on the only function which changes the value) and it has changed to TRUE without the function being called. This is happening across a few different variables.
Any ideas - I really need help with this cause I'm going out of my mind.
James Spibey
I love the word naked, it's brilliant isn't it, 'naked'. When I was a kid I used to write the word naked on a bit of paper hundreds of times and rub my face in it - Jeff, Coupling, BBC2
|
|
|
|
|
Does this "unusual" behaviour only happen in the "Release" version, or also in the "Debug" version.
I had similar problems, where a function bool foo(DWORD& dwValue) was called, the dwValue was not used, and when the function returned there was only "Garbage" in dwValue.
This strange behaviour happens because VS in the "Debug" version, allocates more memory for variables etc (usually before and after the actual variable) AND initialises it.
In the release version is does not.
|
|
|
|
|
Thanks for the response. Unfortunately, this is in the debug version. I have checked and the variables all get initialised properley in their constructors but the value has changed by the time I come to check it.
Is there a way to set a breakpoint on a value so that when it is accessed/modified I get notified?
James Spibey
I love the word naked, it's brilliant isn't it, 'naked'. When I was a kid I used to write the word naked on a bit of paper hundreds of times and rub my face in it - Jeff, Coupling, BBC2
|
|
|
|
|
The best way is to have a method of your class expose the variable (ie. Set/Get).
Also, it could well be that you are corrupting your memory in an unexpected way. I would place a DWORD value around the BOOL value like below.
DWORD dwTest1;
BOOL bValue;
DWORD dwTest2;
Then when I initialized the bValue I would also initialize the dwTest1 and dwTest2 to some unlikely value.
bValue = TRUE;
dwTest1 = 0xfefe;
dwTest2 = 0xfefe;
The other thing you can do is add 2 data members to the class one static and one not static.
static int iStartingPoint;
int iPointOfStart;
Initialize iStartingPoint to zero.
Then in your constructor, set iPointOfStart = iStartingPoint and increment iStartingPoint.
When you check the value of bValue you will 1) know if memory is getting overwritten by checking dwTest1 and dwTest2 and you will know if you are working with the same object you were working with before (check iPointOfStart}
Just my $0.02.
Thanks,
Matt Gullett
|
|
|
|
|
Right, I think I found the error but I don't know what's causing it. The BOOL bValue has the value of decimal 20 rather than 1 or zero and the two DWORDs have changed their value.
Now, how can I trap when this is happens?
James Spibey
I love the word naked, it's brilliant isn't it, 'naked'. When I was a kid I used to write the word naked on a bit of paper hundreds of times and rub my face in it - Jeff, Coupling, BBC2
|
|
|
|
|
Thanks to all that helped but I got it. Only took me 9 hours
For those interested it was a simple index out of bounds. I had two constants defined as the maximum sizes of two arrays I was using and I was looping through one array (and writing to it ) using the wrong max size.
Anyway, thanks again everyone.
James Spibey
I love the word naked, it's brilliant isn't it, 'naked'. When I was a kid I used to write the word naked on a bit of paper hundreds of times and rub my face in it - Jeff, Coupling, BBC2
|
|
|
|
|
Great!
I was justing working on my repost. I was going to tell you to check for...
arValules[10];
for (int i = 0; i <= 10; i++)
...
I used to do this all of the time.
Anyway, glad you solved your problem.
Matt Gullett
|
|
|
|
|
A few things to check.
1. Rogue pointer - You have a pointer that hasn't been properly initialized that is trashing another variable when used.
2. Use of deallocated memory - You deallocate memory, that memory is then allocated to your new object. However, another piece of code is still trying to access the old object thus trashing the data in the new.
3. You are returning a pointer to a stack object.
4. Your object is located on the stack and another buffer (such as a character string) isn't large enough to hold an array of data. Thus when you write this data into the buffer, you trash other objects on the stack. This can also happen with allocated memory.
Tim Smith
Descartes Systems Sciences, Inc.
|
|
|
|