第8章VC++.ppt_第1頁
第8章VC++.ppt_第2頁
第8章VC++.ppt_第3頁
第8章VC++.ppt_第4頁
第8章VC++.ppt_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第8章 Windows 標(biāo)準(zhǔn)控件,作為一般窗口,控件具有通用的窗口屬性,并且可以使用ShowWindows()和MoveWindows()等窗口管理函數(shù)來顯示或隱藏控件、改變控件的位置、尺寸以及其它操作。,控件創(chuàng)建形式,對話框中制定控件:如按鈕控件,調(diào)用CreateWindows()或CreateWindowsEx()函數(shù)創(chuàng)建,必須指定控件的窗口類, 這種窗口類要在應(yīng)用程序 中定義并注冊,但更多的 是使用系統(tǒng)預(yù)定義窗口類,控件,Windows 圖形用戶界面的主要組成部分之一 用戶通過操作控件對象完成與應(yīng)用程序之間的交互 體現(xiàn)了Windows 系統(tǒng)面向?qū)ο蟮奶攸c(diǎn),控件以獨(dú)立 的子窗口或?qū)υ捒?兩

2、種形式存在,8.1概述,應(yīng)用程序窗口可調(diào)用函數(shù)SendMessage向特定的子窗口發(fā)送消息, 例如用戶單擊圓按鈕時(shí),可調(diào)用SendMessage向該圓按鈕發(fā)送BM_SETCHECK消息,為該按鈕設(shè)置選中符號,其形式為: SendMessage (hwndRadioButton,BM_SETCHECK,1,0); 使用對話框控件時(shí),可調(diào)用SendDlgItemMessage向指定的對話框控件發(fā)送消息,其形式為: SendDlgItemMessage (hdlg,ID,message,wParam,lParam);,應(yīng)用程序向控件發(fā)送的消息的字參 數(shù)與長參數(shù)包含該消息的相關(guān)信息 其含義取決于具體的

3、控件消息,8.2 常用子窗口操作函數(shù),按鈕控件,普通按鈕,圓按鈕,復(fù)選框按鈕,組框按鈕,按鈕控件的創(chuàng)建方式,創(chuàng)建控件型的子窗口,在對話框中定義控件,創(chuàng)建并注冊一個(gè)窗口類的實(shí)例,創(chuàng)建并顯示窗口實(shí)例,8.3 按鈕控件的分類與創(chuàng)建,按鈕控件與應(yīng)用程序之間的消息傳遞,1 接收按鈕控件消息,當(dāng)用戶與控件交互時(shí),控件向其父窗口發(fā)送WM_COMMAND消息。,消息的wParam參數(shù),低字節(jié)包含控件的標(biāo)識值(ID),高字節(jié)中包含控件向父窗口發(fā)出的通知代碼,3. 按鈕控件示例,【例8-1】創(chuàng)建如右上圖所示的按鈕控件系列,當(dāng)單擊每一個(gè)按鈕后,就出現(xiàn)如右下圖所示的響應(yīng)。,LRESULT CALLBACK WndPr

4、oc(.) int X=50,Y=30; /控件起始坐標(biāo) switch(message) case WM_CREATE: /通過響應(yīng)WM_CREATE消息創(chuàng)建控件子窗口 hwndPush = CreateWindow(lpszClassName1, /按鈕子窗口 這里是一個(gè)按鈕,按我吧!, BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE, X,Y, 240,25, hwnd, (HMENU)IDB_PUSHBUTTON, hInst, NULL); hwndDefPush = CreateWindow(lpszClassName1,/默認(rèn)按鈕子窗口 這是缺省按鈕,按下試試看

5、!, BS_DEFPUSHBUTTON|WS_CHILD|WS_VISIBLE, X, Y+30, 240,25, hwnd, (HMENU)IDB_DEFPUSHBUTTON, hInst, NULL) ;,/創(chuàng)建自動(dòng)圓按鈕子窗口 hwndAutoRadio = CreateWindow(lpszClassName1, 自動(dòng)圓形按鈕,看看有何區(qū)別?, BS_AUTORADIOBUTTON|WS_CHILD|WS_VISIBLE, X, Y+90, 240,25, hwnd, (HMENU)IDB_AUTORADIOBUTTON, hInst, NULL) ;,hwndRadio = Crea

