Windows程序设计实验报告模板- 副本

更新时间:2023-09-11 02:42:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Windows程序设计实验报告 Technology Chmistry Experiment Report

学生所在学院:软件学院 学生所在班级:软件工程2班 学生姓名:韩娜娜

指导教师:穆云峰、李季辉、 李可、 王艳芬

教 务 处 2016年 5 月

Windows程序设计实验报告

目录

1.概述 ................................................................................................................................... 2

一、实验目的 ............................................................................................................... 2 二、实验内容 ............................................................................................................... 2 三、 功能分析 ............................................................................................................. 2 四、窗口 ....................................................................................................................... 2 五、模块分解 ............................................................................................................... 3 2. 主窗口 .............................................................................................................................. 3

一、菜单的创建 ........................................................................................................... 3 二、子窗口创建 ........................................................................................................... 5 三、画笔宽度对话框 ................................................................................................... 6 四、主要代码 ............................................................................................................... 7 3. 工作区窗口 .................................................................................................................... 10

一、结构体定义 ......................................................................................................... 10 二、 绘图函数(drawfun.cpp) ............................................................................. 11

1. 鼠标落下 ....................................................................................................... 11 2. 鼠标弹起 ....................................................................................................... 12 3. 鼠标移动 ....................................................................................................... 13 三、 重绘 ................................................................................................................... 13

1.drawfun.cpp ................................................................................................... 13 2.graphicfile.cpp ........................................................................................... 16 四、 文件打开与保存 ............................................................................................... 18

1.drawwnd.cpp ................................................................................................... 18 2. PopFile.cpp ................................................................................................. 19 3. Graphicfile.cpp ......................................................................................... 20 五、 主要代码 ........................................................................................................... 20 4. 颜色选择窗口 ................................................................................................................ 23

一、颜色选择窗口创建 ............................................................................................. 23 二、 把鼠标选中的颜色传递给绘图区 ................................................................... 24 三、主要代码 ............................................................................................................. 24 5. 工具栏窗口和工具选择窗口 ........................................................................................ 28

一、工具选择的实现 ................................................................................................. 28 二、把鼠标选中的工具传递给绘图区 ..................................................................... 29 三、主要代码 ............................................................................................................. 29 6.实验总结 .......................................................................................................................... 37

一、实验结果 ............................................................................................................. 37 二、感想体会 ............................................................................................................. 37

1

Windows程序设计实验报告

1.概述

一、实验目的

掌握用C/C++语言采用API在Windows平台下编写软件的方法,熟悉消息驱动的本质;熟悉Windows平台基本控件的本质、熟悉动态链接库的使用,加深对课堂知识的掌握。

二、实验内容

仿照Windows操作系统附件的绘图软件设计一个绘图程序,依次为程序增加绘图函数、菜单选择、工具选择、颜色选择、文件操作等功能,可以在此基础上进行扩充,最终完成一个相对完整的绘图程序。

三、功能分析

1.实现曲线,直线,矩形,椭圆图形的绘制;

2.实现图形线条宽度,颜色的改变以及矩形和椭圆的填充; 3.对绘制图形的保存以及,对以保存的文件的打开和另存; 4.清屏功能。

四、窗口

窗口类 szWindowClass(主窗口) szDrawWndClass(工作区窗口) szColorBoxClass(颜色选择窗口) szToolBtnClass(工具选择窗口) szToolboxClass(工具栏窗口) 对应的处理函数 WndProc() WndDrawProc() ColorBoxProc() ToolBtWndProc() ToolboxWndProc()

2

Windows程序设计实验报告

五、模块分解

根据程序运行时的操作来划分,本程序可大致分为三大功能模块,分别为调色板,工具箱,工作区绘图,如下: 1.调色板模块

本模块用来提供绘图时的颜色的选择,并将改变后的颜色显示在调色板颜色示例的矩形区域中。 2.工具箱模块

本模块用来提供绘图时工具的选择,当选择了某一工具后,该工具按钮是选中状态,其他按钮是凸起状态。 3.工作区绘图模块

