第3講Windows 標(biāo)準(zhǔn)控件_第1頁(yè)
第3講Windows 標(biāo)準(zhǔn)控件_第2頁(yè)
第3講Windows 標(biāo)準(zhǔn)控件_第3頁(yè)
第3講Windows 標(biāo)準(zhǔn)控件_第4頁(yè)
第3講Windows 標(biāo)準(zhǔn)控件_第5頁(yè)
已閱讀5頁(yè),還剩53頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3講Windows標(biāo)準(zhǔn)控件作為一般窗口,控件具有通用的窗口屬性,并且可以使用ShowWindows()和MoveWindows()等窗口管理函數(shù)來(lái)顯示或隱藏控件、改變控件的位置、尺寸以及其它操作。

控件創(chuàng)建形式對(duì)話框中制定控件:如按鈕控件調(diào)用CreateWindows()或CreateWindowsEx()函數(shù)創(chuàng)建必須指定控件的窗口類,這種窗口類要在應(yīng)用程序中定義并注冊(cè),但更多的是使用系統(tǒng)預(yù)定義窗口類控件Windows圖形用戶界面的主要組成部分之一用戶通過(guò)操作控件對(duì)象完成與應(yīng)用程序之間的交互體現(xiàn)了Windows系統(tǒng)面向?qū)ο蟮奶攸c(diǎn)控件以獨(dú)立的子窗口或?qū)υ捒騼煞N形式存在1概述

應(yīng)用程序窗口可調(diào)用函數(shù)SendMessage向特定的子窗口發(fā)送消息,例如用戶單擊圓按鈕時(shí),可調(diào)用SendMessage向該圓按鈕發(fā)送BM_SETCHECK消息,為該按鈕設(shè)置選中符號(hào),其形式為:

SendMessage(hwndRadioButton,BM_SETCHECK,1,0);使用對(duì)話框控件時(shí),可調(diào)用SendDlgItemMessage向指定的對(duì)話框控件發(fā)送消息,其形式為:

