Getting the Combo Box selected item using Win32 API.
-
Hello All, I am adding values 0,1,2 to a combo box in Initdialog
switch(Message) { case WM_INITDIALOG: { HWND hwndCombo = GetDlgItem(hwnd, IDC_CB); SendMessage(hwndCombo , CB_ADDSTRING,0, (LPARAM) "0"); SendMessage(hwndCombo , CB_ADDSTRING,0, (LPARAM) "1"); SendMessage(hwndCombo , CB_ADDSTRING,0, (LPARAM) "2"); }
in other function I want to use the value of the combo box, (user selected item) for that I am using below codeint F; HWND HCBF = GetDlgItem(hwnd, IDC_CB); SendMessage(HCBF , CB_GETITEMDATA,(WPARAM)F, 0);
This code has no error but I am getting some junk value and i am not geting the values 0,1,2 Can u please tell me what is the error in the above code ??? Thanking you, Suresh HC. -
Hello All, I am adding values 0,1,2 to a combo box in Initdialog
switch(Message) { case WM_INITDIALOG: { HWND hwndCombo = GetDlgItem(hwnd, IDC_CB); SendMessage(hwndCombo , CB_ADDSTRING,0, (LPARAM) "0"); SendMessage(hwndCombo , CB_ADDSTRING,0, (LPARAM) "1"); SendMessage(hwndCombo , CB_ADDSTRING,0, (LPARAM) "2"); }
in other function I want to use the value of the combo box, (user selected item) for that I am using below codeint F; HWND HCBF = GetDlgItem(hwnd, IDC_CB); SendMessage(HCBF , CB_GETITEMDATA,(WPARAM)F, 0);
This code has no error but I am getting some junk value and i am not geting the values 0,1,2 Can u please tell me what is the error in the above code ??? Thanking you, Suresh HC.Suresh H wrote:
int F; HWND HCBF = GetDlgItem(hwnd, IDC_CB); SendMessage(HCBF , CB_GETITEMDATA,(WPARAM)F, 0);
Here , you have not initialized
F
. Passing junk values as index. Pass index you want there.CB_GETITEMDATA
is not right message to send in this case, too. You need to useCB_GETLBTEXT
.Prasad Notifier using ATL | Operator new[],delete[][^]
-
Suresh H wrote:
int F; HWND HCBF = GetDlgItem(hwnd, IDC_CB); SendMessage(HCBF , CB_GETITEMDATA,(WPARAM)F, 0);
Here , you have not initialized
F
. Passing junk values as index. Pass index you want there.CB_GETITEMDATA
is not right message to send in this case, too. You need to useCB_GETLBTEXT
.Prasad Notifier using ATL | Operator new[],delete[][^]
Hi Prasad, Thanks for the response. Actually I want to extract the value of the Combo Box (user selected value) In combo box we have values from 0,1,2,3 ---- so on when user selects some value fro list any number , I want to extract that number and I want to use that number in the program. Can u please tell me what I have to do ??
-
Hi Prasad, Thanks for the response. Actually I want to extract the value of the Combo Box (user selected value) In combo box we have values from 0,1,2,3 ---- so on when user selects some value fro list any number , I want to extract that number and I want to use that number in the program. Can u please tell me what I have to do ??
You must use of
CB_GETCURSEL
for get index to currently selected item instead use of 0
WhiteSky
-
Hi Prasad, Thanks for the response. Actually I want to extract the value of the Combo Box (user selected value) In combo box we have values from 0,1,2,3 ---- so on when user selects some value fro list any number , I want to extract that number and I want to use that number in the program. Can u please tell me what I have to do ??
This code should suffice,
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
TCHAR buff[100];
::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);
//buff will contain text returnedPrasad Notifier using ATL | Operator new[],delete[][^]
-
This code should suffice,
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
TCHAR buff[100];
::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);
//buff will contain text returnedPrasad Notifier using ATL | Operator new[],delete[][^]
And he needs to a convert
atoi
;)
WhiteSky
-
And he needs to a convert
atoi
;)
WhiteSky
WhiteSky wrote:
And he needs to a convert atoi
Why ?
Prasad Notifier using ATL | Operator new[],delete[][^]
-
This code should suffice,
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
TCHAR buff[100];
::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);
//buff will contain text returnedPrasad Notifier using ATL | Operator new[],delete[][^]
Thanks Prasad Code is working. Thanks for taking some time for me and helping me. In yr code 1st line was enough for me
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
since in the combo box I have values from 0,1,2,3,4,5 and so on … so as I get the Index number value will be the same as the CB content. I did not know about the CB index. Thank you very much.:) -
WhiteSky wrote:
And he needs to a convert atoi
Why ?
Prasad Notifier using ATL | Operator new[],delete[][^]
If he wants to use of numeric values
WhiteSky
-
If he wants to use of numeric values
WhiteSky
-
If he wants to use of numeric values
WhiteSky
Ok, you was refering to extracting numbers.
Prasad Notifier using ATL | Operator new[],delete[][^]
-
Thanks Prasad Code is working. Thanks for taking some time for me and helping me. In yr code 1st line was enough for me
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
since in the combo box I have values from 0,1,2,3,4,5 and so on … so as I get the Index number value will be the same as the CB content. I did not know about the CB index. Thank you very much.:)Suresh H wrote:
since in the combo box I have values from 0,1,2,3,4,5 and so on … so as I get the Index number value will be the same as the CB content.
Seems very strange logic. But, use
CB_GETLBTEXT
message, as it will not be the case always.Prasad Notifier using ATL | Operator new[],delete[][^]
-
Ok, you was refering to extracting numbers.
Prasad Notifier using ATL | Operator new[],delete[][^]
And also one other thing if he wants to use CB_GETCURSEL(return values) for works on his programs(not for combobox)its not good idea because it returns -1,0,1,...but if he has values like 100,200,300 on his combobox... return values of CB_GETCURSEL not helpfuls ;)
WhiteSky
-
Suresh H wrote:
since in the combo box I have values from 0,1,2,3,4,5 and so on … so as I get the Index number value will be the same as the CB content.
Seems very strange logic. But, use
CB_GETLBTEXT
message, as it will not be the case always.Prasad Notifier using ATL | Operator new[],delete[][^]
-
Thanks WhiteSky for the Response, yr info is also very use full for me. I will keep a note of that.
Thank you ;)
WhiteSky
-
And also one other thing if he wants to use CB_GETCURSEL(return values) for works on his programs(not for combobox)its not good idea because it returns -1,0,1,...but if he has values like 100,200,300 on his combobox... return values of CB_GETCURSEL not helpfuls ;)
WhiteSky
WhiteSky wrote:
CB_GETCURSEL(return values) for works on his programs(not for combobox)
:confused:
WhiteSky wrote:
its not good idea because it returns -1,0,1,...but if he has values like 100,200,300 on his combobox... return values of CB_GETCURSEL not helpfuls
I'm really not getting , what you are trying to say?
Prasad Notifier using ATL | Operator new[],delete[][^]
-
WhiteSky wrote:
CB_GETCURSEL(return values) for works on his programs(not for combobox)
:confused:
WhiteSky wrote:
its not good idea because it returns -1,0,1,...but if he has values like 100,200,300 on his combobox... return values of CB_GETCURSEL not helpfuls
I'm really not getting , what you are trying to say?
Prasad Notifier using ATL | Operator new[],delete[][^]
I said its better he uses of value on combobox ;)
WhiteSky
-
I said its better he uses of value on combobox ;)
WhiteSky
Prasad Notifier using ATL | Operator new[],delete[][^]
-
This code should suffice,
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
TCHAR buff[100];
::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);
//buff will contain text returnedPrasad Notifier using ATL | Operator new[],delete[][^]
For CB_GETLBTEXT, MSDn says: lParam Pointer to the buffer that receives the string. The buffer must have sufficient space for the string and a terminating null character. With your 100 TCHARS you might or might not be ok. MSDN gives the solution in the next sentence: You can send a CB_GETLBTEXTLEN message prior to the CB_GETLBTEXT message to retrieve the length, in TCHARs, of the string. So, the code-snippet would better be:
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
const LRESULT nSize = ::SendMessage(hCombo, CB_GETLBTEXTLEN, (WPARAM)nIndx, 0);
TCHAR buff[nSize+1];
::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);
//buff will contain text returned
"We trained hard, but it seemed that every time we were beginning to form up into teams we would be reorganised. I was to learn later in life that we tend to meet any new situation by reorganising: and a wonderful method it can be for creating the illusion of progress, while producing confusion, inefficiency and demoralisation." -- Caius Petronius, Roman Consul, 66 A.D.
-
For CB_GETLBTEXT, MSDn says: lParam Pointer to the buffer that receives the string. The buffer must have sufficient space for the string and a terminating null character. With your 100 TCHARS you might or might not be ok. MSDN gives the solution in the next sentence: You can send a CB_GETLBTEXTLEN message prior to the CB_GETLBTEXT message to retrieve the length, in TCHARs, of the string. So, the code-snippet would better be:
int nIndx =::SendMessage(hCombo,CB_GETCURSEL,0,0);
const LRESULT nSize = ::SendMessage(hCombo, CB_GETLBTEXTLEN, (WPARAM)nIndx, 0);
TCHAR buff[nSize+1];
::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);
//buff will contain text returned
"We trained hard, but it seemed that every time we were beginning to form up into teams we would be reorganised. I was to learn later in life that we tend to meet any new situation by reorganising: and a wonderful method it can be for creating the illusion of progress, while producing confusion, inefficiency and demoralisation." -- Caius Petronius, Roman Consul, 66 A.D.
jhwurmbach wrote:
lParam Pointer to the buffer that receives the string. The buffer must have sufficient space for the string and a terminating null character. With your 100 TCHARS you might or might not be ok.
True, It is just a quick fix.
jhwurmbach wrote:
TCHAR buff[nSize+1];::SendMessage(h,CB_GETLBTEXT,(WPARAM)nIndx,(LPARAM)buff);//buff will contain text returned
Again, small correction here, need to allocate memory on heap.
TCHAR \*buff = new TCHAR\[nIndx+1\]; ::SendMessage(hCombo,CB\_GETLBTEXT,(WPARAM)0,(LPARAM)buff); //use delete \[\] buff; after use
Prasad Notifier using ATL | Operator new[],delete[][^]