CreateWindow

Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005 - 17 déc. 2004 à 02:13
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005 - 19 déc. 2004 à 02:38
Bonjour,
Est-il possible d'utiliser CreateWindow en mode console (main et non WinMain) ?
Cordialement, Djoobstil

22 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
17 déc. 2004 à 03:06
Ben oui : une application console est une application Win32.
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
17 déc. 2004 à 11:06
Pourtant, je n'arrive pas à le faire générer d'HWND (j'en ai besoin pour les sockets asynchrones).

En fait, je sais pas vraiment comment m'y prendre, je dois plutt faire un CreateDialog ou CreateWindow sachant que j'ai la fentre qui reçoit la réponse de la fonction asynchrone:
LRESULT CALLBACK WSAAsyncProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_WSAASYNC:
    if (!WSAGETSELECTERROR(lParam))
            puts("WSAAsyncGetHostByAddr success.");
    else puts("error");
    return 1;
  }
  return 1;
}

(Code en C).
Cordialement, Djoobstil
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
17 déc. 2004 à 13:39
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowfeatures.asp?frame=true#message_only

Et tu gères les messages qui t'intéressent (ainsi que quelques obligatoires pour quitter le programme, WM_DESTROY au minimum).
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
17 déc. 2004 à 18:20
Le probleme est que je n'arrive pas a former le HWND, il est toujours à null.
Une idée de la raison ?

Cordialement, Djoobstil
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
17 déc. 2004 à 18:59
Ce code fonctionne chez moi, pioche dedans ce qui te manque :

#include <windows.h>
#include <stdio.h>
#include "assert.h"

#define WND_CLASS TEXT("CONSOLE_WND")

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
  case WM_MOUSEMOVE:
    puts("Ahaha, ca chatouille !");
    return 0;
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  default:
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
}

