Breve Tutorial x creazione nuovo "componente" ReactOS

Moderators: forart, Davy Bartoloni, gabrielilardi

Post Reply
User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

:) vista la mega nevicata del giorno..e il consecutivo sonno/noia, cerchero' di svegliarmi scrivendo la "sequenza" necessaria a creare una propria applicazione integrata in ReactOS ( ovvero compilabile tramite l'ambiente RosBE ).. spero che a qualcuno faccia venir voglia di sviluppare :)

allora... inanzitutto, scegliamo un qualcosa di poco legato al SO.. in modo da nn angosciarsi con eventuali dipendenze.. avevo pensato ad una sorta di Help o info-Box, visualizzabile dal CD di installazione di ROS.. una cosa tipo il WELCOME...

ok, allora.. per prima cosa individuiamo la "sezione" piu' adatta a questa piccola nuova applicazione...

indubbiamente, \base\setup che contiene gia' "Welcome".. allora, come al solito, specifico che la directory del sorgente che prendo di riferimento e': C:\ReactOS-src

quindi, spostiamoci nella cartella C:\ReactOS-src\base\setup
e creiamo una nuova directory, "NUOVO"

perfetto, ora editiamo il file setup.rbuild che si trova nella directory in cui abbiamo creato NUOVO, e aggiungiamo le informazioni relative alla nostra nuova applicazione...

questo e' quello originale...

Code: Select all

<?xml version="1.0"?>
<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
<group xmlns:xi="http://www.w3.org/2001/XInclude">
  <directory name="setup">
  <xi:include href="setup/setup.rbuild" />
  </directory>
  <directory name="usetup">
  <xi:include href="usetup/usetup.rbuild" />
  </directory>
  <directory name="vmwinst">
  <xi:include href="vmwinst/vmwinst.rbuild" />
  </directory>
  <directory name="welcome">
  <xi:include href="welcome/welcome.rbuild" />
  </directory>
  <directory name="reactos">
  <xi:include href="reactos/reactos.rbuild" />
  </directory>
</group>
e q eusto e' quello "MODIFICATO"

Code: Select all

<?xml version="1.0"?>
<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
<group xmlns:xi="http://www.w3.org/2001/XInclude">
  <directory name="setup">
  <xi:include href="setup/setup.rbuild" />
  </directory>
  <directory name="usetup">
  <xi:include href="usetup/usetup.rbuild" />
  </directory>
  <directory name="vmwinst">
  <xi:include href="vmwinst/vmwinst.rbuild" />
  </directory>
  <directory name="welcome">
  <xi:include href="welcome/welcome.rbuild" />
  </directory>
  <directory name="reactos">
  <xi:include href="reactos/reactos.rbuild" />
  </directory>
  <directory name="nuovo">
  <xi:include href="nuovo/nuovo.rbuild" />
  </directory>
</group>
bene, ora posizioniamoci nella directory "NUOVO"
e creiamo il RBUILD per la nuova applicazione... ( usando sempre il notepad.. o l' EDIT del DOS.. oppure un qualsiasi IDE testuale )

ecco il contenuto di nuovo.rbuild ( da creare nella cartella : C:\ReactOS-src\base\setup\nuovo )

Code: Select all

<?xml version="1.0"?>
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
<module name="nuovo" type="win32gui" installbase="system32" installname="nuovo.exe" unicode="yes">
	<bootstrap installbase="$(CDOUTPUT)" />
	<include base="nuovo">.</include>
	<library>kernel32</library>
	<library>gdi32</library>
	<library>user32</library>
	<file>nuovo.c</file>
</module>
le librerie incluse, sn quelle minimali necessarie alla creazione di grafica e finestre ( GDI32 ).. a recuperare qualche info sul sistema ( KERNEL32 ) e qualche info sulle finestre (USER32 )
( che posso dire... fidatevi.. sn proprio quelle di base base per scrivere qualcosina di belloccio da vedere )

cm avevamo gia' visto nel tutorial delel modifiche dello screensaver, bisognera' costruire uan struttura a directory contenente le RESOURCES ( RES ) ( ovvero immagin icone suoni.. beh i suoni per il momento in ros sn un azzardo :) ) e poi quello contenente le stringhe nelle varie lingue, per eventuali traduzioni dell' applicazione future... ( LANG )
piu' i soliti file ( .c .rc .h )
ecco lo screenshot della directory ...