6、teWindow(lpszClassName1,/圓按鈕控件子窗口 圓形按鈕,你喜歡嗎?, BS_RADIOBUTTON|WS_CHILD|WS_VISIBLE, X,Y+60, 240,25, hwnd, (HMENU)IDB_RADIOBUTTON, hInst, NULL) ;,/創(chuàng)建自動(dòng)復(fù)選框控件子窗口 hwndAutoCheckBox = CreateWindow(lpszClassName1, 自動(dòng)復(fù)選框,你會用嗎?, BS_AUTOCHECKBOX|WS_CHILD|WS_VISIBLE, X, Y+150, 240,25, hwnd, (HMENU)IDB_AUTOCHECKB

7、OX, hInst, NULL) ;,/創(chuàng)建復(fù)選框控件子窗口 hwndCheckBox = CreateWindow(lpszClassName1, 復(fù)選框 , BS_CHECKBOX|WS_CHILD|WS_VISIBLE, X,Y+120, 240,25, hwnd, (HMENU)IDB_CHECKBOX, hInst, NULL) ;,/處理控件消息 case WM_COMMAND: switch(LOWORD(wParam) case IDB_PUSHBUTTON: /當(dāng)用戶單擊按鈕時(shí),改變按鈕文本 SetWindowText(hwndPush,你已按下了按鈕!); break; c

8、ase IDB_DEFPUSHBUTTON: /當(dāng)用戶單擊按鈕時(shí),改變按鈕文本 SetWindowText(hwndDefPush,按鈕已被按下); break;,/創(chuàng)建組框控件子窗口 hwndGroupBox = CreateWindow(lpszClassName1, 組框, BS_GROUPBOX|WS_CHILD|WS_VISIBLE, X+290, Y+30, 100,140, hwnd, (HMENU)IDB_GROUPBOX, hInst, NULL) ; break;,case IDB_RADIOBUTTON: /當(dāng)用戶單擊圓按鈕時(shí),設(shè)置按鈕為選中狀態(tài) SendMessage(

9、hwndRadio,BM_SETCHECK,1,0); break; case IDB_AUTORADIOBUTTON: break; case IDB_CHECKBOX: /根據(jù)復(fù)選框狀態(tài)設(shè)置復(fù)選框 if(nCheckBoxSt=0) SendMessage(hwndCheckBox,BM_SETCHECK,1,0);nCheckBoxSt=1; else /如果當(dāng)前為非選中狀態(tài),則設(shè)置為選中狀態(tài) SendMessage(hwndCheckBox,BM_SETCHECK,0,0);nCheckBoxSt=0; break; case IDB_AUTOCHECKBOX: break; case

10、 IDB_GROUPBOX:break; break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0; ,本程序運(yùn)行時(shí)將在主窗口用戶區(qū)的中央顯示一個(gè)普通按鈕,上面寫有“啟動(dòng)一個(gè)對話框”,按下按鈕彈出一個(gè)對話框,對話框含有三個(gè)成組框,其中分別是圓按鈕、自動(dòng)圓按鈕和復(fù)選框,此外,還有一個(gè)普通按鈕和一個(gè)默認(rèn)按鈕。,LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM

11、wParam,LPARAM lParam) RECT rect; switch(message) case WM_CREATE: /通過響應(yīng)WM_CREATE消息創(chuàng)建控件子窗口 GetClientRect(hwnd, ,BOOL CALLBACK DialogProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam) switch(message) case WM_COMMAND: switch(LOWORD(wParam) case IDOK: EndDialog(hdlg,0); return 1; case IDCANCEL: End

12、Dialog(hdlg,0); return 1; case IDC_RADIO1: if(HIWORD(wParam)=BN_CLICKED) SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,1,0); SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,0,0); return 1; break; case IDC_RADIO2: if(HIWORD(wParam)=BN_CLICKED) SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,0,0); Send

13、DlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,1,0); return 1; break; break; case WM_CLOSE:EndDialog(hdlg,0);return 1; return 0; ,滾動(dòng)條控件最直接的功能是當(dāng)應(yīng)用程序顯示的內(nèi)容超過窗口的范圍時(shí),用戶可通過拖動(dòng)滾動(dòng)條遍歷整個(gè)窗口內(nèi)容。滾動(dòng)條在功能上分為垂直與水平滾動(dòng)條,分別實(shí)現(xiàn)窗口內(nèi)容縱向和橫向的滾動(dòng)。,8.4 滾動(dòng)條控件8.4.1 滾動(dòng)條控件的功能特點(diǎn)與分類,三種 方法,創(chuàng)建窗口滾動(dòng)條,創(chuàng)建滾動(dòng)條子窗口控件,創(chuàng)建對話框中的滾動(dòng)條控件,SB_BOTTOM到滾動(dòng)條最底端或最左端S

