|
Hi,
I don't know what you mean to use GetSubMenu()?
This code is working, it ataches a new popup to the main menu.
The problem is that it ataches this submenu to the IDR_MAINFRAME menu (after main frame is created). I need to do the same for IDR_VIEWTYPE menu. I don't know in what moment that menu is created. If I use this code in that moment, the new popup would be attached to IDR_VIEWTYPE menu.
Jerzy
|
|
|
|
|
The handle of the IDR_XXXTYPE menu is accessible through public data member of the CMultiDocTemplate class, it's called m_hMenuShared.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Hi Tomek,
Thanks for the solution. It works - it ataches a new popup to IDR_XXXTYPE menu.
But the problem is that I don't know where this code should be placed. If I put it in OnCrete() of ChildFrm, then the new popup is atached as many times as ChildFrm frames were created.
MSDN says something that this menu is loaded during the construction of the document templates. Can I override this?
Thanks for any suggestions.
Jerzy
|
|
|
|
|
You should add popups after creating new CMultiDocTempltate, in CYourApp::InitInstance.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Hi Tomek,
Thank you very much for this tip. It works. I had to only call DrawMenuBar() to refresh the menu. Without this call the menu was updated only when the mouse was over the menu. (This is only when the application starts).
When all documents were closed and then I opened a new one the menu was shown correctly.
Dziekuje,
Jerzy
|
|
|
|
|
Netmeisters,
I have a problem with what appears to be a very simple operation. I'd like to use sockets in a simple client application. Initially, to create and connect a socket, I did this:
CCeSocket mySock;
mySock.Create();
mySock.Connect(_T("dp1.derm.mcw.edu"),23501);
However, I'd now like to move to secure sockets, so I thought I'd use the socket handle rather than the socket class. So I changed to this:
SOCKET s;
s=socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN tcpaddr;
tcpaddr.sin_family=AF_INET;
tcpaddr.sin_port=htons(23501);
tcpaddr.sin_addr.s_addr=inet_addr
("dp1.derm.mcw.edu");
int res=connect(s, (SOCKADDR *)&tcpaddr, sizeof
(tcpaddr));
if (res==SOCKET_ERROR) {
CString err;
err.Format(_T("Error
d\n"),WSAGetLastError());
MessageBox(err);
}
This fails with an error 10049, "The requested address is not valid in its context".
I suppose I could use CCeSocket to create the socket and then get the socket handle from the class, but I am annoyed that this doesn't work. Why?
Thanks very much,
Matthew Fleming
mgf@mcw.edu
|
|
|
|
|
Hi,
I've written an MFC MDI app, not using CDocument.
My View class is derived from CTreeView.
Whenever I close a view window, I get an error. When debugging the program and closing the view window, I get a dialog box "User breakpoint called from 0xXXXXXXX" where the 0xXXXXXX is some memory address. My program has no breakpoints, and the debugger stops in a dissasembly window with no relation to my code that i can see.
In the little information window at the bottom, the following line is present:
HEAP[j5manager.exe]: Invalid Address specified to RtlValidateHeap( 910000, 915314 )
My view class is pretty basic- it doesn't do much yet. Default constructor and destructor, they do nothing. The class has 4 member vars, Two CStrings, an HTREEITEM and a CPtrList, but I've not done anything with these so far.
I'm really stumped as to what is causing the problem. Does anyone have any ideas or reccommendations on how to proceed? I'd post some code but I don't know what part to post!
Your help much appreciated.
Thanks
Jon
|
|
|
|
|
Your heap gets corrupted. One of the reasons could be writing past the end of memory block allocated by new or malloc. Do you have any diagnostic tools, like BoundsChecker or Purify?
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
sadly, no I haven't.
Not sure _how_ the heap could be corrupted? like i said, the view class does pretty much nothing at the moment.
|
|
|
|
|
I have a situation where I need to serialize several parts of a document-derived class. Because the standard doc loading / saving mechanism is not quite what I need, I have to construct the CArchive manually. All the serialization is working fine in itself, but the one thing I can't seem to get to work now I need it is the schema business.
My doc-derived class uses IMPLEMENT_SERIAL() with the current schema number correctly. I create the archive correctly and then start serializing out (when saving, this is)... but for some reason it never saves the schema in the binary file. I tried SetObjectSchema() immediately after constructing the CArchive, which certainly sets the internal schema value... but that never gets written to file.
I looked at the code for CDocument where it calls our overriden Serialize() to see how it did it - from that I see it sets the archive's m_pDocument and another member. So I did this also... STILL doesn't save the schema in the file.
Since CDocument::Serialize() does not do anything, calling the base class has no effect.
Any clues as to what I'm missing? Otherwise I'll have to do the schema bit myself. But I'd rather use the built-in stuff as much as possible.
|
|
|
|
|
How are you serializing document members? Using m_foo.Serialize(ar) or ar << m_pFoo?
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Everything is done using ar << m_pFoo (no objects other than CString are serilaized - most of what is saved is structures, and I do the members of each by hand).
You sound as if you're hinting that each object (class) has its own schema... which I can understand... but should there not be an overall schema for the document / doc-derived object? It does, after all, have IMPLEMENT_SERIAL()...
Basically, I'm not interested in the individual schemas of each thing I serialize - all serializing is done from one class (the doc-derived) (since there are no child objects being serialized, not even CXXXArrays). I want one overall schema that is used in all serializing operations so that I can check it on loading to avoid loading new data from old-schema files...
|
|
|
|
|
Everything is done using ar << m_pFoo (no objects other than CString are serilaized - most of what is saved is structures, and I do the members of each by hand).
You sound as if you're hinting that each object (class) has its own schema... which I can understand... but should there not be an overall schema for the document / doc-derived object? It does, after all, have IMPLEMENT_SERIAL()...
Basically, I'm not interested in the individual schemas of each thing I serialize - all serializing is done from one class (the doc-derived) (since there are no child objects being serialized, not even CXXXArrays). I want one overall schema that is used in all serializing operations so that I can check it on loading to avoid loading new data from old-schema files...
|
|
|
|
|
Schema number is written to file only if you use CArchive::WriteObject (operator << for CObject pointers calls this method). WriteObject uses CArchive::WriteClass for sort of 'metadata' (class name, schema version).
Default serialization implemented in CDocument::OnSaveDocument uses plain Serialize. This means that you can't call GetObjectSchema to get document schema number in CYourDoc::Serialize - it's not in the file.
You've mentioned that you're creating CArchive yourself - if you're replacing OnSaveDocument you can also try to replace CYourDoc::Serialize() with ar << pDoc.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
An excellent suggestion - I will try that trick tomorrow and let you know. Thanks for the help.
|
|
|
|
|
I've got a problem with the post SP4 NT4+ API "CreateIpForwardEntry". I'm trying to add a routing rule in the piece of code hereunder. It works just fine. However, if i use the IP address assigned to my ethernetcard as het "next hop" (thereby making it the default gateway for the particular network segment) it fails me. Can anyone help me out?
<br />
PMIB_IPFORWARDROW pRow = NULL;<br />
ULONG dwSize = 0;<br />
DWORD dwStatus = 0;<br />
<br />
pRow = (PMIB_IPFORWARDROW)malloc(sizeof(MIB_IPFORWARDROW));<br />
<br />
if (!pRow) {<br />
MessageBox("Malloc failed, Out of Memory!\r\n");<br />
exit(1);<br />
}<br />
<br />
pRow->dwForwardDest = inet_addr("172.0.0.0");<br />
pRow->dwForwardNextHop = inet_addr("172.31.64.9");
pRow->dwForwardMask = inet_addr("255.0.0.0");<br />
pRow->dwForwardIfIndex = 2;<br />
pRow->dwForwardType = 4;<br />
pRow->dwForwardProto = MIB_IPPROTO_NETMGMT;<br />
pRow->dwForwardAge = 0;<br />
pRow->dwForwardMetric1 = 30; <br />
<br />
dwStatus = CreateIpForwardEntry(pRow);<br />
<br />
if (dwStatus == NO_ERROR)<br />
MessageBox("Route Added Successfully\n");<br />
else if (dwStatus == ERROR_INVALID_PARAMETER)<br />
MessageBox("Invalid Parameter\n");<br />
else <br />
DisplayErrorMessage(dwStatus);<br />
<br />
if (pRow)<br />
free(pRow); <br />
|
|
|
|
|
Hi,
I am trying to implement an edit host (IHTMLEditHost).
I looked at the ATL example, and tried to implement the IServiceProvider interface in the CHtmlView class. But this doesn't work.
The interface function QueryService is not called after activating the editor (spDoc->put_designmode(L"On").
Does anyone have any idea how to do this?
Thanks,
Jurgen Wolke
|
|
|
|
|
I'm using a CAsyncSocket object to communicate with a unix socket server. The performance of the client data reception is too low. It takes about 400 miliseconds between the net ACK and the data catches the OnReceive() callback function. There's no traffic in the net. How can I improve this performance ? In a windows socket server, the problem doesn't occur.
Thanks !
Visual C++ 6.0, Windows98/NT.
sato
|
|
|
|
|
I'm using a CAsyncSocket object to communicate with a unix socket server. The performance of the client data reception is too low. It takes about 400 miliseconds between the net ACK and the data catches the OnReceive() callback function. There's no traffic in the net. How can I improve this performance ? In a windows socket server, the problem doesn't occurs.
Thanks !
Visual C++ 6.0, Windows98/NT.
sato
|
|
|
|
|
I need my application to be like "Quick Launch" so I could dock it to any screen border or nest in a tray. The GUI consists of a toolbar with a few buttons.
Any ideas?
Thanks!
|
|
|
|
|
There are two ways of approaching this:
The more common way is provide your application with an icon in the system notification area. When the user clicks on the icon, you can pop-up a menu or a toolbar with the choices you would like the user to have.
The potentially "more correct" way would be to make a deskband for your product. This is actually an extension provided by Internet Explorer and the Active Desktop. If you are running Windows 2000 or ME, or an older version of Windows with the Active Desktop installed, you will notice that you not only have a taskbar, but you can have toolbars, and address bar, and several other bars displayed. Each of these is a deskband which provides some interactive functionality.
The major difference between the two methods is that creating a deskband requires some COM programming. If you are familiar with COM, this should not be an issue. However, there are still many programs out there, such as the ones installed by many video card manufacturers, that add an icon to the system notification area with a pop-up menu.
I hope this helps!
--
Paul
"I drank... WHAT?"
|
|
|
|
|
Hi
I need to binary combine two files from C++ code.
I need to add binary file1 and file2 into file3, which is possible by the following command line:
copy /b a:\test1.txt + a:\test2.txt a:\test3.txt
How can I add those file in C++ code or perform a call to the command line which will perform the copy itself?
thanks,
lina
|
|
|
|
|
there are dozens of fun ways to do this.
the first, like you say, is to just issue a command line command to do it. see the "spawn" function.
the second, C, way to do it is like this:
(off the top of my head, so you'll have to fix any bugs by yourself)
FILE *fp1 = fopen("a:\\test1.txt", "rb");
FILE *fp2 = fopen("a:\\test2.txt", "rb");
FILE *fp3 = fopen("a:\\test3.txt", "wb");
while (!feof(fp1))
{
BYTE c;
c = fgetc(fp1);
fputc(fp3, c);
}
while (!feof(fp2))
{
BYTE c;
c = fgetc(fp2);
fputc(fp3, c);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
of course this is horribly inefficient. you'd be much better reading and writing large chunks (4K chunks, for example) instead of single bytes (see fread and fwrite).
then there are the C++ ways to do it, with CFile, or the io stream stuff.
all of it is 100% fun.
-c
------------------------------
Smaller Animals Software, Inc.
http://www.smalleranimals.com
|
|
|
|
|
In CMainFrame I want to access m_Grid that I have declared global in a CFormView derived class called CTableView. In CTableView I have the declaration:
CMSFlexGrid m_Grid;
But when I for example call m_Grid.GetRows() in CMainFrame I get an error:
'm_Grid' : undeclared identifier..........
What am I doing wrong?, it is another way to access m_Grid from CTableView without making it global?
OyS
|
|
|
|
|
1) First, you have to have a pointer to the view that contains the m_Grid variable. To get one, enumerate through the document templates, and then through the opened documents in each template, and then through the opened views of each document until you get a pointer to the desired view.
2) If the m_Grid variable is not declared public (and it shouldn't be), you either need to make it public, or (better choice) make a public function in your view class that returns the number of rows in the grid.
|
|
|
|