[ external image ]

[ CONTINUA... ]
Last edited by Davy Bartoloni on Fri Dec 26, 2008 10:42 pm, edited 1 time in total.

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

Ok, dopo essermi visto le ultime 8 puntate di Heroes (terza stagione) .. passo alla seconda parte del mini-tutorial..

allora.. nel file Nuovo.c dobbiamo scriverci qualche info per far capire a chi lo riprendera' sotto mano in futuro . di che cosa si tratta....
percui.. in testa al sorgente dobbiamo mettere una cosa del genere...

Code: Select all

/*
 * ReactOS Application
 * Copyright (C) 2008-2009 Davy Bartoloni ( hahaha )
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
/* $Id: nuovo.c 2008-25-12 21:17:12 $
 *
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS Simple COMPILER-TEST
 * FILE:        base\setup\nuovo.c
 * PROGRAMMERS: Davy Bartoloni <davy@bartoloni.org>
 */
.. e proseguendo .. direi di creare un paio di messageBox ( winapi ), giusto per poter verificare che il MAKE del ROSBE faccia il suo lavoro correttamente :)
ecco il mini-codice di nuovo.c, da aggiungere al seguito delle REM precedenti.

Code: Select all

#include <windows.h> // indubbiamente faro' uso del sistema a finestre di windows...
#include <tchar.h>   // e per facilitarmi l'inserimento delle stringhe usero' qualche funzione "velocizzante", come TEXT

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    
     //ecco 2 modi di "indentare" il codice, per renderlo piu' leggibile ( nel primo message box )
     MessageBox(
		0,
		TEXT("Questo e' il mio primo programma compilabile attraverso ROS-BE"),
		TEXT("questo tipo di finestra e' una MESSAGEBOX"),
	 	MB_OK
		);

     //e tutto su una sola linea nel secondo messagebox
     MessageBox(0,TEXT("Questa e' una seconda MESSAGEBOX"),TEXT("Ultima finestra"), MB_OK);
	
return(0);
}  
.. ora.. beh penso nn ci sia altro da fare.. lanciamo il ROSBE e digitiamo un bel "MAKE NUOVO"

il tempo di mettere in sesto la procedura di build.. e dovrebbe apparire una cosa simile...

C:\ReactOS-src>make nuovo
[CC] base\setup\nuovo\nuovo.c
[LD] output-i386\base\setup\nuovo\nuovo.exe
[RSYM] output-i386\base\setup\nuovo\nuovo.exe

Total Build Time: 00:00:03
C:\ReactOS-src>


e il risultato lanciando nuovo.exe creato nella directory : C:\ReactOS-src\output-i386\base\setup\nuovo sara':

[ external image ]

p.s qualcuno avra' notato che nello screenshot avevo inserito come file anche nuovo.rc .. ma per questo semplice test l'ho poi eliminato per evitare confusione.. quindi riepilogando, i SOLI FILE NECESSARI per il funzionamernto di questo esempio sono: "NUOVO.C" e "NUOVO.RBUILD" .. oltre alla modifica di "setup.rbuild"

[CONTINUA...]

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

yawnhh sn le 3... di ritorno a casa, prima di andare a dormire ... posto un esempio contenente una finestrella.

Code: Select all

#include <windows.h>
#include <tchar.h> 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{
	CreateWindowEx(	
		0, 
		WC_DIALOG, 
		TEXT("Titolo della finestra"), // beh, facile da capire.. questo e ' il titolo delal finestra
		WS_OVERLAPPEDWINDOW | WS_VISIBLE, // attributi per rendere visibile la finestra...
		400, // la creo alla coordinata X 400 (orizzontale)
		100, // e alla coordinata Y 100 ( verticale)
		400, // Larghezza della finestra...
		300, // Altezza...
		NULL, 
		NULL, 
		NULL, 
		NULL  
	);

	//e ora apro un message box, per evitare che la finestra creata ... sparisca subito

	MessageBox(
		NULL, 
		TEXT("Premi ok per concludere il programma."), // testo del message BOX
		TEXT("Finestra del tipo MESSAGEBOX"),	// titolo...
		0   // questo e' lo stile... 0 e' lo standard "OK"

	);
	return 0;
}
ecco il risultato a schermo...

