How can I make a drop-down box like in browsers? I know, how to make listboxes...
How can I make a drop-down box like in browsers? I know, how to make listboxes...
Damn, I always ask 1 minute before I find the answer by myself. I didn't know they are called "combo boxes"...
But still, it works only when I use it with some listbox styles:
Without LBS_STANDARD it won't display correctly...Code:f1=CreateWindowEx(0,"Combobox","The first one",WS_BORDER|WS_VISIBLE|WS_CHILD|LBS_STANDARD|LBS_USETABSTOPS,10,10,100,200,hwnd,(HMENU)25554,GetModuleHandle(NULL),NULL);
Last edited by maxorator; 10-15-2005 at 06:17 AM.
How can I get the data of the currently selected string?
Doesn't seem to work...Code:MessageBox(hwnd,(char*)SendMessage(f1,CB_GETITEMDATA,SendMessage(f1,CB_GETCURSEL,0,0),0),TEXT("hello"),MB_OK);
Tried this too:
But this crashes my program...Code:char* happy; happy=(char*)SendMessage(f1,CB_GETCURSEL,0,0); SendMessage(f1,CB_GETLBTEXT,(WPARAM)happy,(LPARAM)happy); MessageBox(hwnd,happy,TEXT("hello"),MB_OK);
Ok tested a bit and found a working way:
Code:int tap; char hello[256]; tap=(int)SendMessage(f1,CB_GETCURSEL,0,0); SendMessage(f1,CB_GETLBTEXT,(WPARAM)tap,(LPARAM)happy); MessageBox(hwnd,happy,TEXT("hello"),MB_OK);
Last edited by maxorator; 10-15-2005 at 06:51 AM.
good call on that GetWindowText( ) function.. was just having the same problem.. but now I can easily extract selected text from my combo box
Code:#include <windows.h> #define ID_LIST 1 #define ID_TEXT 2 /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "ComboBox App"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "ComboBox App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } //User Defined Function(s) //Compare the efficiency of my C++ function vs. Charles Petzold's C function //Page #407 void FillListBox(HWND hwndList) { TCHAR *pVarName[] = {"Item1", "Item2", "Item3", "Item4", "Item5"}; for(int i=0; i<5; i++) SendMessage(hwndList, CB_ADDSTRING, 0, (LPARAM)pVarName[i]); } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndList, hwndText; int iIndex, iLength, cxChar, cyChar; TCHAR pVarName[30]; switch (message) /* handle the messages */ { case WM_CREATE: cxChar = LOWORD(GetDialogBaseUnits()); cyChar = HIWORD(GetDialogBaseUnits()); //Create Display Window hwndText = CreateWindow(TEXT("static"),NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar, cyChar, GetSystemMetrics(SM_CXSCREEN), cyChar, hwnd, (HMENU)ID_TEXT, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //Create ComboBox hwndList = CreateWindow(TEXT("Combobox"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, cxChar, cyChar*3, cxChar*16 + GetSystemMetrics(SM_CXVSCROLL), cyChar*5, hwnd, (HMENU)ID_LIST, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //Populate ComboBox FillListBox(hwndList); //Set a Default Selection SendMessage(hwndList, CB_SETCURSEL, 0, 0); GetWindowText(hwndList, pVarName, 30); SetWindowText(hwndText, pVarName); return 0; case WM_COMMAND: if( LOWORD(wParam)==ID_LIST && HIWORD(wParam)==CBN_SELCHANGE) { //Get Selection from Combo Box GetWindowText(hwndList, pVarName, 30); //Show Text in Display Window SetWindowText(hwndText, pVarName); } return 0; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
Last edited by The Brain; 10-28-2005 at 10:44 PM.
- "Problem Solving C++, The Object of Programming" -Walter Savitch
- "Data Structures and Other Objects using C++" -Walter Savitch
- "Assembly Language for Intel-Based Computers" -Kip Irvine
- "Programming Windows, 5th edition" -Charles Petzold
- "Visual C++ MFC Programming by Example" -John E. Swanke
- "Network Programming Windows" -Jones/Ohlund
- "Sams Teach Yourself Game Programming in 24 Hours" -Michael Morrison
- "Mathmatics for 3D Game Programming & Computer Graphics" -Eric Lengyel
Well, I used this method to set a default selection:
Code:SendMessage(hwndCombobox,CB_SETCURSEL,0,0);
Hi, as that topic was on the front page and the author siemed to have found the solution I didn't want to creater a new topic, with almost the same point...How can I import text file contents, as and example:
Cat
Dog
Cow
To combo box?
This is porbably a rather stupid question, but I'd still be happy, if somebody would take his or her time to answer it...
Best regards,
dogbert234.
To "The Brain", thanks for posting that code. It helped me by clearing up some confusion I had.Originally Posted by The Brain
dogbert, good question. If you can read in those words from a file, then you should be able to take "The Brain"'s example code to do it.Originally Posted by dogbert234
Can you write a program to simply read in those words?
If you need more help, I will be glad to help.
(Big hint: read and understand the function "FillListBox()")
Dogbert, I am pretty sure, that you want it to take the whole line from the file so this is the code:
Code:#include <windows.h> #include <stdio.h> LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); HWND combo; FILE * pFile; char run[256]; char szClassName[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx ( 0, szClassName, "Windows App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow (hwnd, nFunsterStil); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: combo=CreateWindowEx(0,"Combobox","", WS_BORDER|WS_VISIBLE|WS_CHILD|LBS_STANDARD|LBS_USETABSTOPS|CBS_AUTOHSCROLL, 10,10,200,200,hwnd, (HMENU)25554,GetModuleHandle(NULL),NULL); pFile = fopen ("text.txt" , "r"); if(pFile==NULL){ MessageBox(hwnd,"Could not open file","Problem",MB_OK); } else{ while(fgets(run,100,pFile)){ if(run[strlen(run)-1]=='\n'){ run[strlen(run)-1]='\0'; } SendMessage(combo,CB_ADDSTRING,0,(LPARAM)run); } SendMessage(combo,CB_SETCURSEL,0,0); } break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
Last edited by maxorator; 10-31-2005 at 06:30 AM.
maxorator,
Excellent.
I had a problem with "LBS_USE TABSTOPS", which should be "LBS_USETABSTOPS".
Theres a wierd thing about these spaces. When I copy it to this textbox it is ok, but when I post the code, some spaces appear...
I've seen it in many posts in this forum.