14、B_RIGHT滾動(dòng)到右邊 SB_LEFT滾動(dòng)到左邊 SB_PAGEUP向上滾動(dòng)一頁 SB_PAGEDOWN 向下滾動(dòng)一頁,8.4.2 滾動(dòng)條控件的創(chuàng)建,SetScrollRange:設(shè)置滾動(dòng)條的滾動(dòng)范圍,int SetScrollRange (HWND hwnd, int nBar,/滾動(dòng)條特性標(biāo)識 int nMaxPos,/滾動(dòng)條最大滾動(dòng)位置 int nMinPos,/滾動(dòng)條最小滾動(dòng)位置 BOOL bRedraw)/當(dāng)滾動(dòng)條改變時(shí)是否重繪;非0表示重繪,SB_CTL 為控件滾動(dòng)條 SB_HORZ 為窗口水平滾動(dòng)條 SB_VERT 為窗口垂直滾動(dòng)條,SetScrollPos:設(shè)置滾動(dòng)塊的位置,

15、int SetScrollPos (HWND hwnd, int nBar,/滾動(dòng)條的特性標(biāo)識,同SetScrollRange函數(shù) int nPos,/滾動(dòng)塊的位置 BOOL bRedraw/意義同SetScrollRange函數(shù) ),8.4.3 常用滾動(dòng)條操作函數(shù),GetSystemMetrics:獲取系統(tǒng)提供的滾動(dòng)條尺寸,如:獲取系統(tǒng)水平滾動(dòng)條的高度:GetSystemMetrics(SM_CYHSCROLL);,GetScrollpos:獲取滾動(dòng)塊的位置,int GetScrollPos ( HWND hwnd,/窗口句柄,同SetScrollRange函數(shù) int nBar/滾動(dòng)條特性

16、標(biāo)識 );,GetScrollRange:獲取滾動(dòng)條的滾動(dòng)范圍,BOOL GetScrollRange ( HWND hwnd, int nBar, LPINT lpMinPos,/接收最小位置的整形變量的地址 LPINT lpMaxPos)/接收最大位置的整形變量的地址,【例8-2】本例要求創(chuàng)建一個(gè)帶滾動(dòng)條的顏色框,在顏色框中,通過拉動(dòng)滾動(dòng)條,使其顯示的區(qū)域產(chǎn)生變化,同時(shí),可以通過顏色的設(shè)置,來改變顏色框的顏色。,8.4.4 滾動(dòng)控件示例,LRESULT APIENTRY MainWndProc(.) HDC hDC;HBRUSH hBrush; static HWND hWndScroll

17、Bar; static SCROLLINFO stScrollInfo; static int nRectWidth; switch(message) case WM_CREATE: hWndScrollBar = CreateWindowEx(0L,SCROLLBAR,(LPSTR)NULL, WS_CHILD | SBS_VERT, 10,30-GetSystemMetrics(SM_CYVSCROLL), 19,100+2*GetSystemMetrics(SM_CYVSCROLL), hWnd,(HMENU)NULL,hInst,(LPVOID)NULL); stScrollInfo.

