Sous classement de edit (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 4 116 fois - Téléchargée 296 fois

Description

Explications du sous classement en WIN32.
Fonctionnement du mini prog:
On met le texte dans un EDIT.
Appui sur ENTER passe texte dans un static,
vide le EDIT, et change couleur du static.

Source / Exemple :


#include <windows.h>

HINSTANCE hinst;
HWND hmain, hed, hst;
char szbuff[24];
WNDPROC oldProc; // PROCEDURE ORIGINE
HBRUSH hbrEdit[2];
DWORD idxBr = 0;
char *szappname = "SubclassEdit";
char *szstclass = "STATIC";
char *szedclass = "EDIT";

// ICI FONCTION DE SOUS CLASSEMENT
LRESULT CALLBACK EdProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_KEYDOWN:
      if(wParam == VK_RETURN) { // TRAITEMENT SPECIAL
        idxBr = idxBr ? 0: 1; // change couleur du STATIC
        GetWindowText(hwnd, szbuff, 24);
        SetWindowText(hst, szbuff); // PASSE DANS LE STATIC
        SetWindowText(hwnd, 0); // VIDANGE
        return 0; // ON NE LAISSE PAS SUIVRE
      }
      break; // PROCEDURE PAR DEFAUT
    case WM_DESTROY:
      DeleteObject(hbrEdit[0]); // NETTOYAGE
      DeleteObject(hbrEdit[1]); // ET MESSAGE CONTINUE SON CHEMIN
  }
  return CallWindowProc(oldProc, hwnd, mssg, wParam, lParam);
}

void __stdcall AdaptChilds(HWND hwnd)
{
  RECT rc;
  GetClientRect(hwnd, &rc);
  MoveWindow(hed, 0, 0, rc.right, 22, 1);
  MoveWindow(hst, 0, 22, rc.right, rc.bottom - 22, 1);
  SendMessage(hed, EM_SETLIMITTEXT, 23, 0);
}

LRESULT CALLBACK AppWndProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_CREATE:
      hed = CreateWindow(szedclass, 0,
              WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_CENTER | ES_AUTOHSCROLL | WS_BORDER,
                        0, 0, 0, 0,
                        hwnd, (HMENU)1000, hinst, 0);
      hst = CreateWindowEx(0, szstclass, 0,
                        WS_CHILD | WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE,
                        0, 0, 0, 0,
                        hwnd, (HMENU)1001, hinst, 0);
      hbrEdit[0] = CreateSolidBrush(RGB(255,230,230));
      hbrEdit[1] = CreateSolidBrush(RGB(230,255,230));
      AdaptChilds(hwnd);
      // ICI SOUS CLASSEMENT DU EDIT
      oldProc = (WNDPROC) SetWindowLong(hed, GWL_WNDPROC, (long) EdProc);
      return 0;
    case WM_SETFOCUS:
      SetFocus(hed);
      return 0;
    case WM_CTLCOLORSTATIC:
      if(GetWindowLong((HWND)lParam, GWL_ID) == 1001) {
        SetBkMode((HDC) wParam, TRANSPARENT);
        return (LRESULT) hbrEdit[idxBr];
      }
      return 0;
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
  }
  return DefWindowProc(hwnd, mssg, wParam, lParam);
}

DWORD InitInstance()
{
  WNDCLASSEX     wndcls;
  memset(&wndcls, 0, sizeof(WNDCLASSEX));
  wndcls.cbSize = sizeof(WNDCLASSEX);
  wndcls.lpfnWndProc   = AppWndProc;
  wndcls.style         = CS_HREDRAW | CS_VREDRAW;
  wndcls.hInstance     = hinst;
  wndcls.lpszClassName = szappname;
  wndcls.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH); // WHITE_BRUSH
  wndcls.hCursor       = LoadCursor(0, IDC_ARROW);
  if(!RegisterClassEx(&wndcls)) return 0;
  hmain = CreateWindowEx(0, szappname, szappname, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU,
                        100, 100, 400, 150,
                        0, 0, hinst, 0);
  return (hmain != 0);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
  MSG msg;
  hinst = hInstance;
  if(!InitInstance()) return 0;
  ShowWindow(hmain, SW_NORMAL);
  while(GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return 0;
}

Conclusion :


CPP dans le zip pour recompiler + exe.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
ben écris le où tu veux, rajoute une ligne sous le CallWindowProc pour stocker le résultat.
Messages postés
104
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
11 septembre 2008

Salut Brunews, est-ce que tu saurais, quand on sous-classe un controle, récupéré le lResult comme le fait Spy++ ?

Merci
Messages postés
104
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
11 septembre 2008

Nikel, c'est ce que je cherchais, merci.
Messages postés
168
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 avril 2005

ok thx;)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
y ressemble dans son mode de fonctionnement mais permet des choses qui seraient beaucoup plus longues a ecrire sous forme macro. Le but reste le meme, insertion du code a la place d'un appel de fonction.
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.