windows三級(jí)項(xiàng)目_第1頁(yè)
windows三級(jí)項(xiàng)目_第2頁(yè)
windows三級(jí)項(xiàng)目_第3頁(yè)
windows三級(jí)項(xiàng)目_第4頁(yè)
windows三級(jí)項(xiàng)目_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 Windows程 序 設(shè) 計(jì) 實(shí) 驗(yàn) 報(bào) 告Technology Chmistry Experiment Report學(xué) 生 所 在 學(xué) 院:軟 件 學(xué) 院學(xué) 生 所 在 班 級(jí):軟件一班指 導(dǎo) 教 師:穆運(yùn)峰、李可、李季輝、王艷芬教 務(wù) 處2016年 5 月實(shí)驗(yàn)?zāi)康恼莆沼肅/C+語(yǔ)言采用API在Windows平臺(tái)下編寫軟件的方法,熟悉消息驅(qū)動(dòng)的本質(zhì);熟悉Windows平臺(tái)基本控件的本質(zhì)、熟悉動(dòng)態(tài)鏈接庫(kù)的使用,加深對(duì)課堂知識(shí)的掌握。實(shí)驗(yàn)內(nèi)容仿照Windows操作系統(tǒng)附件的繪圖軟件設(shè)計(jì)一個(gè)繪圖程序,依次為程序增加繪圖函數(shù)、菜單選擇、工具選擇、顏色選擇、文件操作等功能,可以在此基礎(chǔ)上進(jìn)行擴(kuò)充,最

2、終完成一個(gè)相對(duì)完整的繪圖程序。實(shí)驗(yàn)步驟整體設(shè)計(jì)進(jìn)行分類:一窗口描述本項(xiàng)目共創(chuàng)建四個(gè)窗口,分別是:(1)類名為MyRegisterClass的父窗口,包括各種菜單項(xiàng);(2)繪圖窗口(RegisterDrawWndClass):主要實(shí)現(xiàn)基本的繪圖功能;(3)工具選擇窗口(RegisterToolbarClass):實(shí)現(xiàn)繪圖工具的選擇功能;(4)調(diào)色板窗口(ColorSelectDlgRegisterClass):實(shí)現(xiàn)顏色的選擇功能。本項(xiàng)目還包括一個(gè)改變畫筆寬度的菜單項(xiàng),通過發(fā)送消息WM_CHANGEPENWIDTH給繪圖窗口以改變繪圖中畫筆的寬度。主界面截圖:二各項(xiàng)目文件中的函數(shù)及其主要功能2繪制

3、弧線繪制直線繪制矩形繪制橢圓鼠標(biāo)落下PenMouseDownLineMouseDownRectMouseDownEllipseMouseDown鼠標(biāo)彈起PenMouseUpLineMouseUpRectMouseUpEllipseMouseUp鼠標(biāo)移動(dòng)PenMouseMoveLineMouseMoveRectMouseMoveEllipseMouseMove2.1colorSelectDlgS文件(1)ATOMColorSelectDlgRegisterClass(HINSTANCEhInstance)/進(jìn)行調(diào)色板窗口的注冊(cè)。(2)LRESULTCALLBACKColorBoxProc(HWN

4、DhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)/調(diào)色板窗口過程函數(shù),創(chuàng)建調(diào)色板,并捕獲顏色改變消息,并發(fā)送給繪圖窗口。(3)HWNDCreateColorSelectDlg(LPCTSTRlpWindowName,DWORDdwStyle,HWNDhWndParent,HINSTANCEhInstance,HWNDhWndSendTo)/對(duì)外提供創(chuàng)建調(diào)色板窗口的函數(shù)。2.2drawfun文件(1)typedefVOID(*PDRAWFUN)(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);指針函數(shù),帶入相應(yīng)的函數(shù)名即可