[ external image ]

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

oggi ho pensato bene di sfracellarmi una caviglia :( aprofitto di questa serata "forzata" a casa, per il terzo esempio...

creare la finestra, scriverci qualcosa dentro, e fare in modo che venga "riaggiornata".. ( quindi niente piu' message BOX... ma direttamente la gestione standard con i pulsanti )

ecco il codice...

Code: Select all

/*
 * ReactOS Application
 * Copyright (C) 2008-2009 Davy Bartoloni ( hahaha )
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/* $Id: nuovo.c 2008-27-12 21:17:12 $
 *
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS Simple COMPILER-TEST example 3
 * FILE:        base\setup\nuovo.c
 * PROGRAMMERS: Davy Bartoloni <davy@bartoloni.org>
 */

#include <windows.h>
#include <tchar.h> 

TCHAR *titoloapplicazione=TEXT("Semplice applicazione per REACTOS (esempio 3)");
TCHAR *testo1=TEXT("Questa e' una finestra\r\nfunzionante... ovvero");
TCHAR *testo2=TEXT("viene ridisegnata e puo' essere ingrandita o chiusa");


LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
  switch (msg)
  {
    case WM_PAINT:   // ecco la parte che disegna il contenuto della finestra...
    {
      PAINTSTRUCT ps;
      HDC dc;
      RECT r;
      GetClientRect(hwnd,&r);
      dc=BeginPaint(hwnd,&ps);
      DrawText(dc,testo1,-1,&r,DT_CENTER|DT_VCENTER);  // stampa la prima linea di testo...
      DrawText(dc,testo2,-1,&r,DT_SINGLELINE|DT_CENTER|DT_VCENTER); // e stampa la seconda... ma in maniera diversa.
      EndPaint(hwnd,&ps);
      break;
    }

    case WM_DESTROY:   // e qua quella che permette la chiusura della stessa.
      PostQuitMessage(0);
      break;

    default:
      return DefWindowProc(hwnd, msg, wparam, lparam);
  }
  return 0;
} 

// ecco il "MAIN"...

int WINAPI _tWinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
  // registro la classe della finestra...  

  WNDCLASS wc;
  HWND hwnd;
  MSG msg;

  wc.style=CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc=WindowProc;
  wc.cbClsExtra=0;
  wc.cbWndExtra=0;
  wc.hInstance=hInstance;
  wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);
  wc.hCursor=LoadCursor(NULL,IDC_ARROW);
  wc.hbrBackground=(HBRUSH)COLOR_WINDOWFRAME;
  wc.lpszMenuName=NULL;
  wc.lpszClassName=titoloapplicazione;

  if (!RegisterClass(&wc))
    return 0;

  hwnd = CreateWindow(titoloapplicazione,titoloapplicazione,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,400,120,
    NULL,NULL,hInstance,NULL);

  if (!hwnd)
    return 0;

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

   // ed ecco il ciclo principale... 

  while (GetMessage(&msg,NULL,0,0) > 0)
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
return 0;
}
e' un po piu' lungo... ma contiene sicuramente validi spunti per poter creare un piccolo info-box.

ecco lo screen in ReactOS.

[ external image ]

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

ok siamo quasi alla fine del tutorial... oggi e' il momento dell' immagine grafica, un esempio che vedra' ricomparire la cartella RES ( resources ) .. il file resource.h , nuovo.rc... e nuovo.rbuild ( WOW ! )

per chi avesse letto il tutorial sulla modifica dello screensaver di ReactOS .. nn vedra' nulla di nuovo.

allora, apriamo nuovo.rbuild e aggiungiamo il riferimento a nuovo.rc

Code: Select all

<?xml version="1.0"?>
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
<module name="nuovo" type="win32gui" installbase="system32" installname="nuovo.exe" unicode="yes">
	<bootstrap installbase="$(CDOUTPUT)" />
	<include base="nuovo">.</include>
	<library>kernel32</library>
	<library>gdi32</library>
	<library>user32</library>
	<file>nuovo.c</file>
	<file>nuovo.rc</file>
</module>
ora, editate il file nuovo.rc, in modo da inserire i riferimenti all' immagine che utilizzeremo nell' esempio...

