|
Hi I hv tried but its not working..
Here by I m sending my code , plz look into that..
// Here I am creating the button as well as ListBox. CTxDropDown is derived from CButton.
void CTxDropDown::CreateDropDown(CRect rect, CWnd *pWnd, UINT nID)
{
this->Create(L"", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,rect, pWnd, nID);
CRect m_rtBtn(rect);
m_rtLst.left = m_rtBtn.left + 2 ;
m_rtLst.top = m_rtBtn.top + 38 ;
m_rtLst.right = m_rtBtn.right - 2 ;
m_rtLst.bottom = m_rtBtn.bottom + 120 ;
m_lstCtrl.CreateListBox(m_rtLst , pWnd , this , nID);
m_lstCtrl.SetItemHeight(0, 25);
m_lstCtrl.AddString(L" ENGLISH");
m_lstCtrl.AddString(L" JAPANIES");
m_lstCtrl.AddString(L" FRENCH");
m_lstCtrl.AddString(L" GERMAN");
m_lstCtrl.ShowWindow(SW_HIDE);
}
// On button click I m showing the and hiding the ListBox. m_lstCtrl is the object of my listbox class
void CTxDropDown::OnBnClicked()
{
// TODO: Add your control notification handler code here.
m_lstCtrl.SetFocus();
m_bShowListCtrl = !m_bShowListCtrl;
m_lstCtrl.ShowWindow(m_bShowListCtrl );
Invalidate();
}
// Here I am creating the ListBox.CTxListControl is derived froom CListBox.
void CTxListControl::CreateListBox(CRect rect,CWnd *pWnd,CWnd *pDropDownWnd ,UINT nID)
{
this->Create(WS_VISIBLE |WS_CHILD|WS_VSCROLL|LBS_NOTIFY| LBS_HASSTRINGS | WS_TABSTOP ,rect , pWnd , nID);
this->SetFocus();
m_pDropDownWnd = pDropDownWnd;
m_rtLst = rect ;
}
// Calling the KillFocus on ClistBox
void CTxListControl::OnLbnKillfocus()
{
// TODO: Add your control notification handler code here
CListBox::ShowWindow(SW_HIDE);
}
Plz look the code..
and Gv some idea where I m worng..
|
|
|
|
|
|
Did the KillFocus path have any advantages over SetCapture/ReleaseCature? (And 10 extra points for why.)
The capture way seems to be how comboboxes are implemented, since mouse clicks outside the dropped down list has no effect on other controls.
|
|
|
|
|
I might have to miss the extra points, I'm afraid - I mostly just took Chris' idea and went with it. In the end, pretty much all the code was mine, I just took the idea.
But SetCapture does have a disadvantage or two once you go from Win 3 to NT - it doesn't work across processes now - for good reason. KillFocus will work better if you click on another application.
Your point about not doing anything when you're just clicking away from the dropdown bit of a combox box is a good one, I have to say. I hadn't really noticed it before. I press escape, or click on the already selected item if I want to get rid of it. In the app I used the Generic Dropdown's in had a decent about of safe clickable space, so it wasn't an issue.
Did I get the cookie?
Iain.
I am one of "those foreigners coming over here and stealing our jobs". Yay me!
|
|
|
|
|
Can u guys please help, how to do that..
|
|
|
|
|
Have a look at my original reply: http://www.codeproject.com/Messages/3528108/Re-list-box.aspx[^]
I gave you links to two good articles that should help you. It will take you a little while to read them, look at the code, try moving some of the code to your own program...
Good luck,
Iain.
I am one of "those foreigners coming over here and stealing our jobs". Yay me!
|
|
|
|
|
Iain Clarke, Warrior Programmer wrote: disadvantage or two once you go from Win 3 to NT
Well, lucky for me, I'm not planning on upgrading anytime soon.
Maybe the actual combobox implementation is a combination of WM_KILLFOCUS and Set/Release capture.
...and this[^] is for you.
|
|
|
|
|
Can someoane tell me how can i load more than one resourece file in mfc ?
i need it for the menu (IDR_MAINFRAME) in order to achieve localization (more than one language). thanks
|
|
|
|
|
|
Hi!
I've to build the following Query using C++.
SELECT * FROM ODI WHERE Team = "India" AND Name = "SomePlayerName"
Upto "AND" I've built the query. For "Name" I've to read from an array and assign the elements in order to the string Variable "query". The Query part I've completed is:
stringw query;
query = L"Select Name from ";
switch(tabSelected)
{
case 17:
query += L"Test";
break;
case 18:
query += L"ODI";
break;
case 19:
query += L"T20I";
break;
default:
query += L"Test";
}
query += L" WHERE Team = '";
query +=country.trim();
query +="' AND Name = '";
How to get the Name from the array and assign only one string at a time to query? Can any one help?
|
|
|
|
|
What is the array that you're talking about?
What string are you getting now and what is expected?
|
|
|
|
|
I've to fill the last part "Name" in the query. I've to get it like this:
query += m_pPlayerBtn[i]->getText();
I've to get the text that was set by me to the buttons: m_pPlayerBtn[i] . I've to get the text of one button at a time. getText() will return const wchar_t* and its signature is:
virtual const wchar_t* getText() const
{
return Text.c_str();
}
How to to append the text that getText() returns dynamically to this stringw variable "query"?
|
|
|
|
|
What is wrong with -
query += m_pPlayerBtn[i]->getText();
Are you getting any errors?
|
|
|
|
|
No Compiling Errors. Program crashes when I run this code:
void CGameMenuPlayerProfileState::readFile(stringw& country, int tabId)
{
stringw query;
query = L"Select Name from ";
switch(tabId)
{
case 17:
query += L"Test";
break;
case 18:
query += L"ODI";
break;
case 19:
query += L"T20I";
break;
default:
query += L"Test";
}
query += L" WHERE Team = '";
query +=country.trim();
query +="'";
for(int i = 0; i<m_pPlayerBtn.size();i++)
{
query += m_pPlayerBtn[i]->getText();
}
printf("%S",query);
}
Without the for loop it runs fine.
I've to get each players detail(I've to get the players from button's text) from database and display the details to a tab when a button(the corresponding player's details)is clicked.
|
|
|
|
|
Adding the name in the loop is the problem.
If you have 2 names in the array like "one" and "two", the string you're going to get will be -
"Select Name from Test WHERE Team = 'IN'onetwo"
|
|
|
|
|
Can you tell me any solution to achieve my task?
|
|
|
|
|
I still do not understand what you're trying to do.
The string without the loop is in itself a valid query -
"Select Name from Test WHERE Team = 'IN'"
Why then are you trying to append the button text?
I'm asking you again - What is the string that you're expecting to create?
|
|
|
|
|
SELECT * FROM ODI WHERE Team = "India" AND Name = "SachinRameshTendulkar" like this one I've to built.
Upto AND I've built. The remaining part "Name" I've to get from 11 button's Text(I"ve created buttons using array).
|
|
|
|
|
Ok. I made a mistake when I posted the string it is going to produce.
I'm assuming that you're created only one query.
In that case, you're logic is just fine.
All you need is a ' at the very end.
stringw query;
query = L"Select Name from ";
switch(tabId)
{
case 17:
query += L"Test";
break;
case 18:
query += L"ODI";
break;
case 19:
query += L"T20I";
break;
default:
query += L"Test";
}
query += L" WHERE Team = '";
query +=country.trim();
query +="' AND Name = '";
for(int i = 0; i<m_pPlayerBtn.size();i++)
{
query += m_pPlayerBtn[i]->getText();
}
query += "'";
|
|
|
|
|
I've already tried this one. It brings all the 11 players name in to my "query" at a time. I want only one player's name at a time. Can you tell me this approach is correct? If it's wrong can you suggest me an alternative?
|
|
|
|
|
So that means you want to fire 11 different queries?
Then how about this -
for(int i = 0; i<m_pPlayerBtn.size();i++)
{
stringw query;
query = L"Select Name from ";
switch(tabId)
{
case 17:
query += L"Test";
break;
case 18:
query += L"ODI";
break;
case 19:
query += L"T20I";
break;
default:
query += L"Test";
}
query += L" WHERE Team = '";
query +=country.trim();
query +="' AND Name = '";
query += m_pPlayerBtn[i]->getText();
query += "'";
}
|
|
|
|
|
Sorry. I've done a mistake. Instead writing this code as a separate function, I should write it inside the button's click event. There getText() returns the name of the corresponding player. For loop isn't necessary at all.
I've truobled you a lot. Please forgive me.
|
|
|
|
|
Hi All,
I'm hitting my head against the wall third day about the following code:
#define PointerToMember(B)
template <bool A, typename B, typename C, C PointerToMember(B) D>
class One
{
public:
One() {};
};
template <typename B, typename C, C PointerToMember(B) D>
class One<true, B, C, D> : public One<false, B, C, D>
{
public:
One<true, B, C, D>() : One<false, B, C, D>() { };
};
template <bool A, typename B>
struct Two
{
template <typename C, C PointerToMember(B) D>
class OneUsage : public One<A, B, C, D> { };
};
template <typename B>
struct Two<true, B> : public Two<false, B>
{
template <typename C, C PointerToMember(B) D>
class OneUsage : public One<true, B, C, D> { };
};
struct S { int i;};
int main()
{
Two<true, S>::OneUsage<int, 1> two;
return 0;
}
With those two lines commented out, it compiles in all 3 compilers: GCC, VC++ 2008 and VC++ 2005. But, if instead of
#define PointerToMember(B)
...
Two<true, S>::OneUsage<int, 1> two;
you will make it this:
#define PointerToMember(B) B::*
...
Two<true, S>::OneUsage<int, &S::i> two;
it still will compile in GCC and 2008, but will fail in 2005 with error:
error C2955: 'Two<A,B>::OneUsage' : use of class template requires template argument list
with
[
A=true,
B=S
]
list4.cpp(30) : see declaration of 'Two<A,B>::OneUsage'
with
[
A=true,
B=S
]
error C2133: 'two' : unknown size
error C2512: 'Two<A,B>::OneUsage' : no appropriate default constructor available
with
[
A=true,
B=S
]
Looks like VC++ 2005 compiler does not like usage of pointer-to-member type declaration when inheriting templates with partial specialization. Is it a bug of VC++ 2005, or I break some C++ standard, and other two compilers are just more forgiving?
This code was taken from much more complex one just to show exact problem. Code compiled by both VC++ 2008 and GCC works with no issue and as intended.
Thank you!
|
|
|
|
|
OK, question still remains, but I solved the problem by moving declaration of pointer-to-member this way:
#define PointerToMember(B)
Two<true, S>::OneUsage<int S::*, &S::i> two;
Pay attention to this line:
Two<true, S>::OneUsage<int S::*, &S::i> two;
Basically, instead of saying to template in the declaration that passed variable is of type pointer-to-member, I just make typename "C" to be pointer-to-int-member. Problem with this is that now I don't know the final type of variable "D", and if I will ever need it, I would need to pass it separately, i.e. adding one more template parameter.
This variant compiles everywhere, but question still remains: what's wrong with previous one? It's more compact and straightforward...
|
|
|
|
|
I can't comment on what's wrong with your code in the context of VC++2005 - I don't tend to use pointers to members much and never as template arguments. However as your code is compiling and working on two other compilers I'd put it down to VC++2005 not being standard compliant in that area. I'd be tempted to try VC++2010, gcc 4.x and an EDG based as well and see what happens. If those three work then you can be fairly sure your code is standard.
One other point - templates with templated internal types are going to confuse most people. Make sure you keep a clean interface between your code and your users or they're going to end up cursing your name. Something like bind_first or make_pair to hide all the gribbly declarations they might otherwise have to make (and which are a godsend with C++0x and the auto keyword).
Cheers,
Ash
modified on Thursday, July 8, 2010 4:03 AM
|
|
|
|