5、完成相應(yīng)的繪圖操作,可帶入的函數(shù)名如下表格:(2)VOIDDrawShape(HDChdc,PDRAWSHAPE&pShp)/根據(jù)傳入的圖形參數(shù),繪制相應(yīng)的圖形。(3)VOIDDrawGraphics(HDChdc,GRAPHICS&g)/根據(jù)傳入的圖形列表,逐個(gè)繪制保存的圖形。2.3drawwnd文件(1)LRESULTCALLBACKWndDrawProc(HWND,UINT,WPARAM,LPARAM)/繪圖窗口過程函數(shù),完成文件新建,打開,保存,鼠標(biāo)落下、彈起、移動(dòng),工具改變,顏色改變,畫筆寬度改變等消息的處理。(2)ATOMRegisterDrawWndClass(HINSTANCE

6、hInstance)/進(jìn)行繪圖窗口注冊(cè)。(3)HWNDCreateDrawWindod(HWND,HINSTANCE,UINT)/對(duì)外提供創(chuàng)建繪圖窗口的函數(shù)。2.4graphicfile文件(1)VOIDSaveGraphic(LPCTSTRlpszFilename,GRAPHICS&g)/將傳入的圖形列表g存入lpszFilename中。(2)VOIDOpenGraphic(LPCTSTRlpszFilename,GRAPHICS&g)/將傳入的lpszFilename中所存的圖形載入列表g中。(3)VOIDClearGraphic(GRAPHICS&g)/將列表g中存儲(chǔ)的圖形清空。2.5t

7、ololbox文件(1)ATOMRegisterToolbarClass(HINSTANCEhInstance)/注冊(cè)工具窗口類的創(chuàng)建和工具按鈕窗口類的創(chuàng)建。(2)voidInitToolBox(PTOOLBOXpTb,HINSTANCEhInstance,HWNDhwnd,HWNDhWndWork)/設(shè)置工具窗口的初始化參數(shù),并且創(chuàng)建顯示。3(3)VOIDToolboxCreate(PTOOLBOXpTb)/創(chuàng)建工具窗口。(4)VOIDToolboxShow(PTOOLBOXpTb,BOOLfShow)/完成顯示窗口或隱藏窗口。(5)VOIDToolboxUpdate(PTOOLBOXpTb

8、)/有新文件打開或編輯時(shí)被調(diào)用,刷新工具窗口。(6)LRESULTCALLBACKToolboxWndProc(HWND,UINT,WPARAM,LPARAM)/工具窗口過程函數(shù),完成工具窗口的相關(guān)創(chuàng)建、關(guān)閉和銷毀的相關(guān)處理。(7)LRESULTCALLBACKToolBtnWndProc(HWND,UINT,WPARAM,LPARAM)/工具按鈕窗口過程函數(shù),完成按鈕的繪制,按鈕選擇消息發(fā)送的功能。(8)VOIDToolboxDrawBitmap(PTOOLBOXpTb,HDChDC,INTtool)/繪制對(duì)應(yīng)的Bitmap圖。(9)VOIDToolboxSelectTool(PTOOLBO

9、XpTb,INTtool)/將選擇的工具按鈕及其對(duì)應(yīng)鼠標(biāo)操作進(jìn)行更新,并且將工具按鈕改變消息發(fā)送給繪圖窗口。2.6Util文件(1)VOIDCenterWindow(HWNDhwnd)/將傳入的窗口至于他的GW_OWNER中間。(2)VOIDFitRectToScreen(PRECTprc)/保證給定的矩形在可見的窗口范圍內(nèi)。(3)HBITMAPMyCreateBitmap(HDChdc,INTcx,INTcy,INTnColors)/根據(jù)設(shè)定的條件創(chuàng)建Bitmap。(4)BOOLReadWindowPos(PSTR,PINT,PINT,PINT,PINT,BOOL,PSTR,PSTR)/讀取

