|
The WTL class should work, what problems are your having?
|
|
|
|
|
The ATL declarations in stdafx.h:
// the following lines are required for ATL support
#include "atlbase.h"
extern CComModule _Module;
//#include "atlcom.h"
#include "atlapp.h"
#include "atlwin.h"
#include "atlctrls.h"
#include "shellapi.h"
#include "atlctrlx.h"
The usage of CHyperLink:
CHyperLink MyLink;
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
MyLink.SubclassWindow(GetDlgItem(hDlg,IDC_MYEMAIL));
return TRUE;
The error:
C:\WINDOWS\Desktop\WP\WulframPoller.cpp(1173) : warning C4003: not enough actual parameters for macro 'SubclassWindow'
C:\WINDOWS\Desktop\WP\WulframPoller.cpp(1173) : error C2059: syntax error : '('
|
|
|
|
|
Is it possible to make a tabbed property sheet, using non-MFC Win32? If so, how?
|
|
|
|
|
Yes.
InitCommonControls();
hwndTab = CreateWindow (WC_TABCONTROL, "",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0, rcClient.right, rcClient.bottom,
hwndParent, NULL, g_hinst, NULL); Note that a tab control is not a property sheet. An MFC property sheet contains a tab control (and property pages).
/ravi
"There is always one more bug..."
ravib@ravib.com
http://www.ravib.com
|
|
|
|
|
How would I make the tab control cycle between different dialog templates?
|
|
|
|
|
By selectively showing/hiding modeless dialogs (based on the different templates) depending on the currently selected tab. It's not impossible, but non-trivial. MFC's CPropertySheet makes this easy.
/ravi
"There is always one more bug..."
ravib@ravib.com
http://www.ravib.com
|
|
|
|
|
Unless I can find an example, I think doing it that way would be too difficult for me
|
|
|
|
|
Even if you find an example, it's a lot more work and is much harder to maintain. I would much prefer to use MFC.
/ravi
"There is always one more bug..."
ravib@ravib.com
http://www.ravib.com
|
|
|
|
|
I'm using NT with the latest service packs (both NT and Visual Studio).
Anyone else noticed this? According to MSDN, GetFileTitle() is supposed to return just the filename without the extension. If you open "wankitywank.txt" and then call GetFileTitle(), it should spit out "wankitywank". It even says so explicitly with an example (not the same filename )
Trouble is, that's not what it does. GetFileTitle() returns the same as GetFileName(). Why are they lying to me?!
CFile f;
f.Open("someexistingfile.txt", CFile::modeRead);
cout << (LPCTSTR) f.GetFileTitle() << endl;
cout << (LPCTSTR) f.GetFileName() << endl;
J
|
|
|
|
|
|
Great. That code is no good for me, but now I know that when I religiously uncheck "Hide file extensions for know file types" in explorer after every re-install, I control GetFileTitle().
Thanks a bunch. But man, all I wanted was a quick access method that would give me the filename WITHOUT the extension. You'd think MFC could handle this...
J
|
|
|
|
|
Quit complaining at Microsoft for making a function that does what it's supposed to. It would take all of about 2 seconds for you to write your own.
CString strFilename="MyDOcumenttxt";
CString strTitle;
int nPos;
strTitle= ((nPos=strFilename.Find('.')) != -1) ? strFilename.Left(nPos) : strFilename;
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
I'd use ReverseFind().
/ravi
"There is always one more bug..."
ravib@ravib.com
http://www.ravib.com
|
|
|
|
|
Ouch.
Indeed, it did only take 2 seconds to write my own. I was hoping that I wouldn't have to, since the documentation (save the aforementioned additional article) makes it appear as if MFC does what I need.
J
|
|
|
|
|
That will break if the filename is something like "C:\foo\bar.1\baz". You need to find the last dot and backslash, and check that the dot is after the backslash before truncating the filename.
--Mike--
"COM didn't solve the old version of DLL hell - it just provided us with a new and improved version of hell."
-- John Simmons, 1/22/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
|
Perfect. Thanks.
CFile f("c:\program files\crappysoft\wankitywank.txt", CFile::modeRead);
CString strPath = PathRemoveExtension(f.GetFileTitle());
Hopefully guaranteed to work in all situations... ?
J
|
|
|
|
|
No, because that GetFileTitle() returns a CString. You'll need to save the return value to a CString and call GetBuffer() on that string to get a non-const pointer to the filename.
--Mike--
"COM didn't solve the old version of DLL hell - it just provided us with a new and improved version of hell."
-- John Simmons, 1/22/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
Wowsers... didn't read the spec completely. What the hell type of function modifies a string buffer in place?
I suppose the GetBuffer() would be safe since PathRemoveExtension() shouldn't try to expand the string at all.
CFile f("c:\program files\microsnot\wankitywank.txt", CFile::modeRead);
CString strTitle = f.GetFileTitle();
PathRemoveExtension(strTitle.GetBuffer(0));
strTitle.ReleaseBuffer();
Except, now I need to link in shlwapi.lib... I'm going back to my ReverseFind('.')...
Thanks though.
J
|
|
|
|
|
If you're using the code snippet above, be aware that it will break if the filename is something like "C:\abc\foo.1\bar" You need to find the last dot and last backslash, and make sure the dot is after the backslash before truncating at the dot.
--Mike--
"COM didn't solve the old version of DLL hell - it just provided us with a new and improved version of hell."
-- John Simmons, 1/22/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
I'm in need of a program or class that will check a remote website for new versions of the program files, and update them if needed (check against the timestamps?).
This is so generic, I cannot believe that it hasn't been implemented already.
Thanks in advance.
Jim
|
|
|
|
|
How do I display an animated gif on a dialog box.
Help needed !
|
|
|
|
|
|
How do I break out of my main processing loop(OnOk)when the user selects the Cancel button. I was thinking along the lines that I should use:
MSG message; // declared out side the loop
for ( int t=0; t< mpData.GetSize(); t++ ) {
if (::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)){
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
This does not seem to work. When I omit this piece of code and user hits Cancel, the program just runs until completed.
Any suggestions on how to remedy?
CD
|
|
|
|
|
In Cancel button message handler set Cancel flag to TRUE. In your loop check this flag value after you processing messages. If it is TRUE, break out of loop.
|
|
|
|