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 == 1001nach 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