SendDlgItemMessage(hdlg,ID,message,wParam,lParam);應(yīng)用程序向控件發(fā)送的消息的字參數(shù)與長(zhǎng)參數(shù)包含該消息的相關(guān)信息其含義取決于具體的控件消息1.EnableWindow函數(shù)(功能為激活或禁止窗口)BOOLEnableWindow(HWNDhwnd,BOOLbEnable)激活或禁止標(biāo)識(shí)Ture:該窗口可接收輸入False:禁止該窗口接收輸入2.MoveWindow函數(shù)(移動(dòng)或改變窗口的大小)BOOLMoveWindow(HWNDhwnd,intX,intY,intnWidth,intnHeight,BOOLbReprint //表明窗口移動(dòng)后是否重畫)

8.2常用子窗口操作函數(shù)3.SetWindowText(設(shè)置窗口的標(biāo)題或文本)BOOLSetWindowText(HWNDhwnd,LPCTSTRlpszString)設(shè)置的文本內(nèi)容4.GetWindowText函數(shù)(獲取指定窗口標(biāo)題或文本)intGetWindowText(HWNDhwnd,LPSTRlpszString,intnMax)存放文本字符串的緩沖區(qū)最大可獲取的字符串長(zhǎng)度對(duì)于對(duì)話框按鈕控件,可調(diào)用函數(shù)SetDlgItemText和GetDlgItemText

BOOLSetDlgItemText(HWNDhdlg,intID,LPCTSTRlpszString)IntGetDlgItemText(HWNDhdlg,intID,LPSTRlpszString,intnMax)

該函數(shù)返回從指定的控件獲取的文本字節(jié)數(shù)。5.DestroyWindow函數(shù)關(guān)閉窗口函數(shù)

BOOLDestroyWindow(HWNDhwnd)如果關(guān)閉父窗口,則其中的子窗口同時(shí)被關(guān)閉按鈕控件普通按鈕圓按鈕復(fù)選框按鈕組框按鈕在對(duì)話框定義中創(chuàng)建控件,其一般形式為:

Control-type[Title,]ID,X,Y,nWidth,nHeight[,Style]控件樣式控件的寬度與高度控件類型控件標(biāo)題或內(nèi)容控件起始坐標(biāo)按鈕控件的創(chuàng)建方式創(chuàng)建控件型的子窗口在對(duì)話框中定義控件創(chuàng)建并注冊(cè)一個(gè)窗口類的實(shí)例創(chuàng)建并顯示窗口實(shí)例8.3按鈕控件的分類與創(chuàng)建按鈕控件與應(yīng)用程序之間的消息傳遞1.接收按鈕控件消息

當(dāng)用戶與控件交互時(shí),控件向其父窗口發(fā)送WM_COMMAND消息。消息的wParam參數(shù)低字節(jié)包含控件的標(biāo)識(shí)值(ID)高字節(jié)中包含控件向父窗口發(fā)出的通知代碼2.向按鈕控件發(fā)送消息調(diào)用函數(shù)SendMessage向按鈕控件發(fā)出消息:

SendMessage(hwnd,message,wParam,lParam);設(shè)置復(fù)選框和圓按鈕的選中標(biāo)志時(shí)字參數(shù)應(yīng)取1:

SendMessage(hwnd,BM_SETCHECK,1,0);取消選中標(biāo)志時(shí)字參數(shù)應(yīng)取0,其形式為:

SendMessage(hwnd,BM_SETCHECK,0,0);SendMessage使用字參數(shù)確定同種消息中的不同動(dòng)作對(duì)話框按鈕控件,可用SendDlgItemMessage完成相同操作向控件子窗口發(fā)出的消息3.按鈕控件示例【例1】創(chuàng)建如右上圖所示的按鈕控件系列,當(dāng)單擊每一個(gè)按鈕后,就出現(xiàn)如右下圖所示的響應(yīng)。LRESULTCALLBACKWndProc(){intX=50,Y=30;//控件起始坐標(biāo)

switch(message){caseWM_CREATE://通過(guò)響應(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)按鈕子窗口

"這是缺省按鈕,按下試試看!",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=CreateWindow(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ù)選框,你會(huì)用嗎?", BS_AUTOCHECKBOX|WS_CHILD|WS_VISIBLE, X,Y+150,240,25, hwnd, (HMENU)IDB_AUTOCHECKBOX, 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);//處理控件消息caseWM_COMMAND:

switch(LOWORD(wParam)){

caseIDB_PUSHBUTTON://當(dāng)用戶單擊按鈕時(shí),改變按鈕文本

SetWindowText(hwndPush,"你已按下了按鈕!");break;

caseIDB_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;caseIDB_RADIOBUTTON://當(dāng)用戶單擊圓按鈕時(shí),設(shè)置按鈕為選中狀態(tài)

SendMessage(hwndRadio,BM_SETCHECK,1,0);break;

caseIDB_AUTORADIOBUTTON: break;

caseIDB_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;caseIDB_AUTOCHECKBOX:break;

caseIDB_GROUPBOX: break;

}break;

caseWM_DESTROY:PostQuitMessage(0);break;

default:returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}

本程序運(yùn)行時(shí)將在主窗口用戶區(qū)的中央顯示一個(gè)普通按鈕,上面寫有“啟動(dòng)一個(gè)對(duì)話框”,按下按鈕彈出一個(gè)對(duì)話框,對(duì)話框含有三個(gè)成組框,其中分別是圓按鈕、自動(dòng)圓按鈕和復(fù)選框,此外,還有一個(gè)普通按鈕和一個(gè)默認(rèn)按鈕。

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){RECTrect;switch(message){caseWM_CREATE: //通過(guò)響應(yīng)WM_CREATE消息創(chuàng)建控件子窗口

GetClientRect(hwnd,&rect);//創(chuàng)建按鈕子窗口

hwndPush=CreateWindow("BUTTON","啟動(dòng)一個(gè)對(duì)話框", BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE, (rect.right-rect.left)/2-60, (rect.bottom-rect.top)/2-15, 120,30,hwnd,(HMENU)IDB_PUSHBUTTON,hInst,NULL);break;

caseWM_COMMAND: //處理控件消息

if(LOWORD(wParam)==IDB_PUSHBUTTON) {DialogBox(hInst,"Button",hwnd,DialogProc); EnableWindow(hwndPush,FALSE); SetWindowText(hwndPush,"不能再使用"); } break;

caseWM_DESTROY:PostQuitMessage(0);break;

default:returnDefWindowProc(hwnd,message,wParam,lParam); }return0;}BOOLCALLBACKDialogProc(HWNDhdlg,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_COMMAND: switch(LOWORD(wParam)) {caseIDOK: EndDialog(hdlg,0);return1;

caseIDCANCEL:EndDialog(hdlg,0);return1;

caseIDC_RADIO1: if(HIWORD(wParam)==BN_CLICKED) {SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,1,0); SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,0,0); return1; } break; caseIDC_RADIO2: if(HIWORD(wParam)==BN_CLICKED) {SendDlgItemMessage(hdlg,IDC_RADIO1,BM_SETCHECK,0,0); SendDlgItemMessage(hdlg,IDC_RADIO2,BM_SETCHECK,1,0); return1; } break; }break;caseWM_CLOSE: EndDialog(hdlg,0); return1;}return0;}

