源自網(wǎng)絡(luò)收集,僅供參考
實(shí)驗(yàn)三收集到兩份完整報(bào)告,這是其一,另一份見本專欄下一篇文章。
實(shí)驗(yàn)題目
《面向?qū)ο蟪绦蛟O(shè)計(jì)》 實(shí)驗(yàn)三
實(shí)驗(yàn)題目:子窗口與控件的基本用法、資源的使用
整體目的:理解、窗口之間的消息傳送、調(diào)用棧;掌握光標(biāo)、圖標(biāo)、菜單的制作和使用方式;掌握菜單的響應(yīng)方式、快捷菜單的載入及使用方式;理解GetWindowLong/SetWindowLong, GetClassLong/SetClassLong函數(shù)的用法。
實(shí)驗(yàn)內(nèi)容過程:
改進(jìn)ChildWin示例程序,在子窗口內(nèi)顯示出窗口特定信息(窗口ID號);嘗試在每個(gè)子窗口中繪制特定顏色的矩形
-
- 在子窗口的窗口過程函數(shù)的刷新處理消息中增添處理代碼;
- 用GetWindowLong函數(shù)取出子窗口ID;
- 根據(jù)子窗口ID設(shè)定子窗口內(nèi)需要顯示的信息(使用wsprintf函數(shù)組織待顯示的字符串)
- 嘗試在子窗口中繪制特定顏色的矩形(使用CreateSolidBrush、Rectangle函數(shù))
- 跟蹤消息傳遞過程
- 在Childwin的主窗口過程函數(shù)的WM_CREATE、WM_PAINT、WM_COMMAND、WM_LBUTTONDOWN處設(shè)置斷點(diǎn)
- 在子窗口的WM_CREATE、WM_PAINT、WM_CHILDWIN、WM_LBUTTONDOWN處設(shè)置斷點(diǎn)
- 運(yùn)行程序,查看各斷點(diǎn)的響應(yīng)過程,以此理解消息傳遞的次序
- 設(shè)計(jì)、實(shí)現(xiàn)一個(gè)軟鍵盤
用子窗口實(shí)現(xiàn)一個(gè)軟鍵盤(在窗口的客戶區(qū)用子窗口繪制一個(gè)仿真的鍵盤),鼠標(biāo)點(diǎn)擊每個(gè)子窗口,可輸入不同的字符。將輸入的字符顯示到窗口中。
- 在自己的工作目錄中建立新工程用于控件測試〔可以將Easywin工程的easywin.c拷貝到新工程的目錄中,修改文件名為ctltest.cpp(后綴名改為.cpp),編譯、鏈接并使程序正常工作(包括修正編譯錯(cuò)誤)〕。
- * 用Button完成4*所要求的軟鍵盤實(shí)現(xiàn)。比較與原有實(shí)現(xiàn)的不同之處。
- 創(chuàng)建各種類型的控件子窗口,包括static、edit、listbox、combobox、button、scrollbar等;在主窗口的窗口過程函數(shù)中增加相應(yīng)的消息處理實(shí)現(xiàn)主窗口與子窗口的通信(可嘗試設(shè)置控件的標(biāo)題/內(nèi)容,獲取控件的標(biāo)題/內(nèi)容以及在控件有點(diǎn)擊等操作時(shí)在主窗口給出提示)。
- 同步驟5,新建用于資源測試的工程。
- 增加新的資源:光標(biāo)、圖標(biāo),并正確顯示
- 用資源編輯器編輯一個(gè)光標(biāo)(彩色),注意刪除資源中不需要的image類型,否則顯示光標(biāo)可能不正確。
- 為光標(biāo)設(shè)定熱點(diǎn)(hot spot)
- 用資源編輯器編輯一個(gè)圖標(biāo)
- 修改注冊窗口類的代碼,使程序能正常使用自定義的光標(biāo)和圖標(biāo)
- 用DrawIcon函數(shù),在WM_PAINT消息中增加處理,在窗口客戶區(qū)中顯示自定義的光標(biāo)及圖標(biāo)。
- 創(chuàng)建一個(gè)另外光標(biāo)供后續(xù)實(shí)驗(yàn)步驟使用
- 增加菜單
- 菜單中建立一個(gè)菜單項(xiàng)命令以修改窗口使用的光標(biāo),可命名為“ChangeCursor”,對應(yīng)的ID假設(shè)為ID_CHANGECURSOR
- 修改注冊窗口類的代碼,使程序運(yùn)行時(shí)能正確載入菜單
- 換一種方式,通過修改創(chuàng)建窗口(CreateWindow)的代碼,使菜單能正確載入
- 增加菜單消息響應(yīng)代碼
- 增加WM_COMMAND的消息處理
- 參照第五章菜單示例代碼中的處理方式,響應(yīng)菜單命令
- 對ID_CHANGECURSOR命令的響應(yīng)為:改變窗口使用的光標(biāo),可以使用SetClassLong (hwnd,? GCL_HCURSOR,
???????? ???????? ???????? (LONG)LoadCursor((HINSTANCE)GetWindowLong(hwnd,? GWL_HINSTANCE),
???????? ???????? ???????? ??????? ???????? ???????? ???????? ???????? MAKEINTRESOURCE(IDC_CURSOR2) ) );
- 處理鼠標(biāo)右鍵,增加快捷菜單處理
- 右鍵發(fā)出的菜單命令同樣是通過WM_COMMAND消息響應(yīng)的,增加快捷菜單之后,程序應(yīng)該能通過主菜單或快捷菜單兩種方式發(fā)出同樣的命令
- 將本次實(shí)驗(yàn)做好的工程的編譯、鏈接增加到程序構(gòu)建使用的批處理文件中,用批處理文件一次性自動(dòng)構(gòu)建實(shí)驗(yàn)一、二、三的所有工程。
- 本次實(shí)驗(yàn)的實(shí)驗(yàn)報(bào)告上交時(shí)間為10月22日 21:30之前。
注意:
- 5* 選做。
- 做好各次實(shí)驗(yàn)的備份,每次實(shí)驗(yàn)課時(shí)攜帶所有先前實(shí)驗(yàn)的實(shí)驗(yàn)成果(電子版)備查。
- 實(shí)驗(yàn)報(bào)告文檔格式、文件名應(yīng)符合要求。
實(shí)驗(yàn)報(bào)告1(另一份報(bào)告見本專欄下一篇文章)
-
實(shí)驗(yàn)要求
理解、窗口之間的消息傳送、調(diào)用棧;掌握光標(biāo)、圖標(biāo)、菜單的制作和使用方式;掌握菜單的響應(yīng)方式、快捷菜單的載入及使用方式;理解GetWindowLong/SetWindowLong, GetClassLong/SetClassLong函數(shù)的用法。
2,實(shí)驗(yàn)過程及結(jié)果
2.1創(chuàng)建工程
2.2程序流程和數(shù)據(jù)模型分析
- 改進(jìn)ChildWin示例程序,在子窗口內(nèi)顯示出窗口特定信息(窗口ID號);嘗試在每個(gè)子窗口中繪制特定顏色的矩形
- 在子窗口的窗口過程函數(shù)的刷新處理消息中增添處理代碼;
- 用GetWindowLong函數(shù)取出子窗口ID;
- 根據(jù)子窗口ID設(shè)定子窗口內(nèi)需要顯示的信息(使用wsprintf函數(shù)組織待顯示的字符串)
- 嘗試在子窗口中繪制特定顏色的矩形(使用CreateSolidBrush、Rectangle函數(shù))
?文章來源:http://www.zghlxwxcb.cn/news/detail-468949.html
2.跟蹤消息傳遞過程
在Childwin的主窗口過程函數(shù)的WM_CREATE、WM_PAINT、WM_COMMAND、
-
- WM_LBUTTONDOWN處設(shè)置斷點(diǎn)
- 在子窗口的WM_CREATE、WM_PAINT、WM_CHILDWIN、WM_LBUTTONDOWN處設(shè)置斷點(diǎn)
- 運(yùn)行程序,查看各斷點(diǎn)的響應(yīng)過程,以此理解消息傳遞的次序
3.設(shè)計(jì)、實(shí)現(xiàn)一個(gè)軟鍵盤
用子窗口實(shí)現(xiàn)一個(gè)軟鍵盤(在窗口的客戶區(qū)用子窗口繪制一個(gè)仿真的鍵盤),鼠標(biāo)點(diǎn)擊每個(gè)子窗口,可輸入不同的字符。將輸入的字符顯示到窗口中。
4.在自己的工作目錄中建立新工程用于控件測試〔可以將Easywin工程的easywin.c拷貝到新工程的目錄中,修改文件名為ctltest.cpp(后綴名改為.cpp),編譯、鏈接并使程序正常工作(包括修正編譯錯(cuò)誤)〕
?
- * 用Button完成4*所要求的軟鍵盤實(shí)現(xiàn)。比較與原有實(shí)現(xiàn)的不同之處。
- 創(chuàng)建各種類型的控件子窗口,包括static、edit、listbox、combobox、button、scrollbar等;在主窗口的窗口過程函數(shù)中增加相應(yīng)的消息處理實(shí)現(xiàn)主窗口與子窗口的通信(可嘗試設(shè)置控件的標(biāo)題/內(nèi)容,獲取控件的標(biāo)題/內(nèi)容以及在控件有點(diǎn)擊等操作時(shí)在主窗口給出提示)。
?
- 同步驟4,新建用于資源測試的工程。
- 增加新的資源:光標(biāo)、圖標(biāo),并正確顯示
- 用資源編輯器編輯一個(gè)光標(biāo)(彩色),注意刪除資源中不需要的image類型,否則顯示光標(biāo)可能不正確。
- 為光標(biāo)設(shè)定熱點(diǎn)(hot spot)
- 用資源編輯器編輯一個(gè)圖標(biāo)
- 修改注冊窗口類的代碼,使程序能正常使用自定義的光標(biāo)和圖標(biāo)
- 用DrawIcon函數(shù),在WM_PAINT消息中增加處理,在窗口客戶區(qū)中顯示自定義的光標(biāo)及圖標(biāo)。
- 創(chuàng)建一個(gè)另外光標(biāo)供后續(xù)實(shí)驗(yàn)步驟使用
?
?
?
?
?
9. 增加菜單
- 增加菜單
- 菜單中建立一個(gè)菜單項(xiàng)命令以修改窗口使用的光標(biāo),可命名為“ChangeCursor”,對應(yīng)的ID假設(shè)為ID_CHANGECURSOR
- 修改注冊窗口類的代碼,使程序運(yùn)行時(shí)能正確載入菜單
- 換一種方式,通過修改創(chuàng)建窗口(CreateWindow)的代碼,使菜單能正確載入
?
- 增加菜單消息響應(yīng)代碼
- 增加WM_COMMAND的消息處理
- 參照第五章菜單示例代碼中的處理方式,響應(yīng)菜單命令
- 對ID_CHANGECURSOR命令的響應(yīng)為:改變窗口使用的光標(biāo),可以使用SetClassLong (hwnd,? GCL_HCURSOR,
???????? ???????? ???????? (LONG)LoadCursor((HINSTANCE)GetWindowLong(hwnd,? GWL_HINSTANCE),
???????? ???????? ???????? ??????? ???????? ???????? ???????? ???????? MAKEINTRESOURCE(IDC_CURSOR2) ) );
?
- 處理鼠標(biāo)右鍵,增加快捷菜單處理
右鍵發(fā)出的菜單命令同樣是通過WM_COMMAND消息響應(yīng)的,增加快捷菜單之后,程序應(yīng)該能通過主菜單或快捷菜單兩種方式發(fā)出同樣的命令
?
- 將本次實(shí)驗(yàn)做好的工程的編譯、鏈接增加到程序構(gòu)建使用的批處理文件中,用批處理文件一次性自動(dòng)構(gòu)建實(shí)驗(yàn)一、二、三的所有工程。
2.3問題及解決方案
- 在主窗口設(shè)置的光標(biāo)無法在子窗口顯示,為了在子窗口設(shè)置自己的光標(biāo),我使用了全局變量進(jìn)行編寫子窗口的光標(biāo)程序;
- 由于paint中我使用了if條件語句,導(dǎo)致本軟鍵盤第一個(gè)按鍵無法作用,按下后無法刷新,所以將所有字母向后移動(dòng)一位(也可以不后移,設(shè)置全局變量代替if語句進(jìn)行繪制判斷即可);
- 快捷方式寫好后無法運(yùn)行,經(jīng)檢查為????? g_hSubMenu = GetSubMenu(g_hMenu, 0);語句寫在return語句后面,導(dǎo)致無法正常運(yùn)行,但系統(tǒng)又無法報(bào)錯(cuò)。
3.實(shí)驗(yàn)總結(jié)
在本次試驗(yàn)中,我不僅將老師上課所講的窗口知識和菜單知識進(jìn)行實(shí)踐的運(yùn)用,掌握了繪制光標(biāo),繪制圖標(biāo)的能力,掌握了菜單的制作和使用、響應(yīng)方式,快捷菜單的載入及使用方式,還通過上網(wǎng)搜索等方法了解了許多課外函數(shù),如:GetCursorPos(),TrackPopupMenu()等。不僅鍛煉了自己的獨(dú)立思考能力還拓寬了眼界。文章來源地址http://www.zghlxwxcb.cn/news/detail-468949.html
附錄 關(guān)鍵代碼
軟鍵盤繪制代碼:
case WM_PAINT:
GetClientRect(hWnd, &rect);
hdc = BeginPaint(hWnd, &ps);
if (!(LOWORD(wParam) == nChildWin_ID))
{
string[n] = number + 65;
n++;
DrawText(hdc, string, n, &rect, DT_SINGLELINE);
}
DrawIcon(hdc,1,1, LoadIcon(hin, MAKEINTRESOURCE(IDI_ICON1)));
EndPaint(hWnd, &ps);
return 0;
子窗口命中寫入代碼:
case WM_COMMAND:
if (!(LOWORD(wParam) == nChildWin_ID))
{
SendMessage((HWND)hChildWnd[nCol][nRow], WM_CHILDWIN, 0, 0L);
nChildWin_ID = LOWORD(wParam);
nCol = nChildWin_ID >> 4;
nRow = (nChildWin_ID > 15) ? (nChildWin_ID - 4) : nChildWin_ID;
}
else
{
switch (wParam)
{
case ID_CHANGECURSOR:
SetClassLong(hWnd, GCL_HCURSOR,
(LONG)LoadCursor((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDC_CURSOR1)));
break;
}
}
InvalidateRect(hWnd, NULL, TRUE);
return 0;
主窗口繪制菜單,光標(biāo),圖形代碼:
wcMain.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
wcMain.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE (IDC_CURSOR2));
wcMain.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcMain.lpszMenuName = MAKEINTRESOURCE(IDR_MENU3);
改變光標(biāo)菜單代碼:
case WM_COMMAND:
if (!(LOWORD(wParam) == nChildWin_ID))
{
SendMessage((HWND)hChildWnd[nCol][nRow], WM_CHILDWIN, 0, 0L);
nChildWin_ID = LOWORD(wParam);
nCol = nChildWin_ID >> 4;
nRow = (nChildWin_ID > 15) ? (nChildWin_ID - 4) : nChildWin_ID;
}
else
{
switch (wParam)
{
case ID_CHANGECURSOR:
SetClassLong(hWnd, GCL_HCURSOR,
(LONG)LoadCursor((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDC_CURSOR1)));
break;
}
}
InvalidateRect(hWnd, NULL, TRUE);
return 0;
右鍵快捷菜單代碼:
case WM_RBUTTONDOWN:
GetCursorPos(&stPos);
TrackPopupMenu(g_hSubMenu,TPM_LEFTALIGN,stPos.x,stPos.y,NULL,hWnd,NULL);
break;
到了這里,關(guān)于面向?qū)ο缶幊?實(shí)驗(yàn)三 sduwh 子窗口與控件的基本用法、資源的使用 參考實(shí)驗(yàn)報(bào)告1的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!