PDA

Visualizza la versione completa : [C++] Integrare finestra di dialogo per caricamento file


mist3r0
09-07-2007, 20:24
ciao ragazzi, mi servirebbe un aiuto, ho scritto questo codice per ottenere la finestra allegata nell'immagine:


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

const char g_szClassName[] = "myWindowClass";

// Step 4: La procedura per la Finestra
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_RBUTTONDOWN:
{

char szFileName[MAX_PATH];
HINSTANCE hInstance = GetModuleHandle(NULL);

GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, szFileName, "Hai premuto il tasto destro, Questo programma č:",
MB_OK | MB_ICONINFORMATION);

}
break;

case WM_CREATE:
{
HMENU hMenu, hSubMenu;
HICON hIcon, hIconSm;

hMenu = CreateMenu();

hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "C&arica File");
AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&sci");

AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu,
"&File");


hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "C&omprimi File");
AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "D&ecomprimi File");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu,
"&Processa");

SetMenu(hwnd, hMenu);


}
break;

case WM_LBUTTONDOWN:

break;
case WM_MBUTTONDOWN:
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case ID_STUFF_GO:

break;
}
break;

case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}


BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam,
LPARAM lParam)
{
switch(Message)
{
case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_EXIT:
{
int ret = IDCANCEL; //DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(ID D_ABOUT), hwnd, AboutDlgProc);
if(ret == IDOK){
MessageBox(hwnd, "Dialog terminato con IDOK.", "Avviso",
MB_OK | MB_ICONINFORMATION);
}
else if(ret == IDCANCEL){
MessageBox(hwnd, "Dialog terminato con IDCANCEL.", "Avviso",
MB_OK | MB_ICONINFORMATION);
}
else if(ret == -1){
MessageBox(hwnd, "Dialog fallito!", "Errore",
MB_OK | MB_ICONINFORMATION);
}
}
break;
// altri comandi menu...
}
break;

default:
return FALSE;
}
return TRUE;
}



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;

//Step 1: Registrazione della Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI _MYICON));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);
wc.lpszClassName = g_szClassName;
wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),MAKEINTRESO URCE(IDI_MYICON),IMAGE_ICON, 16, 16, 0);

if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Registrazione della Finestra Fallita!", "Errore!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

// Step 2: Creazione della finestra
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"La mia prima finestra...",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);

if(hwnd == NULL)
{
MessageBox(NULL, "Creazione della Finestra Fallita!", "Errore!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

// Step 3: Il ciclo dei messaggi
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}


QUELLO CHE A ME SERVIREBBE E QUESTO:

VORREI CHE QUANDO CLICCO SUL BOTTONE DEL MENU "Carica File", mi venga visualizzata una finestra per cercare un file nel mio hard disk...

COME DEVO FARE???

AIUTATEMI....

oregon
09-07-2007, 20:28
Questa parte del tuo codice

// altri comandi menu...

ti dice niente ...?

mist3r0
09-07-2007, 20:30
niente niente, puoi anche non considerarla...

oregon
09-07-2007, 20:33
No ... quello e' per la AboutBox ... (non si capisce nulla ... perche' non indenti il codice e lo presenti con i tag [ CODE ] nel forum ??)

Il codice dove devi intervenire e' questo



case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case ID_STUFF_GO:
break;
}


... studialo un po' ...

mist3r0
09-07-2007, 20:38
LO SO CHE DEVO INTERVENIRE NELLA PARTE

case ID_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case ID_STUFF_GO:
//*********************
// PARTE DOVE INTERVENIRE....
//***********************
break;

ma la chiamata a quale system call devo fare?

Avevo pensato a "WM_BROWSE", ma non va...

sai dirmelo tu?

oregon
09-07-2007, 20:51
Originariamente inviato da mist3r0
LO SO CHE DEVO INTERVENIRE NELLA PARTE

Calma ... non e' bello gridare ...



ma la chiamata a quale system call devo fare?

La API che cerchi e' la

GetOpenFileName

La trovi su MSDN

andbin
09-07-2007, 20:52
Originariamente inviato da mist3r0
Avevo pensato a "WM_BROWSE", ma non va...WM_BROWSE??? :oVVoVe:
Ma non esiste .....

Semmai definisci un ID specifico per la voce "Carica File" (cosa che nel codice non hai fatto).
Quindi scrivi una tua funzione (cosė da non allungare la window procedure) in cui usi la funzione Win32 GetOpenFileName() (vedi documentazione per i dettagli) per aprire una dialog box di selezione del file e successivamente farai quello che devi fare con il file selezionato.

Chiaramente nella window procedure dovrai mettere un case per il ID che ho detto prima e richiamare la tua funzione.

@oregon: il tempismo non č il mio forte :zizi:

Loading