fortran66のブログ

fortran について書きます。

Windows Program Minimum

Intel Visual Fortran によるWin32プログラムの最小構成。

普通のコンソール用アプリケーション形式で新しいプロジェクトを作ります。
ただし、コンパイル時のオプションとしてLINKのSYSTEMオプションで、SUBSYSTEMをWINDOWSに変更する必要があります*1

実行すると真っ白なWindows窓が開きます。



*リストを横長に表示する方法がまだ分かりません(><;

MODULE winproc
USE ifwin !USE ifwinty USE user32 
IMPLICIT NONE
CONTAINS
!--------------------------------------------------------------------------------
INTEGER (LRESULT) FUNCTION MainWndProc( hWnd, mesg, wParam, lParam ) ! CALLBACK procedure
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_MainWndProc@16' :: MainWndProc
IMPLICIT NONE
INTEGER (HANDLE) , INTENT(IN) :: hWnd
INTEGER (UINT)   , INTENT(IN) :: mesg
INTEGER (fwParam), INTENT(IN) :: wParam
INTEGER (flParam), INTENT(IN) :: lParam
MainWndProc = 0
SELECT CASE ( mesg )
   CASE (WM_DESTROY)
     CALL PostQuitMessage( 0 )
   CASE DEFAULT
     MainWndProc = DefWindowProc( hWnd, mesg, wParam, lParam )
END SELECT 
RETURN
END FUNCTION MainWndProc
!-------------------------------------------------------------------------------
END MODULE winproc
!===============================================================================
INTEGER (KIND = 4) FUNCTION WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain
USE winproc
IMPLICIT NONE
INTEGER (HANDLE), INTENT(IN) :: hInstance, hPrevInstance 
INTEGER (LPSTR) , INTENT(IN) :: lpszCmdLine
INTEGER (SINT)  , INTENT(IN) :: nCmdShow
TYPE (T_WNDCLASS) :: wc
TYPE (T_MSG)      :: mesg
INTEGER (HANDLE)  :: hWndMain
INTEGER (BOOL)    :: iretb
CHARACTER (LEN = 256) :: ClassName = "Fortran"C
!  Init   Main window
WinMain = -1 ! Error code 
wc%lpszClassName = LOC(ClassName)
wc%lpfnWndProc   = LOC(MainWndProc)               ! CALLBACK procedure name
wc%style         = IOR(CS_VREDRAW , CS_HREDRAW)
wc%hInstance     = hInstance
wc%hIcon         = NULL   
wc%hCursor       = LoadCursor( NULL, IDC_ARROW )
wc%hbrBackground = ( COLOR_WINDOW + 1 )
IF (RegisterClass(wc) == 0) RETURN
!Init instance
WinMain = -2 ! Error code 
hWndMain = CreateWindowEx(  0, ClassName,                        &
                               " FORTRAN Window "C,              &
                               INT(WS_OVERLAPPEDWINDOW),         &
                               CW_USEDEFAULT, CW_USEDEFAULT,     &
                               CW_USEDEFAULT, CW_USEDEFAULT,     &
                               0,                                &
                               0,                                &
                               NULL,                             &
                               NULL                               )
IF (hWndMain == 0) RETURN
iretb = ShowWindow( hWndMain, nCmdShow )
iretb = UpdateWindow( hWndMain )
! Message Loop : Main Loop
DO WHILE ( GetMessage (mesg, NULL, 0, 0) ) 
 iretb = TranslateMessage( mesg )
 iretb = DispatchMessage( mesg )
END DO
WinMain = mesg%wParam
RETURN
END FUNCTION WinMain
!=======================================================================================

 ↓この本は、まったく助けになりませんでした(><;

*1:PROGRAM文で始まる実行モジュールではなく、WinMainという名をもつ関数が実行開始位置になります