fortran66のブログ

fortran について書きます。

Windows Program

Windows Programは、普通のコンソール型のプログラムしか作ったことの無い者には、中々理解しがたいものがあります。以前『猫でも分かるWindowsプログラミング』を買って読んで理解不能だったときは、「俺は猫以下か!」と、かなりがっかりしました。


以下に、理解を妨げていた概念上の困難点を思いつくままに列挙します。

  • PROGRAM文で始まるメインルーチンが無い様に見えますが、WinMainという関数がメインルーチンに相当します。関数がメインルーチンなのは、C言語の影響かもしれません。開始実行ルーチンをPROGRAM文で始めるかWinMainから始めるかは、リンカーのSYSTEM->SUBSYSTEMのオプションで指定します。
  • Windowsのプログラムでは、『Windowが主体でその動作は属性として従属的に与えられる』というのがキモとなる概念だと思います。Windowのサイズやタイトルなどと同列に、動作もCallbackルーチンとして属性的に与えることになります。
  • WinMainは、無限ループで割り込みを待つ形を取ります。その内容は、基本的に以下のような形を取ります。
    1. Windowの属性の定義
    2. Windowの割付
    3. Windowの表示
    4. 割り込み待ちの無限ループ
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
  • Windowsでは、大量の型や定数、インターフェース等があらかじめ定義されているので、その定義モジュールを使用します。
  • Windowsの機能は、C言語での使用が想定されているWin32 APIと呼ばれるサブルーチンライブラリで提供されているので、それらの機能を知る必要があります。これは、適当な本を買ってくるか、ネットで検索して調べます。
  • Intel Visual Fortranでは、膨大なWin32 APIのうち主要なものについて、インターフェースを提供してくれています。それらは、モジュールの形で提供されているので、直接ソースを覗いて調べる必要があります。そのファイルは、C:\Program Files\Intel\Compiler\Fortran\10.1.XXX\IA32\include\の下にあります。