[C++] Wypełnienie combobox danymi (Win API)

0

Hej!
Mam problem w Windows API z wypełnieniem combobox danymi.
Czy ten kod jest zły?? Kompiluje sie ale nic nie działa :

LRESULT CALLBACK DialogProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    HWND hWnd_ROZDZIECZLOSC_COMBOBOX;

    const char *tablica_rozdzielczosci[] = {"640 X 480", "800 X 600", "1024 X 768"};

    switch(Msg)
    {
    case WM_INITDIALOG:
        hWnd_ROZDZIECZLOSC_COMBOBOX = GetDlgItem(hWndDlg, IDC_ROZDZIELCZOSC_COMBOBOX);

        for(int Count = 0; Count < 4; Count++)
        {
            SendMessage(hWnd_ROZDZIECZLOSC_COMBOBOX,
                        CB_ADDSTRING,
                        0,
                        reinterpret_cast<LPARAM>((LPCTSTR)tablica_rozdzielczosci[Count]));
        }

    SendMessage(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_SETCURSEL, 3, 0);
    break;
0

Wygląda na ok, oprócz tego że indeks count wychodzipoza rozmiar tablicy (masz '<4' zamiast '<3') . Jesteś pewien, że ten kod się w ogóle wykonuje ?? Sprawdź to debuggerem albo messageboxa wrzuć dla testu. Sprawdź też czy hWnd_ROZDZIECZLOSC_COMBOBOX jest prawidłowym uchwytem.

A i jeszcze jedno - pracujesz albo na char'ach (ansi), albo na wchar'ach (unicode), albo na tchar'ach (kopatybilene z obydwoma).

Dla ansi powinieś pisać tak:

const char *tablica_rozdzielczosci[] = {"640 X 480", "800 X 600", "1024 X 768"};
...
SendMessageA(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_ADDSTRING, 0,
reinterpret_cast<LPARAM>((LPCSTR)tablica_rozdzielczosci[Count]));

Dla unicode:

const wchar_t *tablica_rozdzielczosci[] = {"640 X 480"L, "800 X 600"L, "1024 X 768"L};
...
SendMessageW(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_ADDSTRING, 0,
reinterpret_cast<LPARAM>((LPCWSTR)tablica_rozdzielczosci[Count]));

Dla TCHAR

const TCHAR *tablica_rozdzielczosci[] = {TEXT("640 X 480"), TEXT("800 X 600"), TEXT("1024 X 768")};
...
SendMessage(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_ADDSTRING, 0,
reinterpret_cast<LPARAM>((LPCTSTR)tablica_rozdzielczosci[Count]));
0

Kod sie wykonuje...
Ehhh ale nadal nie wypełnia comboboxa... :/

Kod pliku (RC) z zasobami :

#define IDD_DIALOG1 1000
#define IDC_ROZDZIELCZOSC_COMBOBOX 1001
#define IDC_ROZDZIELCZOSC_STATIC 1002
#define IDC_GLEBIA_KOLOROW_STATIC 1003
#define IDC_GLEBIA_KOLOROW_COMBOBOX 1004
#define IDC_OK_BUTTON 1006
#define IDC_ANULUJ_BUTTON1 1007
#define IDC_PELNY_EKRAN_CHECKBOX 1005
#include "dialog1.h"
IDD_DIALOG1 DIALOGEX 6,6,208,131
CAPTION "Ustawienia"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10CF0000
BEGIN
  CONTROL "",IDC_ROZDZIELCZOSC_COMBOBOX,"ComboBox",0x50010003,66,22,104,11
  CONTROL "Rozdzielczość : ",IDC_ROZDZIELCZOSC_STATIC,"Static",0x50000000,5,22,50,11
  CONTROL "Głębia kolorów",IDC_GLEBIA_KOLOROW_STATIC,"Static",0x50000000,5,42,58,8
  CONTROL "",IDC_GLEBIA_KOLOROW_COMBOBOX,"ComboBox",0x50010003,66,40,104,9
  CONTROL "OK",IDC_OK_BUTTON,"Button",0x50018001,6,92,53,24
  CONTROL "Anuluj",IDC_ANULUJ_BUTTON,"Button",0x50018000,106,92,53,24
  CONTROL "Pełny ekran",IDC_PELNY_EKRAN_CHECKBOX,"Button",0x50010003,12,62,164,9
END

Kod z plikiem nagłówkowym dla plików zasobów :

#define IDD_DIALOG1              1000
#define IDC_ROZDZIELCZOSC_COMBOBOX  1001
#define IDC_ROZDZIELCZOSC_STATIC  1002
#define IDC_GLEBIA_KOLOROW_STATIC  1003
#define IDC_GLEBIA_KOLOROW_COMBOBOX  1004
#define IDC_PELNY_EKRAN_CHECKBOX  1005
#define IDC_OK_BUTTON            1006
#define IDC_ANULUJ_BUTTON       1007

Sam już nie wiem co może być nie tak...
Używam Dev-C++ 4.9.9.2

0

A tak też nie działa?

const char *tablica_rozdzielczosci[] = {"640 X 480", "800 X 600", "1024 X 768"};
...
SendMessageA(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_ADDSTRING, 0,
(LPARAM) (LPCTSTR) (tablica_rozdzielczosci[Count]);

Sprawdz co zwraca SendMessage, jezeli CB_ERR to znaczy prawdopodobnie ze masz zle hWnd kontrolki. Zobacz tez czy tablica_rozdzielczosci[Count] na pewno zawiera takie stringi jak trzeba (daj MEssageBox w petli na przyklad).

0
       if (SendMessageA(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_ADDSTRING, 0,
        reinterpret_cast<LPARAM>((LPCSTR)tablica_rozdzielczosci[Count])) == CB_ERR)
        {
           MessageBox(NULL, "BŁĄD PRZY WYPELNIANIU COMBOBOX", "BŁĄD", MB_ICONERROR); 
        }

Hmmm... błędu nie ma...
On jednak wypełnia kontrolke, tylko nie da sie wyswietlic zawartosci klikajac myszka w strzałke w dół przy liscie rozwijalnej, ale jedynie za pomoca kursorów na klawiaturze da sie przewijac zawartosc...
Moze to cos we wlasciwosciach kontrolki ??? W pliku RC?
Ehhh jednak z VCL w C++ Builder prostsze bylo programowanie niz w czystym WinAPI i C++

0

Hehe juz jasne. Wejdz w Resource Editor i zwieksz szerokosc ComboBoxa (pociagnij mysza w dół). Albo zadaj mu manifest XP i włącz style XP w systemie - nowa wersja kontrolki dostosowuje szerokosc automatycznie do dlugosci listy.

Ehhh jednak z VCL w C++ Builder prostsze bylo programowanie niz w czystym WinAPI i C++

Po to wymyslono VCL zeby przyspieszyc i ulatwic tworzenie GUI :-P

0
othello napisał(a)

Hehe juz jasne. Wejdz w Resource Editor i zwieksz szerokosc ComboBoxa (pociagnij mysza w dół). Albo zadaj mu manifest XP i włącz style XP w systemie - nowa wersja kontrolki dostosowuje szerokosc automatycznie do dlugosci listy.

Ehhh jednak z VCL w C++ Builder prostsze bylo programowanie niz w czystym WinAPI i C++

Po to wymyslono VCL zeby przyspieszyc i ulatwic tworzenie GUI :-P

Hmmm
uzywam Resource Editor (http://www.radasm.com/resed/)
Zwiększyłem wysokość kontrolki (mniej wiecej 3 razy) oraz ustawiłem AutoScroll na true...
No i działa :)
Ok, teraz bede kombinował odczytać bieżącą wartość z kontrolki i domyślnie ustawić ją na zawartość "640X480" bo przy starcie zawartosc combo-boxa jest pusta dopóki jej nie rozwinie i nie wybiorę jakiejś opcji...

0

A jak odczytać jaka jest obecnie zawartość combo box?
Tzn chodzi o to jaka opcja jest wybrana...
Trzeba odczytac komunikat CB_GETCURSEL ??

0
LOSMARCELOS napisał(a)

Trzeba odczytac komunikat CB_GETCURSEL ??
Raczej wysłać i zobaczyć co odpowie WinAPI :)

0
adf88 napisał(a)
LOSMARCELOS napisał(a)

Trzeba odczytac komunikat CB_GETCURSEL ??
Raczej wysłać i zobaczyć co odpowie WinAPI :)

