|
If you use the SS_NOTIFY style on your static controls they will notify their parent window when the user clicks on them.
It's not rocket surgery!
Within you lies the power for good, use it!!!
|
|
|
|
|
That's what I too believed, however, that is not so.
I had an ON_BN_CLICKED handler for this control, which worked, but as it turned out, SS_NOTIFY does not cause the xBUTTONxxx events pass to the parent.
|
|
|
|
|
Vancouver wrote: I thought I can somehow avoid the trouble
It's not much trouble. MFC does the work for you
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
It was not MUCH trouble, for sure, but it increases the amount of code, it requires two new source files, it requires duplicating some handlers. I am not lazy to do that, but I like compact code, the smaller the better.
Plus, my SetCursor is not working any more, not only in the new handlers, but not even in the main window, and I don't see the connection.
|
|
|
|
|
Vancouver wrote: Plus, my SetCursor is not working any more, not only in the new handlers, but not even in the main window, and I don't see the connection.
Not working how? Do you have a cursor defined for the window class or have you set it to NULL?
Also, how have you subclassed the control?
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
As I posted, it worked yesterday, before I subclassed the control, and it is not working any more. I can't claim, that the subclassing is to blame, as it is not working in the main window either.
The questions indicate, that there is no point to discuss this subject here and now. I have to work backwards and see, at which point the problem appears respectively disappears.
|
|
|
|
|
Vancouver wrote: The questions indicate, that there is no point to discuss this subject here and now. I have to work backwards and see, at which point the problem appears respectively disappears.
Cool.
I would start with just an empty, CStatic-derived class - with just the constructor implemented.
Create objects of the derived type to encapsulate the CStatic controls in the window.
Everything should work normally at that point. If not, then the problem is elsewhere - maybe
an existing problem has been exposed.
Once it works like that, add the mouse button handlers to the derived class. Initially, your
implementation can just call the base class implementation. Once that is done, you'd probably
simply need to notify the parent window of the clicks - via a message, member method, etc.
That should be the extent of the subclassing necessary for the controls
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Mark, I have to disappoint you. I am in the middle(?) of a program, many thousands of code lines. I don't intend to go back in time and in code.
I had come to the idea, that it would be nice to have a feature controlled with the mouse button hold down. (No, I don't need any suggestions, how to realize that. I only need "my cursor" back.)
|
|
|
|
|
Ok no problem
There's lots of us here that can help with the cursor problem if needed!
Good luck!
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
I'm guessing it's not possible to export a Class method - unless it's static?
So I would need to provide a class wrapper around my DLL exported functions?
Just curious
I'm finding the only constant in software development is change it self.
|
|
|
|
|
See if this[^] helps.
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
how can i get the item value of selected records in a list control.
thanks.
|
|
|
|
|
Use this:
CListCtrl::GetFirstSelectedItemPosition()
CListCtrl::GetNextSelectedItem()
Somethings seem HARD to do, until we know how to do them.
_AnShUmAn_
|
|
|
|
|
Is it possible to place an expaned macro inside a string literal?
#define NUMBER 123
...
strcmp(SomeString, "NUMBER"); I want the strcmp line to expand to:
strcmp(SomeString, "123"); I need to use the macro as both a string and an integer, and I want to avoid atoi() etc.
I looked at the # and ## preprocessor operators but can not seem to get them to work.
Any ideas greatly appreciated.
Darker than a black steer's tookus on a moonless praire night
Within you lies the power for good, use it!!!
|
|
|
|
|
I got the following from the source of Boost's preprocessor library:
// CommandLine.cpp : Defines the entry point for the console application.
//
#include "StdAfx.h"
#include <iostream>
#define STRINGIZE(text) STRINGIZE_A((text))
#define STRINGIZE_A(arg) STRINGIZE_B ## (arg)
#define STRINGIZE_B(arg) STRINGIZE_I ## arg
#define STRINGIZE_I(text) #text
#define NUMBER Hello
void main()
{
using namespace std;
cout << STRINGIZE(NUMBER) << endl;
}
Steve
|
|
|
|
|
That works, Thanks!
Now I just have to figure out how it works. Looks like black magic to me so far.
It's not rocket surgery!
Within you lies the power for good, use it!!!
|
|
|
|
|
To me it looks like gibberish, a bunch of no-op macro steps.
The intermediate steps just wrap several () around the arg.
Just unroll them to see:
SS(T) == SS_A((T))
SS(T) == SS_B(((T)))
SS(T) == SS_I(((T)))
SS(T) == (((#T)))
You may as well as used SS_I(T) to start with.
I have to believe they use SS_A, SS_B, SS_I elsewhere as part of other macros as well.
[EDIT]
Whoops, just tried it, looks like it does do something.
[/EDIT]
-- modified at 20:02 Monday 30th April, 2007
...cmk
Save the whales - collect the whole set
|
|
|
|
|
An explanation to what Stephen posted.
What would be ideal would be:
#define NUMBER 123
#define ASSTR(X) #X
But, when used in:
strcmp(SomeString, ASSTR(NUMBER));
We get:
strcmp(SomeString, "NUMBER"); because the token is converted _before_ it is checked for further macro expansion.
So we have to remove the expansion by one level (the boost example adds an extra 2 levels for some reason):
#define NUMBER 123
#define STR(X) #X
#define ASSTR(X) STR(X)
Now we get:
strcmp(SomeString, "123");
This is because:
- first ASSTR(NUMBER) is replaced with STR(NUMBER)
- _then_ the macro is checked for further explansion and NUMBER is replaced with 123 _before_ STR() is resolved
- so we get STR(123) which gives "123".
...cmk
Save the whales - collect the whole set
|
|
|
|
|
cmk wrote: (the boost example adds an extra 2 levels for some reason)
Read the article[^] linked by Stephen below. Section A.2.3 explains about how commas and parentheses can screw things up. The Boost code given accounts for this.
Darker than a black steer's tookus on a moonless praire night
Within you lies the power for good, use it!!!
|
|
|
|
|
Ahhh, there had to be a reason - thanks.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
See here[^]. Search for "A.4.4". This might provide some insight as might the rest of the document.
Steve
|
|
|
|
|
Thanks Stephen, great info there!
It's not rocket surgery!
Within you lies the power for good, use it!!!
|
|
|
|
|
Hello,
This is a very basic question for C++ on arrays. I am getting 2 errors when I compile & do not know what I'm doing wrong. Please assist. Lab is due 2 hrs from the time this email is posted, so very soon.
Error is - expected constructor, destructor or type conversion before = token
and - expected , or ; before = token
void pause(void);
void load_array_from_file(fileSpec filename, arrayType nums, int arraySize);
void display_array(arrayType nums, int arraySize);
int sum_array(arrayType nums, int arraySize);
int average_array;
(lots of other coding in here)
average_array = total / sum_array;
Thanks for the help!
Melissa
|
|
|
|
|
wertyou wrote: average_array = total / sum_array;
what type is total ?
Why are you calling sum_array without any parameters?
It's not rocket surgery!
Within you lies the power for good, use it!!!
|
|
|
|
|
Ok- here is the whole lab & the compiler errors are on line 127, which is the average_array. The total is defined in the sum part.
#include<iostream>
#include<string>
#include <iomanip> // For setw()
#include <fstream> // For file I/O
#include <cstdlib> // For the exit() function
using namespace std;
typedef int arrayType[]; // Declare data type alias
typedef char fileSpec[]; // Declare data type alias
// user defined function prototypes
void pause(void);
void load_array_from_file(fileSpec filename, arrayType nums, int arraySize);
void display_array(arrayType nums, int arraySize);
int sum_array(arrayType nums, int arraySize);
int average_array;
//******************************************************
// main
//******************************************************
int main(void)
{
//------------------------------------------------------
// Place the D6_Lab_01_Input.txt file on the root level
// of your C: (hard disk) drive
//------------------------------------------------------
char filename[] = "c:\\D6_Lab_01_Input.txt";
const int FARMERS = 7; // Input file has at least 7 members
int acres[FARMERS];
// call functions
load_array_from_file(filename, acres, FARMERS);
cout << "The individual farm acerages are: \n";
display_array(acres, FARMERS);
cout << "\n\nThe total acerage is: " << sum_array(acres, FARMERS);
cout << "\n\nThe average acerage is: " << average_array;
pause();
return 0;
}
//******************************************************
// pause
//******************************************************
void pause(void)
{
char pause;
cout << "\n\n\nHit Enter Key to Continue: ";
cin.get(pause);
cin.get(pause);
return;
}
//******************************************************
// load_array_from_file
//******************************************************
void load_array_from_file(fileSpec filename, arrayType nums, int arraySize)
{
ifstream inData; // Used to read the data from a file
int index; // Loop counter
inData.open(filename); //Open input file
if (!inData)
{
cout << "\n\nError opening data file: " << filename << "\n\n";
pause();
exit(EXIT_FAILURE);
}
else
{
for (index = 0; index < arraySize; index++) // Load the array
{
inData >> nums[index];
}
inData.close();
}
return;
}
//******************************************************
// display_array
//******************************************************
void display_array(arrayType nums, int arraySize)
{
int index; // Loop counter
cout << "\n*************************";
for (index = 0; index < arraySize; index++)
{
cout << "\nMemeber " << index+1 << " value is: " << setw(5) << nums[index];
}
cout << "\n*************************";
return;
}
//******************************************************
// sum_array
//******************************************************
int sum_array(arrayType nums, int arraySize)
{
int index; // Loop counter
int total = 0; // Accumulator
for (index = 0; index < arraySize; index++)
{
total += nums[index];
}
return total;
}
//******************************************************
// average_array
//******************************************************
average_array = total / sum_array;
//******************************************************
// End of Program
//******************************************************
Mel
|
|
|
|