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.
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.