|
ATL is the best way to write it. That's what ATL is designed to do, especially if you need to use it in IE and require something lightweight that doesn't rely on a lot of external dlls.
The ATL wizards will generate a lot of the boilerplate code for you. Used in conjuction with WTL you should be able to create a control very quickly.
Michael
'War is at best barbarism...Its glory is all moonshine. It is only those who have neither fired a shot nor heard the shrieks and groans of the wounded who cry aloud for blood, more vengeance, more desolation. War is hell.' - General William Sherman, 1879
|
|
|
|
|
Hello,
I need to enumerate all childs in a dialog, and set them to empty (0, unchecked, "", etc.). To do that, I use the EnumChildWindows function, and in the callback, I try to create a temporary CWnd* object, based on the hWnd. And to perform the correct treatment for each control, I use the IsKindOf (RUNTIME_CLASS (...)).
All is ok, but the CDateTimeCtrl don't work, the linker says :
dateTimeCtrl_pbDlg.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CDateTimeCtrl::classCDateTimeCtrl" (?classCDateTimeCtrl@CDateTimeCtrl@@2UCRuntimeClass@@B)
That's strange, because the CDateTimeCtrl contains DECLARE/IMPLEMENT_DYNAMIC so I don't understand the pb ...;
How can I do that ?
Any ideas ?
Thanks in advance
Thierry
|
|
|
|
|
I don't think it is such a good idea using MFC RUNTIME_CLASS for this. I use a combination of GetWindowLong( hWnd, GWL_STYLE ) and GetClassName( .. ) to work out what type a control is. This is straight Windows API stuff and doesn't rely on MFC. It is also more efficent than creating temporary CWnd objects etc.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
I agree with you, that was my primary way, but the GetClassName seems more efficient. So I'll use it.
Thank you for your answer.
Thierry
|
|
|
|
|
will like to know if there are other ways to position my newly created dialog boxes (ie to have them open at the bottom right hand corner of window for instance). Is there another way other than using SetWindowPos?
thanks
|
|
|
|
|
One solution is the save the window's position in the registry upon exit. Another solution is MoveWindow().
Kuphryn
|
|
|
|
|
Hi,
If you would like to show your dialog box in center of the window use CenterWindow() in OnInitDialog function of your dialog based class.
|
|
|
|
|
CADORecordset m_rs;
//m_rs is opened
m_rs.AddNew();
How to cancel the AddNew();
|
|
|
|
|
If you are not in batch mode then you can't cancel it (undo your operation). You have to delete it.
m_rs.MoveLast();
m_rs.Delete( adAffectCurrent );
In batch mode you can just use CancelUpdate, or RollbackTransmission(). Now, I am not quite sure about the names of these last two functions, because I haven't used them extensively, but look at the ado recordset functions to figure out their actual names and syntaxes are.
By the way, why do you want to cancel AddNew()? Is it because of an error? Because if you have an error, then you can simply call m_rs.CancelUpdate().
// Afterall I realized that even my comment lines have bugs
|
|
|
|
|
CADORecordset m_rs;
//m_rs is opened
m_rs.AddNew();
How to cancel to the AddNew();
|
|
|
|
|
|
Handle the WM_KEYDOWN message in one of your windows.
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|
hi~` thanks for the reply
i have something like this
BOOL CimgtestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
if (pMsg->wParam == VK_SPACE) {
lpreview = 1;
}
if(pMsg->wParam==VK_ESCAPE)
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
so this means when i press space key lpreview will be set to 1.
if the user keeps pressing space key the lpreview will always be 1.
However, what i want is that when the user doesn't press anything
lpreview will be set to 0. How do i do that?
Thanks
|
|
|
|
|
Don't do it in PreTranslateMessage()!!
Handle WM_KEYDOWN:
void CimgtestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_SPACE)
lpreview = 1;
if(nChar == VK_ESCAPE)
}
To set lpreview to 0 when the the key is not pressed, just handle WM_KEYUP:
void CimgtestDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_SPACE)
lpreview = 0;
}
You can also check the state of the space key at any time by using GetKeyState(VK_SPACE) . If the return value <0, then the key is pressed, else it is not pressed.
Hope this helps
Ryan
Being little and getting pushed around by big guys all my life I guess I compensate by pushing electrons and holes around. What a bully I am, but I do enjoy making subatomic particles hop at my bidding - Roger Wright (2nd April 2003, The Lounge)
Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late - John Nichol "Point Of Impact"
|
|
|
|
|
Thanks for the help.. really appreciated..
|
|
|
|
|
Dear all:
the table in wordXP can merge ,split ,align the cells.
How I create a table like this ?
Any sample code or suggestion will be prefered .
Thanks a lot in advance !
apex bird
|
|
|
|
|
In some of the newer versions of Rich Edit DLL, you can actually create tables. They do have limits tho... Read the MSDN on it and see if it will do what you want.
Before we saw that you can do this, we created one that emulates words table.
Wrongway
|
|
|
|
|
i want to add string to a combolistbox of a parent class
who can tell me how to do this .
|
|
|
|
|
One solution is messages. Send a message to the parent window and have it update the control.
Kuphryn
|
|
|
|
|
I am writing a C++ DLL that needs to return an array of my UDT structure to my VB Application. My problem is I am getting an automation error when I try to delcare any variables which are of the structure type I declared in C++
=====================================
I have a structure defined in C++ as follows
typedef struct structCONTACT
{
char* name;
char* email;
}CONTACT;
======================================
My GetContacts Function is defined as follows
CONTACT* __stdcall GetContacts()
{
CONTACT* c;
blah blah blah...
return c;
}
======================================
In visual basic, I set a reference to my DLL file and type the following
Dim cArr As CONTACT ' Causes Automation Error
cArr = GetContacts() ' Causes Automation Error
======================================
Why does this cause an Automation Error? In my DLL i have a resource file that has this code
1 typelib MyWab.tlb
This allows VB to access my C++ datatype with out having to distribute the .tlb file.
My DLL compiles and VB can see my structure, it can also see my function GetContacts(), however it will not run becase it give the following error:
"Compiler Error: Variable uses an Automation type not supported in visual basic."
I think the char* inside my C++ structure is okay, I beleive the problem is the fact that im trying to return an array of the CONTACT structure, and VB does not like this becase it does not recognize CONTACT as a supported Automation Data Type.
How can I make it a supported Automation DataType?
Thanks in advance
|
|
|
|
|
In the design, CONTACT structure is not COM compliant data type. One solution is to design a custom proxy/stub for custom marshaling.
Kuphryn
|
|
|
|
|
Or design your DLL function to accept a variant of type SafeArray. Element 0 is the first string and Element 1 is the second string.
|
|
|
|
|
Thank-you for your reply.
If I am to use SAVEARRAY what would my function signature look like I have not used SAFEARRAY before and do not quite understand the definition in the MSDN. This SAFEARRAY would it actually be an array of CONTACT or how would that actually work?
Thanks again
|
|
|
|
|
Hummm, no one seems to know the answer to this post...
Just an update, I have changed my C++ code so that the GetContacts function no longer returns a CONTACT data structure, instead I pass a reference to a DataStructure in as a parameter.
I then added the following line in the General Declorations Part of VB
Private Declare Function GetContacts Lib "MyWab.dll" (ByRef sPathToWABDLL As String, ByRef c() As CONTACT)
Now im getting a completely different error "Bad DLL calling convention" But if I take out that VB Declare, I get an automation error.
What am I doing wrong?
|
|
|
|
|
I have multiple processes on the same machine listening for datagrams on the same UDP port.
I'm setting up each socket to reuse the address like this:
BOOL bTrue = TRUE ;
if ( setsockopt(hSocket , SOL_SOCKET , SO_REUSEADDR , (char *)&bTrue , sizeof(bTrue) ) != 0 )
and the bind() is working fine as well:
struct sockaddr_in sockAddr ;
sockAddr.sin_family = AF_INET ;
sockAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ) ;
sockAddr.sin_port = htons( 1001 ) ;
if ( bind( hSocket , (sockaddr*)&sockAddr , sizeof(sockAddr)) != 0 )
But when I broadcast a message, only one process gets it (the first one to open the socket). Is this a limitation of UDP or have I missed something?
Software is everything. It also sucks. Charles Fishman [^]
Awasu 1.0.4 (beta)[^]: A free RSS reader with support for Code Project.
|
|
|
|