Hmmm a mozna uzyc funkcji GetDlgItemText, zeby odczytać zawartość kontrolki typu ComboBox (tzn chodzi o tą opcje co jest aktualnie wybrana, nie całą zawartość)

0

Hmmm a mozna uzyc funkcji GetDlgItemText
Być może. Spróbuj.
A jak nie to

int sel_index = SendMessage(uchwyt, CB_GETCURSEL, 0, 0);
SendMessage(uchwyt, CB_GETLBTEXT, sel_index, bufor);
0
adf88 napisał(a)

Hmmm a mozna uzyc funkcji GetDlgItemText
Być może. Spróbuj.
A jak nie to

int sel_index = SendMessage(uchwyt, CB_GETCURSEL, 0, 0);
SendMessage(uchwyt, CB_GETLBTEXT, sel_index, bufor);

Hmmm a w której zmiennej jest zapamiętywane to co jest wybrane w combobox???

Ehhh ciesze,się że jak skończe ten projekcik wracam do C++ Buildera, bo w tym WinAPI człowiek się męczy z duperelami technicznymi,a nie nad istotą rzeczy...

0

Wysylasz potem do kontrolki komunikac CB_GETLBTEXT. W wParam dajesz indeks obliczony poprzednio, a w wParam bufor na pobrany tekst.

