<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ASM: DrawText mit MASM32 (Prostart)]]></title><description><![CDATA[<p>Ich habe folgendes Problem (Bin gerade nicht zu Hause, habe darum nicht den aktuellsten Code da, das Grundgerüst ist aber das Selbe):<br />
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.<br />
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?<br />
Ich möchte z.B. bei</p>
<pre><code class="language-asm">======== menu commands ========

        .if wParam == 1001
</code></pre>
<p>nach dem mci-Aufruf den Dateinamen in das Fenster ausgeben lassen.</p>
<p>Vielen Dank</p>
<pre><code class="language-asm">.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 &quot;open &quot;, 255 dup(?),0
open2 db &quot; alias MyAlias&quot;,255 dup(?),0
play db &quot;play MyAlias&quot;,0
stop db &quot;stop MyAlias&quot;,0
filename db 1024 dup(?)
close db &quot;close MyAlias&quot;,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,&quot;Prostart_Class&quot;

    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(&quot;WM_COMMAND ID 50&quot;),
                              ADDR szDisplayName,MB_OK

        .elseif wParam == 51
            invoke MessageBox,hWin,SADD(&quot;WM_COMMAND ID 51&quot;),
                              ADDR szDisplayName,MB_OK

        .elseif wParam == 52
            invoke MessageBox,hWin,SADD(&quot;WM_COMMAND ID 52&quot;),
                              ADDR szDisplayName,MB_OK

        .elseif wParam == 53
            invoke MessageBox,hWin,SADD(&quot;WM_COMMAND ID 53&quot;),
                              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(&quot;Open A File&quot;),
                                    SADD(&quot;All files&quot;,0,&quot;*.*&quot;,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(&quot;Save File As ...&quot;),
                                     SADD(&quot;All files&quot;,0,&quot;*.*&quot;,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,\
                &quot;About Prostart 3 Template#Windows Application&quot;,\
                &quot;Prostart 3 Template&quot;,13,10,&quot;Copyright © MASM32 2001&quot;
        .endif
    ;====== end menu commands ======

    .elseif uMsg == WM_DROPFILES
        invoke DragQueryFile,wParam,0,ADDR szDropFileName,sizeof szDropFileName
      ; -------------------------------------------------------
      ; perform the action you want with &quot;szDropFileName&quot; here
      ; -------------------------------------------------------
        invoke MessageBox,hWin,ADDR szDropFileName,SADD(&quot;WM_DROPFILES&quot;),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
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/198499/asm-drawtext-mit-masm32-prostart</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 07:53:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198499.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Nov 2007 08:29:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ASM: DrawText mit MASM32 (Prostart) on Thu, 22 Nov 2007 08:29:39 GMT]]></title><description><![CDATA[<p>Ich habe folgendes Problem (Bin gerade nicht zu Hause, habe darum nicht den aktuellsten Code da, das Grundgerüst ist aber das Selbe):<br />
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.<br />
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?<br />
Ich möchte z.B. bei</p>
<pre><code class="language-asm">======== menu commands ========

        .if wParam == 1001
</code></pre>
<p>nach dem mci-Aufruf den Dateinamen in das Fenster ausgeben lassen.</p>
<p>Vielen Dank</p>
<pre><code class="language-asm">.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 &quot;open &quot;, 255 dup(?),0
open2 db &quot; alias MyAlias&quot;,255 dup(?),0
play db &quot;play MyAlias&quot;,0
stop db &quot;stop MyAlias&quot;,0
filename db 1024 dup(?)
close db &quot;close MyAlias&quot;,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,&quot;Prostart_Class&quot;

    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(&quot;WM_COMMAND ID 50&quot;),
                              ADDR szDisplayName,MB_OK

        .elseif wParam == 51
            invoke MessageBox,hWin,SADD(&quot;WM_COMMAND ID 51&quot;),
                              ADDR szDisplayName,MB_OK

        .elseif wParam == 52
            invoke MessageBox,hWin,SADD(&quot;WM_COMMAND ID 52&quot;),
                              ADDR szDisplayName,MB_OK

        .elseif wParam == 53
            invoke MessageBox,hWin,SADD(&quot;WM_COMMAND ID 53&quot;),
                              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(&quot;Open A File&quot;),
                                    SADD(&quot;All files&quot;,0,&quot;*.*&quot;,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(&quot;Save File As ...&quot;),
                                     SADD(&quot;All files&quot;,0,&quot;*.*&quot;,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,\
                &quot;About Prostart 3 Template#Windows Application&quot;,\
                &quot;Prostart 3 Template&quot;,13,10,&quot;Copyright © MASM32 2001&quot;
        .endif
    ;====== end menu commands ======

    .elseif uMsg == WM_DROPFILES
        invoke DragQueryFile,wParam,0,ADDR szDropFileName,sizeof szDropFileName
      ; -------------------------------------------------------
      ; perform the action you want with &quot;szDropFileName&quot; here
      ; -------------------------------------------------------
        invoke MessageBox,hWin,ADDR szDropFileName,SADD(&quot;WM_DROPFILES&quot;),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
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1407936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407936</guid><dc:creator><![CDATA[C. M. Obrecht]]></dc:creator><pubDate>Thu, 22 Nov 2007 08:29:39 GMT</pubDate></item></channel></rss>