Code: Select all

#include "resource.h"

IDB_IMMAGINE           BITMAP DISCARDABLE     "res/immagine.bmp"
creiamo il riferimento a IDB_IMMAGINE nelle resources.. ovvero apriamo ( o creiamo ) resource.h
e inseriamo SOLO questa linea...

Code: Select all

#define IDB_IMMAGINE                    101
ora.. nn resta che inserire un immagine, ovvero IMMAGINE.BMP nella cartella RES, ovvero dove verra' cercata dal programma.
l'immagine la potete salvare da qua: http://www.wcn.it/immagine.bmp

ora..

nuovo.rbuild e' stato modificato...
resource.h e' stato creato e contiene la linea che identifica IDB_IMMAGINE
nuovo.rc contiene il riferimento alla directory che contiene il file IMMAGINE.BMP

nn rimane che scrivere il nuovo codice di nuovo.c... eccolo:

Code: Select all

/*
 * ReactOS Application
 * Copyright (C) 2008-2009 Davy Bartoloni ( hahaha )
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/* $Id: nuovo.c 2008-28-12 21:17:12 $
 *
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS Simple COMPILER-TEST example 4
 * FILE:        base\setup\nuovo.c
 * PROGRAMMERS: Davy Bartoloni <davy@bartoloni.org>
 */

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

TCHAR *g_szClassName = TEXT("Finestra esempio 4");
HBITMAP immagine = NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_CREATE:
			immagine = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_IMMAGINE));
		break;
		case WM_CLOSE:
			DestroyWindow(hwnd);
		break;
		case WM_PAINT:
		{
			BITMAP bm;
			PAINTSTRUCT ps;

			HDC hdc = BeginPaint(hwnd, &ps);

			HDC hdcMem = CreateCompatibleDC(hdc);
			HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, immagine);

			GetObject(immagine, sizeof(bm), &bm);

			BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

			SelectObject(hdcMem, hbmOld);
			DeleteDC(hdcMem);

			EndPaint(hwnd, &ps);
		}
		break;
		case WM_DESTROY:
			DeleteObject(immagine);
			PostQuitMessage(0);
		break;
		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}

int WINAPI _tWinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;

	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.style		 = 0;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = g_szClassName;
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);

	RegisterClassEx(&wc);

	hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		g_szClassName,
		TEXT("ReactOS Logo"),
		WS_OVERLAPPEDWINDOW,
		100, 100, 224, 214,
		NULL, NULL, hInstance, NULL);

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

	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
}

ecco il risulato:
[ external image ]
carino vero?

e questa e' una versione con i message-box con i controlli di errore attivati, ovvero se l'immagine nn viene trovata e inclusa nell'eseguibile.. viene segnalato.. se la classe nn puo' essere registarata . idem.. e se la finestra nn puo' essere creata... pure.

Code: Select all

/*
 * ReactOS Application
 * Copyright (C) 2008-2009 Davy Bartoloni ( hahaha )
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/* $Id: nuovo.c 2008-28-12 21:17:12 $
 *
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS Simple COMPILER-TEST example 4
 * FILE:        base\setup\nuovo.c
 * PROGRAMMERS: Davy Bartoloni <davy@bartoloni.org>
 */

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

TCHAR *g_szClassName = TEXT("Finestra esempio 4");
HBITMAP immagine = NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_CREATE:
			immagine = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_IMMAGINE));
			if(immagine == NULL)
				MessageBox(hwnd, TEXT("Impossibile caricare l' immagine."), TEXT("Errore"), MB_OK | MB_ICONEXCLAMATION);
		break;
		case WM_CLOSE:
			DestroyWindow(hwnd);
		break;
		case WM_PAINT:
		{
			BITMAP bm;
			PAINTSTRUCT ps;

			HDC hdc = BeginPaint(hwnd, &ps);

			HDC hdcMem = CreateCompatibleDC(hdc);
			HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, immagine);

			GetObject(immagine, sizeof(bm), &bm);

			BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

			SelectObject(hdcMem, hbmOld);
			DeleteDC(hdcMem);

			EndPaint(hwnd, &ps);
		}
		break;
		case WM_DESTROY:
			DeleteObject(immagine);
			PostQuitMessage(0);
		break;
		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}

