前章で作ったプログラムから送信されたデータを表示します。
受信したデータをメッセージボックスで
表示するだけではつまらないので、クライアント領域に
エディットコントロールを貼りつけて、受信したデータを次々に
表示するようにします。当然編集もできます。
では、プログラムを見てみることにします。
いつもとたいして変わりません。プログラムが始まったら すぐにRegisterWindowMessage関数でWM_MYMSGをウィンドウ メッセージとして登録します。この時引数("communication")を 前章で作ったものと同じにしておかないとメッセージが来ないので 注意して下さい。// atom02r.cpp #ifndef STRICT #define STRICT #endif #include <windows.h> #include <windowsx.h> #define ID_EDIT 100 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); char szClassName[] = "atom02r"; //ウィンドウクラス char szBuffer[1024*64-1]; static UINT WM_MYMSG; HINSTANCE hInst; int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; WM_MYMSG = RegisterWindowMessage("communication"); if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
いつもと同じです。//ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; //インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szClassName, "猫でもわかるアトム(受信用)",//タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInstance, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }
WM_CREATEが来たら、親のクライアント領域にエディットコントロールを 貼りつけます。//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static int nNum; ATOM aMyAtom; static HWND hEdit; RECT rc; char szStr[256]; char szNo[32]; switch (msg) { case WM_CREATE: GetClientRect(hWnd, &rc); hEdit = CreateWindow( "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL, 0, 0, rc.right, rc.bottom, hWnd, (HMENU)ID_EDIT, hInst, NULL); SendMessage(hEdit, EM_SETLIMITTEXT, (WPARAM)1024*64-1, 0); break; case WM_SIZE: MoveWindow(hEdit, 0, 0, (LOWORD(lp)), (HIWORD(lp)), TRUE); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { DestroyWindow(hEdit); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: if (msg == WM_MYMSG) { nNum++; aMyAtom = (ATOM)wp; GlobalGetAtomName(aMyAtom, szStr, sizeof(szStr)); Edit_GetText(hEdit, szBuffer, sizeof(szBuffer)); wsprintf(szNo, "[MessageNo %03d]\r\n", nNum); lstrcat(szBuffer, szNo); lstrcat(szBuffer, szStr); lstrcat(szBuffer, "\r\n"); SetWindowText(hEdit, szBuffer); return 0; } return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }
親ウィンドウのサイズが変更になったら(WM_SIZE)当然エディットコントロールの 大きさも変えます。
ここで、ちょっと「おやっ!?」と思われるかもしれませんが、WM_MYMSG はdefaultのところで処理して下さい。case XXXX:のXXXXは定数でなくてはいけません。 しかしここでは、WM_MYMSGはUINT型の変数なのでcase WM_MYMSG:とすると コンパイラに怒られます。
さて、送信側からWM_MYMSGが来たらWPARAMを調べてこれを aMyAtomにコピーします(送信側でWPARAMにアトムを指定したので)。 あとは、GlobalGetAtomNameで文字列を取得してエディットコントロールに 表示するだけです。
今回も、簡単でした。次回はグローバル・アトムのもっと別な利用法を 考えてみます。
Update 26/Nov/1998 By Y.Kumei