|
I am not sure of how to do this, since normally all window creation is done via InitInstance. But since I have a dialog based app as the "main window" so to speak, I am not sure how to proceed. Do I need to create a new CWinApp derived class, or what ?I have a dialog, that contains a button. When the user clicks this button, I need to create a new frame window, with a splitter pane splitting the main window into two. The dialog invoking this new window should know if the window is closed.
|
|
|
|
|
It going to take some work, but for a splitter window you're going to have to create an instance of the CSplitterWnd, you can pass a window pointer from your dialog box to the splitter window after you create it from the dialog box and use that as a way to communicate events or pass data, or create custom window message and use that between the window to send messages... there are so many ways to do this, find the easiest one that works for you.
In your dialog box add a method that will create the new window and initialize it. Save it to a member pointer variable of type CWnd* use type casting were required to get the actual splitter window, or just declare a pointer to the final window you will be working with.
Check for this pointer to be null before creating the window, then you will need to use CWnd::GetSafeHwnd API to make sure there is actually a window attached to the window pointer!
You don't want to keep creating a window if one already exist, if one exist you simply want to set the focus to it when the User clicks on the dialog button again.
Make sure the destroy the window and free the pointer when you're done with it....while t he app is running you can simple show and hide the window to save you from creating and deleting a window and losing data then needs to be persistent.
You can start off by looking in the MFC section of this site on splitter windows, also you should create a simple mfc test app with a splitter window and understand how the wizard is generating the view and do the same thing or simply grab the class after tweaking it in the test app and plop it into your dialog app project and create an instance of it yourself.
IF you know how to create a modeless dialog box then you have all the know how of creating a simple window my friend, same concept.
That's all the help i can give you, I am not going to provide any code, you will just have to do you due diligence with the particulars!
Yours Truly, The One and Only!
|
|
|
|
|
FYI: There is a splitter tutorial in the MFC section for beginners that you will find helpful! I would provide you the link but I want to teach you how to be resourceful for yourself and get to know how to use this wonderful site
Yours Truly, The One and Only!
|
|
|
|
|
i got u. but how to create a window on clicking a button. i worked in dialog application only. i dont know about windows and documents. pls guide me.
|
|
|
|
|
did you read the article i told you about? did you build a test app like I told you to and look at the generated source!!!
if not do this first
here is an idea,
class MyWindow : public CFrameWnd
{
CWnd* m_pParent;
public:
MyWindow( CWnd* pParent ) : m_pParent( pParent )
{
Create( 0, _T("Hello Window!!!") );
}
};
void CPopupDlg::OnBnClickedButton1()
{
if( m_pMyWindow == 0 ) {
m_pMyWindow = new MyWindow( this );
}
if( m_pMyWindow->GetSafeHwnd() != 0 )
{
m_pMyWindow->ShowWindow( SW_SHOW );
m_pMyWindow->UpdateWindow();
}
}
GL
Yours Truly, The One and Only!
|
|
|
|
|
yes i got the window thank you very much. i will try for the explorer style. is there any link for this.
|
|
|
|
|
i am glad you got something working
unfortunately i don't know of any resource you can look at for your explorer style window, you could try a search for it in this site or google it, or like i said create a test mfc app with the app wizard, pick mfc app and then in the wizard window under the "application type" select "window explorer" for project style and then just look at the view class and how it gets created...don't be scared to dig in, roll in the mud and get dirty like a pig!!!
but here is the link to the splitter window section for you to browse around and find what you're looking for http://www.codeproject.com/splitter/
Yours Truly, The One and Only!
|
|
|
|
|
The Control has been testified by "ActiveX Test Container" which runs very well,then I use Microsoft ActiveX Control Pad to plug in this control.
IE code like this:
<title>USBClientActiveXEx
<object id="yyy" width="320" height="240
" codebase="http://xxx/yyy.cab"
="" classid="CLSID:622FA9EC-C889-4138-A2D2-A6CCB092C914">
<param name="_Version" value="65536" />
<param name="_ExtentX" value="13229" />
<param name="_ExtentY" value="13229" />
<param name="_StockProps" value="0" />
//inf like this
[Add.Code]
yyy.ocx=yyy.ocx
yyy.inf=yyy.inf
[yyy.ocx]
file=thiscab
clsid={622FA9EC-C889-4138-A2D2-A6CCB092C914}
RegisterServer=yes
FileVersion=1,0,0,1
[yyy.inf]
file=thiscab
of course,the cab file includes yyy.ocx and yyy.inf files.But when I place the page in Apachy,remote user can't register the control,what's the matter?
Later buggers harm more.
|
|
|
|
|
Your codes look OK. I think you need check the following things:
(1) File Dependencies
- MFC is shared link or static link
- Any new versions of libraries required
- Require thirty-party libraries
(2) Make sure the class ID "622FA9EC-C889-4138-A2D2-A6CCB092C914" is correct UUID for your control.
(3) Your OCX module is signed? marked as scripting safe?
(4) Web browser setting of the remote user is adjusted to load OCX?
From my experiences, most of time such case is due to (1).
|
|
|
|
|
(1)
-MFC is static link
-No
-No
(2)Yes,it is.
(3)No signed but marked as scripting safe.
(4)allow all active control access.
Later buggers harm more.
|
|
|
|
|
I have several places in my application where I am trying to change multiple GUI objects in the same function. Not all of the changes are actually taking. For instance in the below snip, the 1st SetWindowText() does not always get written, even when the MyDialer.Hangup takes a while (which it often does, it hangs up a RAS connection). The CheckDlgButton seems never to get called because this checkmark persists (it worked at one point until I moved the ::KillTimer() to before the Hangup).
There are other places in my code where I SetWindowText() before calling a lengthy function and then set it again after that function but before calling the next lengthy function and SOMETIMES the second update works and sometimes it doesn't.
I have the feeling that this is one of those things that experienced programmers just know about and how to work around and that's why it's hard to find a doc or write up on it. I also have a feeling it has to do with my stubborn lack of use of the "UpdateData( FALSE );" method. If someone tells me that using that darn thing exclusively will definitely make these objects update every time, I'll change my code ALL around. I'll still wonder very much why these other direct functions don't force the update properly, but I'll change.
note: none of my function calls are multi-threaded so if passing of control of the only thread to another function is affecting this, I thought I'd let you all know that up front. I also am still running VC 6.0 and the PSDK that was last released that supported 6.0 (for the stupid little apps that my company asks me to write they won't spring for a newer V Studio).
m_objInfoWindowLineOne is a CEdit object for one of my text boxes.
IDC_CHECK_TIMEOUT_OVERRIDE is one of my checkboxes.
void CTstDlg::OnButtonHangUp() <br />
{<br />
m_objInfoWindowLineOne.Clear();<br />
m_objInfoWindowLineOne.SetWindowText("Disconnecting");<br />
<br />
::KillTimer(GetSafeHwnd(), IDT_DIALTIMER);<br />
MyDialer.Hangup();<br />
CheckDlgButton(IDC_CHECK_TIMEOUT_OVERRIDE, BST_UNCHECKED);<br />
<br />
m_objInfoWindowLineOne.Clear();<br />
m_objInfoWindowLineOne.SetWindowText("Idle");<br />
<br />
m_strIPAddress.Empty();<br />
UpdateData( FALSE );<br />
<br />
MySQLConnection.WriteDialupLogDisconnect();<br />
}
Thank you unendingly for any light you can shed,
Chuck
|
|
|
|
|
If there's a member variable tied to m_objInfoWindowLineOne (and/or the
IDC_CHECK_TIMEOUT_OVERRIDE button) through DDE then your UpdateData() call is going to write the
contents of that variable to the m_objInfoWindowLineOne control, AFTER you've set the text
directly.
I'm thinking a quick fix for the method you've shown would be to add an UpdateData(TRUE);
before the m_strIPAddress.Empty(); call. It would probably fix it but it's not necessarily
correct or efficient
Maybe for consistency, you could either use DDE or directly set/retrieve info from controls but
not both. If you choose to use both, you need to pay close attention to when controls and
associated member variables are being modified.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|
|
When you use SetWindowText, Windows generates a message that actually causes the control to redraw itself, but that message isn't processed until your OnButtonHangUp function has completed.
In order to update the text immediately, you can add
m_objInfoWindowLineOne.UpdateWindow() immediatly after you SetWindowText.
Hope that helps.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
When I've installed IIS Server in my machine,one program wrote before will report bind error,but that just bind 6543 port,I suppose that port has been occupied by IIS,however,when I use "netstat -an" or other port viewer,this port hasn't used yet.What's the problem?
Later buggers harm more.
|
|
|
|
|
Problem: “error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const ChessBoard::cart_map_type' (or there is no acceptable conversion)”
ChessPiece get_piece(const std::string& coord) const
{
AssertCoord(coord);
cartesian_type cart = coord_cart_conv_[coord]; <- ERROR C2678
return( get_piece(cart.first, cart.second) );
}
Solution:
ChessPiece get_piece(const std::string& coord) const
{
AssertCoord(coord);
cartesian_type cart = coord_cart_conv_.find(coord)->second; <-SOLUTION
return( get_piece(cart.first, cart.second) );
}
Question: Could someone explain to me why the STL does not define the same overloading for operater[] that it does for find ?
Something like const Type& operator[]( const Key& _Key ) const; .
I really would like to know the logic behind this, as it escapes me at the moment.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
I can't see the type of cartesian_type or cart_map_type so it's hard to say much.
Steve
|
|
|
|
|
Well their types do not matter that much with regards to the question, but here they are.
typedef std::pair< int, int > cartesian_type;
typedef std::map< std::string, cartesian_type > cart_map_type;
cart_map_type coord_cart_conv_;
Cartesian is probably not a good name since I am using {row, column} instead of {X, Y}, but I am still playing with the code.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
John R. Shaw wrote: Well their types do not matter that much with regards to the question
Sure they do. A type determines the operations you can perform on an object and your question is asking why you can't perform a certain operation on an object.
That said, I can't see why your code doesn't compile. In fact, when I tried the following code it compiled just fine:
#include "stdafx.h"
#include <utility>
#include <map>
#include <string>
typedef std::pair< int, int > cartesian_type;
typedef std::map< std::string, cartesian_type > cart_map_type;
cart_map_type coord_cart_conv_;
int main(int arvc, char* argv[])
{
using namespace std;
cartesian_type cart = coord_cart_conv_[string("Hello")];
return 0;
}
Steve
|
|
|
|
|
Your code compiles just fine because main is not a constant member function of a class. If I removed the const from the end of the function declaration my original function would compile without error, but if I tried to call it via a constant object, after that, then I would get another set of errors, because you can not call a non-constant member function from a constant object..
The question had to do with calling operator[] in a constant function.
Try this:
class TestClass
{
typedef std::map< int, int > m_test_map;
public:
TestClass()
{
for( int i=0; i<10; ++i)
m_test_map[i] = i;
}
int get_value(int i) const
{
return m_test_map[i];
}
};
I have not tested the above, but it will generate the error in get_value . The reason for this is that no constant operator[] function is defined for maps.
The following should generate the same error for the same reason, because the same thing applies to strings:
class TestClass2
{
std::string m_str;
public:
TestClass() { m_str = "Hello"; }
int get_char(int i) const
{
return m_str[i];
}
};
This is an STL design issue, they have a reason for this behavior and I was just wondering what the logic behind it was.
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
As you mentioned, std::map<...>::operator [...] is a non-const function. This by design. operator [] returns a reference to the element based on a key and you can't have a reference to nothing. If you pass a key to operator [] that doesn't exist in the map it is added and a reference to the newly created element is returned; thus it can't be const .
Steve
|
|
|
|
|
|
When I create a CTreeCtrl with the TVS_CHECKBOXES property and then destroy it, it leaks the GDI objects for the TVSIL_STATE image list. I have tried adding the following code to the OnDestroy function of the CTreeCtrl's parent window. It is called but it doesn't have any affect.
// Delete the state image list so it doesn't leak GDI objects
//
CImageList *pStateImageList = m_Tree.GetImageList(TVSIL_STATE);
if (pStateImageList)
{
m_Tree.SetImageList(NULL, TVSIL_STATE);
pStateImageList->DeleteImageList();
}
CWnd::OnDestroy();
}
Any suggestions on how to fix this GDI leak?
|
|
|
|
|
Usually the image list is created as a member variable of some class, so it won't go out of scope. Why are you using pStateImageList?
|
|
|
|
|
The TVSIL_STATE image list is created automatically when the TVS_CHECKBOXES property is set on CTreeCtrl. The image lists contain the images of the checked and unchecked checkboxes.
|
|
|
|
|
This should do the same thing....does it work?
HIMAGELIST hImgList = TreeView_SetImageList(m_Tree.GetSafeHwnd(), NULL, TVSIL_STATE);
if (hImgList)
ImageList_Destroy(hImgList);
If not, is there a TVSIL_NORMAL imagelist that's not getting destroyed?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
This episode brought to you by the number 3
|
|
|
|