版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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)下編寫(xiě)軟件的方法,熟悉消息驅(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)行分類(lèi):一 窗口描述本項(xiàng)目共創(chuàng)建四個(gè)窗口,分別是:(1)類(lèi)名為 MyRegisterClass 的父窗口,包括各種菜單項(xiàng);(2)繪圖窗口(RegisterDrawWndClass):主要實(shí)現(xiàn)基本的繪圖功能;(3)工具選擇窗口(RegisterToolbarClass):實(shí)現(xiàn)繪圖工具的選擇功能;(4)調(diào)色板窗口(ColorSelectDlgRegisterClass):實(shí)現(xiàn)顏色的選擇功能。本項(xiàng)目還包括一個(gè)改變畫(huà)筆寬度的菜單項(xiàng),通過(guò)發(fā)送消息 WM_CHANGEPENWIDTH 給繪圖窗口以改變繪圖中畫(huà)
3、筆的寬度。主界面截圖:二各項(xiàng)目文件中的函數(shù)及其主要功能2繪制弧線繪制直線繪制矩形繪制橢圓鼠標(biāo)落下PenMouseDownLineMouseDownRectMouseDownEllipseMouseDown鼠標(biāo)彈起PenMouseUpLineMouseUpRectMouseUpEllipseMouseUp鼠標(biāo)移動(dòng)PenMouseMoveLineMouseMoveRectMouseMoveEllipseMouseMove2.1 colorSelectDlgS 文件(1)ATOM ColorSelectDlgRegisterClass(HINSTANCE hI
4、nstance)/進(jìn)行調(diào)色板窗口的注冊(cè)。(2)LRESULT CALLBACK ColorBoxProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAMlParam)/調(diào)色板窗口過(guò)程函數(shù),創(chuàng)建調(diào)色板,并捕獲顏色改變消息,并發(fā)送給繪圖窗口。(3)HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWNDhWndParent,HINSTANCE hInstance,HWND hWndSendTo)
5、/對(duì)外提供創(chuàng)建調(diào)色板窗口的函數(shù)。2.2 drawfun 文件(1)typedef VOID (*PDRAWFUN)( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);指針函數(shù),帶入相應(yīng)的函數(shù)名即可完成相應(yīng)的繪圖操作,可帶入的函數(shù)名如下表格:(2)VOID DrawShape(HDC hdc,PDRAWSHAPE &pShp)/根據(jù)傳入的圖形參數(shù),繪制相應(yīng)的圖形。(3)VOID DrawGraphics(HDC
6、 hdc,GRAPHICS &g)/根據(jù)傳入的圖形列表,逐個(gè)繪制保存的圖形。2.3 drawwnd 文件(1)LRESULT CALLBACK WndDrawProc(HWND, UINT , WPARAM , LPARAM)/繪圖窗口過(guò)程函數(shù),完成文件新建,打開(kāi),保存,鼠標(biāo)落下、彈起、移動(dòng),工具改變,顏色改變,畫(huà)筆寬度改變等消息的處理。(2)ATOM RegisterDrawWndClass(HINSTANCE hInstance)/進(jìn)行繪圖窗口注冊(cè)。(3
7、)HWND CreateDrawWindod(HWND ,HINSTANCE ,UINT)/對(duì)外提供創(chuàng)建繪圖窗口的函數(shù)。2.4 graphicfile 文件(1)VOID SaveGraphic(LPCTSTR lpszFilename,GRAPHICS &g)/將傳入的圖形列表 g 存入 lpszFilename 中。(2)VOID OpenGraphic(LPCTSTR lpszFilename,GRAPHICS &g)/將傳
8、入的 lpszFilename 中所存的圖形載入列表 g 中。(3)VOID ClearGraphic(GRAPHICS &g)/將列表 g 中存儲(chǔ)的圖形清空。2.5 tololbox 文件(1)ATOM RegisterToolbarClass(HINSTANCE hInstance)/注冊(cè)工具窗口類(lèi)的創(chuàng)建和工具按鈕窗口類(lèi)的創(chuàng)建。(2)void InitToolBox(PTOOLBOX pTb,HINSTANCE hInstance,H
9、WND hwnd,HWNDhWndWork)/設(shè)置工具窗口的初始化參數(shù),并且創(chuàng)建顯示。3(3)VOID ToolboxCreate(PTOOLBOX pTb)/創(chuàng)建工具窗口。(4)VOID ToolboxShow(PTOOLBOX pTb,BOOL fShow)/完成顯示窗口或隱藏窗口。(5)VOID ToolboxUpdate(PTOOLBOX pTb)/有新文件打開(kāi)或編輯時(shí)被調(diào)用,刷新工具窗口。(6)LRESULT CALLBACK ToolboxWndProc(HWND ,
10、60;UINT ,WPARAM ,LPARAM )/工具窗口過(guò)程函數(shù),完成工具窗口的相關(guān)創(chuàng)建、關(guān)閉和銷(xiāo)毀的相關(guān)處理。(7)LRESULT CALLBACK ToolBtnWndProc(HWND , UINT ,WPARAM ,LPARAM )/工具按鈕窗口過(guò)程函數(shù),完成按鈕的繪制,按鈕選擇消息發(fā)送的功能。(8)VOID ToolboxDrawBitmap(PTOOLBOX pTb,HDC hDC,INT tool)/繪制對(duì)應(yīng)的 Bi
11、tmap圖。(9)VOID ToolboxSelectTool(PTOOLBOX pTb,INT tool)/將選擇的工具按鈕及其對(duì)應(yīng)鼠標(biāo)操作進(jìn)行更新,并且將工具按鈕改變消息發(fā)送給繪圖窗口。2.6 Util 文件(1)VOID CenterWindow(HWND hwnd)/將傳入的窗口至于他的 GW_OWNER 中間。(2)VOID FitRectToScreen(PRECT prc)/保證給定的矩形在可見(jiàn)的窗口范圍內(nèi)。(3)HBITMAP MyCreateBitmap(H
12、DC hdc, INT cx, INT cy, INT nColors)/根據(jù)設(shè)定的條件創(chuàng)建 Bitmap。(4)BOOL ReadWindowPos(PSTR , PINT , PINT, PINT , PINT,BOOL ,PSTR ,PSTR )/讀取對(duì)應(yīng)的 windows 相應(yīng)位置及狀態(tài)信息。(5)VOID WriteWindowPos(PRECT, BOOL
13、, PSTR,PSTR ,PSTR )/暫時(shí)保存 PRECT 中的信息。(6)VOID DrawSunkenRect(PRECT prc,HDC hdc)/(7)VOID DrawMarginBorder(HWND hwnd,HDC hdc)/繪制 hwnd 的矩形窗口。2.7 PopFile 文件(1)void PopFileInitialize (HWND hwnd)/設(shè)置文件初始的屬性。(2)BOOL
14、;PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)/設(shè)置對(duì)應(yīng)打開(kāi)文件時(shí)的特定屬性設(shè)置。(3)BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)/設(shè)置對(duì)應(yīng)保存文件時(shí)的特定屬性設(shè)置。2.8 MYDRAW 文件(1)在 int APIENTRY
15、WinMain 函數(shù)中添加如下代碼:if(!ColorSelectDlgRegisterClass(hInstance)return FALSE;If(!RegisterToolbarClass(hInstance)return FALSE;if(!RegisterDrawWndClass(hInstance)4return FALSE;(2)LRESULT CALLBACK DlgPenWidth(HWND, UINT , WPARAM , LPARAM )完成畫(huà)筆寬度對(duì)話
16、框的相關(guān)實(shí)現(xiàn)。(3)在 WndProc 函數(shù)中,如果畫(huà)筆對(duì)話框中改變了參數(shù)值則將該消息發(fā)送給繪圖窗口。(4)在 WM_CREATE 消息中,完成繪圖窗口,調(diào)色板,工具欄的創(chuàng)建。(5)實(shí)現(xiàn)菜單欄中文件保存、打開(kāi)、新建的消息傳遞,傳送給繪圖窗口。以及完成各子窗口的顯示和隱藏處理。(6)在 WM_SIZE 中根據(jù)調(diào)色板的大小,相應(yīng)的調(diào)整繪圖窗口的大小。三 繪圖窗口的實(shí)現(xiàn)3.1 DrawWnd 窗口的產(chǎn)生3.1.1 在主窗口的WM_CREATE中初始化窗口hWndDraw=CreateDrawWindo
17、d(hWnd,(LPCREATESTRUCT)(lParam)->hInstance,2);3.1.2 在主窗口WM_SIZE中調(diào)整顏色選擇窗口和繪圖窗口的相對(duì)大小case WM_SIZE:if(GetWindowLong(hWndColor,GWL_STYLE)&WS_CHILD)RECT rt;GetWindowRect(hWndColor,&rt);ScreenToClient(hWnd,(LPPOINT)&rt);ScreenToClient(hWnd,(LPPOINT)&rt+1);MoveWindow(hWndDr
18、aw,0,rt.bottom,LOWORD(lParam),HIWORD(lParam)-rt.bottom,TRUE);elseMoveWindow(hWndDraw,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;53.2 結(jié)構(gòu)體定義typedef struct tagDrawStruPOINT ptStart,ptEnd,ptPrev;COLORREF color;BOOL bMouseDown;HPEN hPen;HBRUSH hBr;BOOL bFil
19、l;INT iPenWidth;PDRAWFUN pMouseDown,pMouseMove,pMouseUp;GRAPHICS g;PDRAWSHAPE pCurShp; DRAWSTRU,*PDRAWSTRU;3.3 drawfun.cpp 文件中函數(shù)定義定義函數(shù)指針類(lèi)型 :typedef VOID (*PDRAWFUN)( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);繪制直線:VOID&
20、#160;LineMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID LineMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID LineMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);繪制矩形:VOID&
21、#160;RectMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID RectMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID RectMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);繪制橢圓:VOID&
22、#160;EllipseMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID EllipseMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);6VOID EllipseMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);
23、繪制線條:VOID PenMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID PenMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID PenMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOI
24、D DrawShape(HDC hdc,PDRAWSHAPE &pShp);VOID DrawGraphics(HDC hdc,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, HWN
25、D hWnd, WPARAM wParam, LPARAM lParam);3.4 圖形的繪制3.4.1 基本原理鼠標(biāo)按下時(shí),即產(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)繪制,且在過(guò)程中將上一次所畫(huà)圖像用背景色擦掉。鼠標(biāo)彈起產(chǎn)生 WM_LBUTTONUP 消息,記錄相應(yīng)最終坐標(biāo)并繪制圖形。3.4.2 主要代碼(以矩形為例)(1)鼠標(biāo)按下VOID RectMouseDown( PVOID pV,HWND hWnd,WPARAM wParam
26、,LPARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;pDs->ptStart.x=GET_X_LPARAM(lParam);pDs->ptStart.y=GET_Y_LPARAM(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->p
27、CurShp=pShp;pShp->color=pDs->color;pShp->shape=SHAPERECT;pShp->penWidth=pDs->iPenWidth;pRect=new DRAWRECT;pShp->pData=pRect;pRect->rect.left=pDs->ptStart.x;pRect->rect.top=pDs->ptStart.y;pRect->rect.right=pDs->ptEnd.x;pRect->rect.bottom=pDs->ptEnd.y;pRect-&g
28、t;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(hWnd);SetROP2(hdc,R2_NOT);SelectObject(hdc,GetStockObject(NULL_BRUSH);Rectangle(hdc,pDs->
29、;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)彈起VOID RectMouseUp( PVOID pV,HWND hWnd,WPARAM wParam,LPA
30、RAM 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);pDs->ptEnd.x=GET_X_LPARAM(l
31、Param);pDs->ptEnd.y=GET_Y_LPARAM(lParam);SetROP2(hdc,R2_COPYPEN);HPEN hPenOld=(HPEN)SelectObject(hdc,pDs->hPen);/增加的畫(huà)筆選擇代碼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);/
32、增加的選出畫(huà)筆的代碼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 pSh
33、p;pDs->pCurShp=NULL;else/存儲(chǔ)矩形pRect->rect.right=pDs->ptEnd.x;pRect->rect.bottom=pDs->ptEnd.y;pDs->g.AddTail(pShp);pDs->pCurShp=NULL;/-將新建DRAWSHAPE對(duì)象添加到g中四 工具選擇窗口的實(shí)現(xiàn)4.1 資源編輯在 Resourse View 中插入資源類(lèi)型 Bitmap,在 Bitmap 中插入 Bitmap,繪制自己所需的圖標(biāo),每種
34、圖標(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);產(chǎn)生工具欄窗口。該函數(shù)在 ToolBox.cpp 中,包括初始化工具欄的一些設(shè)置,設(shè)置默認(rèn)的第一個(gè)工具按鈕,創(chuàng)建工具窗口,最后使窗口可見(jiàn)。4.3 工具欄按鈕效果的實(shí)現(xiàn)4.3.1 基本原理初始化時(shí)將所有彈起時(shí)的位圖選入設(shè)備描述句柄,并拷貝到窗口對(duì)應(yīng)的矩形區(qū)域,當(dāng)
35、鼠標(biāo)按下時(shí),在指定位置拷貝新的位圖將原位圖覆蓋即可實(shí)現(xiàn)按鈕效果4.3.2 結(jié)構(gòu)體和數(shù)組static TOOLS aTools = PenMouseDown,PenMouseMove,PenMouseUp, NULL,IDBM_TUPENCIL, NULL,IDBM_TDPENCIL, NULL,FALSE, LineMouseDown,LineMouseMove,LineMouseUp,NULL,IDBM_TULINE,NULL,IDBM_TDLINE,NULL,FAL
36、SE, 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, NULL,IDBM_TDCIRCLE,
37、60;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)的部分代碼VOID ToolboxCreate(PTOOLBOX pTb)BITMAP bmp;INT i;INT x;INT
38、 y;INT cx;INT cy;RECT rc;RECT rcClient;POINT pt;UINT cxToolBtn,cyToolBtn;11for (i = 0; i < pTb->iToolBtnCount; i+) if (!(pTb->aToolsi.hbmToolBtnUp= LoadBitmap(pTb->hInst,MAKEINTRESOURCE(pTb->aToolsi.i
39、dbmToolBtnUp)return;if (!(pTb->aToolsi.hbmToolBtnDown = LoadBitmap(pTb->hInst,MAKEINTRESOURCE(pTb->aToolsi.idbmToolBtnDown)return;GetObject(pTb->aTools0.hbmToolBtnUp, sizeof(BITMAP), (PSTR)&bmp);cxToolBtn=pTb->cxToolBtn= bmp.bmWidth;cyToolBtn=pTb->
40、cyToolBtn= bmp.bmHeight;rc.left = 0;rc.top = 0;rc.right = PALETTEMARGIN + (pTb->cxToolBtn - 1) * pTb->iToolboxColumns) +1 + PALETTEMARGIN;rc.bottom = PALETTEMARGIN + (pTb->cyToolBtn -
41、60;1) *(pTb->iToolBtnCount +pTb->iToolboxColumns-1)/ pTb->iToolboxColumns)+ 1 + PALETTEMARGIN;AdjustWindowRect(&rc, TOOLBOXSTYLE, FALSE);cx = rc.right - rc.left;cy = rc.bottom - rc.top;GetClientRect(pTb->
42、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
43、.y, pt.x + cx, pt.y + cy);FitRectToScreen(&rc);x = rc.left;y = rc.top;12if (!(pTb->hwndToolbox = CreateWindow(szToolboxClass, pTb->szTBName,TOOLBOXSTYLE,x, y, cx, cy,pTb->hwndMai
44、n, NULL,pTb->hInst,(LPVOID)pTb )return;x = PALETTEMARGIN;y = PALETTEMARGIN;for (i = 0; i <pTb->iToolBtnCount; i+) CreateWindow(szToolBtnClass, NULL,WS_CHILD | WS_VISIBLE,x, y,pTb->cxToolBtn,pTb->cyToo
45、lBtn,pTb->hwndToolbox, (HMENU)i,pTb->hInst, (LPVOID)pTb );if (i+1)%pTb->iToolboxColumns) x +=pTb->cxToolBtn - 1;else x = PALETTEMARGIN;y += pTb->cyToolBtn - 1;ToolboxUpdate(pTb);4.4 消息傳遞4.4.1 實(shí)現(xiàn)原理在
46、60;ToolBtnWndProc 函數(shù)的 WM_LBUTTONDOWN 消息響應(yīng)在工具窗口中重新選擇工具欄中的工具按鈕,選擇后調(diào)用函數(shù) ToolboxSelectTool(pTb,(UINT)GetWindowLong(hwnd),GWL_ID)。如果當(dāng)前選擇改變了工具按鈕則發(fā)送消息給繪圖窗口,并且在 WM_PAINT 中在重新選擇后進(jìn)行重繪。4.4.2 部分代碼13在 ToolBtnWndProc 函數(shù)中:case WM_LBUTTONDOWN:pTb=(PTOOLBOX)GetWindow
47、Long(hwnd,GWL_USERDATA);ToolboxSelectTool(pTb,(UINT)GetWindowLong(hwnd), GWL_ID);繪圖窗口 WndDrawProc 函數(shù)中:case WM_TOOLCHANGE:pTb=(PTOOLBOX)wParam;ds.bFill=pTb->bFill;ds.pMouseDown=pTb->pMouseDown;ds.pMouseMove=pTb->pMouseMove;ds.pMouseUp=pTb->pMouseUp;break;case WM_L
48、BUTTONDOWN:(ds.pMouseDown)(&ds,hWnd,wParam,lParam);break;case WM_LBUTTONUP:(ds.pMouseUp)(&ds,hWnd,wParam,lParam);break;case WM_MOUSEMOVE:(ds.pMouseMove)(&ds,hWnd,wParam,lParam);break;五 調(diào)色板的實(shí)現(xiàn)5.1 窗口的產(chǎn)生5.1.1 注冊(cè)調(diào)色板窗口類(lèi),然后在主窗口的 WM_CREATE 消息中調(diào)用以下在ColorSelect.
49、cpp 中定義的函數(shù)產(chǎn)生調(diào)色板窗口。HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWNDhWndParent,HINSTANCE hInstance,HWND hWndSendTo)return14CreateWindow(szColorBoxClass,lpWindowName,dwStyle,0,0,0,0,hWndParent,NULL,hInstance,(LPVOID)hWndSendTo);5.1.2 截圖5.2 調(diào)色功能實(shí)現(xiàn)
50、5.2.1 實(shí)現(xiàn)原理注冊(cè) ColorBoxClass 窗口類(lèi),在 ColorBoxProc 函數(shù)中定義顏色數(shù)組static DWORD argbDefaultColor =RGB(255, 255, 255), RGB(0, 0, 0),RGB(192, 192, 192), RGB(128, 128, 128),RGB(255, 0, 0),RGB(128, 0,
51、;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),
52、;RGB(128, 128, 64),RGB(0, 255, 128),RGB(0, 64, 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, 6
53、4, 0);在 WM_CREATE 消息中確定要產(chǎn)生的調(diào)色板的具體參數(shù),并且調(diào)整窗口的大小,在WM_PAINT 消息中繪制對(duì)應(yīng)的顏色按鈕。155.2.2 部分代碼case WM_CREATE:hWndSendTo=(HWND)(LPCREATESTRUCT)(lParam)->lpCreateParams);argbCurrent=argbDefaultColor;nMargin=5;cxColorBox=30;xColorBoxStart=nMargin;yColorBoxStart=nMargin;nColorRows=2;
54、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.left=pt.x;rt.bottom=pt.y+nHeight;rt.right=pt.x+nWidth;AdjustWindowRect(&
55、;rt,GetWindowLong(hWnd,GWL_STYLE),FALSE);MoveWindow(hWnd,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,TRUE);break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);x=xColorBoxStart;y=yColorBoxStart;for(i=1;i<=nColorCount;i+)16hbr=CreateSolidBrush(argbCurrenti-1);hbrOld=(HBRUSH
56、)SelectObject(hdc,hbr);Rectangle(hdc,x,y,x+cxColorBox,y+cxColorBox);SelectObject(hdc,hbrOld);DeleteObject(hbr);if(i%nColorRows)y+=cxColorBox;elsey=yColorBoxStart;x+=cxColorBox;EndPaint(hWnd, &ps);break;5.3 消息處理點(diǎn)擊調(diào)色板中的顏色選擇按鈕,在在ColorBoxProc函數(shù)中產(chǎn)生相應(yīng)的消息case WM_LBUTTONDOWN:pt.x=GET_X_LP
57、ARAM(lParam);pt.y=GET_Y_LPARAM(lParam);nCol=(pt.x-xColorBoxStart)/cxColorBox;nRow=(pt.y-yColorBoxStart)/cxColorBox;if(nCol>=0 && nCol<nColorCols)&& (nRow>=0 && nRow<nColorRows)i=nCol*nColorRows+nRow;color=argbCurrenti;17SendMessage(hWndSen
58、dTo,WM_CHANGECOLOR,(WPARAM)0,(LPARAM)color);break;將消息發(fā)送給繪圖窗口,并產(chǎn)生相應(yīng)的消息處理:case WM_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);六 畫(huà)筆寬度調(diào)節(jié)實(shí)現(xiàn)6.1 創(chuàng)建畫(huà)筆寬度調(diào)節(jié)對(duì)話框設(shè)計(jì)對(duì)話框,如下圖:6.2
59、 實(shí)現(xiàn)原理在 MYDRAW.cpp 中 創(chuàng) 建 對(duì) 話 框 , 并 且 在 WndProc 函 數(shù) 中 的 IDM_PEN 中 將WM_CHANGEPENWIDTH 的消息傳遞給繪圖窗口。6.3 部分代碼在 DlgPenWidth 函數(shù)中重要處理代碼如下:case WM_INITDIALOG:18piPenWidth=(INT *)(lP
60、aram);hWndSpin=GetDlgItem(hDlg,IDC_SPIN_PEN);SetDlgItemInt(hDlg,IDC_PEN,*piPenWidth,FALSE);SendMessage(hWndSpin,UDM_SETRANGE ,(WPARAM)0,(LPARAM)MAKELONG (10 ,1);return TRUE;case IDOK:*piPenWidth=GetDlgItemInt(hDlg,IDC_PEN,&bSuccessed,FALSE);EndDialog(hDlg, LOWORD(wP
61、aram);break;在主窗口中 WndProc 函數(shù)中:(傳送消息給繪圖窗口)case IDM_PEN:if (DialogBoxParam(hInst, (LPCTSTR)IDD_DLG_PENWIDTH, hWnd,(DLGPROC)DlgPenWidth,(LPARAM)&iPenWidth)=IDOK)SendMessage(hWndDraw,WM_CHANGEPENWIDTH,(WPARAM)0,(LPARAM)iPenWidth);break;在繪圖窗口中處理 WM_CHANGEPENWIDTH
62、60;消息代碼:case WM_CHANGEPENWIDTH:ds.iPenWidth=(INT)(lParam);DeleteObject(ds.hPen);ds.hPen=CreatePen(PS_SOLID,ds.iPenWidth,ds.color);break;七 保存、新建與打開(kāi)功能的實(shí)現(xiàn)7.1 實(shí)現(xiàn)截圖當(dāng)在 File 菜單下,選擇對(duì)應(yīng)的 Open,Save,Save As,New 時(shí)彈出如下對(duì)話框。197.2 部分代碼void PopFileInitialize (HWN
63、D hwnd)初始化定義的 static OPENFILENAME ofn 變量。BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)ofn.hwndOwner= hwnd ofn.lpstrFile= pstrFileName ofn.lpstrFileTitle= pstrTitleName ofn.Flags= OFN_HIDEREADONLY | OFN_CREATEPROMPT return GetOpenFileName (&ofn) /對(duì)應(yīng)打開(kāi)時(shí)文件的屬性設(shè)置BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)of
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年商業(yè)廣告燈箱安裝施工合同
- 2025年度大曰金地產(chǎn)樓盤(pán)銷(xiāo)售代理合同全案策劃執(zhí)行合同4篇
- 2025年私人住房買(mǎi)賣(mài)合同書(shū)含物業(yè)管理服務(wù)條款范本2篇
- 2025年度高端鈦礦資源批量采購(gòu)合同
- 二零二五版鍋爐設(shè)備買(mǎi)賣(mài)合同附安全使用操作手冊(cè)3篇
- 2025年度醫(yī)療設(shè)備租賃合同擔(dān)保與維修保養(yǎng)服務(wù)范本4篇
- 二零二五年度屋頂防水隔熱一體化合同
- 2025年BEC商務(wù)英語(yǔ)專(zhuān)業(yè)課程研發(fā)與授權(quán)使用合同3篇
- 二零二五版智慧城市基礎(chǔ)設(shè)施用地租賃合同3篇
- 預(yù)應(yīng)力專(zhuān)項(xiàng)施工方案
- 物流無(wú)人機(jī)垂直起降場(chǎng)選址與建設(shè)規(guī)范
- 冷庫(kù)存儲(chǔ)合同協(xié)議書(shū)范本
- AQ/T 4131-2023 煙花爆竹重大危險(xiǎn)源辨識(shí)(正式版)
- 武術(shù)體育運(yùn)動(dòng)文案范文
- 設(shè)計(jì)服務(wù)合同范本百度網(wǎng)盤(pán)
- 2024年市級(jí)專(zhuān)科護(hù)士理論考核試題及答案
- 肺炎臨床路徑
- 供應(yīng)商供貨服務(wù)方案(2篇)
- JB∕T 3077-2019 汽輪機(jī)圖形符號(hào)
- 《藥物臨床試驗(yàn)機(jī)構(gòu)備案評(píng)估指南及檢查細(xì)則(試行)》
- 河北省2022年中考數(shù)學(xué)真題及答案
評(píng)論
0/150
提交評(píng)論