|
duci
Forum Admin
 173 Posts |
Posted - 07/18/2005 : 16:37:21
|
Dialoguri
Dialogurile sunt initiate de obicei prin fisierul de resurse (rsrc.rc). Modalitatea depinde de mediul integrat de dezvoltare folosit.
Exemplu pentru fereastra din imaginea de mai jos.:
10000 DIALOG 10,10,160,210//18, 30, 136, 142 STYLE WS_OVERLAPPEDWINDOW |DS_MODALFRAME CAPTION "Fereastra de iesire - fara grafica " FONT 10,"MS Sans Serif" BEGIN LTEXT "Functia de repartitie a distributiei Student", 1, 0, 0, 165, 8 GROUPBOX "Rezultate", 5002, 1,58,155,132 LISTBOX 100, 7,68, 142, 124, LBS_HASSTRINGS | WS_VSCROLL|WS_CAPTION GROUPBOX "Datele de intrare", 5003, 1,10,155,47 LTEXT "&1: x:", 10, 11, 20, 44, 8 EDITTEXT IDD_STRING1, 42, 18, 104, 12 LTEXT "&2: v:", 10, 11, 32, 44, 8 EDITTEXT IDD_STRING2, 42, 30, 104, 12 DEFPUSHBUTTON "Calculeaza", IDOK,10,194, 135, 15 END
Programul principal:
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow ) { DialogBox( hInst,MAKEINTRESOURCE(10000),NULL,MainDlgProc); return( FALSE ); } Folosirea unei ferestre de tip dialog este foarte utila pentru scurtarea ciclului de creare a unei ferestre sau pentru deschiderea dialogului dintr-un meniu.
Fiecare dialog trebuie să aiba o procedura CALLBACK proprie.
Pentru ferestre dialog nu avem nevoie de procesarea DefWindowProc, actiunile de procesare a mesajelor fiind făcute automat de sistemul de operare.
In loc de WM_CREATE folosim WM_INITDIALOG. Acest mesaj este foarte util pentru deschiderea dialogului dintr-un meniu sau la apasarea unui buton.
In locul mesajului DestroyWindow vom folosi EndDialog.
BOOL WINAPI MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_INITDIALOG: // Initiere dialog { SetProp( hDlg, MAKEINTATOM( 10000 ), // Dialog box sprintf(szString1,"%lf",x); SetDlgItemText(hDlg,IDD_STRING1,szString1);//scrie în fereastra SendDlgItemMessage(hDlg,IDD_STRING1,EM_LIMITTEXT,MAXLEN - 1, 0); sprintf(szString2,"%2.0lf",v); SetDlgItemText(hDlg,IDD_STRING2,szString2);//scrie în fereastra SendDlgItemMessage (hDlg, IDD_STRING2, EM_SETSEL,0,MAXLEN - 1) ; return( TRUE ); } // End WM_INITDIALOG case WM_COMMAND: { if (( HIWORD(wParam) == BN_CLICKED) &&(LOWORD(wParam)==IDOK) ) // If butonul OK { GetDlgItemText (hDlg, IDD_STRING1, szString1, MAXLEN) ; x = strtod(szString1, &pEnd); GetDlgItemText (hDlg, IDD_STRING2, szString2, MAXLEN) ; v = strtod(szString2, &pEnd); sprintf(sz_str,"P(%lf,%2.0lf)=%lf",x,v,Student(x,v)); SendDlgItemMessage(hDlg, 100, LB_ADDSTRING, 0, (LPARAM)sz_str); // cursorul la sfarsit i=SendDlgItemMessage(hDlg,100, LB_GETCOUNT, 0,0); SendDlgItemMessage(hDlg,100, LB_SETCURSEL, i-2,0); return(TRUE); }//OK if(wParam == IDCANCEL )// sfarsitul dialogului { DeleteObject( GetProp( hDlg, MAKEINTATOM( 10000 ) ) ); // Termina atribuirea proprietatilor RemoveProp( hDlg, MAKEINTATOM( 10000 ) ); EndDialog( hDlg, TRUE ); // Termina dialogul return( TRUE ); }//CANCEL }//WM_COMMAND } //switch return( FALSE ); }// Sfarsit MainDlgProc()
Dialoguri comune Dialogurile comune sunt disponibile prin sistemul de operare, de exemplu dialogul open/save, alegerea fontului, alegerea culorii, sau meniul print. Pentru meniul Open/Save avem urmatoarea descriere
Prototip:
BOOL GetOpenFileName(LPOPENFILENAME fileinfo); returneaza TRUE dacă utilizatorul a selectionat un fisier BOOL GetSaveFileName(LPOPENFILENAME fileinfo); returneaza TRUE dacă utilizatorul a selectionat un fisier
Membrii structurii:
HWND hwndOwner; Fereastra parinte DWORD lStructSize; Dimensiunea structurii trebuie cunoscuta intotdeauna LPTSTR lpstrFilter; Filtru pentru selectia dupa extensie a fisierelor disponibile LPTSTR lpstrFile; Sir de caractere pentru stocarea caii pana la fisier. Minim 256 byte. DWORD nMaxFile; Dimensiunea sirului de caractere *lpstrFile LPCSTR lpstrTitle; Daca nu este Null, acesta va da titlul ferestrei de dialog DWORD Flags; Exista multe variabile de acest tip, care pot fi la nivel de bit. Urmeaza cateva mai des intalnite: OFN_HIDEREADONLY - Ascunde fisierele readonly OFN_FILEMUSTEXIST - Fisierul selectat de utilizator OFN_ALLOWMULTISELECT - Permite selectarea simultana a mai multor fisiere.
Examplu: GetOpenFileName
#include <windows.h> #include <string.h> #include <stdio.h>
int main(void) { OPENFILENAME file; BOOL bret; char FileName[1000]=""; memset(&file,0,sizeof(file)); file.lStructSize = sizeof(file); file.Flags = OFN_HIDEREADONLY; file.lpstrFile=FileName; file.nMaxFile=1000; file.lpstrFilter= "Fisier de tip text(*.txt)\0*.txt;*.text\0Fisiere de tip C\0*.c;*.cpp\0"; bret=GetOpenFileName(&file); if(bret==FALSE) { printf("Nimic selectat"); return 1; } printf("File Name: %s\n",FileName); return 0; } Examplu: GetSaveFileName
#include <windows.h> #include <string.h>
int main(void) { OPENFILENAME file; memset(&file,0,sizeof(file)); file.lStructSize = sizeof(file); GetSaveFileName(&file); return 0; }
|
|