|
|
|
2-4-4. ApMdisysプログラムのコードApMdisysアプリケーションのコードを示します。全ソースコードのファイルは、ここを押せばダウンロードできます。コードの説明は、次項から詳細に説明します。ApMdisys.h /********************************************************************** * ApMdisys for Windows(The Windows MDI Type Application Sample) V1.0 * * リソースの定数 * * * * (C) Copyright 1999 Arcpit Inc. ALL RIGHT RESERVED. * **********************************************************************/ #define IDM_NEWHELLO 100 #define IDM_NEWREDIT 101 #define IDM_OPEN 102 #define IDM_ABOUT 103 #define IDM_EXIT 104 #define IDMC_WINDOW 1 #define IDM_CASCADE 200 #define IDM_VTILE 201 #define IDM_HTILE 202 #define IDM_ALLCLOSE 203 #define IDM_ARRANGE 204 #define IDM_REARRANGE 205 #define IDM_ICONSORT 206 #define IDM_LEFT 300 #define IDM_CENTER 301 #define IDM_RIGHT 302 #define IDM_BOLD 400 #define IDM_ITALIC 401 #define IDM_UNDERLINE 402 #define IDM_STRIKEOUT 403 #define IDM_ALIGNLEFT 404 #define IDM_ALIGNCENTER 405 #define IDM_ALIGNRIGHT 406 #define IDM_FONT 407 #define IDC_STATIC -1 #define IDI_MAIN 1000 #define IDI_HELLO 1001 #define IDI_REDIT 1002 #define ID_MDICHILD 2000 #define ID_RTF 3000 ApMdisys.c /**********************************************************************
* ApMdisys for Windows(The Windows MDI Type Application Sample) V1.0 *
* MDIタイプのサンプルプログラム *
* *
* (C) Copyright 1999 Arcpit Inc. ALL RIGHT RESERVED. *
**********************************************************************/
#include <windows.h>
#include <richedit.h>
#include <commctrl.h>
#include "ApMdisys.h"
LRESULT CALLBACK ApMdiProc(HWND hWnd,UINT uMsg,
WPARAM wParam,LPARAM lParam);
static BOOL CALLBACK CloseEnumProc(HWND hWnd,LONG lParam);
static BOOL CALLBACK AboutProc(HWND hDlg,UINT uMsg,
WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK HelloProc(HWND hWnd,UINT uMsg,
WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK ReditProc(HWND hWnd,UINT uMsg,
WPARAM wParam,LPARAM lParam);
static VOID ChangeCharFormat(UINT uCmd);
static VOID ChangeAlignment(UINT uCmd);
static VOID ChangeFont(HWND hWnd);
static HWND GetReditWindow(VOID);
static HWND hWndMain = NULL;
static HACCEL hAccel = NULL;
static HWND hWndClient = NULL;
static HMENU hMenuInit = NULL;
static HMENU hMenuHello = NULL;
static HMENU hMenuRedit = NULL;
static LPSTR pHelloClass = "HelloClass";
static LPSTR pHelloApp = "ApHello";
static LPSTR pReditClass = "ReditClass";
static LPSTR pReditApp = "ApRedit";
static LPSTR pHello = "Hello World.";
static HFONT hFont = NULL;
/**********************************************************************
* アプリケーションの初期処理 *
**********************************************************************/
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASSEX wc;
static LPSTR pClassName = "ApMdiClass";
static LPSTR pAppName = "ApMdisys";
// フレームウィンドウのクラスの登録
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)ApMdiProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MAIN));
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = pClassName;
wc.hIconSm = LoadImage(hInstance,MAKEINTRESOURCE(IDI_MAIN),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
if (!RegisterClassEx(&wc)) return FALSE;
// Hello MDI子ウィンドウのクラスの登録
wc.lpfnWndProc = (WNDPROC)HelloProc;
wc.cbWndExtra = sizeof(LONG);
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_HELLO));
wc.lpszClassName = pHelloClass;
wc.hIconSm = LoadImage(hInstance,MAKEINTRESOURCE(IDI_HELLO),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
if (!RegisterClassEx(&wc)) return FALSE;
// リッチテキストMDI子ウィンドウのクラスの登録
wc.lpfnWndProc = (WNDPROC)ReditProc;
wc.cbWndExtra = sizeof(LONG);
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_REDIT));
wc.lpszClassName = pReditClass;
wc.hIconSm = LoadImage(hInstance,MAKEINTRESOURCE(IDI_REDIT),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
if (!RegisterClassEx(&wc)) return FALSE;
// フレームウィンドウの作成
hMenuInit = LoadMenu(hInstance,"ApMdisys");
hMenuHello = LoadMenu(hInstance,"ApMdiHello");
hMenuRedit = LoadMenu(hInstance,"ApMdiRedit");
hAccel = LoadAccelerators(hInstance,pAppName);
hWndMain = CreateWindow(pClassName,NULL,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,hMenuInit,hInstance,NULL);
if (!hWndMain) return FALSE;
SetWindowText(hWndMain,pAppName);
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
while (GetMessage(&msg,NULL,0,0))
{
if (!TranslateAccelerator(hWndMain,hAccel,&msg) &&
!TranslateMDISysAccel(hWndClient,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
UNREFERENCED_PARAMETER(hPrevInstance);
}
/**********************************************************************
* フレーム(メイン)ウィンドウのプロシージャ *
**********************************************************************/
LRESULT CALLBACK ApMdiProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
static HINSTANCE hRtfLib; // リッチテキストDLLのインスタンスのハンドル
static CLIPFORMAT cfRTF; // クリップボードのフォーマット
switch (uMsg)
{
case WM_CREATE: // メインウィンドウの新規作成
{
LPCREATESTRUCT lpcs;
CLIENTCREATESTRUCT ccs;
HINSTANCE hInst;
LOGFONT lf;
InitCommonControls();
hRtfLib = LoadLibrary("RICHED32.DLL");
hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
lpcs = (LPCREATESTRUCT)lParam;
ccs.hWindowMenu = GetSubMenu(lpcs->hMenu,IDMC_WINDOW);
ccs.idFirstChild = ID_MDICHILD;
hWndClient = CreateWindow("MDICLIENT",NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|
WS_HSCROLL|WS_VSCROLL,
0,0,0,0,hWnd,lpcs->hMenu,
hInst,(LPVOID)&ccs);
ZeroMemory(&lf,sizeof(LOGFONT));
lf.lfHeight = 32;
lf.lfCharSet = ANSI_CHARSET;
lstrcpy(lf.lfFaceName,"Arial");
hFont = CreateFontIndirect(&lf);
cfRTF = RegisterClipboardFormat(CF_RTF);
break;
}
case WM_DESTROY: // ウィンドウを破棄する
{
if (hWndClient) DestroyWindow(hWndClient);
if (hFont) DeleteObject(hFont);
if (hRtfLib) FreeLibrary(hRtfLib);
break;
}
case WM_SIZE: // ウィンドウのサイズが変わった
{
if (hWndClient) // MDIクライアントウィンドウのサイズを調整する
MoveWindow(hWndClient,0,0,
LOWORD(lParam),HIWORD(lParam),TRUE);
return 0;
}
case WM_INITMENUPOPUP: // メニューがポップアップする前に発生
{
HMENU hMenu;
HWND hMdi;
WNDPROC proc;
INT n;
if ((BOOL)HIWORD(lParam)) return 0; // コントロールメニュー
hMdi = (HWND)SendMessage(hWndClient,WM_MDIGETACTIVE,0,0);
if (!hMdi) return 0;
hMenu = (HMENU)wParam;
proc = (WNDPROC)GetWindowLong(hMdi,GWL_WNDPROC);
switch (GetMenuItemID(hMenu,0))
{
case IDM_LEFT: // 表示メニュー
if (proc != HelloProc) break;
for(n=IDM_LEFT; n <= IDM_RIGHT; ++n)
CheckMenuItem(hMenu,n,MF_BYCOMMAND|MF_UNCHECKED);
n = GetWindowLong(hMdi,0);
CheckMenuItem(hMenu,n,MF_BYCOMMAND|MF_CHECKED);
break;
case IDM_BOLD: // 書式メニュー
{
HWND hEdit;
CHARFORMAT cf;
PARAFORMAT pf;
UINT flag;
if (proc != ReditProc) break;
for(n=IDM_BOLD; n <= IDM_ALIGNRIGHT; ++n)
CheckMenuItem(hMenu,n,MF_BYCOMMAND|MF_UNCHECKED);
hEdit = (HWND)GetWindowLong(hMdi,0);
cf.cbSize = sizeof(CHARFORMAT);
SendMessage(hEdit,EM_GETCHARFORMAT,TRUE,(LPARAM)&cf);
// 強調,斜体,アンダーライン,取消し線のメニュー項目を設定
if (cf.dwMask & CFM_BOLD)
{
flag = (cf.dwEffects&CFE_BOLD) ?
MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(hMenu,IDM_BOLD,MF_BYCOMMAND|flag);
}
if (cf.dwMask & CFM_ITALIC)
{
flag = (cf.dwEffects&CFE_ITALIC) ?
MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(hMenu,IDM_ITALIC
,MF_BYCOMMAND|flag);
}
if (cf.dwMask & CFM_UNDERLINE)
{
flag = (cf.dwEffects&CFE_UNDERLINE) ?
MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(hMenu,IDM_UNDERLINE
,MF_BYCOMMAND|flag);
}
if (cf.dwMask & CFM_STRIKEOUT)
{
flag = (cf.dwEffects&CFE_STRIKEOUT) ?
MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(hMenu,IDM_STRIKEOUT
,MF_BYCOMMAND|flag);
}
pf.cbSize = sizeof(PARAFORMAT);
SendMessage(hEdit,EM_GETPARAFORMAT,0,(LPARAM)&pf);
if (pf.dwMask & PFM_ALIGNMENT)
{
switch (pf.wAlignment)
{
case PFA_LEFT: n=IDM_ALIGNLEFT; break;
case PFA_CENTER: n=IDM_ALIGNCENTER; break;
case PFA_RIGHT: n=IDM_ALIGNRIGHT; break;
}
CheckMenuRadioItem(hMenu,IDM_ALIGNLEFT,
IDM_ALIGNRIGHT,n,MF_BYCOMMAND);
}
break;
}
}
return 0;
}
case WM_COMMAND: // メニューやアクセラレータのコマンド
{
switch (LOWORD(wParam))
{
//
// [ファイル(F)]のメニュー項目
//
case IDM_NEWHELLO: // Helloウィンドウの新規作成
{
CreateMDIWindow(pHelloClass,pHelloApp,0,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
hWndClient,
(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
0);
break;
}
case IDM_NEWREDIT: // 文章ウィンドウの新規作成
{
MDICREATESTRUCT mdic;
mdic.szClass = pReditClass;
mdic.szTitle = pReditApp;
mdic.hOwner = (HINSTANCE)GetWindowLong(hWnd,
GWL_HINSTANCE);
mdic.x = mdic.y = CW_USEDEFAULT;
mdic.cx = mdic.cy = CW_USEDEFAULT;
mdic.style = 0;
mdic.lParam = 0;
SendMessage(hWndClient,WM_MDICREATE
,0,(LPARAM)&mdic);
break;
}
case IDM_OPEN: // ファイルの表示
{
OPENFILENAME ofn;
TCHAR szFileName[MAX_PATH];
szFileName[0] = '\0';
// OPENFILENAME構造体を設定する。
ZeroMemory(&ofn,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "全ファイル形式(*.*)\0*.*\0"
"テキストファイル形式(*.txt)\0*.txt\0"
"プログラムファイル形式(*.c,*.h)\0"
"*.c;*.h;*.cpp;*.rc;*.mak\0\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST|OFN_ENABLEHOOK
|OFN_EXPLORER|OFN_HIDEREADONLY;
ofn.lpstrDefExt = "txt";
if (!GetOpenFileName(&ofn)) break; // キャンセル
CreateMDIWindow(pReditClass,pReditApp,0,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
hWndClient,
(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
(LPARAM)szFileName);
break;
}
case IDM_ABOUT: // バージョン情報
{
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWnd,
GWL_HINSTANCE);
DialogBox(hInst,"ABOUTDLG"
,hWnd,(DLGPROC)AboutProc);
break;
}
case IDM_EXIT: // ApMdisysの終了
PostMessage(hWnd,WM_CLOSE,0,0);
break;
//
// [表示(V)]のメニュー項目
//
case IDM_LEFT: // 左側に表示
case IDM_CENTER: // 中央に表示
case IDM_RIGHT: // 右側に表示
{
HWND hActive;
UINT id;
id = LOWORD(wParam);
hActive = (HWND)SendMessage(hWndClient,
WM_MDIGETACTIVE,0,0);
if (!hActive) return 0;
SetWindowLong(hActive,0,(LONG)id);
InvalidateRect(hActive,NULL,TRUE);
UpdateWindow(hActive);
break;
}
//
// [書式(F)]のメニュー項目
//
case IDM_BOLD: // 強調
case IDM_ITALIC: // 斜体
case IDM_UNDERLINE: // アンダーライン
case IDM_STRIKEOUT: // 取消し線
ChangeCharFormat(LOWORD(wParam));
break;
case IDM_ALIGNLEFT: // 左寄せ
case IDM_ALIGNCENTER: // 中央寄せ
case IDM_ALIGNRIGHT: // 右寄せ
ChangeAlignment(LOWORD(wParam));
break;
case IDM_FONT: // フォント
ChangeFont(hWnd);
break;
//
// ウィンドウ(W) Menu
//
case IDM_CASCADE: // 重ねて表示
SendMessage(hWndClient,WM_MDICASCADE,0L,0L);
return 0L;
case IDM_VTILE: // 上下に並べて表示
SendMessage(hWndClient,WM_MDITILE
,MDITILE_HORIZONTAL,0L);
return 0L;
case IDM_HTILE: // 左右に並べて表示
SendMessage(hWndClient,WM_MDITILE
,MDITILE_VERTICAL,0L);
return 0L;
case IDM_ARRANGE: // すべて最小化する
EnumChildWindows(hWndClient,CloseEnumProc,1);
return 0L;
case IDM_REARRANGE: // すべて元に戻す
EnumChildWindows(hWndClient,CloseEnumProc,2);
return 0L;
case IDM_ICONSORT: // アイコンを整列する
SendMessage(hWndClient,WM_MDIICONARRANGE,0L,0L);
return 0L;
case IDM_ALLCLOSE: // すべて閉じる
EnumChildWindows(hWndClient,CloseEnumProc,0);
return 0L;
}
break;
}
}
return DefFrameProc(hWnd,hWndClient,uMsg,wParam,lParam);
}
//
// MDI子ウィンドウを列挙してすべてのウィンドウをクローズ・アイコン化・復帰する。
//
static BOOL CALLBACK CloseEnumProc(HWND hWnd,LONG lParam)
{
if (GetParent(hWnd) != hWndClient) return 1;
if (lParam == 0) // Close
{
if (!SendMessage(hWnd,WM_QUERYENDSESSION,0,0L)) return 1;
SendMessage(hWndClient,WM_MDIDESTROY,(WPARAM)hWnd,0L);
}
else if (lParam == 1) // Icon
ShowWindow(hWnd,SW_MINIMIZE);
else if (lParam == 2) // Restore
SendMessage(hWndClient,WM_MDIRESTORE,(WPARAM)hWnd,0L);
return 1;
}
//
// [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;
}
/**********************************************************************
* Hello 子ウィンドウのプロシージャ *
**********************************************************************/
LRESULT CALLBACK HelloProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE: // メインウィンドウの新規作成
{
SetWindowLong(hWnd,0,IDM_CENTER);
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 ((UINT)GetWindowLong(hWnd,0))
{
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;
}
//
// このMDI子ウィンドウがアクティブなため、固有のメニューを設定する。
//
case WM_MDIACTIVATE:
{
HMENU hMenu;
if ((HWND)lParam == hWnd)
{
hMenu = GetSubMenu(hMenuHello,IDMC_WINDOW+1);
SendMessage(hWndClient,WM_MDISETMENU
,(WPARAM)hMenuHello,(LPARAM)hMenu);
}
else
{
hMenu = GetSubMenu(hMenuInit,IDMC_WINDOW);
SendMessage(hWndClient,WM_MDISETMENU
,(WPARAM)hMenuInit,(LPARAM)hMenu);
}
DrawMenuBar(hWndMain);
return 0;
}
}
return DefMDIChildProc(hWnd,uMsg,wParam,lParam);
}
/**********************************************************************
* リッチエディト子ウィンドウのプロシージャ *
**********************************************************************/
LRESULT CALLBACK ReditProc(HWND hWnd,UINT uMsg
,WPARAM wParam,LPARAM lParam)
{
HWND hEdit = (HWND)GetWindowLong(hWnd,0);
switch(uMsg)
{
//
// MDI子ウィンドウの新規作成で、各種の初期化を行なう。
//
case WM_CREATE:
{
LPCREATESTRUCT pcs;
LPMDICREATESTRUCT pmdic;
HINSTANCE hInst;
LPSTR pFile;
pcs = (CREATESTRUCT *)lParam;
pmdic = (MDICREATESTRUCT *)pcs->lpCreateParams;
pFile = (LPSTR)pmdic->lParam;
hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"RICHEDIT",NULL,
WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|
ES_AUTOVSCROLL|ES_MULTILINE|ES_NOHIDESEL,
0,0,0,0,
hWnd,(HMENU)ID_RTF,hInst,NULL);
SetWindowLong(hWnd,0,(LONG)hEdit);
if (hEdit)
{
CHARFORMAT cf;
HANDLE hFile;
HGLOBAL hMem;
LPSTR p;
DWORD dwSize,dwN;
SendMessage(hEdit,EM_EXLIMITTEXT,0,0x00FFFFFF);
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_FACE;
strcpy(cf.szFaceName,"FixedSys");
SendMessage(hEdit,EM_SETCHARFORMAT
,SCF_SELECTION,(LPARAM)&cf);
if (pFile)
{
hFile = CreateFile(pFile,GENERIC_READ,0,NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
dwSize = GetFileSize(hFile,NULL);
hMem = GlobalAlloc(GPTR,dwSize+256);
p = GlobalLock(hMem);
if (p)
{
ReadFile(hFile,p,dwSize,&dwN,NULL);
*(p+dwSize) = '\0';
SetWindowText(hEdit,p);
wsprintf(p,"%s - ApRedit",pFile);
SetWindowText(hWnd,p);
}
GlobalUnlock(hMem);
GlobalFree(hMem);
CloseHandle(hFile);
}
}
}
return 0;
}
//
// このウィンドウのクローズに伴う破棄で後処理とメモリ開放
//
case WM_DESTROY:
{
if (hEdit) DestroyWindow(hEdit);
break;
}
//
// ウィンドウをリサイズしたのでRTFコントロールも変更する
//
case WM_SIZE:
{
if (hEdit)
MoveWindow(hEdit,0,0,
LOWORD(lParam),HIWORD(lParam),TRUE);
break; // return 0;はダメ
}
//
// このウィンドウにフォーカスが移った
//
case WM_SETFOCUS:
{
if (hEdit) SetFocus(hEdit);
break;
}
//
// このMDI子ウィンドウがアクティブなため、固有のメニューを設定する。
//
case WM_MDIACTIVATE:
{
HMENU hMenu;
if ((HWND)lParam == hWnd)
{
hMenu = GetSubMenu(hMenuRedit,IDMC_WINDOW+1);
SendMessage(hWndClient,WM_MDISETMENU
,(WPARAM)hMenuRedit,(LPARAM)hMenu);
}
else
{
hMenu = GetSubMenu(hMenuInit,IDMC_WINDOW);
SendMessage(hWndClient,WM_MDISETMENU
,(WPARAM)hMenuInit,(LPARAM)hMenu);
}
DrawMenuBar(hWndMain);
return 0;
}
}
return DefMDIChildProc(hWnd,uMsg,wParam,lParam);
}
/**********************************************************************
* 書式(F)のコマンドの処理関数 *
**********************************************************************/
// ボールド・イタリック・取消し線・アンダーラインの処理の設定か解除
static VOID ChangeCharFormat(UINT uCmd)
{
CHARFORMAT cf;
HWND hEdit;
hEdit = GetReditWindow();
if (!hEdit) return;
// 現在の設定を取得する。
cf.cbSize = sizeof(CHARFORMAT);
SendMessage(hEdit,EM_GETCHARFORMAT,TRUE,(LPARAM)&cf);
// 変更をRTFエディットコントロールに適用する。
switch (uCmd)
{
case IDM_BOLD:
cf.dwMask = CFM_BOLD;
cf.dwEffects ^= CFE_BOLD;
break;
case IDM_ITALIC:
cf.dwMask = CFM_ITALIC;
cf.dwEffects ^= CFE_ITALIC;
break;
case IDM_STRIKEOUT:
cf.dwMask = CFM_STRIKEOUT;
cf.dwEffects ^= CFE_STRIKEOUT;
break;
case IDM_UNDERLINE:
cf.dwMask = CFM_UNDERLINE;
cf.dwEffects ^= CFE_UNDERLINE;
break;
}
SendMessage(hEdit,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);
}
static VOID ChangeAlignment(UINT uCmd)
{
PARAFORMAT pf;
HWND hEdit;
hEdit = GetReditWindow();
if (!hEdit) return;
pf.cbSize = sizeof(PARAFORMAT);
pf.dwMask = PFM_ALIGNMENT;
switch (uCmd)
{
case IDM_ALIGNLEFT : pf.wAlignment = PFA_LEFT; break;
case IDM_ALIGNCENTER : pf.wAlignment = PFA_CENTER; break;
case IDM_ALIGNRIGHT : pf.wAlignment = PFA_RIGHT; break;
}
SendMessage(hEdit,EM_SETPARAFORMAT,0,(LPARAM)&pf);
}
static VOID ChangeFont(HWND hWnd)
{
CHARFORMAT cf;
CHOOSEFONT chFont;
LOGFONT lf;
HDC hDC;
HWND hEdit;
hEdit = GetReditWindow();
if (!hEdit) return;
// 現在のフォント情報を取得する。
cf.cbSize = sizeof(CHARFORMAT);
SendMessage(hEdit,EM_GETCHARFORMAT,TRUE,(LPARAM)&cf);
ZeroMemory(&chFont,sizeof(CHOOSEFONT));
ZeroMemory(&lf,sizeof(LOGFONT));
hDC = GetDC(hWndMain);
lf.lfHeight = MulDiv(cf.yHeight,
GetDeviceCaps(hDC,LOGPIXELSY),-1440);
ReleaseDC(hWndMain,hDC);
lf.lfWeight = (cf.dwEffects & CFE_BOLD) ? FW_BOLD : FW_NORMAL;
lf.lfItalic = (BOOL)(cf.dwEffects & CFE_ITALIC);
lf.lfStrikeOut = (BOOL)(cf.dwEffects & CFE_STRIKEOUT);
lf.lfUnderline = (BOOL)(cf.dwEffects & CFE_UNDERLINE);
lf.lfCharSet = cf.bCharSet; // ANSI_CHARSET;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = cf.bPitchAndFamily;
strcpy(lf.lfFaceName,cf.szFaceName);
// CHOOSEFONT構造体を設定する。
chFont.lStructSize = sizeof(CHOOSEFONT);
chFont.hwndOwner = hWnd;
chFont.lpLogFont = &lf;
chFont.Flags = CF_SCREENFONTS|CF_SCALABLEONLY|
CF_EFFECTS|CF_INITTOLOGFONTSTRUCT;
if (!(cf.dwEffects & CFE_AUTOCOLOR))
chFont.rgbColors = cf.crTextColor;
if (ChooseFont(&chFont))
{
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC |
CFM_CHARSET | CFM_OFFSET | CFM_SIZE |
CFM_STRIKEOUT | CFM_UNDERLINE;
cf.yHeight = 2 * chFont.iPointSize;
cf.yOffset = 0;
cf.dwEffects = 0;
if (lf.lfWeight >= FW_BOLD) cf.dwEffects |= CFE_BOLD;
if (lf.lfItalic) cf.dwEffects |= CFE_ITALIC;
if (lf.lfStrikeOut) cf.dwEffects |= CFE_STRIKEOUT;
if (lf.lfUnderline) cf.dwEffects |= CFE_UNDERLINE;
cf.bCharSet = lf.lfCharSet;
cf.bPitchAndFamily = lf.lfPitchAndFamily;
if (chFont.rgbColors == GetSysColor(COLOR_WINDOWTEXT))
cf.dwEffects |= CFE_AUTOCOLOR;
else
cf.crTextColor = chFont.rgbColors;
strcpy(cf.szFaceName,lf.lfFaceName);
SendMessage(hEdit,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);
}
}
static HWND GetReditWindow(VOID)
{
HWND hActive;
hActive = (HWND)SendMessage(hWndClient,WM_MDIGETACTIVE,0,0);
if (!hActive) return 0;
return (HWND)GetWindowLong(hActive,0);
}
ApMdisys.rc /**********************************************************************
* ApMdisys for Windows(The Windows MDI Type Application Sample) V1.0 *
* リソース *
* *
* (C) Copyright 1999 Arcpit Inc. ALL RIGHT RESERVED. *
**********************************************************************/
#include <windows.h>
#include <winver.h>
#include "ApMdisys.h"
/**********************************************************************
* アイコン・カーソル・メニュー・アクセラレータ類のリソース *
**********************************************************************/
IDI_MAIN ICON DISCARDABLE "ApMdisys.ico"
IDI_HELLO ICON DISCARDABLE "ApHello.ico"
IDI_REDIT ICON DISCARDABLE "ApRedit.ico"
ApMdisys ACCELERATORS
{
"^N", IDM_NEWREDIT
"^O", IDM_OPEN
"^K", IDM_BOLD
"^I", IDM_ITALIC
"^U", IDM_UNDERLINE
"?", IDM_ABOUT, ALT
"/", IDM_ABOUT, ALT
VK_F4, IDM_EXIT, VIRTKEY,ALT
}
ApMdisys MENU DISCARDABLE
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "Helloウィンドウの新規作成(&H)", IDM_NEWHELLO
MENUITEM "文章ウィンドウの新規作成(&N)", IDM_NEWREDIT
MENUITEM SEPARATOR
MENUITEM "開く(&O)...", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "バージョン情報(&A)...", IDM_ABOUT
MENUITEM SEPARATOR
MENUITEM "ApMdisysの終了(&X)", IDM_EXIT
END
POPUP "ウィンドウ(&W)"
BEGIN
MENUITEM "重ねて表示(&C)", IDM_CASCADE
MENUITEM "上下に並べて表示(&H)", IDM_VTILE
MENUITEM "左右に並べて表示(&T)", IDM_HTILE
MENUITEM SEPARATOR
MENUITEM "すべて閉じる(&L)", IDM_ALLCLOSE
MENUITEM "すべて最小化する(&I)", IDM_ARRANGE
MENUITEM "すべて元に戻す(&R)", IDM_REARRANGE
MENUITEM "アイコンを整列する(&S)", IDM_ICONSORT
END
END
ApMdiHello MENU DISCARDABLE
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "Helloウィンドウの新規作成(&H)", IDM_NEWHELLO
MENUITEM "文章ウィンドウの新規作成(&N)", IDM_NEWREDIT
MENUITEM SEPARATOR
MENUITEM "開く(&O)...", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "バージョン情報(&A)...", IDM_ABOUT
MENUITEM SEPARATOR
MENUITEM "ApMdisysの終了(&X)", IDM_EXIT
END
POPUP "表示(&V)"
BEGIN
MENUITEM "左側へ表示(&L)", IDM_LEFT
MENUITEM "中央へ表示(&C)", IDM_CENTER
MENUITEM "右側へ表示(&R)", IDM_RIGHT
END
POPUP "ウィンドウ(&W)"
BEGIN
MENUITEM "重ねて表示(&C)", IDM_CASCADE
MENUITEM "上下に並べて表示(&H)", IDM_VTILE
MENUITEM "左右に並べて表示(&T)", IDM_HTILE
MENUITEM SEPARATOR
MENUITEM "すべて閉じる(&L)", IDM_ALLCLOSE
MENUITEM "すべて最小化する(&I)", IDM_ARRANGE
MENUITEM "すべて元に戻す(&R)", IDM_REARRANGE
MENUITEM "アイコンを整列する(&S)", IDM_ICONSORT
END
END
ApMdiRedit MENU DISCARDABLE
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "Helloウィンドウの新規作成(&H)", IDM_NEWHELLO
MENUITEM "文章ウィンドウの新規作成(&N)", IDM_NEWREDIT
MENUITEM SEPARATOR
MENUITEM "開く(&O)...", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "バージョン情報(&A)...", IDM_ABOUT
MENUITEM SEPARATOR
MENUITEM "ApMdisysの終了(&X)", IDM_EXIT
END
POPUP "書式(&O)"
BEGIN
MENUITEM "強調(&B)", IDM_BOLD
MENUITEM "斜体(&I)", IDM_ITALIC
MENUITEM "アンダーライン(&U)", IDM_UNDERLINE
MENUITEM "取消し線(&S)", IDM_STRIKEOUT
MENUITEM SEPARATOR
MENUITEM "左寄せ(&L)", IDM_ALIGNLEFT
MENUITEM "中央寄せ(&C)", IDM_ALIGNCENTER
MENUITEM "右寄せ(&R)", IDM_ALIGNRIGHT
MENUITEM SEPARATOR
MENUITEM "フォント(&F)...", IDM_FONT
END
POPUP "ウィンドウ(&W)"
BEGIN
MENUITEM "重ねて表示(&C)", IDM_CASCADE
MENUITEM "上下に並べて表示(&H)", IDM_VTILE
MENUITEM "左右に並べて表示(&T)", IDM_HTILE
MENUITEM SEPARATOR
MENUITEM "すべて閉じる(&L)", IDM_ALLCLOSE
MENUITEM "すべて最小化する(&I)", IDM_ARRANGE
MENUITEM "すべて元に戻す(&R)", IDM_REARRANGE
MENUITEM "アイコンを整列する(&S)", IDM_ICONSORT
END
END
/**********************************************************************
* ダイアログボックスのリソース *
**********************************************************************/
ABOUTDLG DIALOG DISCARDABLE 0, 0, 191, 101
STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION
CAPTION "ApMdisysのバージョン情報"
FONT 9, "MS Pゴシック"
BEGIN
CTEXT "ApMdisys for Windows 9x",IDC_STATIC,33,8,148,8
CTEXT "The Sample of Windows API Topics.",IDC_STATIC,
33,20,148,8
CTEXT "Version 1.00",IDC_STATIC,33,35,148,8
CTEXT "(C) Copyright 1999 Arcpit Inc. All Right Reserved."
,IDC_STATIC,33,54,148,8
ICON "ApMdisys",IDC_STATIC,8,13,18,21
DEFPUSHBUTTON "OK",IDOK,136,73,50,14
LTEXT "ホームページ: http://www.tsp.ne.jp/~arcpit/",
IDC_STATIC,6,72,118,8
LTEXT "Eメール: arcpit@tsp.ne.jp",IDC_STATIC,6,84,79,8
END
/**********************************************************************
* バージョンテーブルのリソース *
**********************************************************************/
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041103a4"
BEGIN
VALUE "Comments", "The Sample of Windows API Topics\0"
VALUE "CompanyName", "Arcpit Inc.\0"
VALUE "FileDescription", "ApMdisys for Windows9x\0"
VALUE "FileVersion", "1, 0, 0, 1\0"
VALUE "InternalName", "ApMdisys\0"
VALUE "LegalCopyright", "Copyright (C) 1999. Arcpit Inc.\0"
VALUE "OriginalFilename", "ApMdisys.exe\0"
VALUE "ProductName", "Sample Program\0"
VALUE "ProductVersion", "1, 0, 0, 1\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x411, 932
END
END
|