18、cbSize = sizeof(SCROLLINFO); stScrollInfo.fMask = SIF_POS | SIF_RANGE | SIF_PAGE; stScrollInfo.nMin = 1; stScrollInfo.nMax = 100; stScrollInfo.nPos = 1; stScrollInfo.nPage = 10; / 設(shè)置滾動(dòng)條控件的各方面的特性參數(shù) SetScrollInfo(hWndScrollBar,SB_CTL,制作垂直 滾動(dòng)條,滾 動(dòng) 條 結(jié) 構(gòu),設(shè)置為滾動(dòng)條控件,1. case WM_VSCROLL: 2. if (HWND)lParam!=

19、hWndScrollBar) break; 3. switch(LOWORD(wParam) 4. case SB_LINEUP: nRectWidth+=1; break; 5. case SB_LINEDOWN:nRectWidth-=1;break; 6. case SB_PAGEUP:nRectWidth+=10;break; 7. case SB_PAGEDOWN:nRectWidth-=10;break; 8. case SB_THUMBPOSITION:nRectWidth=101-HIWORD(wParam);break; 9. default:return(DefWindow

20、Proc(hWnd,message,wParam,lParam); 10. if(nRectWidth100)nRectWidth = 100; 12. stScrollInfo.fMask = SIF_POS; 13. stScrollInfo.nPos = 101-nRectWidth; 14. SetScrollInfo(hWndScrollBar,SB_CTL,1. case WM_COMMAND: 2. switch(LOWORD(wParam) 3. case IDM_RGB: 4. DialogBox(hInst,RGBDlg,hWnd,(DLGPROC)RGBDlgProc);

21、 break; 5. case IDM_DRAW: 6. hDC = GetDC(hWnd); 7. hBrush = CreateSolidBrush(RGB(255,255,255); 8. SelectObject(hDC,hBrush); 9. Rectangle(hDC,30,30,130,130); 10. hBrush=CreateSolidBrush(RGB(crRGB0,crRGB1,crRGB2); 11. SelectObject(hDC,hBrush); 12. Rectangle(hDC,30,130-nRectWidth,30+nRectWidth,130); 13

22、. ReleaseDC(hWnd,hDC); 14. break; 15. case IDM_EXIT: 16. PostQuitMessage(0);break; 17. case IDM_ABOUT: 18. DialogBox(hInst,AboutBox,hWnd,(DLGPROC)About);break; 19. default: 20. return(DefWindowProc(hWnd,message,wParam,lParam); 21. 22. break; 23. case WM_DESTROY: PostQuitMessage(0);break; 24. default

23、:return(DefWindowProc(hWnd,message,wParam,lParam); 25. 26. return(0); 27.,1. BOOL APIENTRY RGBDlgProc(.) 2. 3. static int CurrentVal3,PrevVal3; 4. static HWND hwScroll3; 5. char szString10; 6. int i; 7. switch(message) 8. 9. case WM_INITDIALOG: / 分別設(shè)置滾動(dòng)條的范圍和初始位置。 10. for(i=0;i3;i+) 11. 12. CurrentVa

24、li = crRGBi; 13. PrevVali = crRGBi; 14. hwScrolli = GetDlgItem(hDlg,IDC_RED+i); 15. SetScrollRange(hwScrolli,SB_CTL,0,255,FALSE); 16. SetScrollPos(hwScrolli,SB_CTL,CurrentVali,TRUE); 17. SetDlgItemText(hDlg,IDC_VALRED+i,itoa(CurrentVali,szString,10); 18. 19. SetFocus(hwScroll0); 20. break;,1. /處理滾動(dòng)條

25、通知消息 2. case WM_HSCROLL: 3. i=0; 4. while(hwScrolli!=(HWND)lParam) i+; 5. switch(LOWORD(wParam) 6. case SB_LINEDOWN: 7. CurrentVali+; 8. if(CurrentVali255) CurrentVali=255; 9. break; 10. case SB_LINEUP: 11. CurrentVali-; 12. if(CurrentVali0) CurrentVali=0; 13. break; case SB_PAGEDOWN: CurrentVali+=(

26、255-CurrentVali)/2; 15. break; 16. case SB_PAGEUP: CurrentVali-=CurrentVali/2;break; 17. case SB_THUMBTRACK: CurrentVali=HIWORD(wParam); break; 18. case SB_TOP: CurrentVali=0; break; 19. case SB_BOTTOM: CurrentVali=255; break; ,/設(shè)定滾動(dòng)條的位置及其對應(yīng)的文字 1.SetScrollPos(hwScrolli,SB_CTL,CurrentVali,TRUE); 2.Se

27、tDlgItemText(hDlg,IDC_VALRED+i,itoa(CurrentVali,szString,10); 3.crRGBi = CurrentVali; 4.SendMessage(hWndMain,WM_COMMAND,IDM_DRAW,0L); 5.break; 6. case WM_COMMAND: 7. switch(wParam) 8. case IDOK: 9. for(i=0;i3;i+) 10.crRGBi = CurrentVali; 11. EndDialog(hDlg,TRUE); return(TRUE); 12.case IDCANCEL: 13.

28、for(i=0;i3;i+) 14.crRGBi = CurrentVali; 15. EndDialog(hDlg,TRUE); return (TRUE); 16. 17. break; 18. 19. return(FALSE); 20. ,BOOL APIENTRY About(HWND hDlg,UINT message,WPARAM wParam, LPARAM lParam) switch(message) case WM_INITDIALOG:return(TRUE); case WM_COMMAND: if(LOWORD(wParam)=IDOK|LOWORD(wParam)

29、=IDCANCEL) EndDialog(hDlg,TRUE); return(TRUE); break; return(FALSE); ,【例】創(chuàng)建一個(gè)水平滾動(dòng)條控件,用這個(gè)控件來控制字體的大小,字體大小由50到100線性變化;同時(shí)創(chuàng)建一個(gè)垂直滾動(dòng)條,用此滾動(dòng)條來控制字體的顏色,顏色由RGB(0,0,255)到RGB(0,0,0)線性變化 。,long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) HDC hDC;/定義設(shè)備環(huán)境句柄 HFONT hF;/定義字體句柄 PAINTSTRUCT ps;/定義

30、包含繪圖信息的結(jié)構(gòu)體 static HWND hWndScrollBarHor,hWndScrollBarVer; /定義水平和豎直滾動(dòng)條的句柄 static SCROLLINFO stScrollInfo;/定義包含滾動(dòng)條信息的結(jié)構(gòu)體 static int iHorPos=1,iVerPos=100;/定義滾動(dòng)條位置 char cOut=祝您成功.;/輸出字符串 RECT rcRedrawArea=0,0,380,200;/定義刷新區(qū)域,switch(iMessage) case WM_CREATE:/窗口創(chuàng)建消息 hWndScrollBarVer=CreateWindowEx(0L, /創(chuàng)

31、建豎直滾動(dòng)條 SCROLLBAR,(LPSTR)NULL, WS_CHILD|SBS_VERT,/樣式 400,30-GetSystemMetrics(SM_CYVSCROLL),/左上角坐標(biāo) GetSystemMetrics(SM_CYVSCROLL), /滾動(dòng)條寬度 100+2*GetSystemMetrics(SM_CYVSCROLL), /高度條高度 hWnd, (HMENU)NULL, hInst, (LPVOID)NULL); hWndScrollBarHor=CreateWindowEx(0L,/創(chuàng)建水平滾動(dòng)條 SCROLLBAR, (LPSTR)NULL,WS_CHILD|SB

32、S_HORZ,/樣式 50, 200,/左上角坐標(biāo) 100+2*GetSystemMetrics(SM_CYHSCROLL), /滾動(dòng)條寬度 GetSystemMetrics(SM_CYHSCROLL), /高度條高度 hWnd, (HMENU)NULL,hInst,(LPVOID)NULL);,stScrollInfo.cbSize=sizeof(SCROLLINFO);/定義此結(jié)構(gòu)體的大小 stScrollInfo.fMask=SIF_POS|SIF_RANGE|SIF_PAGE;/定義滾動(dòng)條特性參數(shù) stScrollInfo.nMin=1;/定義滾動(dòng)條的最小位置 stScrollInfo

33、.nMax=100;/定義滾動(dòng)條的最大位置 stScrollInfo.nPos=1;/定義滾動(dòng)條上下滾動(dòng)的增量 stScrollInfo.nPage=10;/定義滾動(dòng)條上下滾動(dòng)的增量 /設(shè)置滾動(dòng)條的特性參數(shù) SetScrollInfo(hWndScrollBarVer,SB_CTL,case WM_VSCROLL:/若是豎直滾動(dòng)條的消息 if(HWND)lParam!=hWndScrollBarVer) break; switch(LOWORD(wParam) case SB_LINEUP:iVerPos+=5;break;/向上走一行,位置+5 case SB_LINEDOWN:iVerPo

34、s-=5; break; /向下走一行.位置-5 case SB_PAGEUP:iVerPos+=20; break;/向上走一頁,位置+20 case SB_PAGEDOWN:iVerPos-=20; break;/向下走一頁,位置-20 case SB_THUMBPOSITION:/拖動(dòng)滾動(dòng)條 iVerPos=101-HIWORD(wParam);break; default:return(DefWindowProc(hWnd,iMessage,wParam,lParam); if(iVerPos100) iVerPos=100; /設(shè)定滾動(dòng)條的信息.主要是設(shè)定位置 stScrollInf

35、o.fMask=SIF_POS; stScrollInfo.nPos=101-iVerPos; SetScrollInfo(hWndScrollBarVer,SB_CTL,case WM_HSCROLL:/水平滾動(dòng)條的消息 if(HWND)lParam!=hWndScrollBarHor) break; switch(LOWORD(wParam) case SB_LINELEFT:iHorPos-=5;break;/向左滾動(dòng)一行,位置-5 case SB_LINERIGHT:iHorPos+=5; break;/向右滾動(dòng)一行,位置+5 case SB_PAGELEFT:iHorPos-=20;

36、 break;/向左滾動(dòng)一頁,位置+20 case SB_PAGERIGHT:iHorPos+=20; break;/向右滾動(dòng)一頁,位置+20 case SB_THUMBPOSITION:/拖動(dòng)滾動(dòng)條 iHorPos=HIWORD(wParam);break; default: return(DefWindowProc(hWnd,iMessage,wParam,lParam); if(iHorPos100) iHorPos=100; /設(shè)定滾動(dòng)條的信息.主要是設(shè)定位置 stScrollInfo.fMask=SIF_POS; stScrollInfo.nPos=iHorPos; SetScrol

37、lInfo(hWndScrollBarHor,SB_CTL,靜態(tài)控件是一種包含正文或圖形的小窗口,8.5 靜態(tài)控件,靜態(tài)控件應(yīng)用舉例,【例8-3】本例通過演示位圖靜態(tài)控件的創(chuàng)建于操作方法,說明靜態(tài)控件消息的強(qiáng)制生成與處理過程,當(dāng)單擊位圖時(shí),就報(bào)告該位圖的尺寸。,本例的源程序代碼如下: #include #include #include #define IDS_BITMAP 101 /定義靜態(tài)控件標(biāo)識 char lpszClassName1=STATIC; char lpszText=; HWND hwndStatic; /靜態(tài)控件句柄 HINSTANCE hInst; HDC hdc; HB

38、ITMAP hBm; BITMAP bm; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);,1. LRESULT CALLBACK WndProc(.) 2. switch(message) 3. case WM_CREATE: /創(chuàng)建位圖靜態(tài)控件 4. hwndStatic=CreateWindow(lpszClassName1,Internet_Wall, /該風(fēng)格允許靜態(tài)控件強(qiáng)制發(fā)送消息 WS_CHILD|WS_VISIBLE|WS_BORDER|SS_BITMAP|SS_NOTIFY, 30,30, 0,0, /系統(tǒng)將根據(jù)位圖尺寸自

39、動(dòng)調(diào)節(jié)靜態(tài)控件的大小 hwnd, (HMENU)IDS_BITMAP, hInst, NULL) ; 5. break; 6. case WM_COMMAND: 7. switch (LOWORD(wParam) 8. case IDS_BITMAP: /處理控件消息 9. DestroyWindow(hwndStatic); 10. hdc=GetDC(hwnd); /在窗口中顯示位圖大小信息 11. TextOut(hdc,130,100,lpszText,strlen(lpszText); 12. ReleaseDC(hwnd,hdc);break; 13. 14. break; 15.

40、 case WM_DESTROY: 16. DeleteObject(hBm); PostQuitMessage(0); break; 17. default: return DefWindowProc(hwnd,message,wParam,lParam); 18. 19. return 0;,向父窗口 發(fā)送 單擊/雙擊 可用/不可用 等消息,在靜態(tài)控件區(qū) 顯示特定的位圖,本例在窗口用戶區(qū)的中央顯示靜態(tài)文本“單擊此處顯示一個(gè)位圖”單擊這個(gè)靜態(tài)文本時(shí),將在靜態(tài)文本所在處顯示一個(gè)位圖。,本例資源文件: abitmap BITMAP a.BMP,#include #include #include

41、 #define IDS_BITMAP 101/定義靜態(tài)控件標(biāo)識 char lpszText=; HWND hwndStatic; /靜態(tài)控件句柄 HINSTANCE hInst; HDC hdc; HDC hdcmem; HBITMAP hBm; BITMAP bm;,LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) static RECT rect; switch(message) 1. case WM_CREATE: 2. hdc=GetDC(hwnd); 3.hdcmem=Cr

42、eateCompatibleDC(hdc); 4.ReleaseDC(hwnd,hdc); 5. GetClientRect(hwnd,8.case WM_COMMAND: 9. switch (LOWORD(wParam) 10. case IDS_BITMAP: 11. DestroyWindow(hwndStatic); 12.hdc=GetDC(hwnd); 13.SelectObject(hdcmem,hBm); /在窗口中顯示位圖 14./粘貼位圖 15. BitBlt(hdc,(rect.right-rect.left)/2-bm.bmWidth/2,(rect.bottom-r

43、ect.top)/2 -bm.bmHeight/2,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY); 16. ReleaseDC(hwnd,hdc); 17.break; 18. break; case WM_DESTROY: DeleteObject(hBm); DeleteDC(hdcmem); PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0; ,8.6 列表框子窗口控件,列表框常用于集中顯示同種類型的內(nèi)容,如同

44、類型文件等,列表框一般具有如下特點(diǎn): 1可提供大量的可選項(xiàng)(需要時(shí)自動(dòng)顯示滾動(dòng)條); 2可設(shè)置單選(單個(gè)選項(xiàng))或多選(多項(xiàng)選擇)功能; 3單選時(shí),單擊列表項(xiàng),被選的項(xiàng)以 “ 反相”顯示表示被選中;再次單擊該選項(xiàng),恢復(fù)為非選中狀態(tài)。,創(chuàng)建列表框子窗口控件,列表框和應(yīng)用程序之間消息傳遞,LBN_SELCHANGE表明列表框中的用戶選擇已發(fā)生改變 LBN_DBCLK雙擊 LBN_SELCANCLE列表框中的選擇被取消 LBN_SETFOCUS列表框收到輸入焦點(diǎn) LBN_KILLFOCUS列表框失去輸入焦點(diǎn),列表框應(yīng)用舉例,【例8-4】創(chuàng)建一個(gè)采用常用樣式的單選列表框,并在該列表框中列出磁盤驅(qū)動(dòng)器名、

45、當(dāng)前目錄的文件和子目錄名等。,本例的源程序代碼如下: #include #include #include #define IDL_SAMPLE 101 /定義列表框標(biāo)識 #define FILE_LIST 0 x4010 /定義文件屬性值 HWND hwndList; HINSTANCE hInst ; char lpszClassName1=ListBox; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);,LRESULT CALLBACK WndProc(.) int nIndex; switch(message) case WM_CR

46、EATE: hwndList = CreateWindow(.); /設(shè)置列表框中的所列文件類型 SendMessage(hwndList,LB_DIR,FILE_LIST,(LPARAM)*.*); break; case WM_COMMAND: switch(LOWORD(wParam) case IDL_SAMPLE : /處理列表框消息 if(HIWORD(wParam)=LBN_DBLCLK) nIndex=SendMessage(hwndList,LB_GETCURSEL,0,0L); SendMessage(hwndList,LB_DELETESTRING,nIndex,0L);

47、 break; break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0; ,獲取當(dāng)前 選中項(xiàng)的 索引值,刪除該列表項(xiàng),編輯框的主要作用在于接收用戶鍵盤輸入,兩種創(chuàng)建編輯框控件方式,8.7 編輯框控件,編輯框與應(yīng)用程序間的消息傳遞,應(yīng)用程序創(chuàng)建編輯框控件后,可通過接收控件發(fā)出的消息得知用戶的請求,并可通過向編輯框發(fā)送消息對其進(jìn)行操作。,編輯框控件應(yīng)用舉例,【例8-5】本例介紹一個(gè)包含編輯框控件的“ 乘法器”示例程序,

48、如圖所示。當(dāng)在乘數(shù)的輸入框中輸入一個(gè)數(shù),然后單擊 “ ”(乘號),再在乘數(shù)的輸入框中輸入另一個(gè)數(shù),在結(jié)果輸出框中就可以看到運(yùn)算的結(jié)果,如本例第一次輸入數(shù)字5,第二次輸入數(shù)字8,得到的結(jié)果為40。,LRESULT CALLBACK WndProc(.) switch(message) case WM_CREATE: /定義各種子窗口控件 hStatic1 = CreateWindow(STATIC,乘數(shù):, WS_CHILD|WS_VISIBLE, 40,20,50,20,hwnd,(HMENU)IDS_1,hInst,NULL); hStatic2 = CreateWindow(STATIC,

49、結(jié)果:, WS_CHILD|WS_VISIBLE, 40,70,50,20,hwnd,(HMENU)IDS_2,hInst,NULL); hEditItem = CreateWindow( EDIT,NULL, WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, 130,20,80,20,hwnd,(HMENU)IDE_ADDITEM, hInst,NULL); hEditResult = CreateWindow( EDIT,NULL, S_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER|ES_READONLY, 130,70,80,20,hw

50、nd,(HMENU)IDE_RESULT,hInst,NULL); hButtonAdd = CreateWindow(BUTTON, WS_CHILD|WS_VISIBLE, 20,120,70,20,hwnd,(HMENU)IDB_ADD,hInst,NULL); hButtonReset=CreateWindow(“BUTTON”,“重新開始”,WS_CHILD|WS_VISIBLE, 100,120,70,20,hwnd,(HMENU)IDB_RESET,hInst,NULL); hButtonCancle=CreateWindow( BUTTON,退出, WS_CHILD|WS_VI

51、SIBLE, 180,120,70,20,hwnd,(HMENU)IDB_CANCLE,hInst,NULL); /設(shè)置“結(jié)果”編輯框的初始值 SetWindowText(hEditResult,0); break;,case WM_SETFOCUS: /設(shè)置編輯框獲得輸入焦點(diǎn) SetFocus(hEditItem); break; case WM_COMMAND: switch (LOWORD(wParam) case IDB_ADD: nMax=GetWindowTextLength(hEditItem)+1; GetWindowText(hEditItem,lpszAddItem,nMa

52、x); nAddItem=strtol(lpszAddItem,獲取編輯框中用戶 輸入的文本長度,獲取 用戶 輸入,將輸入的 字符串轉(zhuǎn) 換成整形,在“乘數(shù)”框中 清除用戶輸入, 準(zhǔn)備接收新的輸入,在“結(jié)果”編輯 框中輸出結(jié)果,使“乘數(shù)”框重 新得到輸入焦點(diǎn),case IDB_RESET: /在“乘數(shù)”框中清除用戶輸入,準(zhǔn)備接收新的輸入 SetWindowText(hEditItem,); /使“乘數(shù)”框重新得到輸入焦點(diǎn) SendMessage(hwnd,WM_SETFOCUS,0,0L); /恢復(fù)“結(jié)果”編輯框的初始狀態(tài) SetWindowText(hEditResult,0); nResul

53、t=1; nAddItem=1; break; case IDB_CANCLE: SendMessage(hwnd,WM_DESTROY,0,0L); break; break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0; ,【例】創(chuàng)建一個(gè)編輯框控件和兩個(gè)按鈕控件,它們分別是“顯示字符”和“顯示字符數(shù)”,在此編輯框中輸入某一個(gè)字符串,單擊“顯示字符”按鈕,在另外一個(gè)輸出框中輸出此字符串;單擊“顯示字符數(shù)”按鈕,在輸

54、出框中顯示該字符串的字符數(shù)。如圖所示,是在上面的編輯框中輸入字符串Huang Weitong后,單擊“字符數(shù)”按鈕,在第二個(gè)編輯框中顯示字符串Huang Weitong的字符數(shù)。,long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) case WM_CREATE:/窗口初始化消息 hEdit1=CreateWindow(EDIT,/創(chuàng)建EDIT對象 NULL,/無標(biāo)題 WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, 130,20,300,30, hWnd, (HMENU)I

55、DE_1,/編輯框標(biāo)識 hInst, NULL); hEdit2=CreateWindow(EDIT,/創(chuàng)建EDIT編輯框 NULL, WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, 130,70,300,30, hWnd, (HMENU)IDE_2,/編輯框標(biāo)識 hInst, NULL); hBtn1=CreateWindow(BUTTON,/創(chuàng)建BUTTON對象 顯示,/標(biāo)題 WS_CHILD|WS_VISIBLE, 130,120,100,70,hWnd, (HMENU)IDB1,/標(biāo)識 hInst,NULL); hBtn2=CreateWindow(BUTTON,/創(chuàng)建BUTTON對象 字符數(shù),/標(biāo)題 WS_CHILD|WS_VISIBLE, 330,120,100,70,hWnd, (HMENU)IDB2,/標(biāo)識 hInst, NULL); break;,case WM_COMMAND: switch(LOWORD(wParam) case IDE_1: if(HIWORD(wParam)=EN_SETFOCUS) SetFocus(hEdit1);break; case IDE_2: if(HIWORD(wParam)=EN_SET

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論