本次作業延續作業一,維持原來程式絕大部分的功能,但是在視窗客戶區中開啟一個子視窗,當使用者選擇選單動作時將適當的訊息顯示在子視窗中,並且運用
Edit 控制項視窗現成的螢幕捲動功能在顯示資料超過一個畫面時向上捲動。
下列為主要的步驟:
- 運用 CreateWindow() API 在主視窗的客戶區開啟一個子視窗
a. 請在主視窗顯示出來以後才開啟子視窗,也就是需要處理 WM_CREATE 訊息
b. 子視窗的類別請運用視窗系統提供的 Edit 控制項視窗 (類別名稱為 Edit)
c. 請閱讀 MSDN Library 2005 中 Edit Control Text Operations 以及 Edit Control
Styles 的相關範例和說明
d. 要開啟一個子視窗你一定需要使用下列 style: WS_CHILD | WS_VISIBLE
e. 要顯示視窗的邊界你需要用 WS_BORDER
f. 要顯示多列而且可以支援捲動, 你需要用 ES_MULTILINE | ES_AUTOVSCROLL
g. 要防止使用者直接按鍵輸入, 你需要用 ES_READONLY
以上 ES_ 開頭的都是 Edit 控制項視窗專有的
- 接下來你需要在每一個處理選單命令的程式中加入訊息的輸出, 把訊息寫到子視窗中 (當然在上一步驟中你需要記錄 CreateWindow()
API 回傳的視窗 handle, 你才能夠操作這個視窗), 以下是主要的兩個敘述, 其中用到的訊息都是看 MSDN Library
中得到的, 你也可以試試其他的 訊息 組合, 其中 buf 型態為 WCHAR, 裡面存放要印出去的訊息
SendMessage(hMsgWnd, EM_REPLACESEL, FALSE, (LPARAM)buf);
SendMessage(hMsgWnd, EM_SCROLL, SB_LINEDOWN, 0);
- 上一次作業在 "設定記事本內容" 選單項目時, 運用 SendMessage() API 傳送 WM_SETTEXT
訊息給內層編輯視窗來設定內容為 Hello World, 但是 Edit 控制項視窗似乎沒有記錄文件內容的改變, 因此在關閉視窗時不會詢問是否需要存檔,
請在內容更改後傳遞 EM_SETMODIFY 訊息給 Edit 控制項視窗, 如此就不會有不提醒你存檔的問題了
- 你可以用下列的程式來繪製視窗的底色 (細節我們後續會談到)
RECT rect;
HBRUSH hBrOld, hBrush=CreateSolidBrush(RGB(0,0,240));
GetClientRect(hWnd, &rect);
hBrOld = (HBRUSH) SelectObject((HDC)wParam, hBrush);
Rectangle((HDC)wParam, 0, 0, rect.right, rect.bottom);
SelectObject((HDC)wParam, hBrOld);
DeleteObject(hBrush);
|