滾動(dòng)條控件最直接的功能是當(dāng)應(yīng)用程序顯示的內(nèi)容超過(guò)窗口的范圍時(shí),用戶可通過(guò)拖動(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)建對(duì)話框中的滾動(dòng)條控件SB_BOTTOM 到滾動(dòng)條最底端或最左端SB_RIGHT 滾動(dòng)到右邊 SB_LEFT 滾動(dòng)到左邊 SB_PAGEUP 向上滾動(dòng)一頁(yè) SB_PAGEDOWN向下滾動(dòng)一頁(yè)樣式為WS_VSCROLL和WS_HSCROLL的窗口的創(chuàng)建hwnd=CreateWindow(lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,

hInstance,NULL);調(diào)用CreateWindow創(chuàng)建子窗口滾動(dòng)條控件CreateWindow(“SCROLLBAR”,//預(yù)定義窗口類名

lpszScrollTitle,//滾動(dòng)條標(biāo)題,常為NULLWS_CHILD|WS_VISIBLE…,//滾動(dòng)條樣式

X,Y, //滾動(dòng)條起始坐標(biāo)

nWidth,nHeight,//滾動(dòng)框?qū)挾扰c高度

hwndParant, //擁有該滾動(dòng)條的窗口句柄

ID, //滾動(dòng)條標(biāo)識(shí)

hInstance, //應(yīng)用程序當(dāng)前實(shí)例句柄

NULL}滾動(dòng)條樣式除窗口類樣式外,常用的還有SBS_VERT和SBS_HORZ滾動(dòng)條在對(duì)話框的定義中完成創(chuàng)建操作SCROLLBARID,X,Y,nWidth,nHeight,[style]8.4.2滾動(dòng)條控件的創(chuàng)建

SetScrollRange:設(shè)置滾動(dòng)條的滾動(dòng)范圍intSetScrollRange(HWNDhwnd,

intnBar, //滾動(dòng)條特性標(biāo)識(shí)

intnMaxPos, //滾動(dòng)條最大滾動(dòng)位置

intnMinPos, //滾動(dòng)條最小滾動(dòng)位置

BOOLbRedraw) //當(dāng)滾動(dòng)條改變時(shí)是否重繪;非0表示重繪

SB_CTL為控件滾動(dòng)條

SB_HORZ為窗口水平滾動(dòng)條

