Saisie valeur monétaire (win32, vc++, asm)

Soyez le premier à donner votre avis sur cette source.

Vue 3 886 fois - Téléchargée 170 fois

Description

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.

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
24
Je fais effectivement tous mes petits utilitaires entièrement en asm. Ici le but est purement didactique vu qu'il y a eu des questions récemment sur l'emploi de l'asm dans du code C/C++.
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Bon, le prends pas mal, mais à quoi ca sert de faire un squelette de programme en C pour tout programmer en Asm ?

Soit tu programmes le tout en C pour une meilleure compréhension et dans un souci de ré-utilisation (j'adore "mov dword ptr[eax+32], 61697261h", "mov dword ptr[eax+36], 6Ch" et ta manière de passer les paramètres sur la pile), soit tu fais le tout en assembleur. Mettre de l'asm dans du C ok, mais seulement si ca te permet de vraiment optimiser le code ou d'utiliser le MMX par exemple.

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.