本模块用来提供鼠标完成各种图形的绘制的区域。

2.主窗口 一、菜单的创建

case WM_COMMAND:

wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) {

case IDM_ABOUT:

DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, break;

case IDM_EDIT_PENWIDTH://把线的宽度传到对话框里

} break;

if(IsWindowVisible(hWndColor))

3

(DLGPROC)About);

if (DialogBoxParam(hInst, (LPCTSTR)IDD_DLG_PENWIDTH, hWnd, {

(DLGPROC)DlgPenWidth,(LPARAM)&iPenWidth)==IDOK)

SendMessage(hWndDraw,WM_CHANGEPENWIDTH,(WPARAM)0,(LPARAM)iPenWidth);

case IDM_VIEW_COLOR://如果颜色被选中则显示,如果不被选中则不显示

Windows程序设计实验报告

{

ShowWindow(hWndColor,SW_HIDE);

CheckMenuItem(hMenu,IDM_VIEW_COLOR,MF_BYCOMMAND|MF_UNCHECKED);

} else {

ShowWindow(hWndColor,SW_SHOWNORMAL);

CheckMenuItem(hMenu,IDM_VIEW_COLOR,MF_BYCOMMAND|MF_CHECKED);

} break;

if(IsWindowVisible(Tb.hwndToolbox)) {

ShowWindow(Tb.hwndToolbox,SW_HIDE);

case IDM_VIEW_TOOLS://如果工具被选中则显示,如果不被选中则不显示

CheckMenuItem(hMenu,IDM_VIEW_TOOLS,MF_BYCOMMAND|MF_UNCHECKED);

} else {

ShowWindow(Tb.hwndToolbox,SW_SHOWNORMAL);

CheckMenuItem(hMenu,IDM_VIEW_TOOLS,MF_BYCOMMAND|MF_CHECKED);

} break;

SendMessage(hWndDraw,message,wParam,lParam); break;

SendMessage(hWndDraw,message,wParam,lParam); break;

SendMessage(hWndDraw,message,wParam,lParam); break;

SendMessage(hWndDraw,message,wParam,lParam); break;

4

case IDM_FILE_NEW://新建

case IDM_FILE_OPEN://打开

case IDM_FILE_SAVE://保存

case IDM_FILE_SAVEAS://另存为

Windows程序设计实验报告

}

case IDM_EDIT_CLEAR://清空

// MessageBox(hWnd,TEXT(\

SendMessage(hWndDraw,message,wParam,lParam); break;

case IDM_EXIT:

SendMessage(hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0); break; default:

return DefWindowProc(hWnd, message, wParam, lParam);

break;

二、子窗口创建 1.case WM_CREATE:

hWndDraw=CreateDrawWindod(hWnd,((LPCREATESTRUCT)(lParam))->hInstance,2); hWndColor=CreateColorSelectDlg(NULL,(WS_CHILD|WS_VISIBLE),hWnd,NULL,hWndDraw); InitToolBox(&Tb,((LPCREATESTRUCT)(lParam))->hInstance,hWnd,hWndDraw); hMenu=GetMenu(hWnd); break;

2.HWND CreateDrawWindod(HWND hWndParent,HINSTANCE hInstance,UINT controlId) { return

CreateWindow(szDrawWndClass,NULL,WS_CHILD|WS_BORDER|WS_VISIBLE,0,0,0,0,hWndParent,(HMENU)controlId,hInstance,NULL); }

3.HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWND hWndParent,HINSTANCE hInstance,HWND hWndSendTo) { return

CreateWindow(szColorBoxClass,lpWindowName,dwStyle,0,0,0,0,hWndParent,NULL,hInstance,(LPVOID)hWndSendTo); }

5

Windows程序设计实验报告

三、画笔宽度对话框

LRESULT CALLBACK DlgPenWidth(HWND hDlg, UINT message, WPARAM wParam, LPARAM

lParam) {

}

6

HWND hWndSpin; INT wmId;

