by NoWest » 2006年7月25日(火) 18:03
> まずはプロンプトベースのプログラムを書いて、プロシージャやAPI等の概念に慣れてから、徐々に移行されるのが良いと思います。
>
> 偉そうなこと言って、僕も最近ようやく理解したばかりなんですけどね(笑
ってことでAPIだけでウィンドウを実装してみましょう。
コード: 全て選択
Const CLASSNAME="Window Class"
Const WINDOWNAME="Window"
Dim hMainInst As HINSTANCE
hMainInst=GetModuleHandle(NULL)
Dim wce As WNDCLASSEX
ZeroMemory(VarPtr(wce),SizeOf(WNDCLASSEX))
wce.cbSize=SizeOf(WNDCLASSEX)
wce.hbrBackground=COLOR_WINDOW
wce.hCursor=LoadCursor(hMainInst,IDC_ARROW)
wce.hIcon=LoadIcon(hMainInst,IDI_WINLOGO)
wce.hIconSm=LoadIcon(hMainInst,IDI_WINLOGO)
wce.hInstance=hMainInst
wce.lpfnWndProc=AddressOf(WndProc)
wce.lpszClassName=CLASSNAME
wce.lpszMenuName=NULL
wce.style=CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW
Dim AtmWndClass As ATOM
AtmWndClass=RegisterClassEx(wce)
If AtmWndClass=0 Then ExitProcess(0)
Dim hMainWnd As HWND
hMainWnd=CreateWindowEx(0,CLASSNAME,WINDOWNAME,WS_OVERLAPPEDWINDOW,0,0,640,480,NULL,NULL,hMainInst,NULL)
If hMainWnd=0 Then ExitProcess(0)
ShowWindow(hMainWnd,SW_SHOW)
Dim msg As MSG
Do
Select Case GetMessage(msg,0,0,0)
Case -1,0
Exit Do
Case Else
TranslateMessage(msg)
DispatchMessage(msg)
End Select
Loop
ExitProcess(0)
Function WndProc(hWnd As HWND, Msg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case Msg
Case WM_CLOSE
DestroyWindow(hWnd)
Case WM_DESTROY
PostQuitMessage(0)
End Select
WndProc=DefWindowProc(hWnd,Msg,wParam,lParam)
End Function
ここで、WndProc関数のcase WM_DESTROYの部分がDestroyイベントに対応します。
例えば、Createイベントを実装する場合はWndProc関数を以下のように修正します。
コード: 全て選択
Function WndProc(hWnd As HWND, Msg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case Msg
Case WM_CLOSE
DestroyWindow(hWnd)
Case WM_DESTROY
PostQuitMessage(0)
Case WM_CREATE
MessageBox(hWnd,"ウィンドウが作成された。","メッセージ",MB_OK)
End Select
WndProc=DefWindowProc(hWnd,Msg,wParam,lParam)
End Function
RADツールを使ってウィンドウを作成する場合、このWndProcに相当する関数をRADツールが裏方でこっそり管理してくれているので簡単にプログラミングが出来るわけです。
[quote]> まずはプロンプトベースのプログラムを書いて、プロシージャやAPI等の概念に慣れてから、徐々に移行されるのが良いと思います。
>
> 偉そうなこと言って、僕も最近ようやく理解したばかりなんですけどね(笑[/quote]
ってことでAPIだけでウィンドウを実装してみましょう。
[code]Const CLASSNAME="Window Class"
Const WINDOWNAME="Window"
Dim hMainInst As HINSTANCE
hMainInst=GetModuleHandle(NULL)
Dim wce As WNDCLASSEX
ZeroMemory(VarPtr(wce),SizeOf(WNDCLASSEX))
wce.cbSize=SizeOf(WNDCLASSEX)
wce.hbrBackground=COLOR_WINDOW
wce.hCursor=LoadCursor(hMainInst,IDC_ARROW)
wce.hIcon=LoadIcon(hMainInst,IDI_WINLOGO)
wce.hIconSm=LoadIcon(hMainInst,IDI_WINLOGO)
wce.hInstance=hMainInst
wce.lpfnWndProc=AddressOf(WndProc)
wce.lpszClassName=CLASSNAME
wce.lpszMenuName=NULL
wce.style=CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW
Dim AtmWndClass As ATOM
AtmWndClass=RegisterClassEx(wce)
If AtmWndClass=0 Then ExitProcess(0)
Dim hMainWnd As HWND
hMainWnd=CreateWindowEx(0,CLASSNAME,WINDOWNAME,WS_OVERLAPPEDWINDOW,0,0,640,480,NULL,NULL,hMainInst,NULL)
If hMainWnd=0 Then ExitProcess(0)
ShowWindow(hMainWnd,SW_SHOW)
Dim msg As MSG
Do
Select Case GetMessage(msg,0,0,0)
Case -1,0
Exit Do
Case Else
TranslateMessage(msg)
DispatchMessage(msg)
End Select
Loop
ExitProcess(0)
Function WndProc(hWnd As HWND, Msg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case Msg
Case WM_CLOSE
DestroyWindow(hWnd)
Case WM_DESTROY
PostQuitMessage(0)
End Select
WndProc=DefWindowProc(hWnd,Msg,wParam,lParam)
End Function[/code]
ここで、WndProc関数のcase WM_DESTROYの部分がDestroyイベントに対応します。
例えば、Createイベントを実装する場合はWndProc関数を以下のように修正します。
[code]Function WndProc(hWnd As HWND, Msg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case Msg
Case WM_CLOSE
DestroyWindow(hWnd)
Case WM_DESTROY
PostQuitMessage(0)
Case WM_CREATE
MessageBox(hWnd,"ウィンドウが作成された。","メッセージ",MB_OK)
End Select
WndProc=DefWindowProc(hWnd,Msg,wParam,lParam)
End Function[/code]
RADツールを使ってウィンドウを作成する場合、このWndProcに相当する関数をRADツールが裏方でこっそり管理してくれているので簡単にプログラミングが出来るわけです。