|
Can one of you WTL gurus recommend a simple way to display controls in a gui editor created tab control?
I find myself having to create a WTL-based application for work. Although I have extensive experience with other languages and APIs, I have no experience with MFC/ATL/WTL, and the learning curve has been steep. I've managed to figure out a lot on my own, and am getting the hang of how things work.
The last thing I need to figure out is how to use the tabbed control. For starters I've created a dialog-based application using the gui editor, and one of it's components is a tab control added from the toolbox. I've figured out how to determine when a tab is selected, which one it was, and take action accordingly. What I can't seem to figure out how to do is to display different controls in the tab control depending on which tab is selected (I'm guessing that the easiest way would be to create a couple of dialog windows, then display them when the corresponding tab is selected).
I've looked at some of the examples posted around the internet, but none seem to directly use the editor-created tab control. It's entirely possible that I'm missing something obvious; as I mentioned I lack the background that makes learning this easy.
My question for you WTL gurus is: what's the easiest way to go about this? Obviously I need to do some more learning, but for now any suggestions, help, referrals to concrete examples, etc., would be greatly appreciated. I'm using VS 2005.
Thanks!
-- Modified Wednesday, June 23, 2010 2:19 PM
|
|
|
|
|
I created dialogs with the resource GUI editor to be the pages in my tabbed control so they appear in my rc file as below:
IDD_PSS_DIALOG DIALOGEX 0, 0, 589, 442
STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
EXSTYLE WS_EX_CLIENTEDGE
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",IDOK,306,7,50,14
PUSHBUTTON "Cancel",IDCANCEL,306,24,50,14
....
Then declared dialog classes in the usual way:
class CPSSStatusDlg : public CDialogImpl<CPSSStatusDlg>,
public CWinDataExchange<CPSSStatusDlg>,
public CDialogMessageHook
{
...
public:
CPSSStatusDlg();
enum { IDD = IDD_PSS_DIALOG };
...
};
...
created dialog objects:
...
CAboutDlg m_about;
CTH450StatusDlg m_statusDlg;
CViXStatusDlg m_StackerStatusDlg;
CPSSStatusDlg m_PSSStatusDlg;
...
and then loaded the the dialog objects onto mt tab pages:
m_tabView.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
m_about.Create(m_tabView.m_hWnd,rcDefault, NULL);
m_statusDlg.Create(m_tabView.m_hWnd,rcDefault, NULL);
m_StackerStatusDlg.Create(m_tabView.m_hWnd,rcDefault, NULL);
m_PSSStatusDlg.Create(m_tabView.m_hWnd,rcDefault, NULL);
m_tabView.AddPage(m_about.m_hWnd, _T("Task Control"));
m_tabView.AddPage(m_statusDlg.m_hWnd, _T("Arm Control"));
m_tabView.AddPage(m_StackerStatusDlg.m_hWnd, _T("Stacker Drive"));
m_tabView.AddPage(m_PSSStatusDlg.m_hWnd, _T("PSS Overview"));
|
|
|
|
|
Ok, here is the story. Till now I have a dialog based application which uses a COM object to communicate with a third party hardware. For this in vc++6 I used to do as follows
-Add a new ATL object to the project
-Include/import the necessary files
#include "thirdparty.h"
#import "_thirdparty.tlb" no_namespace
using namespace std;
-Define a variable
CComPtr<IHostDrv> pIHostDrv;
-in cpp file
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(__uuidof(CHostDrv), NULL, CLSCTX_INPROC_SERVER, __uuidof(IHostDrv), (LPVOID *) &pIHostDrv);
if (SUCCEEDED(hr) && pIHostDrv)
{
//do blah blah..
}
everything works great.
Now I am moving my application to VC++2008 and I got everyting cleaned up (all warning messages and that sort of stuff) and the program complied fine. But when I run it, the CoCreateInstance returns with an error 0x80020008 (which is bad variable type). --- this error is still there even after replacing the tlb/lib files with ones generated using VC++2008.
//the following crash error has been resolved by recreating tlb and lib files on VC++2008
So I thought maybe ATL interfacing is different in VS2008, so I started out with a simple MFC dialog based application and tried to create COM object as follows (following MSDN)
-Create the MFC project
-Add new class and then ATL Support to MFC code, then I do the same as above and now the program crashes on CoCreateInstance method (Unhandled exception at 0x003f1978 in VS2008test.exe: 0xC0000005: Access violation.)
But when I run the sample project (which is also a dialog based app) that uses this library provided by third party company (which was created in VS2005) in VS2008, it runs fine and I checked the commands and they were exactly the same I am using in mine. I am a bit lost now , anyone have any ideas why I am having this problem (bad variable type)??
thanks,
PKNT
modified on Tuesday, June 22, 2010 7:30 PM
|
|
|
|
|
Is there any way i can extract the contents relevant to a currently loaded webpage?
For example
1) suppose someone is loading nVidia's website then 'Graphic Card' is the relevant of that webpage.
2) If someone is loading World Cup Soccor website then 'Soccor' is the relevant content of that page.
3) If someone searched for Gadgets in google search, then 'Gadgets' is the relevant content of the search result.
So is there any technique to extract relevant contents of a webpage? I know using IHTMLDocument2 we can extract complete html contents of a webpage. But search engines like google, yahoo etc doers'nt allow you to se its HTML contents.
What I wanna accompalish is something similar to this.
https://addons.mozilla.org/en-US/firefox/addon/8394/
Can someone help me out with this?
Thanks in Advance
Maverick
|
|
|
|
|
Adeel Mirza wrote: So is there any technique to extract relevant contents of a webpage?
Yup. Imagine having a table in a database, where you link the "HowTo" video's to individual keywords. Retrieve the HTML when a page loads and check if it contains any keywords that are in your table. If so, display the videos that go with those keywords.
I are Troll
|
|
|
|
|
I developed a Vertical IE Explorerbar using this artical
http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4395
Now my next assignment is, whenever someone searches for anything in google or yahoo. My application should trap that keyword and display the search result using my websites search engine that explorer bar. How can I accompalish this?
Thanks in Advance
Maverick
|
|
|
|
|
Adeel Mirza wrote: whenever someone searches for anything in google or yahoo.
How would they do this, do you mean using IE or your application?
It's time for a new signature.
|
|
|
|
|
Sorry for the confusion, IE Addin was developed using ATL COM. So by application I mean the Addin. So I want the Addin to capture the keyword that was typed in the searchbar of google, and then my site itself has a search engine.
So it should query that keyword in my site's search and display the result page in the left explorerbar window
Maverick
|
|
|
|
|
I think you may need to talk to the person who developed the addin, it's not clear from your question how it interfaces with the address bar.
It's time for a new signature.
|
|
|
|
|
Not the address bar, I need to extract the keyword entered in google or yahoo search
Maverick
|
|
|
|
|
Sorry, I've no idea if that is possible, the contents of Google/Yahoo pages are controlled by their respective servers and driven by script within the pages. You might like to try posting this query to the Web Development or ASP.NET forums to see if anyone there has any ideas.
It's time for a new signature.
|
|
|
|
|
I think I am unable to explain properly. Lets make it simple. Lets say I have that IE Toolbar installed and some user typed 'Silver' in google or yahoo search. Now my IE Toolbar should extract this keyword 'Silver' when the user pressed search button. So I don't think it should be that hard. So can someone tell me how can this be accompalished.
Maverick
|
|
|
|
|
Adeel Mirza wrote: Now my IE Toolbar should extract this keyword 'Silver' when the user pressed search button.
So you need to find some method of intercepting the button press, if that is possible.
It's time for a new signature.
|
|
|
|
|
Yes. Not really intrcepting that button. Whenever someone press the search button. iHtmldocument2 should have a way to extract the keyboard that was send using http send / post methods. I am not sure though thats why I posted this question
Maverick
|
|
|
|
|
The problem is that pressing these buttons does not trigger a search action within IE, but rather a post back or script action in the web page. This will then send information back to the web site where the actual search takes place. I have no idea how you would capture this action but, as I suggested previously, it has nothing to do with ATL and is more likely to get an answer in the ASP.NET or Web Development forums.
It's time for a new signature.
|
|
|
|
|
In this case, what will ASP.NET or any other web development do? Its not that I am using or developing my own customized page. I am taking it from google or yahoo
Maverick
|
|
|
|
|
Adeel Mirza wrote: I am taking it from google or yahoo
I think perhaps you need to understand how web pages work. What you are trying to do is capture information from a web page when a certain action happens on that page. I have no idea how you could do this, but people with experience of internet tecchnology may be able to suggest something useful.
It's time for a new signature.
|
|
|
|
|
That might be considered "phishing".
The easy way? Change the HOSTS file to point to your site
I are Troll
|
|
|
|
|
Why would you want to do this? Hijacking the users intentions like this seems to be the sort of thing which is best described as malware.
Steve
|
|
|
|
|
please help, need to access CListBox on ATL Form
CListBox* lb;
HWND w=frm->GetDlgItem(IDC_LIST1);
lb=(CListBox*)w;
lb->AddString(s);
I understand that CWnd and CWindow are quite different things, but still have no better idea (
|
|
|
|
|
You cannot cast a HWND to a CListBox* , there is no connection between the two; an HWND is a Win32 handle while a CListBox* is a pointer to an object of type CListBox which is a C++ class. You will need to use some different code to find the pointer to your object; if it's a property of your form then it should be fairly easy to find.
It's time for a new signature.
|
|
|
|
|
yes it`s property of my form.
I created ATL simple control, then add composite control to it, then drag list-box item from toolbox on it.
I need to access that listbox from static function where i have only pointer on this form
unsigned int __stdcall MyFunction(void* _pEl){
CMyDialog* frm=(CMyDialog*)_pEl;
// ???
myLstBox->AddString(L"whatever");
}
|
|
|
|
|
Solved:
HWND list =frm->GetDlgItem(IDC_LIST1); //Retrieves the list control from the window
TCHAR* w=L"whatever\0";
SendMessage(list, LB_ADDSTRING, 0, (LPARAM)w); //Should retrieve the data from the specified index
)))
|
|
|
|
|
I am moving our project from VS 2005 to VS 2010 and am running up against some linker errors. std::string being multiply defined is one issue, but I will take some more time to look into that one. The one I am really confused about is the std::string constructor.
We have been using
std::string abc(aCharArray, 20);
std::string anotherExample(aStdString.c_str(), 20);
without any problems. Now VS 2010 is giving me an unresolved external during linking. It is thinking I want the constructor std::string(const char*, unsigned int) which IS what I want. It used to be defined, and it does still seem to be defined. For some reason, updating to VS 2010, it is no longer linking, though. Is the implementation for this constructor perhaps missing? Anyone run into this or can anyone confirm the same issue? Thanks.
Resolving these is pretty easy, but I am left confused as to why it gets unresolved external.
|
|
|
|
|
I ran into something I don't understand. The following line is producing another unresolved link error. 'buf' is a std::string.
std::getline(stream, buf,'\n');
We have the same line of code in other projects that compile just fine. Below is the link error. To resolve the problem, I changed buf to a char[1024] and am calling stream.getline(buf, sizeof(buf), '\n'). But why am I getting this link error in the first place? The projects which compile fine are REQUIRED projects for the project giving me this problem. I don't know if the chain of links has something to do with this, but I thought I'd at least mention it.
18>SimpleMCSFile.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator+=(char)" (__imp_??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z) referenced in function "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl std::getline<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_istream<char,struct std::char_traits<char> > &&,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,char)" (??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@$$QAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@D@Z)
|
|
|
|
|