|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Aiuto sulle Api (nozioni di base)
Allora, sto studiando da diverso tempo le API, e mi sono sorti alcuni dubbi che non rieso a colmare (sia di codice che di GUI in generale)..
1) Allora, ho capito come creare un dialogo e i suoi rispettivi controlli...però mi è sfuggita una cosa, come posso includere controlli (tipo edit, bottoni etc) nella finestra principale senza creare dialoghi aggiuntivi??... 2) Come posso dire alla finestra principale di "prendere del testo" (mamma mia), tipo il notPad di Windozz?? (ho visto diversi tutorial ma non ho capito bene lo stesso) 3) non ho ben capito il significato di finestra figlia (o meglio cosa la differenzia da una qualsiasi altra)...nel senso...potrebbe essere un dialogo non modale per esempio??... 4)Sento spesso parlare di DLL studiando le API...mi potreste brevemente spiegare cosa sono e a cosa servono? (senza andare troppo nel particolare, al massimo come vengono incluse etc)... 5inta ed ultima) Sto studiando le API per conto mio (visto che a scuola non le trattiamo, non trattiamo proprio la GUI, faremo un pò di VB il prossimo anno ma non mi piace)...e mi è sorto un dilemma: mi conviene veramente continuare, o sarebbe meglio magari passare ad altre librerie come le gtk??...su vista (visto l'imminente cambiamento) saranno presenti in modo uguale?? (cioè: le gtk saranno presenti su vista? e allo stesso modo le API subiranno cambiamenti?)...quale potrebbe essere il guadagno di un passaggio così? (da windows.h a gtk.h, se veramente un guadagno ci può essere)... Ho posatato su questo forum perchè vedo che c'è gente che sene intende di queste cose (mi rendo conto che non sono poche ma sul web non ho trovato adeguata risposta a queste doamande)...ringrazio anticipatamente chiunque possa schiarirmi le idee... |
|
|
|
|
|
#2 | ||||||||||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
1) li crei manualmente di sana CreateWindow 2) li metti in una dialog e crei manualmente un'istanza modeless della dialog (CreateDialog) nella finestra principale 3) usi un tool RAD, come Visual Basic, Delphi, C++ Builder, o come le Windows Forms Quote:
Quote:
la differenza tra i due alberi è sottile, tant'è vero che spesso le finestre hanno per Parent e per Owner la stessa finestra. il Parent di una finestra è quella che la contiene graficamente (se la finestra figlia va fuori dalla client area del suo Parent, viene tagliata; se il Parent è invisibile, la finestra figlia è invisibile indipendentemente dalla sua visibilità). l'Owner di una finestra invece è il suo Parent iniziale, che ha la proprietà di essere quella che ha la responsabilità di eliminarla. una finestra viene eliminata o su richiesta (DefWindowProc riceve WM_DESTROY) o su richiesta rivolta all'Owner; ma non al Parent. spero di essermi ricordato tutto giusto e di non aver detto inesattezze... Quote:
i vantaggi di mettere codice in una dll: 1) se hai sul pc 100 eseguibili che fanno la stessa cosa, e quella cosa la fa una funzione che sta in una sola dll, i 100 eseguibili caricano tutti la stessa dll ed eseguono tutti la stessa porzione di memoria fisica risparmiando spazio su disco e in RAM 2) se quella cosa conteneva un bug, è sufficiente patchare solo la dll anziché ciascuno dei 100 eseguibili Quote:
Quote:
Quote:
anzi, oltre alle funzioni già presenti in XP conterranno addirittura qualche funzione in più Quote:
Quote:
1) succedeva prevalentemente da Windows 9x a Windows NT; ormai è storia, l'ultimo dei Windows 9x è andato 2) si tratta di differenze minime che non costituiscano comunque un "suicidio commerciale" ricorda che qualsiasi differenza di protocollo è una nuova incompatibilità, una nuova dicitura "non supporta Vista" su buona parte dei programmi per Windows Quote:
e ci aggiungiamo forse anche una maggiore semplicità rispetto alle API nude e crude; ma non sono sicuro perché non conosco. |
||||||||||
|
|
|
|
|
#3 | |||||||
|
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Prima di tutto grazie per le risposte
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
Edit: hai iniziato a 12-13 anni????...ma come hai fatto??...cos'è hai iniziato a programmare CUI a 7 anni?? |
|||||||
|
|
|
|
|
#4 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
La soluzione di usare la funzione CreateWindow è sicuramente possibile ma .... molto noiosa e lunga. In <questo> thread avevo postato un esempio completo per creare una finestra vuota (senza controlli). Guarda solo quanto codice serve per aprire una finestra vuota! Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
|
Quote:
Una DLL (Dynamic Linked Library) E' una libreria sotto Windows, equivalente agli .o ed .so sotto Linux -edit- forse tu ti rifersci ai file .lib ... cfr quello che ha scritto andbin Apparentemente adesso si sta parlando di Win32 e quando dici API tu ti riferisci a queste... Ma è da notare come API stia genericamente per Application Programming Interface: una API è una qualunque interfaccia di programmazione, intesa come specifica documentata delle funzioni o delle classi (con relativi metodi pubblici) che il programmatore può "vedere" e usare dal codice che sta scrivendo e che sono contenute in un altro pezzo di codice si dice che una libreria _esporta_ una interfaccia (ma spesso anche un programma eseguibile, quando permette la creazione di plugins, ma per le librerie vale SEMPRE) Quote:
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
Ultima modifica di jappilas : 02-10-2006 alle 17:21. |
||
|
|
|
|
|
#6 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
![]() ti confondi con semplici file COFF; un lib è diverso, ha tutt'altro formato e non è una libreria, ne' statica ne' dinamica. un COFF è una libreria statica, una DLL è dinamica. un lib serve solo in compile time per ritrovare informazioni di linking, statiche o dinamiche che siano. |
||
|
|
|
|
|
#7 | ||
|
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Ok..per fare finestre figlie faccio così:
IDD_DIALOG2 DIALOG 230, 0, 122, 68 STYLE WS_MINIMIZEBOX | WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Non-modale" FONT 8, "MS Sans Serif" BEGIN LISTBOX IDC_LIST1,10,5,105,60,LBS_NOTIFY | LBS_NOSEL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP END Quote:
Quote:
Si ok riesco a farli come dici tu...solo che non mi vengono tipo il grosso edit del BloccoNote di windozz... Come vedi l'edit copre tutta la finestra principale e non può essere un dialogo visto che non presenta la barra del titolo: ![]() Capito che intendo?...ripropongo la domanda: come posso fare un edit identico a quello del Blocco di windozz? Ultima modifica di Gino+89+ : 02-10-2006 alle 17:33. |
||
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comodo no?? Quote:
Eh??? Ma hai bevuto ieri che era Domenica??? Una libreria .lib può essere certamente anche solo una "import library" (per agganciarsi ad una DLL) ma in generale una .lib (o .a su Linux) può contenere tutto il codice che vuoi!!! Funzioni, variabili.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#9 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ci sarà quindi una (o più, non lo so) libreria .lib che contiene le funzioni della libreria standard del "C". Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#10 | |||||||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
capisco che tu abbia voglia di imparare roba di livello un po' più basso delle cazzatelle che ti insegnano a scuola (come non comprenderti, è la stessa voglia che ha sempre guidato anche me attraverso l'apprendimento di questa sconfinata scienza per adesso continua ad imparare che fai bene, ma poi dovrai diventare più produttivo Quote:
non mi va di scrivere codice nel primo caso: per creare una finestra che contenga un controllo nativo di Windows (casella di testo, pulsante, check box, radio button, list box, controlli di Internet Explorer...) basta che come nome della window class gli dai uno di quelli predefinit (qui hai l'elenco completo di quelli nativi, mancano quelli di IE: <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindow.asp>). nel secondo invece devi solo disegnare la tua dialog nelle risorse e crearla con CreateDialogXxx passandogli la tua main window come Parent; e ovviamente, nel disegnare la dialog, devi toglierci la barretta blu e il contorno 3D in modo che resti solo un rettangolo grigio con dentro i controlli Quote:
1) creare l'edit nella main window; banale lavoro di CreateWindow, passando la stringa "EDIT" come window class name. 2) allinearlo alla client area (in modo che se ridimensioni la main window, l'edit la segue); qua non c'è scorciatoia, devi semplicemente gestire WM_SIZE nella finestra principale e ridimensionare l'edit con MoveWindow in modo che occupi l'intera client area della main window. Quote:
Quote:
Quote:
Quote:
infine ho lasciato perdere del tutto la programmazione usermode per dedicarmi allo sviluppo di drivers :P attualmente uso il DDK e sento la mancanza della programmazione a oggetti. |
|||||||
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Quote:
"Creare l'edit nella main window"->ma è questo che non riesco a fare... "passando la stringa "EDIT" come window class name."->Si bè ma solo per far capire che è un edit, anche se gli metto "pippo" non cambierebbe nulla no? "banale lavoro di CreateWindow"-> Codice:
CreateWindowEx(DWORD dwExStyle, // "stile esteso"
LPCTSTR lpClassName, // nome della classe di finestra
LPCTSTR lpWindowName, // testo della finestra
DWORD dwStyle, // stile della finestra
int x, int y, int nWidth, int nHeight, // geometria
HWND hWndParent, // finestra-genitrice
HMENU hMenu, // menu, o identificatore di controllo
HINSTANCE hInstance, // "istanza" del creatore
LPVOID lpParam // puntatore a "dati supplementari"
);
Ultima modifica di Gino+89+ : 02-10-2006 alle 18:17. |
|
|
|
|
|
|
#12 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
non sapevo...fermo rimane che ti confondevi coi file COFF: sarà che ho attivato qualche switch strano del compilatore, ma quando ho creato una mia libreria statica il .lib da solo per linkare non bastava. |
||
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Ha ok scusa ora ho capito...non avevo letto bene la prima parte...grazie mille a tutti!!
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ecco il codice per un semplice e minimale editor di testo.
Codice:
#define STRICT
#include <windows.h>
#include <commctrl.h>
#define MAIN_WNDCLASS "ClasseEditorTesto"
#define IDC_EDIT 100
LRESULT CALLBACK Main_WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
return 0;
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint (hWnd, &ps);
EndPaint (hWnd, &ps);
return 0;
}
case WM_DESTROY:
PostQuitMessage (0);
return 0;
case WM_CLOSE:
DestroyWindow (hWnd);
return 0;
case WM_SIZE:
{
INT iWidth = LOWORD (lParam);
INT iHeight = HIWORD (lParam);
SetWindowPos (GetDlgItem (hWnd, IDC_EDIT), NULL, 0, 0, iWidth, iHeight, SWP_NOZORDER | SWP_NOMOVE);
return 0;
}
}
return DefWindowProc (hWnd, uMsg, wParam, lParam);
}
INT APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpszCmdLine, INT iCmdShow)
{
WNDCLASSEX wcx;
HWND hWnd, hWndEdit;
MSG msg;
wcx.cbSize = sizeof (wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = (WNDPROC) Main_WndProc;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = hInstance;
wcx.hIcon = NULL;
wcx.hIconSm = NULL;
wcx.hCursor = LoadCursor (NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = MAIN_WNDCLASS;
if (!RegisterClassEx (&wcx))
{
MessageBox (NULL, "Errore nella registrazione della classe",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}
hWnd = CreateWindow (MAIN_WNDCLASS, "Editor di testo", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 300, 300,
NULL, NULL, hInstance, NULL);
if (hWnd == NULL)
{
MessageBox (NULL, "Errore nella creazione della finestra",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}
hWndEdit = CreateWindow (WC_EDIT, "", WS_CHILD | WS_VISIBLE | WS_VSCROLL |
WS_HSCROLL | ES_LEFT | ES_MULTILINE | ES_NOHIDESEL,
0, 0, 0, 0,
hWnd, (HMENU) IDC_EDIT, hInstance, NULL);
if (hWndEdit == NULL)
{
MessageBox (NULL, "Errore nella creazione del campo di testo",
"ERRORE", MB_OK | MB_ICONEXCLAMATION);
return 1;
}
ShowWindow (hWnd, SW_SHOWNORMAL);
UpdateWindow (hWnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#15 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Neanche io "bevo". Quote:
Indipendentemente dal suo formato interno, una libreria statica (.lib su Windows o .a su Linux), può, in generale, contenere N file .obj/.o.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
comunque io linkavo senza il lib, direttamente il COFF (ce n'era uno solo perché c'era un solo file sorgente; ce ne fossero stati più d'uno era conveniente metterli tutti dentro il lib e linkare solo quello, poi il compilatore lo apriva e linkava un COFF alla volta, dico bene?) |
|
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Quote:
Che cosa contiene commctrl.h di importante??...quando non lo includo mi da errore sul SetWindowPos()... |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Tecnicamente sarebbe più corretto creare il campo di edit (e in generale tutti i controlli) in risposta al messaggio WM_CREATE, perché in questo modo se la creazione di un controllo fallisce, si può far fallire la creazione della finestra principale restituendo -1 invece di 0. Ho incluso commctrl.h perché in quel include c'è la definizione di WC_EDIT, che è una semplice macro per la stringa "Edit" (il nome della classe per il campo di edit). Strano poi che ti dia errore sulla SetWindowPos se non lo includi. SetWindowPos non ha nulla a che vedere con i commctrl.h!!!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Una libreria statica .lib/.a è generalmente un "contenitore" per più file oggetto. I vari compilatori mettono sicuramente a disposizione un tool per lavorare con le librerie statiche, per aggiungere/togliere/elencare, ecc... gli oggetti.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:21.





















