|
|
|
1-3-3. 全体のプログラムApHellを構築するために必要な、ApHeelo.c、ApHello.h、そしてApHello.rcの3つのファイルの内容を下記に示します。とりあえず全体をざっと確認してください。後でコードについて詳細に検討します。またApHello.makファイルはEXEファイルの構築に使用しますが、これは別項を設けます。ApHello.c
/**********************************************************************
* ApHello for WIN32(The Sample of Windows API Topics) v1.00 *
* メインプログラムの処理 *
* *
* (C) Copyright 1999 Arcpit Inc. ALL RIGHT RESERVED. *
**********************************************************************/
#include <windows.h>
#include "ApHello.h"
LRESULT CALLBACK ApHelloProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam);
static BOOL CALLBACK AboutProc(HWND hDlg,UINT uMsg
,WPARAM wParam,LPARAM lParam);
/**********************************************************************
* アプリケーションの初期処理 *
**********************************************************************/
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, INT nCmdShow)
{
HWND hWndMain;
MSG msg;
WNDCLASSEX wc;
static LPSTR pClassName = "ApHelloClass";
static LPSTR pAppName = "ApHello";
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ApHelloProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance,pAppName);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = pAppName;
wc.lpszClassName = pClassName;
wc.hIconSm = LoadImage(hInstance,pAppName,IMAGE_ICON
,16,16,LR_DEFAULTCOLOR);
if (!RegisterClassEx(&wc)) return FALSE;
hWndMain = CreateWindow(pClassName,NULL,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if (!hWndMain) return FALSE;
SetWindowText(hWndMain,pAppName);
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
UNREFERENCED_PARAMETER(hPrevInstance);
}
/**********************************************************************
* メインウィンドウのプロシージャ *
**********************************************************************/
LRESULT CALLBACK ApHelloProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
static HFONT hFont;
static UINT idFormat = IDM_CENTER;
static LPSTR pHello = "Hello World.";
switch (uMsg)
{
case WM_CREATE: // メインウィンドウの新規作成
{
LOGFONT lf;
HMENU hMenu;
ZeroMemory(&lf,sizeof(LOGFONT));
lf.lfHeight = 32;
lf.lfCharSet = ANSI_CHARSET;
lstrcpy(lf.lfFaceName,"Arial");
hFont = CreateFontIndirect(&lf);
hMenu = GetMenu(hWnd);
if (hMenu)
hMenu = GetSubMenu(hMenu,1);
if (hMenu)
CheckMenuItem(hMenu,IDM_CENTER,MF_BYCOMMAND|MF_CHECKED);
break;
}
case WM_DESTROY:
{
if (hFont) DeleteObject(hFont);
PostQuitMessage(0);
return 0;
}
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
UINT w;
hdc = BeginPaint(hWnd,&ps);
if (hdc)
{
GetClientRect(hWnd,&rc);
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(0,0,255));
SelectObject(hdc,hFont);
switch (idFormat)
{
case IDM_LEFT: w = DT_LEFT; break;
case IDM_CENTER: w = DT_CENTER; break;
case IDM_RIGHT: w = DT_RIGHT; break;
}
DrawText(hdc,pHello,strlen(pHello)
,&rc,DT_SINGLELINE|DT_VCENTER|w);
}
EndPaint(hWnd,&ps);
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
//
// [ファイル(F)]のメニュー項目
//
case IDM_ABOUT:
{
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
DialogBox(hInst,"ABOUTDLG",hWnd,(DLGPROC)AboutProc);
break;
}
case IDM_EXIT: // ApHelloの終了
PostMessage(hWnd,WM_CLOSE,0,0);
break;
//
// [表示(V)]のメニュー項目
//
case IDM_LEFT: // 左側に表示
case IDM_CENTER: // 中央に表示
case IDM_RIGHT: // 右側に表示
{
HMENU hMenu;
UINT id;
id = LOWORD(wParam);
hMenu = GetMenu(hWnd);
if (hMenu) hMenu = GetSubMenu(hMenu,1);
if (hMenu)
{
CheckMenuItem(hMenu,idFormat
,MF_BYCOMMAND|MF_UNCHECKED);
CheckMenuItem(hMenu,id,MF_BYCOMMAND|MF_CHECKED);
}
idFormat = id;
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
break;
}
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
// [About]ダイアログボックスのプロシージャ
static BOOL CALLBACK AboutProc(HWND hDlg,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK: // OK
case IDCANCEL: // キャンセル
EndDialog(hDlg,TRUE);
return TRUE;
}
break;
}
return FALSE;
}
ApHello.h /********************************************************************** * ApHello for WIN32(The Sample of Windows API Topics) v1.00 * * リソースの定数 * * * * (C) Copyright 1999 Arcpit Inc. ALL RIGHT RESERVED. * **********************************************************************/ #define IDM_ABOUT 100 #define IDM_EXIT 101 #define IDM_LEFT 200 #define IDM_CENTER 201 #define IDM_RIGHT 202 #define IDC_STATIC -1 ApHello.rc /********************************************************************** * ApHello for WIN32(The Sample of Windows API Topics) v1.00 * * リソース * * * * (C) Copyright 1999 Arcpit Inc. ALL RIGHT RESERVED. * **********************************************************************/ #include
|