Sous classement de edit (win32)

0/5 (14 avis)

Vue 4 390 fois - Téléchargée 314 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
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
12 juin 2005 à 09:32
ben écris le où tu veux, rajoute une ligne sous le CallWindowProc pour stocker le résultat.
cs_NeoUmbrella Messages postés 104 Date d'inscription vendredi 5 novembre 2004 Statut Membre Dernière intervention 11 septembre 2008
12 juin 2005 à 02:34
Salut Brunews, est-ce que tu saurais, quand on sous-classe un controle, récupéré le lResult comme le fait Spy++ ?

Merci
cs_NeoUmbrella Messages postés 104 Date d'inscription vendredi 5 novembre 2004 Statut Membre Dernière intervention 11 septembre 2008
6 juin 2005 à 16:04
Nikel, c'est ce que je cherchais, merci.
JackosKing Messages postés 168 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 21 avril 2005
26 juin 2003 à 20:17
ok thx;)
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
26 juin 2003 à 20:14
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.