int WINAPI _tWinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;

	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.style		 = 0;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = g_szClassName;
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);

	if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL, TEXT("Impossibile registrare la classe finestra."), TEXT("Errore!"),
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		g_szClassName,
		TEXT("ReactOS Logo"),
		WS_OVERLAPPEDWINDOW,
		100, 100, 224, 214,
		NULL, NULL, hInstance, NULL);

	if(hwnd == NULL)
	{
		MessageBox(NULL, TEXT("Impossibile Creare la finestra"), TEXT("Errore!"),
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}

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

	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
}
da come si puo' vedere.. sn state aggiunti solo 3 IF e 3 Message-BOX

il primo:

Code: Select all

if(immagine == NULL) MessageBox(hwnd, TEXT("Impossibile caricare l' immagine."), TEXT("Errore"), MB_OK | MB_ICONEXCLAMATION);
che avvisa del mancato caricamento dell' immagine.. ma fa cmq proseguire ilprogramma...

il secondo:

Code: Select all

if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL, TEXT("Impossibile registrare la classe finestra."), TEXT("Errore!"),
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}
e il terzo:

Code: Select all

if(hwnd == NULL)
	{
		MessageBox(NULL, TEXT("Impossibile Creare la finestra"), TEXT("Errore!"),
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}
ieri parlando con un amico, mi e' stato fatto presente : "non riesco a capire la struttura del programma..." pero' guardava il codice scorrendolo sul WEB...
beh, che dire, sicuramente, per chi si sta avvicinando o vorrebbe avvicinarsi al C, provenendo da altri linguaggi o da programmazione senza winapi.. la soluzione ideale
e' STAMPARE il sorgente, in questo caso sono solo 2 paginette, una volta stampate, attaccarle assieme con lo scotch una di seguito all' altra in modo da avere una VISIONE COMPLETA DEL CODICE, dalla prima linea all' ultima. e dopodiche' inziare a dividerne le parti, magari usando una biro o un pennarello.

per esempio, inziando a dividere la parte del _tWinMain da quella del CALLBACK WndProc
identificando il loop principale del programma, ovvero l'unico ciclo while presente...
poi al parte in cui viene creata la finestra principale:

Code: Select all

hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		g_szClassName,
		TEXT("ReactOS Logo"),
		WS_OVERLAPPEDWINDOW,
		100, 100, 224, 214,
		NULL, NULL, hInstance, NULL);
che come ho gia' fatto presente puo' essere scritta anche cosi':

Code: Select all

hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, g_szClassName,TEXT("ReactOS Logo"),WS_OVERLAPPEDWINDOW,100, 100, 224, 214,NULL, NULL, hInstance, NULL);
non ci sono rem in questo codice, nn le ho messe per non farlo diventare piu' lungo.. ( ho notato che il codice lungo a "vedersi" fa passare la voglia di leggerlo ) ma stampando il sorgente dell' esempio 2, e dell esempio 3.. e confronatndoli con questo, sara' FACILISSIMO identificare le singole parti dei precedenti esempi ( che invece erano commentati )

per chi volesse stampare il codice su singolo foglio, vedendo ridotto .. eccolo qua:

Code: Select all

#include <windows.h>
#include "resource.h"
#include <tchar.h> 
TCHAR *g_szClassName = TEXT("Finestra esempio 4");
HBITMAP immagine = NULL;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_CREATE:
			immagine = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_IMMAGINE));
		break;
		case WM_CLOSE:
			DestroyWindow(hwnd);
		break;
		case WM_PAINT:
		{
			BITMAP bm;
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);
			HDC hdcMem = CreateCompatibleDC(hdc);
			HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, immagine);
			GetObject(immagine, sizeof(bm), &bm);
			BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
			SelectObject(hdcMem, hbmOld);
			DeleteDC(hdcMem);
			EndPaint(hwnd, &ps);
		}
		break;
		case WM_DESTROY:
			DeleteObject(immagine);
			PostQuitMessage(0);
		break;
		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.style		 = 0;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = g_szClassName;
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
	RegisterClassEx(&wc);
	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName, TEXT("ReactOS Logo"), WS_OVERLAPPEDWINDOW, 100, 100, 224, 214, NULL, NULL, hInstance, NULL);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
}
i compilatori c, di norma, non tengono in cosiderazione gli SPAZI e gli A-CAPO, quindi il codicepuo' essere "distribuito" o "diviso" per migliorarne la leggibilita'.
l'unica cosa a cui bisogna fare attenzione sn le virgole e i ";".. che spesso provocano un errore di compilazione, per una semplice dimenticanza.

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