SB_VERT為窗口垂直滾動(dòng)條SetScrollPos:設(shè)置滾動(dòng)塊的位置intSetScrollPos(HWNDhwnd,

intnBar, //滾動(dòng)條的特性標(biāo)識(shí),同SetScrollRange函數(shù)

intnPos, //滾動(dòng)塊的位置

BOOLbRedraw //意義同SetScrollRange函數(shù))8.4.3常用滾動(dòng)條操作函數(shù)

GetSystemMetrics:獲取系統(tǒng)提供的滾動(dòng)條尺寸如:獲取系統(tǒng)水平滾動(dòng)條的高度:GetSystemMetrics(SM_CYHSCROLL);GetScrollpos:獲取滾動(dòng)塊的位置intGetScrollPos(

HWNDhwnd, //窗口句柄,同SetScrollRange函數(shù)

intnBar //滾動(dòng)條特性標(biāo)識(shí)

);GetScrollRange:獲取滾動(dòng)條的滾動(dòng)范圍BOOLGetScrollRange(HWNDhwnd,intnBar,LPINTlpMinPos, //接收最小位置的整形變量的地址LPINTlpMaxPos) //接收最大位置的整形變量的地址【例8-2】本例要求創(chuàng)建一個(gè)帶滾動(dòng)條的顏色框,在顏色框中,通過(guò)拉動(dòng)滾動(dòng)條,使其顯示的區(qū)域產(chǎn)生變化,同時(shí),可以通過(guò)顏色的設(shè)置,來(lái)改變顏色框的顏色。8.4.4滾動(dòng)控件示例

LRESULTAPIENTRYMainWndProc(){HDChDC; HBRUSHhBrush;staticHWNDhWndScrollBar;staticSCROLLINFOstScrollInfo;staticintnRectWidth;

switch(message){caseWM_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.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,&stScrollInfo,FALSE); ShowWindow(hWndScrollBar,TRUE); nRectWidth=100; break;制作垂直滾動(dòng)條滾動(dòng)條結(jié)構(gòu)設(shè)置為滾動(dòng)條控件1.caseWM_VSCROLL:2.if((HWND)lParam!=hWndScrollBar)break;3.switch(LOWORD(wParam))4.{caseSB_LINEUP: nRectWidth+=1; break;5.

caseSB_LINEDOWN: nRectWidth-=1; break;6.

caseSB_PAGEUP: nRectWidth+=10; break;7.

caseSB_PAGEDOWN: nRectWidth-=10; break;8.caseSB_THUMBPOSITION:nRectWidth=101-HIWORD(wParam);break;9.default:return(DefWindowProc(hWnd,message,wParam,lParam));}10. if(nRectWidth<1) nRectWidth=1;11.elseif(nRectWidth>100) nRectWidth=100;12. stScrollInfo.fMask=SIF_POS;13. stScrollInfo.nPos=101-nRectWidth;14. SetScrollInfo(hWndScrollBar,SB_CTL,&stScrollInfo,TRUE);15. SendMessage(hWndMain,WM_COMMAND,IDM_DRAW,0L);16. break;1.caseWM_COMMAND:2.

switch(LOWORD(wParam))3.{caseIDM_RGB:4.DialogBox(hInst,"RGBDlg",hWnd,(DLGPROC)RGBDlgProc);break;5.caseIDM_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(crRGB[0],crRGB[1],crRGB[2]));11. SelectObject(hDC,hBrush);12. Rectangle(hDC,30,130-nRectWidth,30+nRectWidth,130);13. ReleaseDC(hWnd,hDC);14. break;15.caseIDM_EXIT:16. PostQuitMessage(0); break;17.caseIDM_ABOUT:18. DialogBox(hInst,"AboutBox",hWnd,(DLGPROC)About); break;19.default:20. return(DefWindowProc(hWnd,message,wParam,lParam));21.}22.break;23.caseWM_DESTROY:PostQuitMessage(0); break;24.default:return(DefWindowProc(hWnd,message,wParam,lParam));25.}26.return(0);27.}1.BOOLAPIENTRYRGBDlgProc()2.{3.staticintCurrentVal[3],PrevVal[3];4.staticHWNDhwScroll[3];5.charszString[10];6.inti;7.switch(message)8.{9.caseWM_INITDIALOG: //分別設(shè)置滾動(dòng)條的范圍和初始位置。10.for(i=0;i<3;i++)11.{12.CurrentVal[i]=crRGB[i];13.PrevVal[i]=crRGB[i];14.hwScroll[i]=GetDlgItem(hDlg,IDC_RED+i);15.SetScrollRange(hwScroll[i],SB_CTL,0,255,FALSE);16.SetScrollPos(hwScroll[i],SB_CTL,CurrentVal[i],TRUE);17.SetDlgItemText(hDlg,IDC_VALRED+i,itoa(CurrentVal[i],szString,10));18.}19.SetFocus(hwScroll[0]);20.break;1.//處理滾動(dòng)條通知消息2.caseWM_HSCROLL:3.i=0;4.while(hwScroll[i]!=(HWND)lParam)i++;5.switch(LOWORD(wParam))6.{caseSB_LINEDOWN:7.CurrentVal[i]++;8.if(CurrentVal[i]>255)CurrentVal[i]=255;9.break;10.caseSB_LINEUP:11.CurrentVal[i]--;12.if(CurrentVal[i]<0) CurrentVal[i]=0;13.break;caseSB_PAGEDOWN:CurrentVal[i]+=(255-CurrentVal[i])/2;15. break;16.caseSB_PAGEUP: CurrentVal[i]-=CurrentVal[i]/2; break;17.caseSB_THUMBTRACK: CurrentVal[i]=HIWORD(wParam); break;18.caseSB_TOP: CurrentVal[i]=0; break;19.caseSB_BOTTOM: CurrentVal[i]=255; break;}//設(shè)定滾動(dòng)條的位置及其對(duì)應(yīng)的文字1. SetScrollPos(hwScroll[i],SB_CTL,CurrentVal[i],TRUE);2. SetDlgItemText(hDlg,IDC_VALRED+i,itoa(CurrentVal[i],szString,10));3. crRGB[i]=CurrentVal[i];4. SendMessage(hWndMain,WM_COMMAND,IDM_DRAW,0L);5. break;6.caseWM_COMMAND:7.switch(wParam)8.{ caseIDOK:9. for(i=0;i<3;i++)10. crRGB[i]=CurrentVal[i];11. EndDialog(hDlg,TRUE); return(TRUE);12. caseIDCANCEL:13. for(i=0;i<3;i++)14. crRGB[i]=CurrentVal[i];15. EndDialog(hDlg,TRUE); return(TRUE);16.}17.break;18.}19.return(FALSE);20.}BOOLAPIENTRYAbout(HWNDhDlg,UINTmessage,WPARAMwParam, LPARAMlParam){

switch(message) {

caseWM_INITDIALOG: return(TRUE);

caseWM_COMMAND:

if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL) { EndDialog(hDlg,TRUE); return(TRUE); } break; }return(FALSE);}【例】創(chuàng)建一個(gè)水平滾動(dòng)條控件,用這個(gè)控件來(lái)控制字體的大小,字體大小由50到100線性變化;同時(shí)創(chuàng)建一個(gè)垂直滾動(dòng)條,用此滾動(dòng)條來(lái)控制字體的顏色,顏色由RGB(0,0,255)到RGB(0,0,0)線性變化。longWINAPIWndProc(HWNDhWnd,UINTiMessage,WPARAMwParam,LPARAMlParam){HDChDC; //定義設(shè)備環(huán)境句柄HFONThF; //定義字體句柄PAINTSTRUCTps; //定義包含繪圖信息的結(jié)構(gòu)體staticHWNDhWndScrollBarHor,hWndScrollBarVer;//定義水平和豎直滾動(dòng)條的句柄staticSCROLLINFOstScrollInfo; //定義包含滾動(dòng)條信息的結(jié)構(gòu)體staticintiHorPos=1,iVerPos=100; //定義滾動(dòng)條位置charcOut[]="祝您成功."; //輸出字符串RECTrcRedrawArea={0,0,380,200}; //定義刷新區(qū)域switch(iMessage){caseWM_CREATE: //窗口創(chuàng)建消息

hWndScrollBarVer=CreateWindowEx(0L, //創(chuàng)建豎直滾動(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|SBS_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.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,&stScrollInfo,FALSE);SetScrollInfo(hWndScrollBarHor,SB_CTL,&stScrollInfo,FALSE);ShowWindow(hWndScrollBarHor,TRUE);ShowWindow(hWndScrollBarVer,TRUE);break;caseWM_VSCROLL: //若是豎直滾動(dòng)條的消息

if((HWND)lParam!=hWndScrollBarVer) break; switch(LOWORD(wParam)) { caseSB_LINEUP: iVerPos+=5; break; //向上走一行,位置+5 caseSB_LINEDOWN: iVerPos-=5; break; //向下走一行.位置-5 caseSB_PAGEUP: iVerPos+=20; break; //向上走一頁(yè),位置+20 caseSB_PAGEDOWN: iVerPos-=20; break; //向下走一頁(yè),位置-20 caseSB_THUMBPOSITION: //拖動(dòng)滾動(dòng)條

iVerPos=101-HIWORD(wParam); break; default: return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } if(iVerPos<1)iVerPos=1; //限制位置的范圍

elseif(iVerPos>100)iVerPos=100; //設(shè)定滾動(dòng)條的信息.主要是設(shè)定位置

stScrollInfo.fMask=SIF_POS; stScrollInfo.nPos=101-iVerPos; SetScrollInfo(hWndScrollBarVer,SB_CTL,&stScrollInfo,TRUE); InvalidateRect(hWnd,&rcRedrawArea,1); //刷新自定義的用戶區(qū)

break;caseWM_HSCROLL: //水平滾動(dòng)條的消息

if((HWND)lParam!=hWndScrollBarHor) break; switch(LOWORD(wParam)) { caseSB_LINELEFT: iHorPos-=5; break; //向左滾動(dòng)一行,位置-5 caseSB_LINERIGHT: iHorPos+=5; break; //向右滾動(dòng)一行,位置+5 caseSB_PAGELEFT: iHorPos-=20; break; //向左滾動(dòng)一頁(yè),位置+20 caseSB_PAGERIGHT: iHorPos+=20; break; //向右滾動(dòng)一頁(yè),位置+20 caseSB_THUMBPOSITION: //拖動(dòng)滾動(dòng)條

iHorPos=HIWORD(wParam); break; default:return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } if(iHorPos<1)iHorPos=1; //限制位置范圍

elseif(iHorPos>100)iHorPos=100; //設(shè)定滾動(dòng)條的信息.主要是設(shè)定位置

stScrollInfo.fMask=SIF_POS; stScrollInfo.nPos=iHorPos; SetScrollInfo(hWndScrollBarHor,SB_CTL,&stScrollInfo,TRUE); InvalidateRect(hWnd,&rcRedrawArea,1); //刷新用戶區(qū)

break;靜態(tài)控件創(chuàng)建方法CreateWindow(“

STATIC”,//預(yù)定義窗口類名lpszStaticTitle,//靜態(tài)控件標(biāo)題WS_CHILD|WS_VISIBLE|WS_BORDER|…,∥樣式X,Y,∥靜態(tài)控件起始坐標(biāo)nWidth,nHeight,∥靜態(tài)控件寬度與高度hwndParant,∥擁有該靜態(tài)控件的窗口句柄ID,∥靜態(tài)控件標(biāo)識(shí)HInstance,∥應(yīng)用程序當(dāng)前實(shí)例句柄NULL)創(chuàng)建靜態(tài)控件子窗口創(chuàng)建對(duì)話框中的靜態(tài)控件靜態(tài)控件是一種包含正文或圖形的小窗口Static-TypeTilte, //靜態(tài)控件標(biāo)題(文本或位圖等)ID, //靜態(tài)控件標(biāo)識(shí)X,Y, //起始坐標(biāo)nWidth,nHeight,//滾動(dòng)框的寬度和高度[,style]//滾動(dòng)條樣式Static-Type為靜態(tài)控件類型關(guān)鍵字,常用類型有:LTEXT(左對(duì)齊)、CTEX(右對(duì)齊)和RTEXT(居中)創(chuàng)建過(guò)程在對(duì)話框的定義中完成通知碼 說(shuō)明STN_CLICKED

單擊靜態(tài)控件STN_ENABLE 激話靜態(tài)控件STN_DBLCLK

雙擊靜態(tài)控件STN_DISABLE

禁止靜態(tài)控件發(fā)送靜態(tài)控件消息8.5靜態(tài)控件位圖顯示本例的源程序代碼如下:(1)添加bmp位圖資源(2)全局變量HDChdc;HBITMAPhBm;BITMAPbm;(3)WM_CREATE消息: caseWM_CREATE: hBm=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_TEST)); GetObject(hBm,sizeof(BITMAP),&bm);

caseWM_PAINT: hdc=BeginPaint(hWnd,&ps); hdcmem=CreateCompatibleDC(hdc); SelectObject(hdcmem,hBm); //在窗口中顯示位圖

//粘貼位圖

BitBlt(hdc,10,10,bm.bmWidth+10,bm.bmHeight+10,hdcmem,0,0,SRCCOPY); DeleteDC(hdcmem); EndPaint(hWnd,&ps); break;

本例在窗口用戶區(qū)的中央顯示靜態(tài)文本“單擊此處顯示一個(gè)位圖”單擊這個(gè)靜態(tài)文本時(shí),將在靜態(tài)文本所在處顯示一個(gè)位圖。

本例資源文件:abitmapBITMAPa.BMP8.6列表框子窗口控件列表框常用于集中顯示同種類型的內(nèi)容,如同類型文件等,列表框一般具有如下特點(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)建列表框子窗口控件創(chuàng)建列表框子窗口控件創(chuàng)建作為對(duì)話框控件的列表框創(chuàng)建列表框子窗口控件方法列表框和應(yīng)用程序之間消息傳遞1.列表框向應(yīng)用程序發(fā)送消息當(dāng)用戶與列表框交互時(shí),列表框向應(yīng)用程序發(fā)出WM_COMMAND消息。LBN_SELCHANGE

表明列表框中的用戶選擇已發(fā)生改變 LBN_DBCLK

雙擊 LBN_SELCANCLE

列表框中的選擇被取消 LBN_SETFOCUS

列表框收到輸入焦點(diǎn) LBN_KILLFOCUS

列表框失去輸入焦點(diǎn)消息字參數(shù)(wParam)高字節(jié)為標(biāo)識(shí)列表框動(dòng)作的消息通知碼(如LBN_DBLCLK標(biāo)識(shí)用戶雙擊)低字節(jié)為控件標(biāo)識(shí)值2.應(yīng)用程序向列表框發(fā)送消息

應(yīng)用程序?qū)α斜砜虻牟僮魍ㄟ^(guò)調(diào)用函數(shù)SendMessage或SendDlgItemMessage向其發(fā)送各種消息來(lái)完成。LB_ADDFILE 在文件列表中加入指定文件LB_GETTEXT 獲取指定項(xiàng)文本 LB_ADDSTRING 在列表框中加入列表項(xiàng)LB_GETTEXTLEN 獲取指定項(xiàng)長(zhǎng)高 LB_DELETESTRING 在列表框中刪除列表項(xiàng)LB_GETTOPINDEX 獲取列表框中第一項(xiàng)的索引值 LB_DIR 在列表框中列出指定文件LB_INSERTSTRING 在列表框的指定位置加入一項(xiàng) LB_FINDSTRING 在列表框中查找指定項(xiàng)LB_RESETCONTENT 清空列表框 LB_GETCOUNT 獲取多選列表框中的項(xiàng)數(shù)LB_SETSEL 設(shè)置多選列表框中指定項(xiàng)的選中狀態(tài) LB_GETCURSEL 獲取列表框中當(dāng)前選中項(xiàng)的索引值LB_SETCURSEL 設(shè)置單選列表框中指定項(xiàng)的選中狀態(tài) LB_GETSEL 獲取列表框中指定項(xiàng)的選中狀態(tài)LB_SETTOPINDEX 設(shè)置列表框中第一項(xiàng)的索引值 LB_GETSELCOUNT 獲取多選列表框中選中的項(xiàng)數(shù) a.索引號(hào)的使用應(yīng)用程序通過(guò)列表框中項(xiàng)的索引值操作指定項(xiàng),第一項(xiàng)默認(rèn)索引號(hào)為0,最后一項(xiàng)為-1應(yīng)用程序常通過(guò)向列表框發(fā)送LB_GETCURSEL消息獲取當(dāng)前選中的索引號(hào)b.多選列表框消息發(fā)送當(dāng)列表框的樣式為L(zhǎng)BS_EXTENDEDSEL和LBS_MULTIPLSEL時(shí),可在該列表框中選取多個(gè)項(xiàng)。此時(shí)通過(guò)向列表框發(fā)送LB_GETSELCOUNT消息獲取選中的項(xiàng)數(shù)應(yīng)用程序向列表框發(fā)送LB_GETSEL消息獲取指定項(xiàng)的選中狀態(tài)c.發(fā)送LB_DIR消息應(yīng)用程序向列表框發(fā)出此消息以顯示一系列文件名、目錄或驅(qū)動(dòng)器向列表框發(fā)送消息時(shí)應(yīng)注意的問(wèn)題

