|
It depends on the language:
C:
#1 requires you say "enum EColour" when declaring an EColour variable.
#2 I don't think will compile.
#3 might not compile but the idea is that you now have a typedef.
C++:
#1 This is the way to go. Enough said.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
The difference is to do with C/C++ differences.
In C, enums have a separate namespace of their own (as do
structs.) So when you say:
enum EColour {...}
You are introducing the name EColour into the enum namespace
in C. That means that subsequently to declare a type of this
kind you must qualify the name with enum, viz:
enum EColour myColour;
If you try to declare a variable thus in C:
EColour myColour;
You should get an error, because EColour is not a type name
in the global namespace it is in the enum namespace which is
separate. (Note some compilers blur the differences between
C and C++ and might accept the above.)
The second version:
typedef enum EColour { ... }
is a weird meaingless structure, that is allowed for various
reasons, however, the compiler basically ignores the typedef
keyword here. (typedef int; is also allowed, but is also
largely meaningless.) This is equivelent to the previous.
The third is a kind of old C hack.
typedef enum EColour {... } EColour;
In this case you are introducing two type names. In the enum
namespace you are introducing a type called EColour, and in
the global namespace another name, EColour that is typedefed
to enum EColour. (This statement is a combination of two
statements and is equivelent to:
enum EColour {...};
typedef enum EColour EColour;
In this case you can declare a variable of this type in two
ways:
enum EColour myColour;
EColour myColour;
Both are essentially equivelent, though they have different
types, the first is type "enum EColour" the second "EColour."
However, they are assignment compatible because C uses structural
type equivelence rather than name type equivelence (as in Pascal.)
That is to say, both enums are resolved to int in C.
Note that this is not idiomatic C. Normally this would be
written as typedef enum {red, green, blue } EColour; using
an anonymous enum in the enum space. However the structure
referred to is common with structs, viz:
typedef struct _List
{
struct _List* next;
int data;
} List;
This example above is largely the reason for this weirdness
in C. If we didn't have a name for the struct, viz:
typedef struct
{
List* next;
int data;
} List;
Is what we would like to write, however, when the compiler
finds the declaration of next it has not yet seen the declaration
of List, and so this is an error. Consequently, C added the
little hack to allow you to define the structure tag up front
as in the previous example, and then introduce the full name
at the end with type typedef. (Note in the first example you
must say struct _List not just _List. Note also, that it was
common practice to use a slighly modified name of the struct
like with an affixed "_" for the structure tag. The reason
is to be compatible with even more limited compilers from
the seventies.)
Things are slightly different in C++.
C++ places enum (and struct) names into the global namespace.
There is no special namespace for enums or structs.
When you do:
enum EColour {...};
In C++ that introduces a type name "EColour" into the global
namespace, as opposed to introducing "EColour" into the enum
namespace (As in C.)
Consequently,
typedef enum EColour {...} EColour;
is a duplication in C++ since you are introducing the name
twice. However, introducing a typename twice, assuming you
give it exactly the same definition is OK in C++. (Part of
the reason why this is so, is to allow for the aforementioned
construct, making C backward compatibility stronger.)
Finally, I said that C++ introduced the name into the global
namespace, that is not strictly true. In fact it introduces
it into the prevailing namespace at the point in code it is
declared. For example:
class VisualDescription
{
public:
enum EColour { red, green blue };
}
Introduces EColour into the VisualDescription namespace, since
it was declared in that class. That is why the correct way
to qualify these names is like this:
VisualDescription::EColour col = VisualDescription::red;
rather than:
EColour col = EColour::red;
In summary, the correct way to do this in C++ is
enum EColour { red, green. blue };
The other two examples you give a hacks left over from the
flaws in C's type system.
Oh, and one final thing, the List struct above is correctly
written thus in C++:
struct List
{
List* next;
int data;
};
Here the name List is introduced immediately in the first
line, and so is directly available when we declare "next".
Of course when List is introduced in the first line it
is introduced as an incomplete type, because the compiler
has not yet read the whole definition. However, pointers
to incomplete types are valid. (And incomplete types is
a whole other article.)
HTH
|
|
|
|
|
I have a slider ctrl in my MDI app. There is a scrollbar in the frame also, which is sending forth WM_SCROLL messages. I want two different functions to run, depending on which object was scrolled: the mainframe, or the slider on my CFormView. How do I distinguish between the two WM_HSCROLL messages?
Thanks!
Appreciate your help,
ns
|
|
|
|
|
I have a wizard in my application that, when in one configuration, shows 3 read-only edit-controls on a propertysheet. However, when the propertysheet is activated (it's the 4th of 7 pages), always one of the 3 controls has the focus (all other controls are statics, except for the wizard navigation buttons on the parent). I've tried various means to get the focus to the Next button, but the only way I managed to do it is by using ShowWindow(SW_HIDE) on all three controls in SetActive, en then ShowWindow(SW_SHOW) in OnPaint ..
Is there any way to prevent initial focus on these 3 edit controls?
|
|
|
|
|
can body tell the simple code for executing a process in vc++?
r00d0034@yahoo.com
|
|
|
|
|
|
Hello,
You now that we can register a tool with a ToolTip control by using TTM_ADDTOOL.
Now how can we remove the registered tooltips?
I know about using TTM_DELTOOL but I'm looking for another ways.
Thank you in advance.
BOOL CMyToolTip::AddRectTool(CWnd *pWnd,LPCTSTR pszText,LPCRECT pRect,UINT nIDTool)<br />
{<br />
TOOLINFO ti;<br />
ti.cbSize = sizeof (TOOLINFO);<br />
ti.uFlags = TTF_SUBCLASS;<br />
ti.hwnd = pWnd->GetSafeHwnd();<br />
ti.uId = nIDTool;<br />
ti.hinst = AfxGetInstanceHandle();<br />
ti.lpszText = (LPTSTR) pszText;<br />
::CopyRect (&ti.rect, pRect);<br />
<br />
return (BOOL)SendMessage(TTM_ADDTOOL, 0, (LPARAM) &ti);<br />
}
|
|
|
|
|
how to i make an ocx it plays a swf file using flash player ocx?
Thanks.
|
|
|
|
|
the following situation:
In Win CE.
Dialog based App.
Dialog resource has 1 control, a Tab Control
when selecting a tab-page all controls for that page are created dynamically (parent = tabcntrl).
So the message handling functions for the controls and the corresponding code in messagemap are added manually. the ID's are matching. The code syntax seems to be correct.
problem:
The control are showed but the message handlers aren't called.
Did I forget something ?
|
|
|
|
|
how can one prevent a visual c++ programm from being run more than once on same PC
|
|
|
|
|
There are a number of ways to do this, a named mutex is the most common. The name for this is a singleton, if you search this site or google for the word 'singleton' I reckon you'll find heaps of examples.
Christian
No offense, but I don't really want to encourage the creation of another VB developer.
- Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael
P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not
as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
|
Can someone tell me why I can't edit my message? I'm logged in, but the board wants a password in order to delete/modify the message. However, it says that the password is incorrect, and it doesn't get sent by mail if I click on "I forgot my password"
Help
modified 12-Sep-18 21:01pm.
|
|
|
|
|
I have developed a MFC application for some equipment. The interface between my application and equipment is through serial COM port. Now problem is like this, whenever I starts the application and one dialog box appears to choose the COM port(there are two ports in one PC). If I clicks on the caption bar of that dialog box by mouse, than it displays a message box showing illegal operation and I have to close the application. Suggest me what can be the problem with my application ?
Otherwise my application is working fine.
Thanks.
Arun
|
|
|
|
|
Build a debug version, enter the debugger when it crashes, and you'll see where the problem is.
Christian
No offense, but I don't really want to encourage the creation of another VB developer.
- Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael
P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not
as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
I am running the debug version already......
But there is no Retry or Debug button onth illigal message box.
|
|
|
|
|
Show us the source code of the dialog where you choose the serial port ...
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
Although this problem is not consistent.
the cpp file is :
// ProtComPortDlg.cpp : implementation file
//
#include "stdafx.h"
#include "FasGui.h"
#include "ProtComPortDlg.h"
#include "MainFrm.h"
#include "Music.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
bool CProtComPortDlg::bFasBmpFlag;
/////////////////////////////////////////////////////////////////////////////
// CProtComPortDlg dialog
CProtComPortDlg::CProtComPortDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProtComPortDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CProtComPortDlg)
m_nComPort1 = 1;
m_strPortSystemName = _T("Fas");
//}}AFX_DATA_INIT
}
void CProtComPortDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProtComPortDlg)
DDX_Radio(pDX, IDC_PORTCOM1, m_nComPort1);
DDX_Text(pDX, IDC_PORTSYSTEMNAME, m_strPortSystemName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProtComPortDlg, CDialog)
//{{AFX_MSG_MAP(CProtComPortDlg)
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProtComPortDlg message handlers
BOOL CProtComPortDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetIcon(AfxGetApp()->LoadIcon(IDR_MAIN),FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CProtComPortDlg::OnCancel()
{
// TODO: Add extra cleanup here
CMusic MusicObj;
strSong = "Utopia.wav";
MusicObj.PlayMusic();
if(AfxMessageBox("This will terminate the application\nContinue with termination...",MB_YESNO|MB_ICONQUESTION) == IDYES)
{
PostQuitMessage(NULL);
}
//CDialog::OnCancel();
}
BOOL CProtComPortDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
::SetCursor(::LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CDOT)));
return TRUE;
// return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
I am calling the DoModal() of this class in MainFrm.cpp as:
if(ProtComPortDlgObj.DoModal()==IDOK)
{
//some processing
}
bye
|
|
|
|
|
Maybe the line ::SetCursor(::LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CDOT))); in the function BOOL CProtComPortDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) function produce the error ?!?!
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
I have a moduless dialog which has WS_CHILD property in a dll and used as an child in a view. when the dialog has focus ,it look the accelerator key massage as a dialog message and does not pass to it's parent(the view),while my purpose is that it should route the msg to the view and the dispatch to any it's child.Please tell me how to achieve this.
some presetive code goes:
In the view class:
<br />
BOOL CTestAccelView::PreTranslateMessage(MSG* pMsg) <br />
{<br />
if(TranslateAccelerator(m_hWnd,m_hAccelTest,pMsg))<br />
return TRUE;<br />
if(m_pTestDlgWnd && m_pTestDlgWnd->GetSafeHwnd() )<br />
if(m_pTestDlgWnd->PreTranslateMessage(pMsg))<br />
return TRUE;<br />
if(m_pTestDlgWnd2 && m_pTestDlgWnd2->GetSafeHwnd())<br />
if(m_pTestDlgWnd2->PreTranslateMessage(pMsg))<br />
return TRUE;<br />
return CView::PreTranslateMessage(pMsg);<br />
}<br />
In the Dialog class:
<br />
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) <br />
{<br />
if(TranslateAccelerator(m_hWnd,m_hAccelTest,pMsg))<br />
{<br />
return TRUE;<br />
}<br />
if(IsDialogMessage(pMsg))<br />
{<br />
return TRUE;<br />
}<br />
return CWnd::PreTranslateMessage(pMsg);<br />
}<br />
Scratch
|
|
|
|
|
hello @all,
i posted this message yesterday in this forum and i got much assistance, however give it another and easier way, without THEADS.!!
i have a dialogbased program.
there a two buttons (eg. button1 and button2).
if i press button1 first i get a new dialog (ID_DIALOG_COMBO) with a combobox (m_ctrlComboBox ).
if i press the button2 a CString (CString mystring ) should be enterd into the combobox from the ID_DIALOG_COMBO.
how can i do this????
thank you very much
this is only an example, to explain the real background would be take to much time
sunny
|
|
|
|
|
The dialog needs to be modeless, end of story. Someone said that to you yesterday and it's all you need. Once you have a modeless dialog, then you can still press the second button while the dialog is up, and you can create a method on the modeless dialog which takes your string and enters it into your combo box. Call that method when button two is pressed, and you're done.
People suggested you need *threads* to do this ?
Christian
No offense, but I don't really want to encourage the creation of another VB developer.
- Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael
P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not
as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
thanks for reply.
Christian Graus wrote:
The dialog needs to be modeless
i have modeless dialogs!!!
Christian Graus wrote:
you can create a method on the modeless dialog which takes your string and enters it into your combo box
that is, what i mean! how can i do this? how should the method look like?
thanks
sunny
|
|
|
|
|
public:
void PassText(CString s);
void MyModelessDialog::PassText(CString s)
{
MyComboBox.SetWindowText(s);
}
Christian
No offense, but I don't really want to encourage the creation of another VB developer.
- Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael
P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not
as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
i´m sorry, i do not understand this code example! can i use it in mfc???
thank you very much
sunny
|
|
|
|
|