Fichiers cpp,rc et h pour recompiler sont dans zip.
Exemple de sous classement de fenetre (editbox).
Il n'accepte des chiffres et UN SEUL point en séparateur.
On peut taper virgule, est transformée en point.
Le nombre de décimales est limité à 2 par le code.
N'accepte que 21 caractères maxi.
Source / Exemple :
#include <windows.h>
#include "resource.h"
WNDPROC oldMoneyProc;
HBRUSH hbrMoney;
HFONT hfntMoney;
__declspec(naked) int edMoneyProc()
{
__asm {
mov eax, [esp+8]
mov edx, [esp+12]
mov ecx, [esp+4]
cmp eax, WM_PASTE
je short onBEEP
cmp eax, WM_CHAR
je short onCHAR
cmp eax, WM_DESTROY
je short onDESTROY
defProc:
push [esp+16]
push edx
push eax
push ecx
push oldMoneyProc
call dword ptr CallWindowProc
ret 16
onBEEP:
push 0
call dword ptr MessageBeep
ret 16
onCHAR:
cmp edx, VK_BACK
je short defProc
cmp edx, 57
ja short onBEEP
cmp edx, 48
jae short defProc
cmp edx, 44
je short verifDot
cmp edx, 46
jne short onBEEP
verifDot:
lea eax, [esp-24]
mov edx, 22
mov esp, eax
push edx
push eax
push ecx
call dword ptr GetWindowText
mov edx, esp
xor ecx, ecx
whlc:
mov al, [edx]
or al, al
je short endLoop
inc edx
cmp al, 46
jne short whlc
inc ecx
endLoop:
add esp, 24
dec ecx
jns short onBEEP
mov eax, [esp+8]
mov edx, 46
mov ecx, [esp+4]
jmp short defProc
onDESTROY:
push hfntMoney
call dword ptr DeleteObject
push hbrMoney
call dword ptr DeleteObject
ret 16
}
}
__declspec(naked) void __stdcall AdaptEditMoney(HWND hed)
{
__asm {
lea eax, [esp-72]
mov edx, [esp+4]
lea ecx, [eax+8]
mov [eax], edx
mov esp ,eax
mov [eax+4], ecx
call dword ptr GetClientRect
mov eax, esp
xor ecx, ecx
mov edx, [eax+12]
mov dword ptr[eax+20], 700
neg edx
mov [eax+24], ecx
add edx, 4
mov [eax+16], ecx
mov [eax+4], edx
mov [eax+8], ecx
mov [eax+12], ecx
lea edx, [eax+4]
mov dword ptr[eax+32], 61697261h
mov dword ptr[eax+36], 6Ch
mov [eax], edx
call dword ptr CreateFontIndirect
add esp, 16
mov hfntMoney, eax
mov ecx, [esp+48]
xor edx, edx
mov dword ptr[esp+4], WM_SETFONT
mov [esp], ecx
mov [esp+8], eax
mov [esp+12], edx
mov [esp+16], ecx
mov dword ptr[esp+20], EM_SETLIMITTEXT
mov dword ptr[esp+24], 21
mov [esp+28], edx
mov [esp+32], ecx
mov dword ptr[esp+36], GWL_WNDPROC
mov dword ptr[esp+40], offset edMoneyProc
call dword ptr SendMessage
call dword ptr SendMessage
call dword ptr SetWindowLong
mov oldMoneyProc, eax
ret 4
}
}
__declspec(naked) void __stdcall edMoneyChange(HWND hed)
{
__asm {
lea eax, [esp-36]
mov edx, [esp+4]
lea ecx, [eax+12]
mov dword ptr[eax+8], 22
mov [eax], edx
mov esp, eax
mov [eax+4], ecx
call dword ptr GetWindowText
mov edx, esp
or eax, eax
je short chngExit
xor ecx, ecx
L1:
mov al, [edx]
or al, al
je short chngExit
inc edx
cmp al, 46
jne short L1
L2:
mov al, [edx]
inc ecx
or al, al
je short chngExit
cmp ecx, 2
ja short L3
inc edx
jmp short L2
L3:
mov eax, esp
mov byte ptr[edx], 0
mov ecx, [eax+28]
push 0
push eax
push ecx
call dword ptr SetWindowText
call dword ptr MessageBeep
chngExit:
add esp, 24
ret 4
}
}
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_INITDIALOG:
SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(0, IDI_APPLICATION));
hbrMoney = (HBRUSH) CreateSolidBrush(0xFFFFDF);
AdaptEditMoney(GetDlgItem(hdlg, IDED_FRIC));
return TRUE;
case WM_CTLCOLOREDIT:
SetBkMode((HDC) wParam, TRANSPARENT);
SetTextColor((HDC) wParam, RGB(255,0,0));
return (BOOL) hbrMoney;
case WM_COMMAND:
switch(wParam) {
case 0x30003E9:
edMoneyChange((HWND) lParam);
return 0;
case IDCANCEL:
EndDialog(hdlg, 0);
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
__asm {
mov eax, [esp+4]
push 0
push offset AppDlgProc
push 0
push IDD_APP
push eax
call dword ptr DialogBoxParam
}
}
Conclusion :
Les couleurs de texte et de fond restent paramétrables.
Le reste est entièrement prêt à l'emploi. Il n'y a que
le squelette du prog qui soit en C pour WIN32.
Tout le reste, initialisation de editbox avec sa police
et son sous classement sont entièrement en ASM.
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.