Sous classement de edit (win32)

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

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.