PDA

Visualizza la versione completa : [C API WIN 32] Problema con LISTBOX


Pensiero
01-03-2010, 17:55
Dunque, ho un dialogo, dovrei aggiungere il testo contenuto in un controllo EDIT in una LISTBOX, quando premo il pulsante OK.
Ma non capisco perchè, quando premo OK, non succede proprio nulla. Per controllare se l'applicazione arriva a gestire l'evento WM_COMMAND ho inserito una MESSAGEBOX, ed infatti quando clicco il pulsante la MESSAGEBOX appare, ma il testo dell'EDIT proprio non me la vuole inserire nella LISTBOX!


#define STRICT
#define WIN32_LEAN_AND_MEAN
#define OEMRESOURCE
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <string.h>
#include "resource.h"
#include "main.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBoxParam(0,MAKEINTRESOURCE(IDD_DIALOG1), 0,EventsManager,0);
return 0;
}



BOOL CALLBACK EventsManager(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static int messages[]={WM_CLOSE,WM_COMMAND,-1};
static DLGPROC on_events[]={On_Close,On_Command};
int i=0;
int notify=0;
char str[6];
while(notify>=0)
{
notify=messages[i];
if(notify<0)break;
if(uMsg==notify)return on_events[i](hwndDlg, uMsg, wParam, lParam);
i++;
}
return FALSE;
}

BOOL CALLBACK On_Command(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char text[256];
HWND hEdit;
switch(HIWORD(wParam))
{
case BN_CLICKED:
{
switch(LOWORD(wParam))
{
case ID_OK:
{
MessageBox(0, "L'evento viene gestito", "Fin qui va tutto bene!", MB_OK);
hEdit=GetDlgItem(hwndDlg,ID_EDIT);
GetWindowText(hEdit,text,256);
SendMessage(hEdit,LB_ADDSTRING,0,(LPARAM)text);
return TRUE;
}
break;
case ID_CANCEL:
{
EndDialog(hwndDlg,0);
return TRUE;
}
break;
}
}
break;
}
return FALSE;
}

BOOL CALLBACK On_Close (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
EndDialog(hwndDlg,0);
return TRUE;
}

oregon
01-03-2010, 18:01
Fammi capire ... con questa linea

SendMessage(hEdit,LB_ADDSTRING,0,(LPARAM)text);

invii il messaggio LB_ADDSTRING al controllo hEdit?

kirakira93
01-03-2010, 18:04
Allora... è meglio che porsti anche resoucre.h, main.h e il file .rc
Non sono un esperto di win32 ma proverò comunque ad aiutarti.
Penso che il problema sia questo:




MessageBox(0, "L'evento viene gestito", "Fin qui va tutto bene!", MB_OK);
hEdit=GetDlgItemID(hwndDlg,_EDIT);
GetWindowText(hEdit,text,256);
SendMessage(hEdit,LB_ADDSTRING,0,(LPARAM)text);


a



if (MessageBox(0, "L'evento viene gestito", "Fin qui va tutto bene!", MB_OK) == IDOK)/*etc*/



questo è per fare la condizione quando premi premi OK


Penso che la mia risposta sia futile per te comunque.... ho provato

Pensiero
02-03-2010, 07:54
Si, con "SendMessage(hEdit,LB_ADDSTRING,0,(LPARAM)text);" invio il messaggio al controllo hEdit, cioè l'EDIT(che ha come id ID_EDIT).

Questo è il resource.h:



#define IDD_DIALOG1 100
#define ID_OK 101
#define ID_CANCEL 102
#define ID_LIST 103
#define ID_EDIT 104


Questo invece è resource.rc:


#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"

IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 227, 68
STYLE DS_MODALFRAME | WS_CAPTION | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg 2"
{
DEFPUSHBUTTON "ok", ID_OK,175,5,50,14
PUSHBUTTON "Cancel",ID_CANCEL,120,5,50,14
LISTBOX ID_LIST, 10,5,105,60, NOT LBS_NOTIFY|LBS_NOSEL | WS_VSCROLL | WS_HSCROLL
EDITTEXT ID_EDIT, 120,25,105,20, ES_AUTOHSCROLL
}

oregon
02-03-2010, 09:26
E perchè lo invii al controllo Edit se devi aggiungere il dato alla Listbox?

Pensiero
02-03-2010, 11:01
Originariamente inviato da oregon
E perchè lo invii al controllo Edit se devi aggiungere il dato alla Listbox?
Ok, grazie, ho sostuito l'istruzione incriminata con questo:


SendMessage(GetDlgItem(hwndDlg,ID_LIST),LB_ADDSTRI NG,0,(LPARAM)text);


Ringrazio a tutti, adesso è perfetto!

oregon
02-03-2010, 11:06
Originariamente inviato da Pensiero
Ringrazio a tutti, adesso è perfetto!

Prego ... adesso è logicamente corretto ... :)

Loading