Czyli zeby pobrac tekst zaznaczenia musisz wyslac 2 komunikaty - najpierw indeks numeryczny a potem tekst z listy odpowiadajacy temu indeksowi.

[edit]
Widze ze odpowiedz juz miales - czytaj uwaznie odpowiediz na swoje posty :-P

0

Ehhh juz nie czaje...

LRESULT CALLBACK DialogProc(HWND hWndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{  
HWND hWnd_ROZDZIECZLOSC_COMBOBOX;
const char *tablica_rozdzielczosci[] = {"640 X 480", "800 X 600", "1024 X 768"};
char bufor;
int sel_index;
char *temp_char = NULL;
switch ( message )
{
   case WM_INITDIALOG:
      CheckDlgButton(hWndDlg, IDC_PELNY_EKRAN_CHECKBOX, BST_CHECKED);
      hWnd_ROZDZIECZLOSC_COMBOBOX = GetDlgItem(hWndDlg, IDC_ROZDZIELCZOSC_COMBOBOX);
      for(int Count = 0; Count < 3; Count++)
      {
       if (SendMessageA(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_ADDSTRING, 0,
        reinterpret_cast<LPARAM>((LPCSTR)tablica_rozdzielczosci[Count])) == CB_ERR)
        {
           MessageBox(NULL, "BŁĄD PRZY WYPELNIANIU COMBOBOX", "BŁĄD", MB_ICONERROR); 
        } 
      }
      if (SendMessageA(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_SETCURSEL, 3, 0) == CB_ERR)
      {
                                     
      }
   return true;

   case WM_COMMAND:
     switch ( LOWORD(wParam))
     {
             
        case IDC_OK_BUTTON:
          if (IsDlgButtonChecked(hWndDlg, IDC_PELNY_EKRAN_CHECKBOX) == true)
          {
            fullscreen = true;                                   
          }
          else
          {
            fullscreen = false;    
          }
          sel_index = SendMessage(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_GETCURSEL, 0, 0);
          SendMessage(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_GETLBTEXT, sel_index, bufor);
        //  itoa(sel_index, temp_char, 2);
        //  MessageBox(NULL, temp_char, "", MB_ICONINFORMATION);
          EndDialog(hWndDlg, IDC_OK_BUTTON);
   
        case IDC_ANULUJ_BUTTON:
         EndDialog(hWndDlg, IDC_ANULUJ_BUTTON);
         
         case IDC_ROZDZIELCZOSC_COMBOBOX: // If the combo box sent the message,
               switch(HIWORD(wParam)) // Find out what message it was
               {
                 case CBN_DROPDOWN: // This means that the list is about to display
                    MessageBox(hWndDlg, "A request to display the list has been made",
                           "Display Notification", MB_OK);
                 break;
                 case CBN_CLOSEUP:
                   SendMessage(hWnd_ROZDZIECZLOSC_COMBOBOX, CB_GETLBTEXT, WPARAM(sel_index), LPARAM(bufor));
                   MessageBox(hWndDlg, "The list will be closed",
                           "List Close Notification", MB_OK);
                   MessageBox(NULL, &bufor, "", MB_ICONINFORMATION);
                 break;
                 
                }
   return true;
  case WM_CLOSE:
     DestroyWindow(hWndDlg);
     break;
  case WM_DESTROY:
     PostQuitMessage(0);
     break;
}

break;

}
return false;
} 

Nic nie wyswietla... nie pokazuje zawartosci wybranej pozycji w combobox

0

Jak myślisz co oznacza 'bufor' ? Jeden znak ? Bo tak go zadeklarowałeś. Bufor musi być tablicą znaków.
http://msdn2.microsoft.com/en-us/library/ms673167.aspx
Po drugie nie ma instrukcji, która ten bufor by wyświetliła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1