Wypełnianie Combobox'a elementami z listy [Win API]

0

Dzień dobry. Pracuję nad programem do obliczania ceny materiału na podstawie jego gatunku, wymiarów itp. Stworzyłem klasę w której zadeklarowałem strukturę zawierającą trzy typy danych: typ materiału (enum), gatunek materiału (string) oraz gęstość materiału (double). W pliku main.cpp stworzyłem comboboxa oraz liste do której przypisuje obiekty typu wcześniej wspomnianej struktury. Problem polega na tym, że nie wiem jak wypełnić comboboxa za pomocą elementów z listy. Poniżej mój kod z pliku głównego oraz deklaracja struktury.

main.cpp

        Calculations* calc = new Calculations();

	list<Calculations::MaterialGenre> materialGenreList;
	

	calc->SetStruct(Calculations::Aluminium, "PA6", 8.0);


	materialGenreList.push_back(calc->GetGenre());

	list<Calculations::MaterialGenre>::iterator i = materialGenreList.begin();

	for (i; i != materialGenreList.end(); ++i)
	{
		SendMessage(chooseMaterialGenreComboBox, CB_ADDSTRING, 0, (LPARAM)i->materialGenre);
	}

	delete calc;

Calculations.h

#ifndef CALCULATIONS_H
#define CALCULATIONS_H
#pragma once

#include <iostream>
#include <string>
#include <list>
#include <iterator>

using namespace std;

class Calculations
{
public:
	enum  MaterialType { Aluminium, Stal, Stal_nierdzewna, Ołów, Mosiądz, Brąz, Plastik };
	struct MaterialGenre
	{
		MaterialType materialType;
		string materialGenre;
		double materialDensity;
	};



public:
	void SetStruct(MaterialType, string, double);
	MaterialGenre GetGenre();


};
#endif // !CALCULATIONS_H

Calculations.cpp

#include "Calculations.h"

Calculations::MaterialGenre material_genre;

Calculations::MaterialGenre Calculations::GetGenre()
{
	return material_genre;
}



void Calculations::SetStruct(MaterialType materialType, string genre, double density)
{

	material_genre.materialType = materialType;
	material_genre.materialGenre = genre;
	material_genre.materialDensity = density; 
}

Oczywiście pojawiają się również błędy:

screenshot-20210920173841.png

Byłbym wdzięczny za jakąkolwiek podpowiedź jak to ugryźć.

Pozdrawiam

2

Nie mam tu Windowsa pod ręką, ale spróbowałbym

SendMessage(chooseMaterialGenreComboBox, CB_ADDSTRING, 0, (LPARAM)i->materialGenre.c_str());

Poza konkursem:
using namespace std; w headerze. Fatalne.
enum MaterialType { Aluminium, Stal, Stal_nierdzewna, Ołów, Mosiądz, Brąz, Plastik }; to już trochę śmiechowe, ale nie polecałbym znaków diakrytycznych w kodzie ;)
SetStruct wydaje się być bez sensu, od takich rzeczy jest konstruktor.

Pytanie na koniec: musisz pisać w antycznym C++, czy możesz wziąć chociaż C++11 (lepiej 14 albo 17)?

2

Ponieważ masz unikodowy projekt (taki VS tworzy domyślnie), SendMessage jest aliasem dla SendMessageW i wymaga unikodowych (UTF-16) stringów.
To oznacza używanie std::wstring i wchar_t* w miejsce std::string i char* tam gdzie coś ma być przekazane do WinAPI.

Alternatywnie możesz jawnie użyć SendMessageA i wtedy masz standardowe stringi a konwersją na UTF-16 zajmie się system.

0
alagner napisał(a):

SendMessage(chooseMaterialGenreComboBox, CB_ADDSTRING, 0, (LPARAM)i->materialGenre.c_str());

Zmieniłem na SendMessageA i prawidłowo wpisało stringa do comboboxa.

using namespace std; w headerze. Fatalne.

Zgadzam się. Poprawione.

enum MaterialType { Aluminium, Stal, Stal_nierdzewna, Ołów, Mosiądz, Brąz, Plastik }; to już trochę śmiechowe, ale nie polecałbym znaków diakrytycznych w kodzie ;)

Zgadzam się. Poprawione.

SetStruct wydaje się być bez sensu, od takich rzeczy jest konstruktor.

Zgadzam się. Poprawione.

Pytanie na koniec: musisz pisać w antycznym C++, czy możesz wziąć chociaż C++11 (lepiej 14 albo 17)?

Zmienione na C++17

Dzięki za pomoc i podpowiedzi dotyczące kodu :]

0

@Azarien: Wykorzystałem SendMessageA i działa. Dzięki! :]

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