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という名をもつ関数が実行開始位置になります