; ######################################################################### .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include Dragdrop.inc ; local includes for this file ; ######################################################################### .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine, eax invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax ; ######################################################################### WinMain proc hInst :DWORD, hPrevInst :DWORD, CmdLine :DWORD, CmdShow :DWORD ;==================== ; Put LOCALs on stack ;==================== LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL Wwd :DWORD LOCAL Wht :DWORD LOCAL Wtx :DWORD LOCAL Wty :DWORD ;================================================== ; Fill WNDCLASSEX structure with required variables ;================================================== invoke LoadIcon,hInst,500 ; icon ID mov hIcon, eax szText szClassName,"Project_Class" mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW \ or CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInst mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName m2m wc.hIcon, hIcon invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax m2m wc.hIconSm, hIcon invoke RegisterClassEx, ADDR wc ;================================ ; Centre window at following size ;================================ mov Wwd, 300 mov Wht, 300 invoke GetSystemMetrics,SM_CXSCREEN invoke TopXY,Wwd,eax mov Wtx, eax invoke GetSystemMetrics,SM_CYSCREEN invoke TopXY,Wht,eax mov Wty, eax ; ---------------------------------------------------- ; Setting the extended style with "WS_EX_ACCEPTFILES" ; enables the drag & drop capacity of the window. ; ---------------------------------------------------- invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPED or WS_SYSMENU, Wtx,Wty,Wwd,Wht, NULL,NULL, hInst,NULL mov hWnd,eax invoke LoadMenu,hInst,600 ; menu ID invoke SetMenu,hWnd,eax invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd ;=================================== ; Loop until PostQuitMessage is sent ;=================================== StartLoop: invoke GetMessage,ADDR msg,NULL,0,0 cmp eax, 0 je ExitLoop invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp StartLoop ExitLoop: return msg.wParam WinMain endp ; ######################################################################### WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD LOCAL var :DWORD LOCAL caW :DWORD LOCAL caH :DWORD LOCAL Rct :RECT LOCAL hDC :DWORD LOCAL Ps :PAINTSTRUCT LOCAL buffer1[128]:BYTE ; these are two spare buffers LOCAL buffer2[128]:BYTE ; for text manipulation etc.. .if uMsg == WM_COMMAND ;======== menu commands ======== ; -------------------------------------------------------- ; Processing this message is where the name of the file ; is obtained within the application. Once you have the ; name of the file, you can do whatever you want with ; it IE: load it into an editor, load a bitmap file etc.. ; -------------------------------------------------------- .elseif uMsg == WM_DROPFILES invoke DragQueryFile,wParam,0,ADDR buffer1,128 szText title1,"This is the file you dropped into the window" invoke MessageBox,hWin,Addr buffer1,ADDR title1,MB_OK .elseif uMsg == WM_CREATE .elseif uMsg == WM_SIZE .elseif uMsg == WM_PAINT invoke BeginPaint,hWin,ADDR Ps mov hDC, eax invoke Paint_Proc,hWin,hDC invoke EndPaint,hWin,ADDR Ps return 0 .elseif uMsg == WM_CLOSE .elseif uMsg == WM_DESTROY 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, hDC:DWORD LOCAL btn_hi :DWORD LOCAL btn_lo :DWORD LOCAL Rct :RECT invoke GetSysColor,COLOR_BTNHIGHLIGHT mov btn_hi, eax invoke GetSysColor,COLOR_BTNSHADOW mov btn_lo, eax return 0 Paint_Proc endp ; ######################################################################## end start