|
Hi all,
i m using this to set background color of menu.
To change the background color of MenuBar, simply add below's line of code, beginning of mainframe OnCreate
CBrush* NewBrush;
NewBrush = new CBrush;
NewBrush->CreateSolidBrush(RGB(139,137,137));
MENUINFO MenuInfo = {0};
MenuInfo.cbSize = sizeof(MenuInfo);
MenuInfo.hbrBack = *NewBrush; // Brush you want to draw
MenuInfo.fMask = MIM_BACKGROUND;
MenuInfo.dwStyle = MNS_AUTODISMISS;
CMenu* pMenu = this->GetMenu();
if(IsMenu(pMenu->m_hMenu))
{
SetMenuInfo(pMenu->m_hMenu, &MenuInfo);
}
after using this,color of menu bar is changed but the color of menu items not changed.
please tell me how can i change the menu items color.
thanks in advance.
To accomplish great things, we must not only act, but also dream;
not only plan, but also believe.
|
|
|
|
|
Use owner-drawn menus. There are plenty of samples - just search the C++ articles for 'owner-drawn menu'.
L u n a t i c F r i n g e
|
|
|
|
|
Hi,
In my application i have funtion like
char* CTagController :: SendInitialPoints()
{
union UController CON;
memset(CON.Buffer,0,CONSIZE);
CON.S.AlarmPriority =AlarmPriority;
CON.S.AlarmEnable =AlarmEnable;
CON.S.TagIndex =TagIndex;
.
.
.
.
return CON.Buffer;
}
In another function,im using this
char *pConInitData = 0 ;
pConInitData = pTagController->SendInitialPoints();
My problrem is,When i set Common Language Runtime Support (/clr) option in CLR support,
the pConInitData shows some garbage value.
If i set No Common Language Runtime support,then pConInitData returns correct value.
Whats the problem in setting /clr option.
Actually i convert VC6 to VS2008.Actually i want to set that /clr option,because im using some WPF controls in my applcaiton.
Pls help me
Anu
|
|
|
|
|
It looks like you are returning a pointer to an area of memory that is part of a stack variable. Thus, when SendInitialPoints() returns CON is eligible for garbage collection and may disappear. You should allocate your buffer using new to ensure it does not disappear before you have finished with it.
MVP 2010 - are they mad?
|
|
|
|
|
You can either allocate memory for the union on the heap as Richard said or you can create it on the stack from the caller function and pass it into the SendIntialPoints function.
char* CTagController::SendInitialPoints(UController& CON)
{
memset(CON.Buffer,0,CONSIZE);
CON.S.AlarmPriority =AlarmPriority;
CON.S.AlarmEnable =AlarmEnable;
CON.S.TagIndex =TagIndex;
.
.
.
.
return CON.Buffer;
}
This can be called as follows -
char *pConInitData = 0 ;
union UController CON;
pConInitData = pTagController->SendInitialPoints(CON);
In this case you do not need the function to return anything.
So the calling can be as follows -
union UController CON;
pTagController->SendInitialPoints(CON);
|
|
|
|
|
Hi Guys,
I got a txt file which contains html codes in it.
<td class="ticker_name"><a href="http://finance.yahoo.com/q;_ylt=Al7he7j4xkWAM99.PPB7UVFO7sMF;_ylu=X3oDMTE5cnE2OWVuBHBvcwMzBHNlYwNtYXJrZXRTdW1tYXJ5SW5kaWNlcwRzbGsDbmFzZGFx?s=%5EIXIC" >Nasdaq</a></td><td><span class="streaming-datum" id="yfs_l10_^ixic">2,147.35</span></td><td class="ticker_down"><span class="streaming-datum" id="yfs_c10_^ixic">-31.65</span></td><td class="right_cell ticker_down"><span class="streaming-datum" id="yfs_pp0_^ixic">-1.45%</span>
how do i extract the value example 2,147.35 and -31.65 of NASDAQ
|
|
|
|
|
You could write your own parser or adapt from this article[^].
MVP 2010 - are they mad?
|
|
|
|
|
My immediate approach would be to:
(a) Scan for and replace all comas with nothing. I.e "," --> ""
(b) Scan for the text ixic">
(c) if string not found, then exit loop - jump to (g)
(d) Advance the returned pointer by the length of the search string (6 bytes)
(e) Do a scanf, asking for a float
(f) Return to (b)
(g) ...
Perhaps a little something like this?
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#include <string>
using namespace std;
string& str_replace(const string &search, const string &replace, string &subject)
{
string buffer;
int sealeng = search.length();
int strleng = subject.length();
if (sealeng==0)
return subject;
for(int i=0, j=0; i<strleng; j=0 )
{
while (i+j<strleng && j<sealeng && subject[i+j]==search[j])
j++;
if (j==sealeng)
{
buffer.append(replace);
i+=sealeng;
}
else
{
buffer.append( &subject[i++], 1);
}
}
subject = buffer;
return subject;
}
int main()
{
FILE *fp;
char *htmlStr, *tmp, *filename="infile.html";
char *pos1, *pos2, *pos3;
float retrievedNum;
long fileSize;
string findMe = "ixic\">";
fp = fopen(filename, "r+b");
fseek(fp, 0, SEEK_END);
fileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
htmlStr = new char[fileSize+1];
htmlStr[fileSize] = 0;
fread(htmlStr, sizeof(char), fileSize, fp);
string tmpS = htmlStr;
string find = ",";
string replace = "";
tmpS = str_replace(find, replace, tmpS);
printf("%s\n\n", tmpS.c_str() );
fclose(fp);
strcpy(htmlStr, tmpS.c_str() );
pos1 = htmlStr;
while (pos1 = strstr(pos1, findMe.c_str()))
{
pos1 += strlen(findMe.c_str());
sscanf(pos1, "%f", &retrievedNum);
printf("Retrieved: %f\n", retrievedNum);
}
delete htmlStr;
}
Yeah, the code's not winning any beauty pageants.
|
|
|
|
|
benjamin yap wrote: how do i extract the value example 2,147.35 and -31.65 of NASDAQ
Have a look at regular expressions (RE). There are various libraries for C++, see Boost or CodeProject articles about it. You could scan line by line trough your HTML-input and with a regular expression test/extract the wanted information.
Hope this helps,
M
|
|
|
|
|
Hi,
I am writing an Installer for Software Upgrades. The final step is to Delete the existing Bin Directory, and renaming the Temp One to the Old Dir Name. This will ofcourse fail if the existing Bin Dir contains Files that are in Use.
The First part of the question is, How can I force Terminate running Apps.(and then finalise the installation, and restart what was running. No problem with doing that last step)
The Second part is, When the above fails, I would like to Shut down the computer, restart it, Block everything while I finalise the initial Installation, before the 'Start' list executes, and then resume Normal Startup.
The third part is, 'Can that be done remotely on a Networked Computer.'
BTW We Don't use '.COM' or 'ActiveX'. The preferred solution would entail the 'Kernel' API functions.
Regards,
Bram van Kampen
|
|
|
|
|
Hi all,
I have been using the following method to allow multiple instances of a class CInd1 to be generated using a base class pointer with various virtual functions in the base class. The problem I have is that I now would like to access variables in the class CInd1 generated by new. I can't figure out how to do this. The pointer m_pIndicator points to the desired class but it's a CIndicator class pointer (necessary to use virtual functions). Is there any way to re-cast the pointer or similar to gain access to CInd1 variables?
Thanks
class CInd1 : public CIndicator
{
Public:
virtual void CInd1::Draw(..) const;
CInd1(..);
CInd1 () {}
};
class CIndicator : public CObject
{
public:
virtual void Draw(CDC* pDC) const {}
public:
CIndicator() {};
};
CIndicator* m_pIndicator;
m_pIndicator = new CInd1(..);
m_pIndicator-> ??
|
|
|
|
|
What you are experiencing is a warning that you probably have a design problem.
If you are working on objects via pointers to a base class, generally all that the code that uses the base class pointer should care about is the base class interface, irregardless of whether the actual object is of base class or derived type.
The immediate questions that your post brings up are: Why are you using a pointer to a dynamically allocated object here? Is there a better design available?
If you are really stuck with this yucky situation the next questions are: How do I know the what the actual type of object this pointer is pointer to is? What do I do in which case of what derived type it is? Can't I come up with a better design that avoids the mess I may be creating?
The best thing to do would probably be to share the situation & your design goal, so that people can give you advice on other ways of dealing with it.
If all my ranting and raving doesn't dissuade you, then you probably want to look up and familiarize yourself with the C++ dynamic_cast<> operator.
|
|
|
|
|
You are absolutely right Avi and I'm glad you brought this up. This design is typical for simple, graphical elements that are not typically modified (easier to delete and create a new one). However, I extended it to more complex elements that should have the capability to be modified since there is a lot of dialog setup. The real value of the base class implementation is that it allows the use of virtual functions, especially the draw function without which the View class draw routine becomes very complex.
Currently, if the user wants to modify the element(with a dialog), my code deletes it and replaces it with a new element (transparent to the user). The problem arises when the user creates 2 of the same kinds of elements but with different settings. Then, when the dialog corresponding to the element is opened, the dialog settings do not always correspond to the instance that was selected since the dialog will just retain the last settings. So my intent was to set the dialog controls based on the dialog data stored with the element when the dialog init function is called. I can't use a virtual function from CIndicator since there are other elements (besides CInd1) that have different dialogs and thus different set up vars.
There must be an accepted way to design this function, since many engineering tools allow lots of copies of elements to be used yet they can still be modfied. I'll give it some thought.
|
|
|
|
|
I think the (sort of) obvious answer here is that the derived class should generate it's own dialog, i.e.
m_pIndicator->IndDialog();
The IndDialog() function would be a virtual function. This way the class is completely self contained.
Currently the dialog for each element is instantiated in an unrelated class.
|
|
|
|
|
Now that I've gotten back here to look at this again and as far as I understand your situation, it sounds like you've come up with a reasonable plan. You are (obviously) entirely right in not wanting to bring up a dialog displaying the wrong initial data.
In addition, it seems to solve another (potential) problem. I don't know how you are having the user indicate which object to modify, but without something like this, you might have also had a problem determining which dialog to create. Now, at least as I am imagining it, you can hit test to determine what object has responsibility and not additionally need the user to specify the type of thing he wants to deal with. Perhaps this isn't an issue in your current UI, but with design changes, who knows what will come up?
Good luck with this.
|
|
|
|
|
Why not instantiate m_pIndicator to be a CInd1() object? This gives you access to all of the variables and methods in the base (except private) and derived class.
MVP 2010 - are they mad?
|
|
|
|
|
I didn't really state the problem very well -
The whole point of this code is polymorphism to allow one virtual function to be called on the base class for various operations but especially drawing. This way a huge switch statement is avoided every time you want to draw an object (i.e. CInd1, CInd2.. etc.) and you don't have to modify the View class when adding a new object. It seems to be fairly standard - it's described very well in Horton's "Beginning Visual C++".
The downside appears to be the difficulty modifying existing elements but I solve that by a delete and replace operation (transparent to the user). My only difficulty was populating the CInd setup dialog to reflect the selected element but I think I have solved that by instantiating the dialog in the CInd1 class and calling a CIndicator display dialog virtual function.
|
|
|
|
|
Can you add a virtual method to CIndicator that returns the value of CIndicator 's member variables?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Thanks all,
I know which element to modify because the CIndicator class has a couple of vars, CString ElementName and int ElementId.
I also realized that I can solve this by casting the pIndicator to the derived class (I had a serious hole in my knowledge with regards to casting pointers of derived classes). Then I think I can add a function to the dialog to update the controls by passing the derived class pointer, ie.
CInd1* pInd1 = static_cast<cind1*>pIndicator); //cast from base to derived class
Ind1Dlg.UpdateDlg(pInd1);
|
|
|
|
|
Hi,
I have developed an installer application in Visual C++ 6.0. It runs in admin login. While it creates program folder, I want to assign specific rights. The rights I want to assign are as under.
Everybody should be allowed for Modify + Read & Execute + List folder content + Read + Write.
On advance security tab, "Apply to" field for Everybody should be set to "This folder, subfolders and files". In addition "Apply these permissions to objects and/or containers within this container only" tick box shoud be checked.
Right now, the code I have used for this is,
--------------------------------------------------------------
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE);
SetSecurityDescriptorGroup(&sd,NULL, FALSE );
SetSecurityDescriptorSacl(&sd, FALSE, NULL, FALSE );
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = TRUE;
CreateDirectory( m_strDestinationDir, &sa );
--------------------------------------------------------------
This gives full control to Everybody but does not have setting on Advance tab as I mentioned above. Due to that files created by one user in this folder becomes unaccessible for another user.
I will be very much thankful if someone can help me out to resolve this problem.
Thanks & Regards,
Chintan.
C.R.Naik
|
|
|
|
|
Hello folks!
Do you know of any good guide about writing a shell replacement for windows in VC++? I tried to google around but i didn't find anything usefull really, maybe i am not looking for the right terms...i tried to search here on CP too of course but no luck...so if any of you knows where to look or at least what i should search for, please give suggestions, thanks a lot in advance.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
It all depends on what you want your replacement to do. If you mean a complete replacement of Windows then you have about 500 years of development ahead of you. If you mean just one small part then perhaps you could expand on your requirements.
MVP 2010 - are they mad?
|
|
|
|
|
Thanks for the answer. Of course i know that writing a complete replacement that can do at least what explorer.exe can do and more is not a one man job, or a one man job for the coming 2 centuries. But i have no such ambitious plans, i am just after learning something new, to expand my knowledge, see what could be possible and what not.
Richard MacCutchan wrote: If you mean just one small part then perhaps you could expand on your requirements.
-i don't understand what you mean by expanding requirements, i probably lack the "proper english" here...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
Code-o-mat wrote: -i don't understand what you mean by expanding requirements,
Well your original question was "Do you know of any good guide about writing a shell replacement for windows in VC++". So what do you mean by a Shell replacement? What do you expect your version to do? You might like to take a look at some of the open source projects around to see what they offer and whether reading some of that code will help you.
MVP 2010 - are they mad?
|
|
|
|
|
i think Saurabh.Garg (here's his post[^]) got it right, i am/was looking for some general guide, something that would explain exactly what tasks a replacement for the graphical shell has to fullfill, i mean from the system's point of view, not the user's, i guess it isn't simply just replacing explorer.exe with something else (changing the registry entry that points windows at explorer.exe to make it run some other program instead upon logon) and done, i read on some forum that the shell has to perform some special initializations in order to work (and of course these were not listed). Looking thorough those codes is a good idea, it might be very hard though to understand it without any basic idea of what exactly the intent of the whole thing is...hmm, they however might have comments in the code that might be very usefull and shed a lot of light onto the whole thing, thanks.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|