static INT *piPenWidth; switch (message) {

case WM_INITDIALOG:

piPenWidth=(INT *)(lParam);

hWndSpin=GetDlgItem(hDlg,IDC_SPIN_PENWIDTH); SetDlgItemInt(hDlg,IDC_PENWIDTH,*piPenWidth,FALSE);

SendMessage(hWndSpin,UDM_SETRANGE ,(WPARAM)0,(LPARAM)MAKELONG (10 , return TRUE;

1));

case WM_COMMAND:

{ } break;

}

return TRUE;

EndDialog(hDlg, LOWORD(wParam)); break;

EndDialog(hDlg, LOWORD(wParam)); break; BOOL bSuccessed; wmId=LOWORD(wParam); switch (wmId) {

case IDOK:

*piPenWidth=GetDlgItemInt(hDlg,IDC_PENWIDTH,&bSuccessed,FALSE);

case IDCANCEL:

return FALSE;

Windows程序设计实验报告 } 四、主要代码

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc;

static HWND hWndColor,hWndDraw; static DRAWSTRU ds; static TOOLBOX Tb; static HMENU hMenu; static INT iPenWidth=2; switch (message) {

case WM_COMMAND:

wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) {

case IDM_ABOUT:

DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, break;

case IDM_EDIT_PENWIDTH://把线的宽度传到对话框里

7

(DLGPROC)About);

if (DialogBoxParam(hInst, (LPCTSTR)IDD_DLG_PENWIDTH, hWnd, {

(DLGPROC)DlgPenWidth,(LPARAM)&iPenWidth)==IDOK)

SendMessage(hWndDraw,WM_CHANGEPENWIDTH,(WPARAM)0,(LPARAM)iPenWidth);

} break;

if(IsWindowVisible(hWndColor)) {

ShowWindow(hWndColor,SW_HIDE);

case IDM_VIEW_COLOR://如果颜色被选中则显示,如果不被选中则不显示

Windows程序设计实验报告

CheckMenuItem(hMenu,IDM_VIEW_COLOR,MF_BYCOMMAND|MF_UNCHECKED);

} break;

SendMessage(hWndDraw,message,wParam,lParam); break;

SendMessage(hWndDraw,message,wParam,lParam); break;

SendMessage(hWndDraw,message,wParam,lParam); break;

SendMessage(hWndDraw,message,wParam,lParam); break; } else {

ShowWindow(Tb.hwndToolbox,SW_SHOWNORMAL); } break;

if(IsWindowVisible(Tb.hwndToolbox)) {

ShowWindow(Tb.hwndToolbox,SW_HIDE); } else {

ShowWindow(hWndColor,SW_SHOWNORMAL);

CheckMenuItem(hMenu,IDM_VIEW_COLOR,MF_BYCOMMAND|MF_CHECKED);

case IDM_VIEW_TOOLS://如果工具被选中则显示,如果不被选中则不显示

CheckMenuItem(hMenu,IDM_VIEW_TOOLS,MF_BYCOMMAND|MF_UNCHECKED);

CheckMenuItem(hMenu,IDM_VIEW_TOOLS,MF_BYCOMMAND|MF_CHECKED);

case IDM_FILE_NEW://新建

case IDM_FILE_OPEN://打开

case IDM_FILE_SAVE://保存

case IDM_FILE_SAVEAS://另存为

case IDM_EDIT_CLEAR://清空

// MessageBox(hWnd,TEXT(\

SendMessage(hWndDraw,message,wParam,lParam);

8

Windows程序设计实验报告 );

}

break; case IDM_EXIT:

SendMessage(hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0); break; default:

return DefWindowProc(hWnd, message, wParam, lParam);

break;

CheckMenuItem(hMenu,IDM_VIEW_TOOLS,MF_BYCOMMAND|MF_UNCHECKED); break;

CheckMenuItem(hMenu,IDM_VIEW_COLOR,MF_BYCOMMAND|MF_UNCHECKED); break;

case TOOLHIDE:

case WM_HIDECOLORBOX:

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(hWndDraw,0,rt.bottom,LOWORD(lParam),HIWORD(lParam)-rt.bottom,TRUE

} else