列表框應(yīng)用舉例【例8-4】創(chuàng)建一個(gè)采用常用樣式的單選列表框,并在該列表框中列出磁盤驅(qū)動(dòng)器名、當(dāng)前目錄的文件和子目錄名等。本例的源程序代碼如下:

#include<windows.h> #include<stdio.h> #include<stdlib.h> #defineIDL_SAMPLE101//定義列表框標(biāo)識(shí)

#defineFILE_LIST0x4010//定義文件屬性值

HWNDhwndList;HINSTANCEhInst;charlpszClassName1[]="ListBox";LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);LRESULTCALLBACKWndProc(){intnIndex;switch(message){caseWM_CREATE:

hwndList=CreateWindow();//設(shè)置列表框中的所列文件類型

SendMessage(hwndList,LB_DIR,FILE_LIST,(LPARAM)"*.*");

break;

caseWM_COMMAND:switch(LOWORD(wParam))

{caseIDL_SAMPLE://處理列表框消息

if(HIWORD(wParam)==LBN_DBLCLK){nIndex=SendMessage(hwndList,LB_GETCURSEL,0,0L);

SendMessage(hwndList,LB_DELETESTRING,nIndex,0L);break;}break;

caseWM_DESTROY:

PostQuitMessage(0);break;default:

returnDefWindowProc(hwnd,message,wParam,lParam);

}return0;}獲取當(dāng)前選中項(xiàng)的索引值刪除該列表項(xiàng)

編輯框的主要作用在于接收用戶鍵盤輸入兩種創(chuàng)建編輯框控件方式創(chuàng)建編輯框子窗口控件CreateWindow(

“EDIT”, ∥預(yù)定義窗口類名

NULL, ∥編輯框一般無(wú)標(biāo)題

WS_CHILD|WS_VISIBLE|…,∥樣式

X,Y, ∥編輯框起始坐標(biāo)

nWidth,nHeight,∥編輯框的寬度與高度

hwndParant,∥擁有該編輯框的窗口句柄

ID,∥編輯框標(biāo)識(shí)

hInstance,∥應(yīng)用程序當(dāng)前實(shí)例句柄

NULL)創(chuàng)建對(duì)話框中編輯框控件EDITTEXTID,X,Y,nWidth,nHeight,[,style]8.7編輯框控件編輯框與應(yīng)用程序間的消息傳遞

應(yīng)用程序創(chuàng)建編輯框控件后,可通過(guò)接收控件發(fā)出的消息得知用戶的請(qǐng)求,并可通過(guò)向編輯框發(fā)送消息對(duì)其進(jìn)行操作。編輯框向應(yīng)用程序發(fā)送WM_COMMAND消息消息字參數(shù)(wParam)的低字節(jié)為控件標(biāo)識(shí)該消息字參數(shù)(wParam)的高字節(jié)為標(biāo)識(shí)列表框動(dòng)作的消息通知碼應(yīng)用程序向編輯框發(fā)送消息消息傳遞種類調(diào)用SendMessage調(diào)用SendDlgItemMessage向應(yīng)用程序發(fā)送各種消息編輯框控件應(yīng)用舉例【例8-5】本例介紹一個(gè)包含編輯框控件的“乘法器”示例程序,如圖所示。當(dāng)在乘數(shù)的輸入框中輸入一個(gè)數(shù),然后單擊“×”(乘號(hào)),再在乘數(shù)的輸入框中輸入另一個(gè)數(shù),在結(jié)果輸出框中就可以看到運(yùn)算的結(jié)果,如本例第一次輸入數(shù)字5,第二次輸入數(shù)字8,得到的結(jié)果為40。LRESULTCALLBACKWndProc(){switch(message){caseWM_CREATE: //定義各種子窗口控件

hStatic1=CreateWindow("STATIC","乘數(shù):",WS_CHILD|WS_VISIBLE, 40,20,50,20,hwnd,(HMENU)IDS_1,hInst,NULL);hStatic2=CreateWindow("STATIC","結(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,hwnd,(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_VISIBLE, 180,120,70,20,hwnd,(HMENU)IDB_CANCLE,hInst,NULL);//設(shè)置“結(jié)果”編輯框的初始值

SetWindowText(hEditResult,"0"); break;caseWM_SETFOCUS://設(shè)置編輯框獲得輸入焦點(diǎn)

SetFocus(hEditItem);break;caseWM_COMMAND:

switch(LOWORD(wParam)){caseIDB_ADD:nMax=GetWindowTextLength(hEditItem)+1; GetWindowText(hEditItem,lpszAddItem,nMax);nAddItem=strtol(lpszAddItem,&stop,10); nResult*=nAddItem;_ltoa(nResult,lpszResult,10);//將結(jié)果轉(zhuǎn)換成字符串

SetWindowText(hEditResult,lpszResult); SetWindowText(hEditItem,"");SendMessage(hwnd,WM_SETFOCUS,0,0L);break;獲取編輯框中用戶輸入的文本長(zhǎng)度獲取用戶輸入將輸入的字符串轉(zhuǎn)換成整形在“乘數(shù)”框中清除用戶輸入,準(zhǔn)備接收新的輸入在“結(jié)果”編輯框中輸出結(jié)果使“乘數(shù)”框重新得到輸入焦點(diǎn)caseIDB_RESET:

//在“乘數(shù)”框中清除用戶輸入,準(zhǔn)備接收新的輸入

SetWindowText(hEditItem,"");

//使“乘數(shù)”框重新得到輸入焦點(diǎn)

SendMessage(hwnd,WM_SETFOCUS,0,0L);

//恢復(fù)“結(jié)果”編輯框的初始狀態(tài)

SetWindowText(hEditResult,"0");nResult=1; nAddItem=1; break;caseIDB_CANCLE:SendMessage(hwnd,WM_DESTROY,0,0L);break;}break;caseWM_DESTROY:PostQuitMessage(0);break;

default:returnDefWindowProc(hwnd,message,wParam,lParam); return0;}【例】創(chuàng)建一個(gè)編輯框控件和兩個(gè)按鈕控件,它們分別是“顯示字符”和“顯示字符數(shù)”,在此編輯框中輸入某一個(gè)字符串,單擊“顯示字符”按鈕,在另外一個(gè)輸出框中輸出此字符串;單擊“顯示字符數(shù)”按鈕,在輸出框中顯示該字符串的字符數(shù)。如圖所示,是在上面的編輯框中輸入字符串HuangWeitong后,單擊“字符數(shù)”按鈕,在第二個(gè)編輯框中顯示字符串HuangWeitong的字符數(shù)。

longWINAPIWndProc(HWNDhWnd,UINTiMessage,WPARAMwParam,LPARAMlParam){caseWM_CREATE: //窗口初始化消息

hEdit1=CreateWindow("EDIT", //創(chuàng)建EDIT對(duì)象

NULL, //無(wú)標(biāo)題

WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, 130,20,300,30,hWnd, (HMENU)IDE_1, //編輯框標(biāo)識(shí)

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)識(shí)

hInst,NULL); hBtn1=CreateWindow("BUTTON", //創(chuàng)建BUTTON對(duì)象

"顯示", //標(biāo)題

WS_CHILD|WS_VISIBLE, 130,120, 100,70,hWnd, (HMENU)IDB1, //標(biāo)識(shí)

hInst,NULL); hBtn2=CreateWindow("BUTTON", //創(chuàng)建BUTTON對(duì)象

"字符數(shù)", //標(biāo)題

WS_CHILD|WS_VISIBLE, 330,120, 100,70,hWnd, (HMENU)IDB2, //標(biāo)識(shí)

hInst,NULL

溫馨提示

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

評(píng)論

0/150

提交評(píng)論