ed ecco aggiunte le scritte, con un INTUITIVA gestione colori e posizione ...

Code: Select all

/*
 * ReactOS Application
 * Copyright (C) 2008-2009 Davy Bartoloni ( hahaha )
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/* $Id: nuovo.c 2008-28-12 21:17:12 $
 *
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS Simple COMPILER-TEST example 5
 * FILE:        base\setup\nuovo.c
 * PROGRAMMERS: Davy Bartoloni <davy@bartoloni.org>
 */

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

TCHAR *g_szClassName = TEXT("Finestra esempio 5");
TCHAR *testo1=TEXT("E questa e' una scritta sul fondo.");

HBITMAP immagine = NULL;

COLORREF NERO = RGB(0, 0, 0);
COLORREF BLU = RGB(2, 25, 255);

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_CREATE:
			immagine = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_IMMAGINE));
		break;
		case WM_CLOSE:
			DestroyWindow(hwnd);
		break;
		case WM_PAINT:
		{
			BITMAP bm;
			PAINTSTRUCT ps;


      			RECT r;
			GetClientRect(hwnd,&r);
			HDC hdc = BeginPaint(hwnd, &ps);

			HDC hdcMem = CreateCompatibleDC(hdc);
			HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, immagine);

			GetObject(immagine, sizeof(bm), &bm);

			BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

			SelectObject(hdcMem, hbmOld);
			SetTextColor(hdc, NERO);
			SetBkColor(hdc, RGB(200, 200, 230));
			TextOut(hdc, 150, 107, TEXT(" TESTO1 "), 8);
			SetBkColor(hdc, RGB(180, 180, 230));
			TextOut(hdc, 150, 125, TEXT(" TESTO2 "), 8);
			SetBkColor(hdc, RGB(160, 160, 230));
			TextOut(hdc, 150, 143, TEXT(" TESTO3 "), 8);
			SetTextColor(hdc, BLU);    
			SetBkColor(hdc, RGB(180, 180, 180));
	                DrawText(hdc,testo1,-1,&r,DT_SINGLELINE| DT_BOTTOM | DT_CENTER);  // stampa la prima linea di testo...
			
			DeleteDC(hdcMem);

			EndPaint(hwnd, &ps);
		}
		break;
		case WM_DESTROY:
			DeleteObject(immagine);
			PostQuitMessage(0);
		break;
		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}

int WINAPI _tWinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;

	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.style		 = 0;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = g_szClassName;
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);


	RegisterClassEx(&wc);


	hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		g_szClassName,
		TEXT("ReactOS Logo"),
		WS_OVERLAPPEDWINDOW,
		100, 100, 224, 225,
		NULL, NULL, hInstance, NULL);

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

	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
}
questo e' necessario se utiliziamo il Drawtext dell' esempio precedente...

Code: Select all

RECT r;
GetClientRect(hwnd,&r);
ma per TEXTOUT non ne abbiamo bisogno...

Code: Select all

TextOut(hdc, 150, 143, TEXT(" TESTO3 "), 8);
SetTextColor(hdc, BLU);    
SetBkColor(hdc, RGB(180, 180, 180));
DrawText(hdc,testo1,-1,&r,DT_SINGLELINE| DT_BOTTOM | DT_CENTER);  // stampa la prima linea di testo...
per quanto riguarda BLU , ho utilizzato RGB che server a convertire un-semplice-da-capire RED GREEN BLU in un COLORREF

Code: Select all

COLORREF BLU = RGB(2, 25, 255);
invece il background utilizza direttamente RGB "al volo"

bon, penso che il tutorial sia concluso :) spero serva a qualcuno.

[ external image ]

ah... ultima cosa.. per sorgenti piu' incasinati e' meglio scrivere qualcosa anche nel Debug-Log... l'istruzione e' questa:

Code: Select all

OutputDebugStringW(L"Classe Registratata correttamente.\n");
in questo caso, il codice potrebbe essere inserito, subito prima del CreateWindowEx

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

