?
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