int main(void) {
  WNDCLASSEX wc;
  HWND hWnd;
  MSG Msg;
  wc.cbSize = sizeof(wc);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = GetModuleHandle(NULL);
  wc.hIcon = NULL;
  wc.hCursor = NULL;
  wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = TEXT(WND_CLASS);
  wc.hIconSm = NULL;
  assert(RegisterClassEx(&wc) != 0);
  hWnd = CreateWindowEx(WS_EX_APPWINDOW, TEXT(WND_CLASS), TEXT("Une fenêtre en mode console"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 100, NULL, NULL, wc.hInstance, NULL);
  assert(hWnd != NULL);
  ShowWindow(hWnd, SW_SHOWNORMAL);
  assert(UpdateWindow(hWnd) != 0);
  while (GetMessage(&Msg, NULL, 0, 0) > 0) {
    if (IsDialogMessage(hWnd, &Msg) == 0) {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
    }
  }
  return Msg.wParam;
}
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
17 déc. 2004 à 20:18
Parfait, ça marche !
Mais ça soulève un deuxième probleme avec: WSAAsyncGetHostByAddr

Je l'utilise comme suit:
  WSAAsyncGetHostByAddr(hwnd, WM_WSAASYNC, (char *)&addr, len, type,
    (char *)&listn->hp, sizeof(listn->hp));


il n'appelle pas WndProc, alors que normalement, même en cas d'échec de la résolution de l'host il devrait appeller la fonction.

Cordialement, Djoobstil
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
17 déc. 2004 à 20:44
Hm il l'appelle en cas de succès au moins ?
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
17 déc. 2004 à 21:44
oui et en cas de succès, lParam est null.
Cordialement, Djoobstil
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 déc. 2004 à 22:53
Salut,

HANDLE WSAAsyncGetHostByAddr(
HWND hWnd,
unsigned int wMsg,
const char* addr,
int len,
int type,
char* buf,
int buflen
);

hWnd: handle de fenetre valide.
wMsg: message qui sera envoyé a la fenetre.
addr: pointeur sur un DWORD qui contient l'adresse a resoudre (format ipv4).
len: longueur de l'adresse, c'est a dire sizeof(DWORD).
type: SOCK_STREAM
buf: buffer vide, déclaré en global, d'une taille de MAXGETHOSTSTRUCT octets. (un tableau de BYTE par exemple).
buflen: taille du buffer, c'est a dire MAXGETHOSTSTRUCT.

Quand tu recois le message, tu peux afficher le numéro de l'erreur (HIWORD(lParam))
S'il n'y a pas d'erreur, tu peux déclarer un pointeur struct hostent* et le caster avec l'adresse du tableau de byte.
Et ensuite tu peux acceder aux champs de la structure hostent..
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
18 déc. 2004 à 10:49
Bonjour,

Donc, en cas de réussite, il n'appelle pas la fentre ?
(voila qui est bien embêtant :( )

Cordialement, Djoobstil
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
18 déc. 2004 à 17:12
Salut,
heu ben si, lorsque l'operation est terminée tu recois un message, dans tout les cas...
Et lors du traitement du message, tu peux checker les erreurs, et lire les infos du buffer.
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
18 déc. 2004 à 18:59
Bien comme je le disais, il n'appelle pas le hwnd.
Pourtant au début du programme, la fenêtre est bien appellé...
En tout cas, WSAAsyncGetHostByAddr n'appelle pas la fenêtre, ça c'est sûr, j'ai mis un puts("test"); au début.

Cordialement, Djoobstil
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
18 déc. 2004 à 19:06
Salut,
Faut pas etre aussi sur ...
Tu dois avoir une erreur, poste tout ton code ici.
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
18 déc. 2004 à 19:32
#define WM_WSAASYNC (WM_USER +5)

LRESULT CALLBACK WSAAsyncProc(HWND, UINT, WPARAM, LPARAM);

Async_init()
{
#define WND_CLASS "AsyncSocket"

  WNDCLASSEX wc;

  wc.cbSize = sizeof(wc);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = WSAAsyncProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = GetModuleHandle(NULL);
  wc.hIcon = 0;
  wc.hCursor = 0;
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszMenuName = 0;
  wc.lpszClassName = TEXT(WND_CLASS);
  wc.hIconSm = 0;

  if(!RegisterClassEx(&wc))
    assert(!puts("RegisterClassEx error"));

  hwnd = CreateWindowEx(0, TEXT(WND_CLASS), 0, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, wc.hInstance, NULL);

  assert((hwnd != NULL));

}

Async_gethostbyaddr(listener *listn, struct sockaddr_in addr, int len, int type)
{
  assert((hwnd != NULL));
  printf("sizeof(listn->hp) = %lu\n", sizeof(listn->hp));
puts("aync");
  WSAAsyncGetHostByAddr(hwnd, WM_WSAASYNC, (char *)&addr, len, type,
    (char *)&listn->hp, sizeof(listn->hp));
puts("aync2");
}
LRESULT CALLBACK WSAAsyncProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  puts("good ?");
  switch(msg)
  {
  case WM_WSAASYNC:
    if (!WSAGETSELECTERROR(lParam))
            puts("WSAAsyncGetHostByAddr success.");
    else puts("error");
    return 1;
  }
  return 1;
}


lores de l'appelle de AsyncInit();, j'ai 3 ou 4 fois "good ?" qui s'affiche mais lors de l'appelle de WSAAsyncGetHostByAddr, rien ne s'affiche.
(AsyncInit(); est lancé dans le main(), au début du prog.)

Cordialement, Djoobstil
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
18 déc. 2004 à 19:43
Salut,
Pourrais tu mettre TOUT le code (pret a c/c pour que je puisse compiler).

Car la, je ne vois pas de boucle de message pour la fenetre, et je vois pas ou tu alloues le buffer, etc...
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
18 déc. 2004 à 19:52
mon code fait 745 lignes et 14fichiers, je pense pas pouvoir le mettre sur ce site...
Je fais un server, l'appelle à la fonction Async_gethostbyaddr est donc bref, je n'ai pas de boucle de message. Ca passe pas sans ?

Cordialement, Djoobstil
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
18 déc. 2004 à 19:58
Salut,
Sans boucle de message, comment veut tu que ta fenetre recoive les messages ?

WSAAsyncGetHostByAddr n'appele pas la fenetre comme tu l'a si souvent dit, mais poste un message dans sa pile de message.
La boucle de message est la pour dépiler les messages, et les traiter..
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
19 déc. 2004 à 01:38
Bien, j'ai integré le message à ma boucle principale (boucle non-bloquante). Ca a pas l'air de marcher mieux.
(je l'ai passé avant toutes les autres fonctions):
  while(1)
  {
    if(hwnd && (GetMessage(&hmsg, 0, 0, 0) > 0))
      if(!IsDialogMessage(hwnd, &hmsg))
      {
        puts("msg");
        TranslateMessage(&hmsg);
        DispatchMessage(&hmsg);
      }

    FD_ZERO(&sfd);
    FD_SET((m = me->sock), &sfd);


Mais toujours aucun appelle à la fenêtre, sauf au début du programme. (comme avant)

Cordialement, Djoobstil
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
19 déc. 2004 à 02:06
Mon hwnd était null..., mais le proleme est résolu maintenant.
L'autre probleme est que GetMessage est bloquant...
Voila qui ne va pas dutout aller. :x

Cordialement, Djoobstil
0
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
19 déc. 2004 à 02:12
Bien, voici qui cloturera ce forum:
PeekMessage.
C'est la version non bloquante de GetMessage.
Merci à tous de votre aide.

Cordialement, Djoobstil
0
Rejoignez-nous