ASM: DrawText mit MASM32 (Prostart)



  • Ich habe folgendes Problem (Bin gerade nicht zu Hause, habe darum nicht den aktuellsten Code da, das Grundgerüst ist aber das Selbe):
    Ich habe das Fenster mit Prostart (MASM32) erzeugt. Nun möchte ich in der Fensterprozedur Text in das Fenster zeichnen können, z.B. um den Dateinamen auszugeben und die Länge eines Stückes etc.
    Ich bin nicht so sehr API-bewandelt, habe aber Beispiele aus einem Tutorial durchgearbeitet welche etwas anders aufgebaut waren, da klappte es (DrawText). Bei dem von Prostart erzeugten Code sei nun hDC und Ps nicht definiert; wie kann ich das Problem lösen?
    Ich möchte z.B. bei

    ======== menu commands ========
    
            .if wParam == 1001
    

    nach dem mci-Aufruf den Dateinamen in das Fenster ausgeben lassen.

    Vielen Dank

    .486                      ; create 32 bit code
          .model flat, stdcall      ; 32 bit memory model
          option casemap :none      ; case sensitive
    
          include mp3Player.inc        ; local includes for this file
          include dbmacros.asm
          include errormac.asm
          include \masm32\include\winmm.inc
    includelib \masm32\lib\winmm.lib
    
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    
    .data
    
    open1 db "open ", 255 dup(?),0
    open2 db " alias MyAlias",255 dup(?),0
    play db "play MyAlias",0
    stop db "stop MyAlias",0
    filename db 1024 dup(?)
    close db "close MyAlias",0
    mci3 db 0
    
    .code
    
    ; #########################################################################
    
    start:
    
          invoke InitCommonControls
    
        ; ------------------
        ; set global values
        ; ------------------
          invoke GetModuleHandle, NULL
          mov hInstance, eax
    
          invoke GetCommandLine
          mov CommandLine, eax
    
          invoke LoadIcon,hInstance,500    ; icon ID
          mov hIcon, eax
    
          invoke LoadCursor,NULL,IDC_ARROW
          mov hCursor, eax
    
          invoke GetSystemMetrics,SM_CXSCREEN
          mov sWid, eax
    
          invoke GetSystemMetrics,SM_CYSCREEN
          mov sHgt, eax
    
          call Main
    
          invoke ExitProcess,eax
    
    ; #########################################################################
    
    Main proc
    
        LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD
    
        STRING szClassName,"Prostart_Class"
    
        SingleInstanceOnly ADDR szClassName
    
      ; --------------------------------------------
      ; register class name for CreateWindowEx call
      ; --------------------------------------------
        invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,
                           hIcon,hCursor,COLOR_BTNFACE+1
    
        mov Wwd, 300
        mov Wht, 200
        invoke TopXY,Wwd,sWid
        mov Wtx, eax
        invoke TopXY,Wht,sHgt
        mov Wty, eax
    
        invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES,
                              ADDR szClassName,
                              ADDR szDisplayName,
                              WS_OVERLAPPED or WS_SYSMENU,
                              Wtx,Wty,Wwd,Wht,
                              NULL,NULL,
                              hInstance,NULL
        mov hWnd,eax
    
      ; ---------------------------
      ; macros for unchanging code
      ; ---------------------------
        DisplayMenu hWnd,600
        DisplayWindow hWnd,SW_SHOWNORMAL
    
        call MsgLoop
        ret
    
    Main endp
    
    ; #########################################################################
    
    RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,
                          Icon:DWORD, Cursor:DWORD, bColor:DWORD
    
        LOCAL wc:WNDCLASSEX
    
        mov wc.cbSize,         sizeof WNDCLASSEX
        mov wc.style,          CS_BYTEALIGNCLIENT or \
                               CS_BYTEALIGNWINDOW
        m2m wc.lpfnWndProc,    lpWndProc
        mov wc.cbClsExtra,     NULL
        mov wc.cbWndExtra,     NULL
        m2m wc.hInstance,      hInstance
        m2m wc.hbrBackground,  bColor
        mov wc.lpszMenuName,   NULL
        m2m wc.lpszClassName,  lpClassName
        m2m wc.hIcon,          Icon
        m2m wc.hCursor,        Cursor
        m2m wc.hIconSm,        Icon
    
        invoke RegisterClassEx, ADDR wc
    
        ret
    
    RegisterWinClass endp
    
    ; ########################################################################
    
    MsgLoop proc
    
      ; ------------------------------------------
      ; The following 4 equates are available for
      ; processing messages directly in the loop.
      ; m_hWnd - m_Msg - m_wParam - m_lParam
      ; ------------------------------------------
    
        LOCAL msg:MSG
    
        StartLoop:
          invoke GetMessage,ADDR msg,NULL,0,0
          cmp eax, 0
          je ExitLoop
          invoke TranslateMessage, ADDR msg
          invoke DispatchMessage,  ADDR msg
          jmp StartLoop
        ExitLoop:
    
        mov eax, msg.wParam
        ret
    
    MsgLoop endp
    
    ; #########################################################################
    
    WndProc proc hWin   :DWORD,
                 uMsg   :DWORD,
                 wParam :DWORD,
                 lParam :DWORD
    
        LOCAL var    :DWORD
        LOCAL caW    :DWORD
        LOCAL caH    :DWORD
        LOCAL Rct    :RECT
        LOCAL buffer1[128]:BYTE  ; these are two spare buffers
        LOCAL buffer2[128]:BYTE  ; for text manipulation etc..
        LOCAL szDropFileName[260]:BYTE
    
        .if uMsg == WM_COMMAND
        ;======== toolbar commands ========
            .if wParam == 50
                invoke MessageBox,hWin,SADD("WM_COMMAND ID 50"),
                                  ADDR szDisplayName,MB_OK
    
            .elseif wParam == 51
                invoke MessageBox,hWin,SADD("WM_COMMAND ID 51"),
                                  ADDR szDisplayName,MB_OK
    
            .elseif wParam == 52
                invoke MessageBox,hWin,SADD("WM_COMMAND ID 52"),
                                  ADDR szDisplayName,MB_OK
    
            .elseif wParam == 53
                invoke MessageBox,hWin,SADD("WM_COMMAND ID 53"),
                                  ADDR szDisplayName,MB_OK
    
            .endif
    
        ;======== menu commands ========
    
            .if wParam == 1001
              ; --------------------------------------
              ; szFileName is defined in Filedlgs.asm
              ; --------------------------------------
                mov szFileName[0],0     ; set 1st byte to zero
                invoke GetFileName,hWin,SADD("Open A File"),
                                        SADD("All files",0,"*.*",0)
                cmp szFileName[0],0     ; zero if cancel pressed in dlgbox
                je @F
    
    invoke GetShortPathName, ADDR szFileName, ADDR filename, 255
    
    Start:   
      lea esi, open1 
     FindLastByte: 
      lodsb 
      Or al, al 
      jnz FindLastByte 
    
      dec esi 
      mov edi, esi 
      lea esi, filename
      CatStrings: 
      lodsb 
      Or al, al 
      jz Done 
      stosb 
      jmp CatStrings 
    
     Done: 
      mov al, 0
      stosb 
    
                     ;Start:   
      lea esi, open1
     FindLastByte2: 
      lodsb 
      Or al, al 
      jnz FindLastByte2 
    
      dec esi 
      mov edi, esi 
      lea esi, open2
      CatStrings2: 
      lodsb 
      Or al, al 
      jz Done2 
      stosb 
      jmp CatStrings2 
    
     Done2: 
      mov al, 0
      stosb 
    
                invoke mciSendString, ADDR open1, ADDR mci3,0,0
                    invoke mciSendString, ADDR play, ADDR mci3,0,0
                @@:
    
            .elseif wParam == 1002
              ; --------------------------------------
              ; szFileName is defined in Filedlgs.asm
              ; --------------------------------------
                mov szFileName[0],0     ; set 1st byte to zero
                invoke SaveFileName,hWin,SADD("Save File As ..."),
                                         SADD("All files",0,"*.*",0,0)
                cmp szFileName[0],0     ; zero if cancel pressed in dlgbox
                je @F
              ; ---------------------------------
              ; perform your file save code here
              ; ---------------------------------
                invoke MessageBox,hWin,ADDR szFileName,ADDR szDisplayName,MB_OK
                @@:
    
            .endif
    
            .if wParam == 1010
                invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
    
            .elseif wParam == 1900
                ShellAboutBox hWin,hIcon,\
                    "About Prostart 3 Template#Windows Application",\
                    "Prostart 3 Template",13,10,"Copyright © MASM32 2001"
            .endif
        ;====== end menu commands ======
    
        .elseif uMsg == WM_DROPFILES
            invoke DragQueryFile,wParam,0,ADDR szDropFileName,sizeof szDropFileName
          ; -------------------------------------------------------
          ; perform the action you want with "szDropFileName" here
          ; -------------------------------------------------------
            invoke MessageBox,hWin,ADDR szDropFileName,SADD("WM_DROPFILES"),MB_OK
    
        .elseif uMsg == WM_CREATE
            invoke Do_ToolBar,hWin
    
        .elseif uMsg == WM_SYSCOLORCHANGE
            invoke Do_ToolBar,hWin
    
        .elseif uMsg == WM_SIZE
            invoke SendMessage,hToolBar,TB_AUTOSIZE,0,0
    
        .elseif uMsg == WM_PAINT
            invoke Paint_Proc,hWin
            return 0
    
        .elseif uMsg == WM_CLOSE
    
        .elseif uMsg == WM_DESTROY
        invoke mciSendString, ADDR stop, ADDR mci3,0,0
        invoke mciSendString, ADDR close, ADDR mci3,0,0
            invoke PostQuitMessage,NULL
            return 0
    
        .endif
    
        invoke DefWindowProc,hWin,uMsg,wParam,lParam
    
        ret
    
    WndProc endp
    
    ; ########################################################################
    
    TopXY proc wDim:DWORD, sDim:DWORD
    
        shr sDim, 1      ; divide screen dimension by 2
        shr wDim, 1      ; divide window dimension by 2
        mov eax, wDim    ; copy window dimension into eax
        sub sDim, eax    ; sub half win dimension from half screen dimension
    
        return sDim
    
    TopXY endp
    
    ; #########################################################################
    
    Paint_Proc proc hWin:DWORD
    
        LOCAL hDC      :DWORD
        LOCAL btn_hi   :DWORD
        LOCAL btn_lo   :DWORD
        LOCAL Rct      :RECT
        LOCAL Ps       :PAINTSTRUCT
    
        invoke BeginPaint,hWin,ADDR Ps
        mov hDC, eax
    
      ; ----------------------------------------
    
        invoke GetSysColor,COLOR_BTNHIGHLIGHT
        mov btn_hi, eax
    
        invoke GetSysColor,COLOR_BTNSHADOW
        mov btn_lo, eax
    
      ; ----------------------------------------
    
        invoke EndPaint,hWin,ADDR Ps
    
        ret
    
    Paint_Proc endp
    
    ; ########################################################################
    
    end start
    

Anmelden zum Antworten