10、對(duì)應(yīng)的windows相應(yīng)位置及狀態(tài)信息。(5)VOIDWriteWindowPos(PRECT,BOOL,PSTR,PSTR,PSTR)/暫時(shí)保存PRECT中的信息。(6)VOIDDrawSunkenRect(PRECTprc,HDChdc)/(7)VOIDDrawMarginBorder(HWNDhwnd,HDChdc)/繪制hwnd的矩形窗口。2.7PopFile文件(1)voidPopFileInitialize(HWNDhwnd)/設(shè)置文件初始的屬性。(2)BOOLPopFileOpenDlg(HWNDhwnd,PTSTRpstrFileName,PTSTRpstrTitleName)

11、/設(shè)置對(duì)應(yīng)打開文件時(shí)的特定屬性設(shè)置。(3)BOOLPopFileSaveDlg(HWNDhwnd,PTSTRpstrFileName,PTSTRpstrTitleName)/設(shè)置對(duì)應(yīng)保存文件時(shí)的特定屬性設(shè)置。2.8MYDRAW文件(1)在intAPIENTRYWinMain函數(shù)中添加如下代碼:if(!ColorSelectDlgRegisterClass(hInstance)returnFALSE;If(!RegisterToolbarClass(hInstance)returnFALSE;if(!RegisterDrawWndClass(hInstance)4returnFALSE;(2)L

12、RESULTCALLBACKDlgPenWidth(HWND,UINT,WPARAM,LPARAM)完成畫筆寬度對(duì)話框的相關(guān)實(shí)現(xiàn)。(3)在WndProc函數(shù)中,如果畫筆對(duì)話框中改變了參數(shù)值則將該消息發(fā)送給繪圖窗口。(4)在WM_CREATE消息中,完成繪圖窗口,調(diào)色板,工具欄的創(chuàng)建。(5)實(shí)現(xiàn)菜單欄中文件保存、打開、新建的消息傳遞,傳送給繪圖窗口。以及完成各子窗口的顯示和隱藏處理。(6)在WM_SIZE中根據(jù)調(diào)色板的大小,相應(yīng)的調(diào)整繪圖窗口的大小。三繪圖窗口的實(shí)現(xiàn)3.1DrawWnd窗口的產(chǎn)生3.1.1在主窗口的WM_CREATE中初始化窗口hWndDraw=CreateDrawWindod(

13、hWnd,(LPCREATESTRUCT)(lParam)-hInstance,2);3.1.2在主窗口WM_SIZE中調(diào)整顏色選擇窗口和繪圖窗口的相對(duì)大小caseWM_SIZE:if(GetWindowLong(hWndColor,GWL_STYLE)&WS_CHILD)RECTrt;GetWindowRect(hWndColor,&rt);ScreenToClient(hWnd,(LPPOINT)&rt);ScreenToClient(hWnd,(LPPOINT)&rt+1);MoveWindow(hWndDraw,0,rt.bottom,LOWORD(lParam),HIWORD(lPa

14、ram)-rt.bottom,TRUE);elseMoveWindow(hWndDraw,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;53.2結(jié)構(gòu)體定義typedefstructtagDrawStruPOINTptStart,ptEnd,ptPrev;COLORREFcolor;BOOLbMouseDown;HPENhPen;HBRUSHhBr;BOOLbFill;INTiPenWidth;PDRAWFUNpMouseDown,pMouseMove,pMouseUp;GRAPHICSg;PDRAWSHAPEpCurShp;DRAWSTRU,*PD

15、RAWSTRU;3.3drawfun.cpp文件中函數(shù)定義定義函數(shù)指針類型:typedefVOID(*PDRAWFUN)(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);繪制直線:VOIDLineMouseDown(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDLineMouseUp(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDLineMouseMove(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);繪制

16、矩形:VOIDRectMouseDown(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDRectMouseUp(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDRectMouseMove(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);繪制橢圓:VOIDEllipseMouseDown(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDEllipseMouseUp(PVOIDpDs,HWNDhWnd,WP

17、ARAMwParam,LPARAMlParam);6VOIDEllipseMouseMove(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);繪制線條:VOIDPenMouseDown(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDPenMouseUp(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDPenMouseMove(PVOIDpDs,HWNDhWnd,WPARAMwParam,LPARAMlParam);VOIDDrawShape(HDChd

18、c,PDRAWSHAPE&pShp);VOIDDrawGraphics(HDChdc,GRAPHICS&g);繪制橡皮擦:VOID EraserMouseDown(PVOID pDs, HWND hWnd, WPARAM wParam, LPARAM lParam);VOID EraserMouseUp(PVOID pDs, HWND hWnd, WPARAM wParam, LPARAM lParam);VOID EraserMouseMove(PVOID pDs, HWND hWnd, WPARAM wParam, LPARAM lParam);3.4圖形的繪制3.4.1基本原理鼠標(biāo)按下時(shí)

19、,即產(chǎn)生WM_LBUTTONDOWN消息時(shí)記錄鼠標(biāo)按下點(diǎn)的坐標(biāo),鼠標(biāo)移動(dòng)產(chǎn)生WM_MOUSEMOVE消息并進(jìn)行進(jìn)行相應(yīng)繪制,且在過程中將上一次所畫圖像用背景色擦掉。鼠標(biāo)彈起產(chǎn)生WM_LBUTTONUP消息,記錄相應(yīng)最終坐標(biāo)并繪制圖形。3.4.2主要代碼(以矩形為例)(1)鼠標(biāo)按下VOID RectMouseDown( PVOID pV,HWND hWnd,WPARAM wParam,LPARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;pDs-ptStart.x=GET_X_LPARAM(lParam);pDs-ptStart.y=GET_Y_LPARAM

20、(lParam);pDs-ptEnd.x=pDs-ptStart.x;pDs-ptEnd.y=pDs-ptStart.y;pDs-bMouseDown=TRUE;/-新建DRAWSHAPE對(duì)象以存儲(chǔ)矩形的信息PDRAWRECT pRect;PDRAWSHAPE pShp;pShp=new DRAWSHAPE;pDs-pCurShp=pShp;pShp-color=pDs-color;pShp-shape=SHAPERECT;pShp-penWidth=pDs-iPenWidth;pRect=new DRAWRECT;pShp-pData=pRect;pRect-rect.left=pDs-pt

21、Start.x;pRect-rect.top=pDs-ptStart.y;pRect-rect.right=pDs-ptEnd.x;pRect-rect.bottom=pDs-ptEnd.y;pRect-bFill=pDs-bFill;/-新建DRAWSHAPE對(duì)象以存儲(chǔ)矩形的信息SetCapture(hWnd); (2)鼠標(biāo)移動(dòng)VOID RectMouseMove( PVOID pV,HWND hWnd,WPARAM wParam,LPARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;HDC hdc;if(pDs-bMouseDown)hdc=GetDC

22、(hWnd);SetROP2(hdc,R2_NOT);SelectObject(hdc,GetStockObject(NULL_BRUSH);Rectangle(hdc,pDs-ptStart.x,pDs-ptStart.y,pDs-ptEnd.x,pDs-ptEnd.y);pDs-ptEnd.x=GET_X_LPARAM(lParam);pDs-ptEnd.y=GET_Y_LPARAM(lParam);Rectangle(hdc,pDs-ptStart.x,pDs-ptStart.y,pDs-ptEnd.x,pDs-ptEnd.y);ReleaseDC(hWnd,hdc);(3)鼠標(biāo)彈起VO

23、ID RectMouseUp( PVOID pV,HWND hWnd,WPARAM wParam,LPARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;HDC hdc;HBRUSH hBrOld;pDs-bMouseDown=FALSE;ReleaseCapture();hdc=GetDC(hWnd);SetROP2(hdc,R2_NOT);SelectObject(hdc,GetStockObject(NULL_BRUSH);Rectangle(hdc,pDs-ptStart.x,pDs-ptStart.y,pDs-ptEnd.x,pDs-ptEnd.y

24、);pDs-ptEnd.x=GET_X_LPARAM(lParam);pDs-ptEnd.y=GET_Y_LPARAM(lParam);SetROP2(hdc,R2_COPYPEN);HPEN hPenOld=(HPEN)SelectObject(hdc,pDs-hPen);/增加的畫筆選擇代碼if(pDs-bFill)hBrOld=(HBRUSH)SelectObject(hdc,pDs-hBr);Rectangle(hdc,pDs-ptStart.x,pDs-ptStart.y,pDs-ptEnd.x,pDs-ptEnd.y);SelectObject(hdc,hPenOld);/增加的選

25、出畫筆的代碼if(pDs-bFill)SelectObject(hdc,hBrOld);ReleaseDC(hWnd,hdc);/-取得DRAWSHAPE對(duì)象以存儲(chǔ)矩形的信息PDRAWRECT pRect;PDRAWSHAPE pShp;pShp=pDs-pCurShp;pRect=(PDRAWRECT)pShp-pData;if(pDs-ptStart.x=pDs-ptEnd.x)&(pDs-ptEnd.y=pDs-ptStart.y)/如果起點(diǎn)與終點(diǎn)相同則刪除矩形delete pRect;delete pShp;pDs-pCurShp=NULL;else/存儲(chǔ)矩形pRect-rect.ri

26、ght=pDs-ptEnd.x;pRect-rect.bottom=pDs-ptEnd.y;pDs-g.AddTail(pShp);pDs-pCurShp=NULL;/-將新建DRAWSHAPE對(duì)象添加到g中四工具選擇窗口的實(shí)現(xiàn)4.1資源編輯在ResourseView中插入資源類型Bitmap,在Bitmap中插入Bitmap,繪制自己所需的圖標(biāo),每種圖標(biāo)對(duì)應(yīng)兩個(gè)位圖,鼠標(biāo)按下和彈起對(duì)應(yīng)不同的位圖從而實(shí)現(xiàn)按鈕效4.2工具欄窗口的產(chǎn)生在主窗口的WM_CREATE消息中調(diào)用函數(shù):InitToolBox(&Tb,(LPCREATESTRUCT)(lParam)-hInstance,hWndDraw)

27、;產(chǎn)生工具欄窗口。該函數(shù)在ToolBox.cpp中,包括初始化工具欄的一些設(shè)置,設(shè)置默認(rèn)的第一個(gè)工具按鈕,創(chuàng)建工具窗口,最后使窗口可見。4.3工具欄按鈕效果的實(shí)現(xiàn)4.3.1基本原理初始化時(shí)將所有彈起時(shí)的位圖選入設(shè)備描述句柄,并拷貝到窗口對(duì)應(yīng)的矩形區(qū)域,當(dāng)鼠標(biāo)按下時(shí),在指定位置拷貝新的位圖將原位圖覆蓋即可實(shí)現(xiàn)按鈕效果4.3.2結(jié)構(gòu)體和數(shù)組staticTOOLSaTools=PenMouseDown,PenMouseMove,PenMouseUp,NULL,IDBM_TUPENCIL,NULL,IDBM_TDPENCIL,NULL,FALSE,LineMouseDown,LineMouseMove

28、,LineMouseUp,NULL,IDBM_TULINE,NULL,IDBM_TDLINE,NULL,FALSE,RectMouseDown,RectMouseMove,RectMouseUp,NULL,IDBM_TURECT,NULL,IDBM_TDRECT,NULL,FALSE,RectMouseDown,RectMouseMove,RectMouseUp,NULL,IDBM_TUSRECT,NULL,IDBM_TDSRECT,NULL,TRUE,EllipseMouseDown,EllipseMouseMove,EllipseMouseUp,NULL,IDBM_TUCIRCLE,NUL

29、L,IDBM_TDCIRCLE,NULL,FALSE,EllipseMouseDown,EllipseMouseMove,EllipseMouseUp,NULL,IDBM_TUSCIRCLE,NULL,IDBM_TDSCIRCLE,NULL,TRUE,;/定義一個(gè)aTools數(shù)組保存按鈕對(duì)應(yīng)的函數(shù)及對(duì)應(yīng)的按下及彈起位圖的ID。4.3.3實(shí)現(xiàn)的部分代碼VOIDToolboxCreate(PTOOLBOXpTb)BITMAPbmp;INTi;INTx;INTy;INTcx;INTcy;RECTrc;RECTrcClient;POINTpt;UINTcxToolBtn,cyToolBtn;11for

30、(i=0;iiToolBtnCount;i+)if(!(pTb-aToolsi.hbmToolBtnUp=LoadBitmap(pTb-hInst,MAKEINTRESOURCE(pTb-aToolsi.idbmToolBtnUp)return;if(!(pTb-aToolsi.hbmToolBtnDown=LoadBitmap(pTb-hInst,MAKEINTRESOURCE(pTb-aToolsi.idbmToolBtnDown)return;GetObject(pTb-aTools0.hbmToolBtnUp,sizeof(BITMAP),(PSTR)&bmp);cxToolBtn=p

31、Tb-cxToolBtn=bmp.bmWidth;cyToolBtn=pTb-cyToolBtn=bmp.bmHeight;rc.left=0;rc.top=0;rc.right=PALETTEMARGIN+(pTb-cxToolBtn-1)*pTb-iToolboxColumns)+1+PALETTEMARGIN;rc.bottom=PALETTEMARGIN+(pTb-cyToolBtn-1)*(pTb-iToolBtnCount+pTb-iToolboxColumns-1)/pTb-iToolboxColumns)+1+PALETTEMARGIN;AdjustWindowRect(&rc

32、,TOOLBOXSTYLE,FALSE);cx=rc.right-rc.left;cy=rc.bottom-rc.top;GetClientRect(pTb-hwndMain,&rcClient);pt.x=rcClient.right-cx-(2*PALETTEMARGIN);pt.y=rcClient.top+pTb-yBegin+(2*PALETTEMARGIN);ClientToScreen(pTb-hwndMain,&pt);SetRect(&rc,pt.x,pt.y,pt.x+cx,pt.y+cy);FitRectToScreen(&rc);x=rc.left;y=rc.top;1

33、2if(!(pTb-hwndToolbox=CreateWindow(szToolboxClass,pTb-szTBName,TOOLBOXSTYLE,x,y,cx,cy,pTb-hwndMain,NULL,pTb-hInst,(LPVOID)pTb)return;x=PALETTEMARGIN;y=PALETTEMARGIN;for(i=0;iiToolBtnCount;i+)CreateWindow(szToolBtnClass,NULL,WS_CHILD|WS_VISIBLE,x,y,pTb-cxToolBtn,pTb-cyToolBtn,pTb-hwndToolbox,(HMENU)i

34、,pTb-hInst,(LPVOID)pTb);if(i+1)%pTb-iToolboxColumns)x+=pTb-cxToolBtn-1;elsex=PALETTEMARGIN;y+=pTb-cyToolBtn-1;ToolboxUpdate(pTb);4.4消息傳遞4.4.1實(shí)現(xiàn)原理在ToolBtnWndProc函數(shù)的WM_LBUTTONDOWN消息響應(yīng)在工具窗口中重新選擇工具欄中的工具按鈕,選擇后調(diào)用函數(shù)ToolboxSelectTool(pTb,(UINT)GetWindowLong(hwnd),GWL_ID)。如果當(dāng)前選擇改變了工具按鈕則發(fā)送消息給繪圖窗口,并且在WM_PAINT中

35、在重新選擇后進(jìn)行重繪。4.4.2部分代碼13在ToolBtnWndProc函數(shù)中:caseWM_LBUTTONDOWN:pTb=(PTOOLBOX)GetWindowLong(hwnd,GWL_USERDATA);ToolboxSelectTool(pTb,(UINT)GetWindowLong(hwnd),GWL_ID);繪圖窗口WndDrawProc函數(shù)中:caseWM_TOOLCHANGE:pTb=(PTOOLBOX)wParam;ds.bFill=pTb-bFill;ds.pMouseDown=pTb-pMouseDown;ds.pMouseMove=pTb-pMouseMove;ds

36、.pMouseUp=pTb-pMouseUp;break;caseWM_LBUTTONDOWN:(ds.pMouseDown)(&ds,hWnd,wParam,lParam);break;caseWM_LBUTTONUP:(ds.pMouseUp)(&ds,hWnd,wParam,lParam);break;caseWM_MOUSEMOVE:(ds.pMouseMove)(&ds,hWnd,wParam,lParam);break;五調(diào)色板的實(shí)現(xiàn)5.1窗口的產(chǎn)生5.1.1注冊(cè)調(diào)色板窗口類,然后在主窗口的WM_CREATE消息中調(diào)用以下在ColorSelect.cpp中定義的函數(shù)產(chǎn)生調(diào)色板窗口。

37、HWNDCreateColorSelectDlg(LPCTSTRlpWindowName,DWORDdwStyle,HWNDhWndParent,HINSTANCEhInstance,HWNDhWndSendTo)return14CreateWindow(szColorBoxClass,lpWindowName,dwStyle,0,0,0,0,hWndParent,NULL,hInstance,(LPVOID)hWndSendTo);5.1.2截圖5.2調(diào)色功能實(shí)現(xiàn)5.2.1實(shí)現(xiàn)原理注冊(cè)ColorBoxClass窗口類,在ColorBoxProc函數(shù)中定義顏色數(shù)組staticDWORDargb

38、DefaultColor=RGB(255,255,255),RGB(0,0,0),RGB(192,192,192),RGB(128,128,128),RGB(255,0,0),RGB(128,0,0),RGB(255,255,0),RGB(128,128,0),RGB(0,255,0),RGB(0,128,0),RGB(0,255,255),RGB(0,128,128),RGB(0,0,255),RGB(0,0,128),RGB(255,0,255),RGB(128,0,128),RGB(255,255,128),RGB(128,128,64),RGB(0,255,128),RGB(0,64,

39、64),RGB(128,255,255),RGB(0,128,255),RGB(128,128,255),RGB(0,64,128),RGB(255,0,128),RGB(64,0,128),RGB(255,128,64),RGB(128,64,0);在WM_CREATE消息中確定要產(chǎn)生的調(diào)色板的具體參數(shù),并且調(diào)整窗口的大小,在WM_PAINT消息中繪制對(duì)應(yīng)的顏色按鈕。155.2.2部分代碼caseWM_CREATE:hWndSendTo=(HWND)(LPCREATESTRUCT)(lParam)-lpCreateParams);argbCurrent=argbDefaultColor;nM

40、argin=5;cxColorBox=30;xColorBoxStart=nMargin;yColorBoxStart=nMargin;nColorRows=2;nColorCols=14;nColorCount=28;nWidth=nMargin*2+cxColorBox*nColorCols;nHeight=nMargin*2+cxColorBox*nColorRows;pt.x=0;pt.y=0;if(!(GetWindowLong(hWnd,GWL_STYLE)&WS_CHILD)ClientToScreen(GetParent(hWnd),&pt);rt.top=pt.y;rt.le

41、ft=pt.x;rt.bottom=pt.y+nHeight;rt.right=pt.x+nWidth;AdjustWindowRect(&rt,GetWindowLong(hWnd,GWL_STYLE),FALSE);MoveWindow(hWnd,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,TRUE);break;caseWM_PAINT:hdc=BeginPaint(hWnd,&ps);x=xColorBoxStart;y=yColorBoxStart;for(i=1;i=0&nCol=0&nRownColorRows)i=nCol*

42、nColorRows+nRow;color=argbCurrenti;17SendMessage(hWndSendTo,WM_CHANGECOLOR,(WPARAM)0,(LPARAM)color);break;將消息發(fā)送給繪圖窗口,并產(chǎn)生相應(yīng)的消息處理:caseWM_CHANGECOLOR:DeleteObject(ds.hBr);DeleteObject(ds.hPen);ds.color=(COLORREF)(lParam);ds.hBr=CreateSolidBrush(ds.color);ds.hPen=CreatePen(PS_SOLID,ds.iPenWidth,ds.color

43、);六畫筆寬度調(diào)節(jié)實(shí)現(xiàn)6.1創(chuàng)建畫筆寬度調(diào)節(jié)對(duì)話框設(shè)計(jì)對(duì)話框,如下圖:6.2實(shí)現(xiàn)原理在MYDRAW.cpp中創(chuàng)建對(duì)話框,并且在WndProc函數(shù)中的IDM_PEN中將WM_CHANGEPENWIDTH的消息傳遞給繪圖窗口。6.3部分代碼在DlgPenWidth函數(shù)中重要處理代碼如下:caseWM_INITDIALOG:18piPenWidth=(INT*)(lParam);hWndSpin=GetDlgItem(hDlg,IDC_SPIN_PEN);SetDlgItemInt(hDlg,IDC_PEN,*piPenWidth,FALSE);SendMessage(hWndSpin,UDM_SE

44、TRANGE,(WPARAM)0,(LPARAM)MAKELONG(10,1);returnTRUE;caseIDOK:*piPenWidth=GetDlgItemInt(hDlg,IDC_PEN,&bSuccessed,FALSE);EndDialog(hDlg,LOWORD(wParam);break;在主窗口中WndProc函數(shù)中:(傳送消息給繪圖窗口)caseIDM_PEN:if(DialogBoxParam(hInst,(LPCTSTR)IDD_DLG_PENWIDTH,hWnd,(DLGPROC)DlgPenWidth,(LPARAM)&iPenWidth)=IDOK)SendMe

45、ssage(hWndDraw,WM_CHANGEPENWIDTH,(WPARAM)0,(LPARAM)iPenWidth);break;在繪圖窗口中處理WM_CHANGEPENWIDTH消息代碼:caseWM_CHANGEPENWIDTH:ds.iPenWidth=(INT)(lParam);DeleteObject(ds.hPen);ds.hPen=CreatePen(PS_SOLID,ds.iPenWidth,ds.color);break;七保存、新建與打開功能的實(shí)現(xiàn)7.1實(shí)現(xiàn)截圖當(dāng)在File菜單下,選擇對(duì)應(yīng)的Open,Save,SaveAs,New時(shí)彈出如下對(duì)話框。197.2部分代碼v

46、oidPopFileInitialize(HWNDhwnd)初始化定義的staticOPENFILENAMEofn變量。BOOLPopFileOpenDlg(HWNDhwnd,PTSTRpstrFileName,PTSTRpstrTitleName)ofn.hwndOwner=hwnd;ofn.lpstrFile=pstrFileName;ofn.lpstrFileTitle=pstrTitleName;ofn.Flags=OFN_HIDEREADONLY|OFN_CREATEPROMPT;returnGetOpenFileName(&ofn);/對(duì)應(yīng)打開時(shí)文件的屬性設(shè)置BOOLPopFileSaveDlg(HWNDhwnd,PTSTRpstrFileName,PTSTRpstrTitleName)ofn.hwndOwner=hwnd;ofn.lpstrFile=pstrFileName;ofn.lpstrFileTitle=pstrTitleName;ofn.Flags=OFN_OVERWRITEPROMPT;20returnGetSaveFileName(&ofn);/對(duì)應(yīng)保存文件的屬性設(shè)置在主窗口中菜單項(xiàng)中選擇對(duì)應(yīng)的功能,將消息但送給繪圖窗口,例如:caseIDM_SAVEA:SendMessa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論