MoveWindow(hWndDraw,0,0,LOWORD(lParam),HIWORD(lParam),TRUE); break;

hdc = BeginPaint(hWnd, &ps); RECT rt;

GetClientRect(hWnd, &rt); EndPaint(hWnd, &ps); break;

case WM_PAINT:

case WM_CLOSE:

if(MessageBox(hWnd,TEXT(\确定退出吗?\),TEXT(\提示信息

9

Windows程序设计实验报告

{ }

VOID ToolboxDrawBitmap(PTOOLBOX pTb,HDC hDC,INT tool) {

HDC hMemDC; HBITMAP hbmOld;

35

PTOOLBOX pTb; case WM_CREATE:

pTb=(PTOOLBOX)(((LPCREATESTRUCT)lParam)->lpCreateParams); SetWindowLong(hwnd,GWL_USERDATA,(LONG)pTb); break;

//* Select the tool that was clicked on. pTb=(PTOOLBOX)GetWindowLong(hwnd,GWL_USERDATA);

ToolboxSelectTool(pTb,(UINT)GetWindowLong((hwnd), GWL_ID)); break; { } break;

return DefWindowProc(hwnd, msg, wParam, lParam);

HDC hDC; PAINTSTRUCT ps;

pTb=(PTOOLBOX)GetWindowLong(hwnd,GWL_USERDATA); hDC = BeginPaint(hwnd, &ps);

ToolboxDrawBitmap(pTb,hDC, (UINT)GetWindowLong((hwnd), GWL_ID)); EndPaint(hwnd, &ps);

switch (msg) {

case WM_LBUTTONDOWN:

case WM_PAINT:

default:

}

return 0;

Windows程序设计实验报告

hMemDC = CreateCompatibleDC(hDC);

hbmOld = (HBITMAP)SelectObject(hMemDC, (tool ==pTb->icurTool) ?

pTb->aTools[tool].hbmToolBtnDown : pTb->aTools[tool].hbmToolBtnUp);

BitBlt(hDC, 0, 0, pTb->cxToolBtn,pTb->cyToolBtn, hMemDC, 0, 0, SRCCOPY); SelectObject(hMemDC, hbmOld); DeleteDC(hMemDC); }

VOID ToolboxSelectTool(PTOOLBOX pTb,INT tool) {

if (pTb->icurTool != tool) { if (pTb->hwndToolbox) {

InvalidateRect(GetDlgItem(pTb->hwndToolbox, pTb->icurTool), NULL, FALSE);

InvalidateRect(GetDlgItem(pTb->hwndToolbox, tool), NULL, FALSE);

}

pTb->icurTool = tool;

pTb->pMouseDown = pTb->aTools[pTb->icurTool].pMouseDown; }

pTb->pMouseMove = pTb->aTools[pTb->icurTool].pMouseMove; pTb->pMouseUp = pTb->aTools[pTb->icurTool].pMouseUp; pTb->bFill = pTb->aTools[pTb->icurTool].bFill;

SendMessage(pTb->hWndWork,WM_TOOLCHANGE,(WPARAM)pTb,(LPARAM)0L);

}

36

Windows程序设计实验报告

6.实验总结

一、实验结果

二、感想体会

通过老师对windows程序设计的讲解和自己的学习,掌握了消息队列以及循环队列的知识,掌握了窗口消息的处理和响应,对windows API有了更深入的理解。

总的来说,这次学习收获还是很大的。这个程序通过老师一点一点的讲解,一点一点往里加东西,逐渐变成了一个大程序,相对于我以前编的代码,程序还是比较大的。让我对大程序有了一定的认识,对模块化编程有了一定的了解,不再那么害怕编程了,谢谢老师!

37

Windows程序设计实验报告

static TCHAR szColorBoxClass[]=TEXT(\); ATOM ColorSelectDlgRegisterClass(HINSTANCE hInstance) { }

//------------------颜色选择窗口----------------------------

LRESULT CALLBACK ColorBoxProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) {

HDC hdc; PAINTSTRUCT ps; COLORREF color; HBRUSH hbr,hbrOld; RECT rt;

INT x,y,i,nRow,nCol; POINT pt;

static INT nWidth,nHeight; static INT nMargin; static INT cxColorBox; static INT xColorBoxStart; static INT yColorBoxStart; static INT nColorCols; static INT nColorRows;

25

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX); wcex.style

= CS_HREDRAW | CS_VREDRAW; = 0; = 0;

= hInstance; = NULL;

=(HBRUSH)(COLOR_WINDOW+1);

wcex.cbClsExtra wcex.cbWndExtra wcex.hInstance wcex.hIcon

wcex.hCursor wcex.hIconSm

= LoadCursor(NULL, IDC_ARROW); = NULL;

wcex.hbrBackground

wcex.lpfnWndProc=(WNDPROC)ColorBoxProc; wcex.lpszClassName=szColorBoxClass; wcex.lpszMenuName=NULL; if (!RegisterClassEx(&wcex))

return FALSE; return TRUE;

Windows程序设计实验报告

static INT nColorCount;

static DWORD *argbCurrent; static DWORD argbDefaultColor[] = { };

static HWND hWndSendTo; switch (msg) { case WM_CREATE:

hWndSendTo=(HWND)(((LPCREATESTRUCT)(lParam))->lpCreateParams); argbCurrent=argbDefaultColor; nMargin=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);

26

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, 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)

rt.top=pt.y;

Windows程序设计实验报告

rt.left=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;

hdc = BeginPaint(hWnd, &ps); x=xColorBoxStart; y=yColorBoxStart;

for(i=1;i<=nColorCount;i++) { }

EndPaint(hWnd, &ps); break;

pt.x=GET_X_LPARAM(lParam); pt.y=GET_Y_LPARAM(lParam);

nCol=(pt.x-xColorBoxStart)/cxColorBox; nRow=(pt.y-yColorBoxStart)/cxColorBox;

if((nCol>=0 && nCol=0 && nRow

i=nCol*nColorRows+nRow;

27

case WM_PAINT:

hbr=CreateSolidBrush(argbCurrent[i-1]); hbrOld=(HBRUSH)SelectObject(hdc,hbr);

Rectangle(hdc,x,y,x+cxColorBox,y+cxColorBox); SelectObject(hdc,hbrOld); DeleteObject(hbr); if(i%nColorRows) { } else { }

y=yColorBoxStart; x+=cxColorBox; y+=cxColorBox;

case WM_LBUTTONDOWN:

Windows程序设计实验报告

}

}

}