negli ultimi giorni ho pensato molto al funzionamento "ottimizzato" di una shell ( per Ros o per qualsiasi altro SO )
i precedenti (miei) esperimenti erano piu' che altro un tentativo di scrivere delle funzioncine BASE per la gestione della grafica.. dei file.. e del registro.

indubbiamente la strada piu' Giusta che potevo intraprendere.. ma stasera, dalle 7 ad ora.. che e' quasi mezzanotte mi sn messo a riscrivere la shell, scrivendo il codice
"al volo" in base a cosa mi passava per la testa.. il risultato e' decisamente meno Buggato dei precedenti tentativi.. :) e gira pure abbastanza velocemente.. ho cmq dei guai
sul refresh delle applicazioni.. che talvolta vengono disegnate solo in parte.. ( per esempio ho dovuto fare 3 volte CTRL ALT CANC per fare lo screenshot a quella finestrella )

[ external image ]

l fatto e' che una volta implementata la compatibilita' con le DirectX o OPENGL... sarebbe meglio scrivere la shell direttamente in DX9.. usando cm fa l'irrlicht il 3D anche per la gestione degli oggetti bidimensionali... praticamente texturizzando dei poligoni visti di fronte. . I PRO sn sicuramente una velocita' invidiabile.. e un possibile porting in REAL-3D molto semplice...

i CONTRO... che il supporto DirectX ( quelel ufficiali ) e' ancora lontano ( ma nn troppo .. guardando i commit.. ) e che quindi sarebbe meglio attendere ... e POI SVILUPPARE LA SHELL...

boh.. ci dormo su.. e vedo se domani continuare a scrivere questa sorta di shell alternativa...

Parad0x
Posts: 86
Joined: Wed Aug 06, 2008 8:22 pm
Location: Sassari

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Parad0x »

perchè non continui? è una bella idea....
io comuqnue desidero vedere,almeno dopo la 0.4.0 un miglioramento visivo ad explorer almeno a metterlo più in linea con xp/2003 per avere nella prima beta un os graficamente non troppo datato (ricordiamo che molti niubbi guardano sono la grafica....molti mi hanno detto che sembra win95 :( )

User avatar
Davy Bartoloni
Posts: 1483
Joined: Wed Jan 04, 2006 11:31 pm
Location: Cuneo
Contact:

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Davy Bartoloni »

eh.. gia'.. purtroppo l' aspetto e' veramente un punto importante per la promozione... se hai dato un occhiata in area generale.. nell' elenco degli OS.. ci sn 7 OS decisamente in stato superiore al BETA... ma che presentano cmq un aspetto molto simile a BEOS.... ( forse haiku e' l'unico che ha deciso di slegarsi da quell' aspetto... )

ci andrebbe proprio un idea d'avanguardia... curata nel design.. forse .. sarebbe quasi il momento di slegarsi dalle solite shell... nn so in che modo..

ma io .. pensavo a nn avere piu' il menu di START.... praticamente.. la navigazione del menu' programmi.. farla avvenire sul desktop ... magari cn icone piu' dettagliate... piu' grandi.. e cn informazioni relative all' applicazione.. del TIPO:

ICONA Nome programma
Scopo del programma o Note.

un qualcosa di diverso.... magari con effetti di scorrimento...

solo che avere almeno a disposizione le DDRAW decentemente funzionanti... sarebbe un mega aiuto nello sviluppo...
purtroppo cn le api di windows e i Refresh delle finestre.. si possono ottenere al massimo della velocita' cmq uelle del giochino/animazione cn vegeta che ho fatto...
velocita' troppo basse per far qualcosa di fluido ... o perlomeno ... d'impatto...

sigh

Parad0x
Posts: 86
Joined: Wed Aug 06, 2008 8:22 pm
Location: Sassari

Re: Breve Tutorial x creazione nuovo "componente" ReactOS

Post by Parad0x »

una shell alternativa,magari nel ros downloader ci sta ma ricorda che l'obbiettivo di ros e di installarlo nel computer della nonna e non notare differenze :D

a parte gli scherzi a me una shell classica windows va bene...poi non so se si è in grando di fare un porting di kde boh

Post Reply

Who is online

Users browsing this forum: No registered users and 3 guests