Accueil > > > [WIN32][C][DEV-C++] TESTSERV TELNET AMELIORE COLORATION SAUVEGARDE
[WIN32][C][DEV-C++] TESTSERV TELNET AMELIORE COLORATION SAUVEGARDE
Information sur la source
Description
Cet utilitaire très simple permet une connexion TCP à un serveur distant.
- il permet une sauvegarde dans le fichier "historique.txt" de le connexion. (utilisation de "CreateFile", "WriteFile","CloseHandle")
- gestion avec thread (utilisation de "CreateThread")
- coloration d"un listview avec gestion de colonne (même qi une seul colonne ^^)
- implémentation des socket (création + envoie/réception...)
petite fonctions pratiques:
- utilisation d'une DialogBox comme fenêtre principale
- application d'une icone à la fenêtre principal
- activer /désactiver un item...
Ce code est assez simple, j'espère que les débutants y trouveront leur bonheur :)
Source
- //------------------------------------------------------------------------------
- // Projet TestServ : Utilitaire de type Telnet avec enregistrement
- // d'historique + coloration +sauvegarde des commandes
- // Auteur : Hanteville Nicolas
- // Fichier : main.c
- // Version : 0.1
- // Date de modification : 30/06/2007
- // Description : programme principale + fonction / procédures
- // Environnement : compatiblité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
- //------------------------------------------------------------------------------
- #include "ressources.h"
- //------------------------------------------------------------------------------
- // ajout de l'item avec le texte en paramètre
- //Type: FALSE = Envoie / TRUE = Réception
- void AjouterItem(char *texte,BOOL Type)
- {
- char tmp[TAILLE_REQUETE];
- char *t = texte;
- LVITEM lvi;//une ligne
- char car[2];
-
- if (!Type)
- {
- strcpy(tmp,"Envoyé:");
- strncat(tmp,texte,TAILLE_REQUETE);
- strncat(tmp,"\0",TAILLE_REQUETE);
- }else
- {
- strcpy(tmp,"Recue:");
- while(*t++)
- {
- if (*t == '\r')
- strncat(tmp,"<CR>",TAILLE_REQUETE);
- else if (*t == '\n')
- strncat(tmp,"<LF>",TAILLE_REQUETE);
- else
- {
- car[0] = *t;
- car[1] = 0;
- strncat(tmp,car,TAILLE_REQUETE);
- }
- }
- *t =0;//fin de la chaine
- }
-
- //ajout d'un item
- lvi.mask = LVIF_TEXT|LVIF_PARAM;
- lvi.iSubItem = 0;
- lvi.lParam = 0;
- lvi.pszText=tmp;
- lvi.iItem = 0;
- car[0] = ListView_InsertItem(H_LISTVIEW, &lvi);
-
- if (log)//ajouter item au fichier de log
- {
- strncat(tmp,"\r\n",TAILLE_REQUETE);
- WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
- }
- ListView_RedrawItems(H_LISTVIEW,car[0],car[0]);
- }
-
- //------------------------------------------------------------------------------
- // init de la connexion + traitement début de fichier
- BOOL MyConnect()
- {
- //init du réseau
- WSADATA wsaData;//variable pour initialisé la connexion
- SOCKADDR_IN sinfo; // la configuration du socket
- struct in_addr **a;
-
- char tmp[TAILLE_REQUETE];
- char serveur[TAILLE_REQUETE]="";
- char port[TAILLE_PORT]="";
- char *pt;
- BOOL ETAT_IP = TRUE;
-
- if (log)
- {
- //ouverture du fichier de log
- HLog = CreateFile("Historique.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
- if (HLog == INVALID_HANDLE_VALUE)
- {
- CloseHandle(HLog);
- return FALSE;
- }
-
- //on se place a la fin du fichier
- SetFilePointer(HLog,GetFileSize(HLog,NULL),0,FILE_BEGIN);
- }
-
- if (!WSAStartup(0x0202,&wsaData))// si pas d'erreur
- {
- //init du socket
- sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- sinfo.sin_family = AF_INET;
-
- //récupération du port
- GetWindowText(H_PORT,port,TAILLE_PORT);
- if (!port)
- {
- shutdown(sock,2);
- WSACleanup();
- MessageBox(0,"Port non valide!","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
- return FALSE;
- }
- sinfo.sin_port = htons(atoi(port));
-
- //récupération de l'adresse du serveur
- GetWindowText(H_SERVEUR,serveur,TAILLE_REQUETE);
- if (!serveur)
- {
- shutdown(sock,2);
- WSACleanup();
- MessageBox(0,"Adresse du serveur non valide","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
- return FALSE;
- }
-
- //test si c'est une adresse ip ou autre
- pt = serveur;
-
- while(*pt && ETAT_IP)
- {
- if ((*pt <48 && *pt != 46) || (*pt >57 && *pt != 46)) //si pas un chiffre et pas un point alors pas une ip
- ETAT_IP = FALSE;
- pt++;
- }
-
- if (!ETAT_IP) //résolution du nom
- {
- struct hostent *host;
- if (host=gethostbyname(serveur))
- {
- a = (struct in_addr **)host->h_addr_list;
- sinfo.sin_addr.s_addr=inet_addr(inet_ntoa(**a));
- }else
- {
- shutdown(sock,2);
- WSACleanup();
- MessageBox(0,"Résolution de l'adresse du serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
- return FALSE;
- }
- }else
- sinfo.sin_addr.s_addr=inet_addr(serveur);
-
- //connexion
- if (connect(sock,(SOCKADDR *)&sinfo,sizeof(sinfo))!=0)
- {
- closesocket(sock);
- shutdown(sock,2);
- WSACleanup();
- MessageBox(0,"Connexion au serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
- return FALSE;
- }
-
- //ajout sur le liste view de la trame de connexion
- if (!ETAT_IP)
- snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" (%s) port:%s Réussi!!!",serveur,inet_ntoa(**a),port);
- else
- snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" port:%s Réussi!!!",serveur,port);
-
- AjouterItem(tmp,FALSE);
-
- //lancement du thread de récupération
- //MyThread = (HWND)CreateThread(NULL, 0,ThreadRec,0,0,&IDThread);
- if (CreateThread(NULL, 0,ThreadRec,0,0,0) ==0)
- {
- closesocket(sock);
- shutdown(sock,2);
- WSACleanup();
- MessageBox(0,"Réception des trames impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
- return FALSE;
- }
- return TRUE;
- }else
- return FALSE;
- }
- //------------------------------------------------------------------------------
- // fonction de fin de connexion
- DWORD WINAPI MyDisConnect(LPVOID lParam)
- {
- CONNECTEE = FALSE;
-
- //désactive le bouton envoyer
- EnableWindow(H_BUTTON_ENVOYER, FALSE);
-
- //déconnexion
- closesocket(sock);
- shutdown(sock,2);
- WSACleanup();
-
- if (log)
- {
- WriteFile(HLog,"--------------------\n\n",22,&copiee,0);
- CloseHandle(HLog);
- }
- }
-
- //------------------------------------------------------------------------------
- // fonction d'envoie de trames
- DWORD WINAPI EnvoieTrame(LPVOID lParam)
- {
- char requete[TAILLE_REQUETE];
- //récupération de la zone de texte
- GetWindowText(H_COMMANDE,requete,TAILLE_REQUETE);
-
- //ajout de la requète a la chaine ^^
- if (requete[0] != 0)
- SendMessage(H_COMMANDE, CB_ADDSTRING,0, (LPARAM)requete);
-
- //poste traitement pour gestion d'affichage
- strncat(requete,"\r\n",TAILLE_REQUETE); //retour a la ligne
- //envoie
- send(sock,requete,strlen(requete),0);
-
- //ajout de la trame a la liste view
- requete[strlen(requete)-2]=0;
- strncat(requete,"<CR><LF>\0",TAILLE_REQUETE);
-
- AjouterItem(requete,FALSE);
-
- //vidage de la zone mémoire
- SetWindowText(H_COMMANDE,"");
- }
- //------------------------------------------------------------------------------
- // fonction de réception des trames
- DWORD WINAPI ThreadRec(LPVOID lParam)
- {
- char requete[TAILLE_REQUETE];
- //récupération en non bloquant
- int retour=1;
-
- //on quitte quand la connexion est terminé
- //+le socket est fermé
- //+ erreur de réception ou fin de connexion
- while(CONNECTEE && retour > 0)
- {
- //récupération de la trame
- retour = recv(sock,requete,TAILLE_REQUETE,0);
-
- //affichage de la trame dans la liste view
- if (retour > 0)
- {
- requete[retour]=0; // gestion \r\n
- AjouterItem(requete,TRUE);
- }
- }
-
- if (CONNECTEE)
- {
- //désactive le bouton envoyer
- EnableWindow(H_BUTTON_ENVOYER, FALSE);
-
- //déconnexion
- CONNECTEE = FALSE;
- closesocket(sock);
- shutdown(sock,2);
- WSACleanup();
- }
-
- AjouterItem("[]Déconnecté du serveur!!!",FALSE);
-
- SetWindowText(H_BUTTON_CONNECTE,TXT_CONNECTE);
-
- //active les paramètres
- EnableWindow(H_PORT, TRUE);
- EnableWindow(H_SERVEUR, TRUE);
- EnableWindow(H_BUTTON_LOG, TRUE);
- }
- //------------------------------------------------------------------------------
- //gestion des appels et msg sur le fenêtre principale
- HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam)
- {
- LPDRAWITEMSTRUCT lpDrawItem;
- RECT rect;
- char tmp [TAILLE_REQUETE];
-
- switch(Msg)
- {
- case WM_DRAWITEM://permet la coloration des lignes
- //traitement par ligne
- lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
-
- if(ListView_GetItemState(H_LISTVIEW, lpDrawItem->itemID, LVIS_SELECTED) & LVIS_SELECTED)
- // L'élément est séléctionné
- FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, (HBRUSH)GetStockObject(GRAY_BRUSH));
- else //fond des lignes
- FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, GetSysColorBrush(COLOR_WINDOW));
-
- //récupération du texte de la ligne + zone de l'item
- ListView_GetItemText(H_LISTVIEW,lpDrawItem->itemID,0,tmp,TAILLE_REQUETE);
- ListView_GetItemRect(H_LISTVIEW, lpDrawItem->itemID, &rect, LVIR_BOUNDS);
-
- //si commence par
- if (tmp[0] == 'R')//réception en rouge
- {
- SetTextColor(lpDrawItem->hDC,RGB(255, 0, 0));
- }
- else//sinon en bleu
- {
- SetTextColor(lpDrawItem->hDC,RGB(0, 0, 255));
- }
-
- //écriture du texte + zone d'écriture
- rect.left+=2;
- rect.right= rect.left + ListView_GetColumnWidth(H_LISTVIEW, 0)-4;
- DrawText(lpDrawItem->hDC,tmp, strlen(tmp), &rect, DT_VCENTER);
- break;
- case WM_INITDIALOG:
- InitCommonControls();
- CONNECTEE = FALSE;
- log = FALSE;
- H_LISTVIEW=GetDlgItem(hwnd,LST_INFO);
- H_BUTTON_ENVOYER=GetDlgItem(hwnd,BT_ENVOYER);
- H_PORT = GetDlgItem(hwnd,PORT);
- H_SERVEUR = GetDlgItem(hwnd,SERVEUR);
- H_BUTTON_CONNECTE = GetDlgItem(hwnd,BT_CONNECT);
- H_COMMANDE = GetDlgItem(hwnd,COMMANDE);
- H_BUTTON_LOG = GetDlgItem(hwnd,BT_LOG);
- EnableWindow(H_BUTTON_ENVOYER, FALSE);
-
- //icone sur notre fenêtre
- SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
-
-
- LVCOLUMN lvc; //gestion colonne de la listeview
- SendMessage(H_LISTVIEW,LVM_FIRST + 31,(WPARAM )0,(LPARAM )0);
- lvc.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;
- lvc.fmt = LVCFMT_LEFT;
- lvc.cx = 600; //taille colonne
- lvc.pszText = "-- Commandes --"; //texte de la colonne
- ListView_InsertColumn(H_LISTVIEW, 0, &lvc); //ajout colonne
-
- break;
- case WM_CLOSE:
- PostQuitMessage(0);
- break;
- case WM_NOTIFY://gestion du double click sur un item
- if ((LOWORD(Wparam) == LST_INFO) && (((LPNMHDR)lParam)->code == NM_DBLCLK))
- {
- char tmp[TAILLE_REQUETE];
-
- //comptenu de la sélection
- ListView_GetItemText(H_LISTVIEW,(unsigned int)SendMessage(H_LISTVIEW,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED),0,tmp,TAILLE_REQUETE);
-
- //on affiche
- MessageBox(0,tmp,"Information Trame",MB_OK|MB_TOPMOST);
- }
-
- break;
- case WM_COMMAND :
- switch(LOWORD(Wparam))
- {
- case BT_ENVOYER:
- CreateThread(NULL,0,EnvoieTrame,0,0,0);
- break;
- case BT_CONNECT:
- if (CONNECTEE)
- {
- CreateThread(NULL,0,MyDisConnect,0,0,0);
- }else
- {
- if (MyConnect())
- {
- CONNECTEE = TRUE;
- SetWindowText(H_BUTTON_CONNECTE,TXT_DECONNECTE);
-
- //active le bouton envoyer
- EnableWindow(H_BUTTON_ENVOYER, TRUE);
- //désactive les paramètres
- EnableWindow(H_PORT, FALSE);
- EnableWindow(H_SERVEUR, FALSE);
- EnableWindow(H_BUTTON_LOG, FALSE);
- }
- }
- break;
- case BT_LOG://maj de la gestion des logs
- if (!log) log=TRUE;
- else log=FALSE;
- break;
- }
- break;
- }
- return 0;
- }
-
- //------------------------------------------------------------------------------
- //fonction principal (main)
- int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow)
- {
- Hinst = hInst;
-
- //création de la fenêtre
- DialogBox(0,MAKEINTRESOURCE(TestServeur),GetDesktopWindow(),(DLGPROC)DlgProc);
- return 0;
- }
//------------------------------------------------------------------------------
// Projet TestServ : Utilitaire de type Telnet avec enregistrement
// d'historique + coloration +sauvegarde des commandes
// Auteur : Hanteville Nicolas
// Fichier : main.c
// Version : 0.1
// Date de modification : 30/06/2007
// Description : programme principale + fonction / procédures
// Environnement : compatiblité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
// ajout de l'item avec le texte en paramètre
//Type: FALSE = Envoie / TRUE = Réception
void AjouterItem(char *texte,BOOL Type)
{
char tmp[TAILLE_REQUETE];
char *t = texte;
LVITEM lvi;//une ligne
char car[2];
if (!Type)
{
strcpy(tmp,"Envoyé:");
strncat(tmp,texte,TAILLE_REQUETE);
strncat(tmp,"\0",TAILLE_REQUETE);
}else
{
strcpy(tmp,"Recue:");
while(*t++)
{
if (*t == '\r')
strncat(tmp,"<CR>",TAILLE_REQUETE);
else if (*t == '\n')
strncat(tmp,"<LF>",TAILLE_REQUETE);
else
{
car[0] = *t;
car[1] = 0;
strncat(tmp,car,TAILLE_REQUETE);
}
}
*t =0;//fin de la chaine
}
//ajout d'un item
lvi.mask = LVIF_TEXT|LVIF_PARAM;
lvi.iSubItem = 0;
lvi.lParam = 0;
lvi.pszText=tmp;
lvi.iItem = 0;
car[0] = ListView_InsertItem(H_LISTVIEW, &lvi);
if (log)//ajouter item au fichier de log
{
strncat(tmp,"\r\n",TAILLE_REQUETE);
WriteFile(HLog,tmp,strlen(tmp),&copiee,0);
}
ListView_RedrawItems(H_LISTVIEW,car[0],car[0]);
}
//------------------------------------------------------------------------------
// init de la connexion + traitement début de fichier
BOOL MyConnect()
{
//init du réseau
WSADATA wsaData;//variable pour initialisé la connexion
SOCKADDR_IN sinfo; // la configuration du socket
struct in_addr **a;
char tmp[TAILLE_REQUETE];
char serveur[TAILLE_REQUETE]="";
char port[TAILLE_PORT]="";
char *pt;
BOOL ETAT_IP = TRUE;
if (log)
{
//ouverture du fichier de log
HLog = CreateFile("Historique.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
if (HLog == INVALID_HANDLE_VALUE)
{
CloseHandle(HLog);
return FALSE;
}
//on se place a la fin du fichier
SetFilePointer(HLog,GetFileSize(HLog,NULL),0,FILE_BEGIN);
}
if (!WSAStartup(0x0202,&wsaData))// si pas d'erreur
{
//init du socket
sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sinfo.sin_family = AF_INET;
//récupération du port
GetWindowText(H_PORT,port,TAILLE_PORT);
if (!port)
{
shutdown(sock,2);
WSACleanup();
MessageBox(0,"Port non valide!","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
return FALSE;
}
sinfo.sin_port = htons(atoi(port));
//récupération de l'adresse du serveur
GetWindowText(H_SERVEUR,serveur,TAILLE_REQUETE);
if (!serveur)
{
shutdown(sock,2);
WSACleanup();
MessageBox(0,"Adresse du serveur non valide","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
return FALSE;
}
//test si c'est une adresse ip ou autre
pt = serveur;
while(*pt && ETAT_IP)
{
if ((*pt <48 && *pt != 46) || (*pt >57 && *pt != 46)) //si pas un chiffre et pas un point alors pas une ip
ETAT_IP = FALSE;
pt++;
}
if (!ETAT_IP) //résolution du nom
{
struct hostent *host;
if (host=gethostbyname(serveur))
{
a = (struct in_addr **)host->h_addr_list;
sinfo.sin_addr.s_addr=inet_addr(inet_ntoa(**a));
}else
{
shutdown(sock,2);
WSACleanup();
MessageBox(0,"Résolution de l'adresse du serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
return FALSE;
}
}else
sinfo.sin_addr.s_addr=inet_addr(serveur);
//connexion
if (connect(sock,(SOCKADDR *)&sinfo,sizeof(sinfo))!=0)
{
closesocket(sock);
shutdown(sock,2);
WSACleanup();
MessageBox(0,"Connexion au serveur impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
return FALSE;
}
//ajout sur le liste view de la trame de connexion
if (!ETAT_IP)
snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" (%s) port:%s Réussi!!!",serveur,inet_ntoa(**a),port);
else
snprintf(tmp,TAILLE_REQUETE,"[]Connexion au serveur : \"%s\" port:%s Réussi!!!",serveur,port);
AjouterItem(tmp,FALSE);
//lancement du thread de récupération
//MyThread = (HWND)CreateThread(NULL, 0,ThreadRec,0,0,&IDThread);
if (CreateThread(NULL, 0,ThreadRec,0,0,0) ==0)
{
closesocket(sock);
shutdown(sock,2);
WSACleanup();
MessageBox(0,"Réception des trames impossible","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}else
return FALSE;
}
//------------------------------------------------------------------------------
// fonction de fin de connexion
DWORD WINAPI MyDisConnect(LPVOID lParam)
{
CONNECTEE = FALSE;
//désactive le bouton envoyer
EnableWindow(H_BUTTON_ENVOYER, FALSE);
//déconnexion
closesocket(sock);
shutdown(sock,2);
WSACleanup();
if (log)
{
WriteFile(HLog,"--------------------\n\n",22,&copiee,0);
CloseHandle(HLog);
}
}
//------------------------------------------------------------------------------
// fonction d'envoie de trames
DWORD WINAPI EnvoieTrame(LPVOID lParam)
{
char requete[TAILLE_REQUETE];
//récupération de la zone de texte
GetWindowText(H_COMMANDE,requete,TAILLE_REQUETE);
//ajout de la requète a la chaine ^^
if (requete[0] != 0)
SendMessage(H_COMMANDE, CB_ADDSTRING,0, (LPARAM)requete);
//poste traitement pour gestion d'affichage
strncat(requete,"\r\n",TAILLE_REQUETE); //retour a la ligne
//envoie
send(sock,requete,strlen(requete),0);
//ajout de la trame a la liste view
requete[strlen(requete)-2]=0;
strncat(requete,"<CR><LF>\0",TAILLE_REQUETE);
AjouterItem(requete,FALSE);
//vidage de la zone mémoire
SetWindowText(H_COMMANDE,"");
}
//------------------------------------------------------------------------------
// fonction de réception des trames
DWORD WINAPI ThreadRec(LPVOID lParam)
{
char requete[TAILLE_REQUETE];
//récupération en non bloquant
int retour=1;
//on quitte quand la connexion est terminé
//+le socket est fermé
//+ erreur de réception ou fin de connexion
while(CONNECTEE && retour > 0)
{
//récupération de la trame
retour = recv(sock,requete,TAILLE_REQUETE,0);
//affichage de la trame dans la liste view
if (retour > 0)
{
requete[retour]=0; // gestion \r\n
AjouterItem(requete,TRUE);
}
}
if (CONNECTEE)
{
//désactive le bouton envoyer
EnableWindow(H_BUTTON_ENVOYER, FALSE);
//déconnexion
CONNECTEE = FALSE;
closesocket(sock);
shutdown(sock,2);
WSACleanup();
}
AjouterItem("[]Déconnecté du serveur!!!",FALSE);
SetWindowText(H_BUTTON_CONNECTE,TXT_CONNECTE);
//active les paramètres
EnableWindow(H_PORT, TRUE);
EnableWindow(H_SERVEUR, TRUE);
EnableWindow(H_BUTTON_LOG, TRUE);
}
//------------------------------------------------------------------------------
//gestion des appels et msg sur le fenêtre principale
HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam)
{
LPDRAWITEMSTRUCT lpDrawItem;
RECT rect;
char tmp [TAILLE_REQUETE];
switch(Msg)
{
case WM_DRAWITEM://permet la coloration des lignes
//traitement par ligne
lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
if(ListView_GetItemState(H_LISTVIEW, lpDrawItem->itemID, LVIS_SELECTED) & LVIS_SELECTED)
// L'élément est séléctionné
FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, (HBRUSH)GetStockObject(GRAY_BRUSH));
else //fond des lignes
FillRect(lpDrawItem->hDC, &lpDrawItem->rcItem, GetSysColorBrush(COLOR_WINDOW));
//récupération du texte de la ligne + zone de l'item
ListView_GetItemText(H_LISTVIEW,lpDrawItem->itemID,0,tmp,TAILLE_REQUETE);
ListView_GetItemRect(H_LISTVIEW, lpDrawItem->itemID, &rect, LVIR_BOUNDS);
//si commence par
if (tmp[0] == 'R')//réception en rouge
{
SetTextColor(lpDrawItem->hDC,RGB(255, 0, 0));
}
else//sinon en bleu
{
SetTextColor(lpDrawItem->hDC,RGB(0, 0, 255));
}
//écriture du texte + zone d'écriture
rect.left+=2;
rect.right= rect.left + ListView_GetColumnWidth(H_LISTVIEW, 0)-4;
DrawText(lpDrawItem->hDC,tmp, strlen(tmp), &rect, DT_VCENTER);
break;
case WM_INITDIALOG:
InitCommonControls();
CONNECTEE = FALSE;
log = FALSE;
H_LISTVIEW=GetDlgItem(hwnd,LST_INFO);
H_BUTTON_ENVOYER=GetDlgItem(hwnd,BT_ENVOYER);
H_PORT = GetDlgItem(hwnd,PORT);
H_SERVEUR = GetDlgItem(hwnd,SERVEUR);
H_BUTTON_CONNECTE = GetDlgItem(hwnd,BT_CONNECT);
H_COMMANDE = GetDlgItem(hwnd,COMMANDE);
H_BUTTON_LOG = GetDlgItem(hwnd,BT_LOG);
EnableWindow(H_BUTTON_ENVOYER, FALSE);
//icone sur notre fenêtre
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
LVCOLUMN lvc; //gestion colonne de la listeview
SendMessage(H_LISTVIEW,LVM_FIRST + 31,(WPARAM )0,(LPARAM )0);
lvc.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 600; //taille colonne
lvc.pszText = "-- Commandes --"; //texte de la colonne
ListView_InsertColumn(H_LISTVIEW, 0, &lvc); //ajout colonne
break;
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_NOTIFY://gestion du double click sur un item
if ((LOWORD(Wparam) == LST_INFO) && (((LPNMHDR)lParam)->code == NM_DBLCLK))
{
char tmp[TAILLE_REQUETE];
//comptenu de la sélection
ListView_GetItemText(H_LISTVIEW,(unsigned int)SendMessage(H_LISTVIEW,LVM_GETNEXTITEM,(WPARAM)-1,LVNI_FOCUSED),0,tmp,TAILLE_REQUETE);
//on affiche
MessageBox(0,tmp,"Information Trame",MB_OK|MB_TOPMOST);
}
break;
case WM_COMMAND :
switch(LOWORD(Wparam))
{
case BT_ENVOYER:
CreateThread(NULL,0,EnvoieTrame,0,0,0);
break;
case BT_CONNECT:
if (CONNECTEE)
{
CreateThread(NULL,0,MyDisConnect,0,0,0);
}else
{
if (MyConnect())
{
CONNECTEE = TRUE;
SetWindowText(H_BUTTON_CONNECTE,TXT_DECONNECTE);
//active le bouton envoyer
EnableWindow(H_BUTTON_ENVOYER, TRUE);
//désactive les paramètres
EnableWindow(H_PORT, FALSE);
EnableWindow(H_SERVEUR, FALSE);
EnableWindow(H_BUTTON_LOG, FALSE);
}
}
break;
case BT_LOG://maj de la gestion des logs
if (!log) log=TRUE;
else log=FALSE;
break;
}
break;
}
return 0;
}
//------------------------------------------------------------------------------
//fonction principal (main)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow)
{
Hinst = hInst;
//création de la fenêtre
DialogBox(0,MAKEINTRESOURCE(TestServeur),GetDesktopWindow(),(DLGPROC)DlgProc);
return 0;
}
Conclusion
N'hésitez pas à poser des questions :)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Envoyer et recevoir un fichier par Socket en C [ par coolboy78 ]
Bonjour,j'aimerai Envoyer et recevoir un fichier par Socket en C. Mais je n'ai pas trouvé de fonction ni d'exemple pour ceci.Si kelkun pouvez maider,
Thread et socket [ par epoc ]
Petite question.J'ai créé un petit serveur avec un socket 'bloquant'. Etant donné que je désire que mon aplication ne soit pas bloquée j'ai créé un th
Pb reseau -> SOCKET [ par Haldwin ]
Salut à tous,Voila j'expose mon pb!!!!J'essaie de faire une appli Client/serveur qui me permette de visionner mon ecran de PC à distance (enfin en LAN
Thread et socket udp [ par eurysthe ]
Bonjour !!Voila j'ai un petit problème de thread qui me pourrit la vie.J'ai crée un thread qui doit écouter en boucle les informations qui transite su
probleme avec ifstream et ofstream [ par kobee12 ]
J'ai un petit probleme dans mon programme. J'ai voulu inserer une fonction de cryptage pour crypter et decrypter un fichier. Le probleme c'est que j'a
[serveur]telecharger fichier [ par lombredudragon ]
Avec les socket je debute et j'aimerais me faire un serveur en c ou c++ ou kan on se connect au port 23 par telnet on recoit automatiquement un fichie
Serveur Telnet C++ Aide sur IP [ par hergo ]
Bonjour je suis debutant et j'aimerai savoir comment recuperer l'ip dun client qui se connect a un serveur telnet:jai recuperer ce serveur telnet si j
Socket [ par c2millet ]
Bonjour à tous,je voudrais dans un premier tps si qqun a ou connais une doc sur les sockets. Ensuite, g un petit pb. g réalisé un serveur qui lit sur
Probleme thread [ par PunkDude424 ]
J'ai un probleme avec les threadJ,ai un server et jessai de créer un thread a chaque fois quun client se connecte, mais sa fonctionne pas.J,ai essayer
Socket [ par casper_2 ]
Excuser moi,bonjour.J'ai un leger problem avec les sockets.kan je te recupere les données d'un fichier zipé sur un serveur,a l'ouverture de
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|