<Previous>  <Next>   <SDK Top>   <Top>


2章.1節.リッチエディットコントロールを使う

ウィンドウに文字が打ち込めるウィンドウが出てきてますね!!
これは多くのアプリケーションで使われるエディットコントロールといいます.
エディットコントロールの中でも,文字の色・形・大きさを自由に変えることができるものをリッチエディットコントロールといいます.

今回はそれを作ってみましょう.

------------------------------------------------------------------------------------------------------------------------
#include "stdafx.h"
#include "resource.h"

#define MAX_LOADSTRING 100
#define IDC_RICHEDIT (101)

// グローバル変数:
HINSTANCE hInst;					// 現在のインスタンス
TCHAR szTitle[MAX_LOADSTRING];				// タイトル バー テキスト
TCHAR szWindowClass[MAX_LOADSTRING];			// タイトル バー テキスト

// このコード モジュールに含まれる関数の前宣言:
ATOM			MyRegisterClass( HINSTANCE hInstance );
BOOL			InitInstance( HINSTANCE, int );
LRESULT CALLBACK	WndProc( HWND, UINT, WPARAM, LPARAM );

//リッチエディットの使用するために用いる変数
HINSTANCE	hRtLib;
HWND		hRichEdit;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
 	// TODO: この位置にコードを記述してください。
	MSG msg;
	HACCEL hAccelTable;

	// グローバル ストリングを初期化します
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_SAMPLE, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass( hInstance );

	// アプリケーションの初期化を行います:
	if( !InitInstance( hInstance, nCmdShow ) ) 
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SAMPLE);

	// メイン メッセージ ループ:
	while( GetMessage(&msg, NULL, 0, 0) ) 
	{
		if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) 
		{
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
	}

	return msg.wParam;
}

ATOM MyRegisterClass( HINSTANCE hInstance )
{
	WNDCLASSEX wcex;

	wcex.cbSize 		= sizeof(WNDCLASSEX); 
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc		= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_SAMPLE);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName		= (LPCSTR)IDC_SAMPLE;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	return RegisterClassEx( &wcex );
}

BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
   HWND hWnd;

   hInst = hInstance; // グローバル変数にインスタンス ハンドルを保存

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if( !hWnd ) 
   {
      return FALSE;
   }

   ShowWindow( hWnd, nCmdShow );
   UpdateWindow( hWnd );

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch( message ) 
	{
		case WM_CREATE:
			hRtLib = LoadLibrary("RICHED32.DLL");

			hRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
					"RICHEDIT",
					"",
					WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_HSCROLL |
					WS_VSCROLL | ES_AUTOVSCROLL | ES_NOHIDESEL,
					0,0,0,0,
					hWnd,
					(HMENU)IDC_RICHEDIT,
					hInst,
					NULL);

			break;
		case WM_SIZE:
			MoveWindow(hRichEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
			break;
		case WM_DESTROY:
			PostQuitMessage( 0 );
			break;
		default:
			return DefWindowProc( hWnd, message, wParam, lParam );
   }
   return 0;
}
------------------------------------------------------------------------------------------------------------------------

水色で蛍光してあるコードが追加したものです.

case WM_CREATE:

はこのアプリケーションが作られると一番初めに一回だけ送られるメッセージです.
ここで,リッチエディットを作っちゃおうということです.
hRtLib = LoadLibrary("RICHED32.DLL");
hRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
		"RICHEDIT",
		"",
		WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_HSCROLL |
		WS_VSCROLL | ES_AUTOVSCROLL | ES_NOHIDESEL,
		0,0,0,0, //とりあえず幅、高さ0のウィンドウを作る
		hWnd,
		(HMENU)IDC_RICHEDIT,
		hInst,
		NULL);
は,リッチエディットを作るためには,RICHED32.DLLというライブラリをロードしなくてはなりません.
(おまじないぐらいに思ってください)
そして,CreateWindowEx関数を使って,リッチエディットを作成します.
WS_CHILD | WS_VISIBLE | ・・・ | ES_AUTOVSCROLL | ES_NOHIDESEL となんかわけのわかんない文字列がならんでますが,
これらは,スタイルといってそのコントロールの特徴を決めてやるものです.
(エディットコントロールスタイル表はこちらIDC_RICHEDITはコントロール固有の値です.
他のコントロールとバッティングしないように自分で決めてやりましょう.
(今回は#define IDC_RICHEDIT (101) という感じに設定しました)

リッチエディット作成時に高さ,幅を0にしています.
しかし,リッチエディットはちゃんとウィンドウ全体に表示されています.
それはなぜかというと,次のメッセージ処理

case WM_SIZE:
//リストビューのスクロール完了
MoveWindow(hRichEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
break;

があるからです.これはウィンドウのサイズが変更したときに実行される処理です.
ただ,この処理はリッチエディット作成時にも実行されます.
上のMoveWindow関数の意味は,

リッチエディットをウィンドウの左上座標(0,0)から,ウィンドウの横・縦幅(LOWORD(lParam), HIWORD(lParam))

にして表示しろということです.

(LOWORD(lParam), HIWORD(lParam))は,ウィンドウサイズが変わるたびに変更される値なので,どんなにウィンドウを動かしたり,サイズを変えてもリッチエディットがちゃんと表示されるわけですね.
とにかく習うより慣れろです.どんどん作っていきましょう! 

            

 

------------------------------------------------------------------------------------------------

当ページの一部または全部を転載、複写、複製することを禁じます。
また,当サイトを利用した結果に関するトラブル等は、一切関与いたしませんのでご容赦下さい。
Update 04/02/15 By 松本義弘

------------------------------------------------------------------------------------------------

デル4_120x60富士通ショッピングサイト WEB MART   NEC得選街   sotecロゴ88x31b   バナー 10000035