color=argbCurrent[i];

SendMessage(hWndSendTo,WM_CHANGECOLOR,(WPARAM)0,(LPARAM)color);

break;

ShowWindow(hWnd,SW_HIDE);

SendMessage(GetParent(hWnd),WM_HIDECOLORBOX,(WPARAM)0,(LPARAM)0); break;

return DefWindowProc(hWnd, msg, wParam, lParam);

case WM_CLOSE:

default:

return 0;

//-----------------颜色选择窗口----------------------

HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWND hWndParent,HINSTANCE hInstance,HWND hWndSendTo) {

return

CreateWindow(szColorBoxClass,lpWindowName,dwStyle,0,0,0,0,hWndParent,NULL,hInstance,(LPVOID)hWndSendTo); }

5.工具栏窗口和工具选择窗口 一、工具选择的实现

工具栏的每个图标对应两个位图,鼠标弹起和落下对应两个不同的位图。

for (i = 0; i < pTb->iToolBtnCount; i++) {

if (!(pTb->aTools[i].hbmToolBtnUp= LoadBitmap(pTb->hInst,

if (!(pTb->aTools[i].hbmToolBtnDown = LoadBitmap(pTb->hInst,

MAKEINTRESOURCE(pTb->aTools[i].idbmToolBtnDown)))) return;

28

MAKEINTRESOURCE(pTb->aTools[i].idbmToolBtnUp)))) return;

Windows程序设计实验报告

} 二、把鼠标选中的工具传递给绘图区

case WM_LBUTTONDOWN:

VOID ToolboxSelectTool(PTOOLBOX pTb,INT tool) {

if (pTb->icurTool != tool) { if (pTb->hwndToolbox) {

InvalidateRect(GetDlgItem(pTb->hwndToolbox, pTb->icurTool), NULL, FALSE);

InvalidateRect(GetDlgItem(pTb->hwndToolbox, tool), NULL, FALSE);

}

pTb->icurTool = tool;

pTb->pMouseDown = pTb->aTools[pTb->icurTool].pMouseDown; }

pTb->pMouseMove = pTb->aTools[pTb->icurTool].pMouseMove; pTb->pMouseUp = pTb->aTools[pTb->icurTool].pMouseUp; pTb->bFill = pTb->aTools[pTb->icurTool].bFill;

SendMessage(pTb->hWndWork,WM_TOOLCHANGE,(WPARAM)pTb,(LPARAM)0L);

//* Select the tool that was clicked on. pTb=(PTOOLBOX)GetWindowLong(hwnd,GWL_USERDATA);

ToolboxSelectTool(pTb,(UINT)GetWindowLong((hwnd), GWL_ID));

}

三、主要代码

void InitToolBox(PTOOLBOX pTb,HINSTANCE hInstance,HWND hWnd,HWND hWndWork) {

strcpy(pTb->szAppIniFile,\); strcpy(pTb->szAppName,TEXT(\)); strcpy(pTb->szTBName,TEXT(\));

pTb->hInst=hInstance; // Store instance handle in our global variable pTb->bIsVisuable=TRUE; pTb->yBegin=0; pTb->hwndMain=hWnd;

29

Windows程序设计实验报告

pTb->hWndWork=hWndWork; pTb->iToolboxColumns=2; pTb->iToolBtnCount=6; pTb->iToolFirst=0;

pTb->iToolLast=pTb->iToolBtnCount-1; pTb->icurTool=pTb->iToolFirst+1; pTb->aTools=aTools;

pTb->aTools[TOOL_PENCIL].hcur =

LoadCursor(hInstance, MAKEINTRESOURCE(IDCUR_PENCIL));

pTb->aTools[TOOL_LINE].hcur = pTb->aTools[TOOL_RECT].hcur = pTb->aTools[TOOL_SOLIDRECT].hcur = pTb->aTools[TOOL_CIRCLE].hcur = pTb->aTools[TOOL_SOLIDCIRCLE].hcur = }

