|
The following code snips relate to code that successfully compiled using Visual Studio 6.0. This same implementation does not compile in Visual Studio .Net 7.0. Here is the error message
ConfigTSAControlsFView.cpp(200) : error C2440: 'static_cast' : cannot convert from 'void (__thiscall CConfigTSAControlsFView::* )(UINT)' to 'void (__thiscall CWnd::* )(CWnd *)'
//Function Declaration
afx_msg void OnKillFocus(UINT uiCtrlID);
//Message Map Entry
ON_WM_KILLFOCUS()
//Function Implementation
void CConfigTSAControlsFView::OnKillFocus(UINT uiCtrlID)
{
//the code
}
Now this is what confuses me the most. The MSDN library implies that the OnKillFocus method takes a CWnd*, not a UINT. Visual studio 6.0, somehow was able to compile this and perform a cast. However, Visual Studio .net is complaining that the static_cast is not possible. So can someone explain to me how visual studio 6.0 can make the cast and why visual studio .Net cannot? The uiCntrlId is used in a switch statement so the actual value being used is equal to the resource Id of the window. How did visual studio cast from a CWnd* to a resource Id automatically? This seems like quite a stretch. If anyone has any ideas, I'd appreciate it.
Personally, I think the error message makes perfect sense. Of course the compiler won't cast from a CWnd* to a UINT that has a completely different meaning. I just can't imagine how the code ever compiled and worked with visual studio 6.0. The other thing is that if I change the code to use a CWND*, then it seems to invalidate the existing switch statements, within the function, that expects a controller id.
|
|
|
|
|
The Visual C++ 6 compiler was not particular standards-compliant, while the Visual C++.NET compiler is much moer compliant. There is a lot of code that compiles under Visual C++ 6 that won't compile under the .NET compiler (and vice-versa).
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"
|
|
|
|
|
Let me clarify my question. I need to understand why visual studio 6.0 was able make the static_cast so that I can understand how to get this code to work under visual studio.net. Obviously, visual studio .net is more standards compliant since it is complaining. Since I can't imagine how the compiler performs the implicit cast from CWnd* to UINT iResourceId, I have no idea how to do the cast manually. There must be a way.
|
|
|
|
|
Hi,
I have a CFormView doc/view app. I would like to be able to (at runtime) Create a CScrollView or some other view in its place.
Does anyone have any ideas?
Thanks,
|
|
|
|
|
|
Hello,
I'm very new to programming but have learned allot over the past few months. Here's my problem.
I have a program that I'm working on. It's written in C not C++ and it is GDI based. I'm using MS Visual Studio 2003. I have the ability to edit everything that is in the .rc file under the project such as dialogs, menus and ext. What I don't have the ability to edit is the items below the menu such as the pens and other visual designs that are contained within the main window of the program. It's not like VB or C# where you can just edit the main window from the IDE. I have no ability whatsoever to change the overall visual design or feel of the main body of the program other than manual editing of the code, for example:
// draw check box
// We select the brown pen anyway to make sure we have a valid value
// for hOldPen for later calls to SelectObject()
hOldPen = SelectObject( hDC, lpe->hBlackPen );
if ( !lpe->tracks[i].bData )
{
pts[0].x = pts[3].x = pts[3].x = ((hx[1]+1)/2 - 4) - lpe->dx;
pts[1].x = pts[2].x = pts[0].x + 12;
pts[0].y = pts[1].y = pts[4].y = rc.top + 1;
pts[2].y = pts[3].y = rc.top + 13;
Polyline( hDC, pts, 5 );
}
if ( lpe->tracks[i].bChecked && !lpe->tracks[i].bData )
{
SelectObject( hDC, lpe->hBlackPen );
pts[0].x += 3;
pts[0].y += 3;
pts[1].x = pts[0].x + 2;
pts[1].y = pts[0].y + 3;
pts[2].x = pts[1].x + 8;
pts[2].y = pts[1].y - 8;
Polyline( hDC, pts, 4 );
pts[0].x += 1;
pts[1].x = pts[0].x + 2;
pts[1].y = pts[0].y + 3;
pts[2].x = pts[1].x + 8;
pts[2].y = pts[1].y - 8;
Polyline( hDC, pts, 4 );
}
SelectObject( hDC, hOldPen );
}
SetBkMode( hDC, oldBkMode );
SelectObject( hDC, hOldFont );
EndPaint( hWnd, &p );
}
The code above is for displaying a simple checkbox for selecting items displayed within the main window. I have been able to modify the code to an extent but it takes allot off time and pulling out of hair Really what I would like to do is be able to change these things at least as easy as I can make changes in the .rc file under the MSVC resource editor. There has to be an easier way to make changes or additions besides what I'm now doing. Unfortionally, I'm not the original author of this program so I don't know what editor they used to compose the GUI.
Better yet, I would like to spice up my main window from the generic look it has now to something better as well as be able to add to it. Are there any libraries out there that would easily integrate into this GDI application? I really like the new Office 2003 look and feel.
I would very much appreciate any help I can get and thank everyone in advance for your time in helping me.
Jamie
|
|
|
|
|
This program works ok. I get an exe file. But I would like to be able to send the output to a printer. How would I be able to send the output from the exe file after running it, to a printer? I have some code by the forward slashes. Thank You
// RWA's and Charges
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <string>
using std::cout;
using std::cin;
using std::fixed;
using namespace std;
//#include
int main () //int,char*)
//ofstream printer ("lpt1:");
//Printer <<"test"<<endl;
//return 0;
//}
{
int c;
double fee;
double total;
char a ='y', ans;
string input;
int number;
while (a =='y'|| a =='Y')
{
cout << "\nChoose from options below.\n";
cout << "\nEnter A to calculate total RWA cost.\n";
cout << "\nEnter B to calculate RWA base estimate.\n";
cout << "\nEnter your choice, then press the enter key:\a";
cin >> ans;
cin.ignore();
if (ans == 'A' || ans == 'a' ){
cout << "\nEnter RWA Base Estimate, then press the enter key:$\a";
cin >> input;
cout << "You entered:$" << input << endl;
int pos = input.find(',');
while (pos != -1)
{
input.replace(pos, 1, "");
pos = input.find(',');
}
number = atoi(input.c_str());
fee = number * 0.04;
cout << fixed;
cout.precision(2);
cout << "4% Management Fee:$" << fee <<"\n";
total = number + fee;
cout << fixed;
cout.precision(2);
cout << "Total:$" << total <<"\n";
if (total >= 1 && total <= 2499)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.1 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.1) <<"\n";
}
if (total >= 2500 && total <= 9999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.09 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.09) <<"\n";
}
if (total >= 10000 && total <= 24999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.08 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.08) <<"\n";
}
if (total >= 25000 && total <= 49999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.07 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.07) <<"\n";
}
if (total >= 50000 && total <= 99999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.05 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.05) <<"\n";
}
if (total >= 100000 && total <= 299999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.03 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.03) <<"\n";
}
if (total >= 300000 && total <= 999999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.015 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.015) <<"\n";
}
if (total >= 1000000 && total <= 2425000)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.005 <<"\n";
cout << "Total Obligation:$" << total + (total * 0.005) <<"\n";
}
}
if (ans == 'B' || ans == 'b') {
cout << "\nEnter Total RWA Cost, then press the enter key:$\a";
cin >> input;
cout << "You entered:$" << input << endl;
int pos = input.find(',');
while (pos != -1)
{
input.replace(pos, 1, "");
pos = input.find(',');
}
number = atoi(input.c_str());
fee = number * 0.04;
cout << fixed;
cout.precision(2);
cout << "4% Management Fee:$" << fee <<"\n";
total = number - fee;
cout << fixed;
cout.precision(2);
cout << "Total:$" << total <<"\n";
if (total >= 1 && total <= 2499)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.1 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.1) <<"\n";
}
if (total >= 2500 && total <= 9999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.09 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.09) <<"\n";
}
if (total >= 10000 && total <= 24999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.08 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.08) <<"\n";
}
if (total >= 25000 && total <= 49999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.07 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.07) <<"\n";
}
if (total >= 50000 && total <= 99999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.05 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.05) <<"\n";
}
if (total >= 100000 && total <= 299999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.03 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.03) <<"\n";
}
if (total >= 300000 && total <= 999999)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.015 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.015) <<"\n";
}
if (total >= 1000000 && total <= 2425000)
{
cout << fixed;
cout.precision(2);
cout << "Overhead:$" << total*0.005 <<"\n";
cout << "Spendable Amount:$" << total - (total * 0.005) <<"\n";
}
}
cout <<"********************************************************************""\n";
cout <<"* Rate Range Subtotal Max. Range *""\n";
cout <<"* .01 .1 $2,499 $250.00 $250.00 *""\n";
cout <<"* 0.09 $2,500 $9,999 $675.00 $675.00 *""\n";
cout <<"* 0.08 $10,000 $24,999 $800.00 $1,200.00 *""\n";
cout <<"* 0.07 $25,000 $49,999 $1,750.00 *""\n";
cout <<"* 0.05 $50,000 $99,999 $2,500.00 *""\n";
cout <<"* 0.03 $100,000 299,999 $6,000.00 *""\n";
cout <<"* 0.015 $300,000 $999,999 $10,500.00 *""\n";
cout <<"* 0.005 $1,000,000 $2,425,000 $7,125.00 *""\n";
cout <<"********************************************************************""\n";
cout<<"Would You Like to Perform Another Calculation (Y/N)?\a";
cin>> a;
}
cout <<"\nGoodBye\n";
getchar();
return 0;
cin >> c;
}
|
|
|
|
|
Hello all
I am very very new to this and I have to debug this problem and I really need your help.
The problem is that there is client and sever application which are coomunicating. When the server goes down, I like to print a warning in the client.
I know that recive will get a 0 return value when the connection is lost but in my case, it seems like I don't even get there. the program is run through a GUI and in Run function, there is loop like:
while(PeekMessage(&msg, 0, 0, NULL, PM_REMOVE))
{
if(msg.message == MSG_UPDATE_TCPIP_CONNECTIONS)
{
m_ServerIPAcceptDlg.Refresh();
m_TCPSummaryDlg.Refresh();
OnUpdateIP();
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DispatchMessage function goes throught some MFC codes and then calls the recive. When the connection is lost the DispatchMessage does not call the recive function anymore.
I am guessing ( I could be wrong as I am very very new to this) that there should be message that I can get that tell me the connection was lost and then print this message.
I have looked every where on line for a list of msg.message types to look and can not find what type of messages are available to me.
Please help me as this is very important to me. If you know a good on line refrence book or any good book that can help me with MFC networking and programing, please let me know.
Thank you kindly for all your helps.
|
|
|
|
|
back to top, Any help is greatly appritiated.
|
|
|
|
|
This is not homework - honest - wished it was at 34 !
I am just flicking through some code suggestions I found on the web and one was about pure performance which I haven't really looked into much, I am more of a GUI person, always waiting for the user! Anyway, cut to the chase....
If speed alone is purely the issue, which would be faster :-
int A_Return_n_if_n_isIsLessThan2(unsigned int n)
{
if (n < 2)
return n;
else
return -1;
}
int B_Return_n_if_n_isIsLessThan2(unsigned int n)
{
if (n ==0 || n == 1)
return n;
else
return -1;
}
int C_Return_n_if_n_isIsLessThan2(unsigned int n)
{
return (n < 2 ? n : -1);
}
int D_Return_n_if_n_isIsLessThan2(unsigned int n)
{
return ((n == 0 || n == 1) ? n : -1);
}
I would have said 'C' but things aren't always that straight forward, especially when people start talking about 'atomic' operations - not too sure about those!!
Also, what would be the speed of these in big O notation? And how do you know that, or is that a far bigger subject?
Regards
Angel
*********************************************
The sooner you fall behind, the longer you have to catch up.
|
|
|
|
|
A and C are essentially equivalent and most often fastest. If n==0 then B and D will be equivalent.
You can verify this by looking at an assembly code listing for the code.
The difference would probably not be noticable unless you are using this repeatedly for every pixel of a multi-mega pixel image or some other highly repetitive operation.
|
|
|
|
|
It very much depends on the compiler. I would actually expect an optimising compiler to generate the same code for A and C, and also the same code (possibly different from A/C) for B and D. B and D have an extra 'sequence point' according to the C++ specification, where all externally visible side-effects must be complete from evaluating the left side of || before any side-effects from the right-hand side are visible. However since they're just tests with no observable side-effects this rule doesn't really apply.
Atomic operations - operations that are all-or-nothing. Either the whole operation succeeds, or none of it succeeds. The term is usually used to mean that operations appear as if they occurred in a particular sequence. Assignment of simple, register-size values is an atomic operation - it cannot be broken up. However, incrementing is not atomic - the processor must read the existing value, increment it and write it back. Another thread could read the value before the write-back occurs, increment that and write it back. Two threads have tried to increment, but the value is only one greater than before.
The issue isn't relevant here, because you're only dealing with local variables and parameters, which will be on your thread's stack. It's very unlikely that another thread will be writing to those values. C and C++ offer no support for atomic operations. The most they provide is the volatile keyword, which tells the compiler that it must read from the memory location every time, it cannot cache the value in a register and reuse it.
They're all O(1). There's no polynomial complexity at all. The time taken will never vary (disregarding the possibility of system context switches, e.g. handling an interrupt, switching to a different thread) regardless of the value of n.
If you want to know more, I suggest compiling the code using the Listing generation options and examine the generated assembly.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
OK, I loaded up VS2005 Beta 1 and pasted your code into a new project. In the same file I added main :
int a = A_Return_n_if_n_isIsLessThan2( argc );
int b = B_Return_n_if_n_isIsLessThan2( argc );
int c = C_Return_n_if_n_isIsLessThan2( argc );
int d = D_Return_n_if_n_isIsLessThan2( argc );
printf( "%d\n%d\n%d\n%d\n", a, b, c, d );
return 0; I then compiled with the /FAs option to generate assembly listings with source, using the Full Optimization, Favor Small Code options (/Oxs). A and C got compiled to the same code:
mov eax, DWORD PTR _n$[esp-4] ; eax = n
cmp eax, 2 ; set flags based on eax - 2
jb SHORT $LN4@C_Return_n ; jump if below
or eax, -1 ; set eax to -1
$LN4@C_Return_n:
ret 0 ; return, remove 0 items from the stack In reading this it's important to know that the eax register contains return value of the function. If the value is below 2 the jump is taken and eax already contains the return value. The compiler picked or rather than mov because it can use sign-extension to fill the whole register and therefore only needs to specify 0xFF rather than 0xFFFFFFFF for the mov instruction, saving 2 bytes (3 vs. 5).
B and D compile to this:
mov eax, DWORD PTR _n$[esp-4]
test eax, eax ; test sets the Zero Flag if zero
je SHORT $LN3@D_Return_n ; je (jump equal) jumps if ZF is set
cmp eax, 1 ; set flags based on eax - 1
je SHORT $LN3@D_Return_n ; if zero, jump
or eax, -1
$LN3@D_Return_n:
ret 0 Interestingly, the compiler actually removed the temporaries a , b , c and d from main and just compiled the calls inline, in the opposite order. Presumably the optimizer looked inside the calls, saw there were no side-effects, eliminated the sequence points that should have been at the end of each statement, and reordered the calls so it could push the results on the stack in the order needed for printf .
Therefore B/D might be slightly slower than A/C. However, on modern processors you can't count instructions and say the one with more instructions will be slower. You have to take parallel execution, out-of-order execution, and branch prediction into account. If enough resources are available the processor could evaluate the test , cmp and or in B/D in parallel, discarding the 'wrong' result. However A/C is smaller code and is more likely to fit on a memory page with other code, will fit better into instruction cache and uses fewer branch prediction resources. You're unlikely to see any difference, though.
There's very little point performing micro-optimisations like this unless you already know that there's a bottleneck here, which is pretty unlikely. Write whatever's clearest.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
As others have said, A and C should compile down to the same code, and will probably be slightly quicker (maybe a nanosecond or so). However, just to throw a spanner in the works, a good compiler should be able to determine that all four are identical and produce identical code for every case. I don't know of any that would (check the Intel compiler though if you're interested - it has excellent optimisation).
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"
|
|
|
|
|
Hi,
I am using ATL to create a toolbar with a initially positioned static control in it with the following code in my Toolbar Class:
CWindow m_TextWindow;
LRESULT CToolbar::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HWND m_Text = CreateWindow("STATIC", "Test Text", WS_CHILD | WS_VISIBLE, 465, 4, 15, 20, m_hWnd, NULL, NULL, NULL);
m_TextWindow.Attach(m_Text);
return 0;
}
In my OnSize function, I have the following code:
LRESULT CToolbar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
RECT staticRect;
::GetClienRect(m_TextWindow, &staticRect);
staticRect.right -= 100;
return 0
}
However, I can not position the Static Control whenever I size the window.
Thanks in advance.
|
|
|
|
|
If I'm not mistaken, you need to actually call MoveWindow to get the control to move.
modified 12-Jul-20 21:01pm.
|
|
|
|
|
tdnxxx444 wrote:
However, I can not position the Static Control whenever I size the window.
That's because all you've done is changed the value of a variable. You need to call MoveWindow() or SetWindowPos() to actually move the window.
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"
|
|
|
|
|
ahhh.. Got it! Thanks for the help.
|
|
|
|
|
I have Visual Studio .NET but I'm programming in Win32 C++. I followed the procedure here and filled out the class wizard but once I click Finish, no files are created or anything. Am I missing something? I thought I ran into this problem before and it was some bug in VS. Thanks in advance.
|
|
|
|
|
Hi
I am creating a named pipe server with CreateNamedPipe(). Once a client connects, I use ImpersonateNamedPipeClient() and OpenThreadToken() to get the client's logon token. I then use LookupAccountSid() to get the client user account details. All standard stuff. *BUT* what I would like to do at this point is determine whether the client connected from a session logged on locally at the server, OR from another system. I *think* I need to check the logon type (LOGON32_LOGON_INTERACTIVE) but I have no idea how. Has anyone any idea how to do this?
Many thanks,
Neil Humphreys
|
|
|
|
|
I have a property sheet with lots of property pages.
Just before I launch the property sheet, I can type:
m_pViewPropertySheet->SetActivePage(1);
and that makes the first page active. I have alot of
helpful information on the 0th page; I have a button
on each property sheet that Im hoping that the end-user
can click on to switch them to the 0th property page.
I just can't get figure out the code to switch the user
from one property page to the another.
I could make a box popup that tells the user to go
click on the little tab at the top to switch to the
0th page for helpful information, but that's kinda
primitive.
I tried just letting the user figure out on their own
that the 0th page has lots of information, but they
never do.
Please, any response any one can give me will be
greatly appreciated.
Sincerely,
Danielle Brina (an overworked graduate student)
|
|
|
|
|
|
Can you show me how to use either command? I looked on
codeproject and google and dont see any examples.
Please, please, please. Im in lets say property page 2
and when they click on a button, I want to switch to
property page 1.
Please, please, please any response you can give me will
be greatly appreciated.
Sincerely,
Danielle Brina (an overworked graduate student)
|
|
|
|
|
Assuming MFC code (you didn't say what you were using), from the page 2 class, you can do something like:
CWnd* pSheet = GetParent();
pSheet->SendMessage ( PSM_SETCURSELID, 0, IDD_PAGE1 ); where IDD_PAGE1 is the resource ID of the page 1 dialog resource.
--Mike--
LINKS~! Ericahist | 1ClickPicGrabber | CP SearchBar v2.0.2 | C++ Forum FAQ | You Are Dumb
Magnae clunes mihi placent, nec possum de hac re mentiri.
|
|
|
|
|
is there any way to use CFileDialog to select an HTML file out of a resource DLL? I need to beable to select files out of a resource DLL and files in the filesystem.
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|