@Alexv Non intendo forzare nessuno a cambiare, davo solo un contributo alla conoscenza e il perché si usa uno o un altro linguaggio, poi dal mio punto di vista che non deve essere per forza condiviso.
@Rosmarino Non conosco le wxWidgets e non ti posso aiutare, ho sperimentato QT5 che permette la creazione di interfacce multipiattaforma a dir poco fantastiche, usato anche dalle case automobilistiche per la creazione dei nuovi cruscotti interattivi (un pachiderma) e FLTK farraginoso un po' datato ma ancora supportato.
Resto in ascolto anche io, sono interessato ad una soluzione per gestire un'interfaccia grafica con Il C/C++, con la mia scarsa esperienza per ora ho trovato soluzioni che poi sono risultate obsolete e/o deprecate che risolvevano dei problemi ma poi non funzionavono con win10 o delle librerie aggiuntive indispensabili erano sparite, oppure ide sterminati dove l'installazione configurazione e uso comporta un'impegno equivalente ad imparare a programmare da zero.
Un link dove trovare come installare ed usare una libreria valida ancora oggi per gestire un'interfaccia senza grandi pretese in C/C++ è gradito.
Il C++ supporta la sintassi del C, non avrai nessun problema ad usarlo, i nuovi tipi di dato e la gestione della console permette di usare il C++ come un C corredato di qualche comoda istruzione in più. Ma è un uso riduttivo del C++, che invece contempla le classi e la programmazione ad oggetti.
Programmo in C da pochi mesi per curiosità, di proposito evito il C++ (conosco C# e VB.Net non sento il bisogno del C++), a scopo didattico dalla console sono riuscito a speremere qualcosina in più, per la posizione del mouse ho scritto un programma: il gioco del 15:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <ctype.h>
const char RigSopra[]={(CHAR)201,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)203,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)203,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)203,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)187,'\0'};
const char RigheCentro[]={(CHAR)204,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)206,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)206,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)206,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)185,'\0'};
const char RigSotto[]={(CHAR)200,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)202,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)202,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)202,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)205,(CHAR)188,'\0'};
const unsigned int aControllo[16][4]={{1, 4, 0, 0}, {0, 2, 5, 1}, {1, 3, 6, 2}, {2, 7, 3, 3}, {0, 5, 8, 4}, {4, 1, 6, 9}, {5, 2, 7, 10}, {11, 3, 6, 7}, {4, 9, 12, 8}, {8, 5, 10, 13}, {14, 9, 6, 11}, {15, 10, 7, 11}, {8, 13, 12, 12}, {12, 9, 14, 13}, {13, 10, 15, 14}, {14, 11, 15, 15}};
const char Titolo[]="Gioco del15 CB2021";
struct {
unsigned int riga;
unsigned int colonna;
unsigned int casella;
unsigned int mosse;
unsigned int MouseButton;
unsigned char iSequenza[16];
}GiocoDel15;
int Schermo(HANDLE Cons);
int SeqValida();
void MenuScelta();
void GenSequenza();
void mescola(HANDLE Cons);
void TrovaCasella(int x, int y, HANDLE Cons);
int main()
{
SetConsoleTitle(Titolo);
POINT pCoor;
HWND hwnd=0;
while (hwnd==0)
hwnd=FindWindow(NULL, Titolo);
HANDLE console=GetStdHandle(STD_OUTPUT_HANDLE);
MenuScelta();
GenSequenza();
Schermo(console);
while(1){
Sleep(50);
if((GetKeyState(GiocoDel15.MouseButton) & 0x8000) != 0){
GetCursorPos(&pCoor);
ScreenToClient(hwnd, &pCoor);
TrovaCasella(pCoor.x, pCoor.y, console);
if (GiocoDel15.riga!=0 && GiocoDel15.colonna!=0){
for (int i=0; i<4; i++){
if (GiocoDel15.iSequenza[aControllo[GiocoDel15.casella][i]]==0){
GiocoDel15.iSequenza[aControllo[GiocoDel15.casella][i]]=GiocoDel15.iSequenza[GiocoDel15.casella];
GiocoDel15.iSequenza[GiocoDel15.casella]=0;
GiocoDel15.mosse++;
break;
}
}
int risolto=Schermo(console);
printf("\n\n ");
if (risolto==1){
SetConsoleTextAttribute(console, 0x0E);
printf(" Risolto,");
SetConsoleTextAttribute(console, 0x0A);
}
printf(" mosse = %d",GiocoDel15.mosse);
}
Sleep(200);
}
}
}
int Schermo(HANDLE Cons){
system("cls");
int i=0;
SetConsoleTextAttribute(Cons, 0x0B);
if (GiocoDel15.MouseButton==1)
printf("\n GIOCO DEL15 W7 LBUTTON\n");
else
printf("\n GIOCO DEL15 W10 RBUTTON\n");
printf("\n ");
SetConsoleTextAttribute(Cons, 0xCF);
printf(" ");
SetConsoleTextAttribute(Cons, 0x0B);
printf("\n ");
SetConsoleTextAttribute(Cons, 0xCF);
printf(" %s ",RigSopra);
for (i=0; i<16; i+=4){
SetConsoleTextAttribute(Cons, 0x0B);
printf("\n ");
SetConsoleTextAttribute(Cons, 0xCF);
for (int ind=0; ind<4; ind++){
printf(" %c ", (CHAR)186);
if (GiocoDel15.iSequenza[ind+i]==0) printf(" "); else printf("%02d", GiocoDel15.iSequenza[ind+i]);
}
printf(" %c ", (CHAR)186);
SetConsoleTextAttribute(Cons, 0x0B);
printf("\n ");
SetConsoleTextAttribute(Cons, 0xCF);
if (i==12) printf(" %s ", RigSotto); else printf(" %s ", RigheCentro);
}
SetConsoleTextAttribute(Cons, 0x0B);
printf("\n ");
SetConsoleTextAttribute(Cons, 0xCF);
printf(" ");
SetConsoleTextAttribute(Cons, 0x0B);
printf("\n ");
printf("\n [MESCOLA] [ESCI]");
SetConsoleTextAttribute(Cons, 0x0A);
printf("\n\n Sequenza = [");
for (i=0; i<16; i++){
printf("%02d", GiocoDel15.iSequenza[i]);
}
printf("]");
if (GiocoDel15.iSequenza[15]==0 ){
printf(" SeqValida = %d", SeqValida());
}
for (i=0; i<15; i++){
if (GiocoDel15.iSequenza[i] != i+1) return 0;
}
return 1;
}
int SeqValida(){
unsigned int coppie = 0;
for (int i=0; i<15;i++){
for (int y=i+1; y<15;y++){
if (GiocoDel15.iSequenza[i] < GiocoDel15.iSequenza[y]) coppie++;
}
}
return coppie%2;
}
void MenuScelta(){
GiocoDel15.MouseButton=0;
while(GiocoDel15.MouseButton==0){
system("cls");
printf("\n ***** GIOCO DEL15 *****\n");
printf("\n si gioca con il mouse, le coordinate cambiano in base al S.O.\n");
printf("\n 1) Win 7 tasto sinistro mouse");
printf("\n 2) Win10 tasto destro mouse\n");
printf("\n 0) Esci\n");
printf("\n Tua scelta : ");
char scelta=getchar();
switch (scelta){
case '1':
GiocoDel15.MouseButton = 1;
break;
case '2':
GiocoDel15.MouseButton = 2;
break;
case '0':
printf("\n");
exit(0);
}
}
}
void GenSequenza(){
for (int i=0; i<15; i++)GiocoDel15.iSequenza[i]=i+1;
GiocoDel15.iSequenza[15]=0;
}
void mescola(HANDLE Cons){
GenSequenza();
srand((unsigned) time(NULL));
for (int i=0; i<30; i++){
int ind = rand() % 14 + 1 ;
unsigned char tmp = GiocoDel15.iSequenza[ind];
GiocoDel15.iSequenza[ind] = GiocoDel15.iSequenza[0];
GiocoDel15.iSequenza[0] = tmp;
}
GiocoDel15.mosse = 0;
Schermo(Cons);
}
void TrovaCasella(int x, int y, HANDLE Cons){
GiocoDel15.riga = 0;
GiocoDel15.colonna = 0;
GiocoDel15.casella = 0;
if (GiocoDel15.MouseButton==1){
if (x>39 && x<73) GiocoDel15.colonna = 1;
if (x>79 && x<113) {GiocoDel15.colonna = 2; GiocoDel15.casella = 1;}
if (x>119 && x<153) {GiocoDel15.colonna = 3; GiocoDel15.casella = 2;}
if (x>158 && x<193) {GiocoDel15.colonna = 4; GiocoDel15.casella = 3;}
if (y>55 && y<76) GiocoDel15.riga = 1;
if (y>79 && y<100) {GiocoDel15.riga = 2; GiocoDel15.casella +=4;}
if (y>103 && y<123) {GiocoDel15.riga = 3; GiocoDel15.casella +=8;}
if (y>129 && y<148) {GiocoDel15.riga = 4; GiocoDel15.casella +=12;}
if (x>37 && x<100 && y>180 && y<190) mescola(Cons);
if (x>149 && x<188 && y>180 && y<190) {printf("\n"); exit(0);}
}
else{
if (x > 39 && x < 74) GiocoDel15.colonna = 1;
if (x > 78 && x < 112) { GiocoDel15.colonna = 2; GiocoDel15.casella = 1; }
if (x > 119 && x < 154) { GiocoDel15.colonna = 3; GiocoDel15.casella = 2; }
if (x > 158 && x < 192) { GiocoDel15.colonna = 4; GiocoDel15.casella = 3; }
if (y > 76 && y < 103) GiocoDel15.riga = 1;
if (y > 107 && y < 135) { GiocoDel15.riga = 2; GiocoDel15.casella += 4; }
if (y > 140 && y < 167) { GiocoDel15.riga = 3; GiocoDel15.casella += 8; }
if (y > 173 && y < 197) { GiocoDel15.riga = 4; GiocoDel15.casella += 12; }
if (x > 37 && x < 100 && y>240 && y < 251) mescola(Cons);
if (x > 149 && x < 188 && y>240 && y < 251) { printf("\n"); exit(0); }
}
}
Per la posizione del cursore e i colori, ho scritto un programma che replica alcune istruzioni presenti in alcune versioni della libreria conio.h:
#include <stdio.h>
#include <windows.h>
int fore = 7;
int back = 0;
HANDLE handle;
void gotoxy(int x, int y){
COORD cursore;
cursore.X=x-1;
cursore.Y=y-1;
SetConsoleCursorPosition(handle, cursore);
}
COORD getxy(){
CONSOLE_SCREEN_BUFFER_INFO buff;
GetConsoleScreenBufferInfo(handle, &buff);
return buff.dwCursorPosition;
}
void textcolor(int f){
fore=f;
SetConsoleTextAttribute(handle, fore+back*16);
}
void textbackground(int b){
back=b;
SetConsoleTextAttribute(handle, fore+back*16);
}
void clrscr(){
system("cls");
}
int main(){
handle=GetStdHandle(STD_OUTPUT_HANDLE);
for (int i=0; i<16; i++) printf("foba ");
for (int ba=0; ba<16; ba++){
for (int fo=0; fo<16; fo++){
gotoxy(ba*5+1,fo+2);
textcolor(fo); textbackground(ba);
printf("%02d%02d", fo, ba);
}
}
textcolor(7); textbackground(0);
printf("\n");
COORD cursore=getxy();
printf("_<- qui il cursore e' in colonna %d riga %d ", cursore.X, cursore.Y);
cursore=getxy();
printf("_<- qui colonna %d riga %d \n\n", cursore.X, cursore.Y);
system("pause");
return 0;
}
entrambi sono per progetti:
console application, scritti in C con Code::Blocks e compilatore GCC. (funzionano anche con progetto console application C++).
I codici sopra esposti sono frutto del mio primo approcio al C.
EDIT: concordo con Weierstrass