VOID ToolboxCreate(PTOOLBOX pTb) {

BITMAP bmp; INT i; INT x; INT y; INT cx; INT cy; RECT rc; RECT rcClient; POINT pt; /*

30

LoadCursor(hInstance, MAKEINTRESOURCE(IDCUR_CROSS));

ToolboxSelectTool(pTb,pTb->iToolFirst); ToolboxCreate(pTb);

ToolboxShow(pTb,pTb->bIsVisuable);

UINT cxToolBtn,cyToolBtn;

Windows程序设计实验报告

* Load the bitmaps. */

for (i = 0; i < pTb->iToolBtnCount; i++) { } /*

* Get the dimensions of the tool button bitmaps. */

GetObject(pTb->aTools[0].hbmToolBtnUp, sizeof(BITMAP), (PSTR)&bmp); cxToolBtn=pTb->cxToolBtn= bmp.bmWidth; cyToolBtn=pTb->cyToolBtn= bmp.bmHeight; rc.left = 0; rc.top = 0;

rc.right = PALETTEMARGIN + ((pTb->cxToolBtn - 1) * pTb->iToolboxColumns) + 1 + rc.bottom = PALETTEMARGIN + ((pTb->cyToolBtn - 1) *

((pTb->iToolBtnCount +pTb->iToolboxColumns-1)/ pTb->iToolboxColumns)) + 1 if (!(pTb->aTools[i].hbmToolBtnUp= LoadBitmap(pTb->hInst,

if (!(pTb->aTools[i].hbmToolBtnDown = LoadBitmap(pTb->hInst,

MAKEINTRESOURCE(pTb->aTools[i].idbmToolBtnDown)))) return;

MAKEINTRESOURCE(pTb->aTools[i].idbmToolBtnUp)))) return;

PALETTEMARGIN;

+ PALETTEMARGIN;

AdjustWindowRect(&rc, 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;

31

Windows程序设计实验报告

y = rc.top;

// } }

VOID ToolboxShow(PTOOLBOX pTb,BOOL fShow) { }

VOID ToolboxUpdate(PTOOLBOX pTb) {

if (!pTb->hwndToolbox)

32

if (!(pTb->hwndToolbox = CreateWindow(szToolboxClass, pTb->szTBName,

x, y, cx, cy,pTb->hwndMain, NULL,pTb->hInst,(LPVOID)pTb ))) return;

TOOLBOXSTYLE,

x = PALETTEMARGIN; y = PALETTEMARGIN;

for (i = 0; i iToolBtnCount; i++) { }

ToolboxUpdate(pTb);

CreateWindow(szToolBtnClass, NULL, } else { }

x = PALETTEMARGIN; y += pTb->cyToolBtn - 1; WS_CHILD | WS_VISIBLE,

x, y,pTb->cxToolBtn,pTb->cyToolBtn,

pTb->hwndToolbox, (HMENU)i,pTb->hInst, (LPVOID)pTb ); x +=pTb->cxToolBtn - 1;

if ((i+1)%pTb->iToolboxColumns) {

if (fShow)

ShowWindow(pTb->hwndToolbox, SW_SHOWNA); ShowWindow(pTb->hwndToolbox, SW_HIDE); else

Windows程序设计实验报告

}

return;

pTb->iToolLast =pTb->iToolBtnCount-1; ToolboxSelectTool(pTb,pTb->iToolFirst);

LRESULT CALLBACK ToolboxWndProc( {

PTOOLBOX pTb; switch (msg) { case WM_CREATE:

{ } break; {

HDC hdc; PAINTSTRUCT ps;

hdc = BeginPaint(hwnd, &ps); DrawMarginBorder(hwnd, hdc);

33

HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

pTb=(PTOOLBOX)(((LPCREATESTRUCT)lParam)->lpCreateParams); SetWindowLong(hwnd,GWL_USERDATA,(LONG)pTb);

HMENU hmenu = GetSystemMenu(hwnd, FALSE);

RemoveMenu(hmenu, 7, MF_BYPOSITION); // Second separator. RemoveMenu(hmenu, 5, MF_BYPOSITION); // First separator.

RemoveMenu(hmenu, SC_RESTORE, MF_BYCOMMAND); RemoveMenu(hmenu, SC_SIZE, MF_BYCOMMAND); RemoveMenu(hmenu, SC_MINIMIZE, MF_BYCOMMAND); RemoveMenu(hmenu, SC_MAXIMIZE, MF_BYCOMMAND); RemoveMenu(hmenu, SC_TASKLIST, MF_BYCOMMAND);

case WM_PAINT:

Windows程序设计实验报告

}

}

}

EndPaint(hwnd, &ps);

break;

pTb=(PTOOLBOX)GetWindowLong(hwnd,GWL_USERDATA); ToolboxShow(pTb,FALSE); pTb->bIsVisuable= FALSE;

SendMessage(pTb->hwndMain,TOOLHIDE,(WPARAM)0,(LPARAM)0); break; { } break;

return DefWindowProc(hwnd, msg, wParam, lParam);

INT i;

pTb=(PTOOLBOX)GetWindowLong(hwnd,GWL_USERDATA); for (i = 0; i < pTb->iToolBtnCount; i++) { }

pTb->hwndToolbox = NULL;

DeleteObject(pTb->aTools[i].hbmToolBtnUp); pTb->aTools[i].hbmToolBtnUp = NULL;

DeleteObject(pTb->aTools[i].hbmToolBtnDown); pTb->aTools[i].hbmToolBtnDown = NULL;

case WM_CLOSE:

case WM_DESTROY:

default:

return 0;

LRESULT CALLBACK ToolBtnWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

34

本文来源:https://www.bwwdw.com/article/r7eh.html

Top