网站导航网学 原创论文 网站设计 最新系统 最新研究 原创论文 获取论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计下载 > VC与C++类别 > 正文

VC+SQL服装销售管理系统|服装进销存

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/05/14

【编者按】:网学网VC与C++类别为您提供VC+SQL服装销售管理系统|服装进销存参考,解决您在VC+SQL服装销售管理系统|服装进销存学习中工作中的难题,参考学习。

QQ交谈客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn

4 详细设计
4.1 主窗口设计
销售管理系统主窗口由菜单、工具栏、客户区域和状态栏四部分组成,效果如图3所示。

图3 销售管理系统主窗口
1.菜单设计
(1)在工具栏中单击按钮 ,或者从菜单中选择“View”/“Workspace”项,这时会弹出如图4所示的工作区窗口(Workspace窗口)。在工作区窗口中,能看到该程序所使用的资源,且每种资源都有一个资源符号,主窗体也使用了一个资源符号IDD_A1_DIALOG,这是VC缺省提供的。可以在这里添加或者删除各种资源。

图4 Workspace窗口
(2)在工作区窗口(Workspace窗口)右键单击“a1 resources”选项,在弹出菜单中选择“Insert...”选项,将弹出“Insert Resource”对话框。在该对话框中选择“Menu”选项,然后单击“New”按钮,将生成如图5所示的菜单资源。

图5 编辑菜单资源
(3)右键双击菜单资源编辑器的虚线空白框,在弹出的菜单中选择“Properties”选项,将弹出“Menu Item Properties”对话框,在“Menu Item Properties”对话框的“caption”(标题)编辑框中键入:“基础信息(&I)”(符号&可以使字母I有一个下划线,而且可以通过“Alt+I”访问该菜单项。此时关闭“Menu Item Properties”对话框,将在菜单编辑器中生成主菜单“基础信息”。
(4)同上,可以设计其他主菜单及菜单项。最后得到如图6所示的菜单界面。

图6 菜单界面
2.工具栏设计
在应用程序中要经常使用工具栏,它是最常用的界面元素,对应着应用程序的最常用功能。主窗口共有9个工具栏按钮,分别是“销售登记”、“销售退货”、“销售结账”、“入库登记”、“入库退货”、“入库结账”、“调货登记”、“库存登记”、“退出”工具栏按钮。创建工具栏可使用MFC类库中的CToolBarCtrl类,该类用来生成工具条。本系统主窗体的工具栏将引用MSDN提供的类CStandardBar,该类派生自CToolBarCtrl。
操作步骤如下:
(1)从基类CToolBarCtrl中派生需要的类CstandardBar。选择“Insert”/“New Class...”菜单项,在弹出来的“New Class”对话框中设置“Class Type”为“MFC Class”,在“Class Infomation”中的Name编辑框中键入“CstandardBar”,然后在“Base Class”下拉列表框中选择“CtoolBarCtrl”,最后单击“OK”按钮。
(2)需要9个按钮,每个按钮有相应的文本和图片。所以,需要添加如图7所示的图片资源,资源长为288像素,高为32像素,资源符号为:IDR_STANDARDBAR。

图7 图片资源
(3)添加字符串资源(String Table),如表1所示。
表1 字符串资源
资源符号 值 字符串资源
IDSTR_XSDJ 102 销售登记
IDSTR_XSTH 103 销售退货
IDSTR_XSJZ 104 销售结账
IDSTR_RKDJ 105 入库登记
IDSTR_RKTH 106 入库退货
IDSTR_RKJZ 107 入库结账
IDSTR_DHDJ 108 调货登记
IDSTR_KCPD 109 库存盘点
IDSTR_OUT 110 退出
(4)程序中引入资源,创建工具栏按钮。
创建工具栏按钮需要重写Create函数,该函数创建工具栏的步骤如下:
① 先创建工具栏窗口,然后为工具栏类添加图片资源。相关函数是:
SetBitmapSize(CSize(32,32)); //设置单个位图的大小
VERIFY(AddBitmap(m_nButtonCount,IDR_STANDARDBAR) != -1); //添加位图
m_nButtonCount是指按钮图片的个数,IDR_STANDARDBAR对应着相应的图片。
② 创建相应数量的按钮,并为每个按钮分配相应图片资源和文本资源,设置相关属性。
m_pTBButtons = new TBBUTTON[m_nButtonCount]; //用来加入到工具栏里的按钮
……
m_pTBButtons[nIndex].iString = AddStrings(pString);
m_pTBButtons[nIndex].fsState = TBSTATE_ENABLED;
m_pTBButtons[nIndex].fsStyle = TBSTYLE_BUTTON;
m_pTBButtons[nIndex].dwData = 0;
m_pTBButtons[nIndex].iBitmap = nIndex; //控制按钮的相关图片
m_pTBButtons[nIndex].idCommand = nIndex + IDSTR_XSDJ; //用于命令消息传递
在步骤②中,要注意如下事项:
① AddStrings(pString)返回一个字符串的基于0的编号,该值用来连接字符串到按钮上,其中的字符串参数pString需要两个结束符来表示结尾,必须将字符串写成如下形式:pString= "Only one string to add\0";CString类不能提供这样的功能,因为不可能在CString中保存超过一个结束符的字符串。所以,将CString中的字符串取出,以char定义的字符串保存,再对该字符串添加一个结束符,做法如下:
CString string;
string.LoadString(nIndex + IDSTR_XSDJ); //装载字符串资源
……
//取得字符串的长度为了添加一个结束符,给长度加1
int nStringLength = string.GetLength() + 1;
……
TCHAR * pString = string.GetBufferSetLength(nStringLength); //按增加后的长度返回字符串
pString[nStringLength] = 0;
函数GetBufferSetLength的过程分配了nStringLength+1长度的内存空间,并在加上结束符''\0''之后,复制原字符串到这个新的内存空间中,同时将原字符串的结束符也复制到新的位置,于是,该函数结束后,字符串pString已经有两个结束符了,最后一个语句略显多余或不足。但为了保证该字符串确实有两个结束符,不能省略这两个结束符。
pString[nStringLength] = 0;
pString[nStringLength-1] = 0;
② fsState确定按钮的状态,fsStyle确定按钮的风格。若给fsStyle赋值TBSTYLE_SEP,则该按钮表现为一个间隔。dwData可以是用户自定义的数据,可以将一个指针或句柄传递给它,可以在某些消息响应函数中使用。iBitmap是表示基于0的图像列表的编号。
③ idCommand为与按钮连接的命令标识,当这个按钮被按下时,这个值将被放到WM_COMMAND中发送到父窗体。如果fsStyle被设置为TBSTYLE_SEP,该值必须为0。
用Create函数创建工具栏的代码如下:
BOOL CStandardBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
{
BOOL bRet = CToolBarCtrl::Create(dwStyle, rect, pParentWnd, nID); //记录基类的返回值
m_nButtonCount = IDSTR_OUT - IDSTR_XSDJ + 1;
SetBitmapSize(CSize(32,32)); //设置单个位图的大小
VERIFY(AddBitmap(m_nButtonCount,IDR_STANDARDBAR) != -1); //添加位图
m_pTBButtons = new TBBUTTON[m_nButtonCount]; //用来加入到工具栏里的按钮
for (int nIndex = 0; nIndex < m_nButtonCount; nIndex++) //循环设定按钮属性
{
CString string;
string.LoadString(nIndex + IDSTR_XSDJ); //装载字符串资源
//为每一个字符串再加一个''\0'',用于向工具栏里加字符串
int nStringLength = string.GetLength() + 1;
TCHAR * pString = string.GetBufferSetLength(nStringLength);
pString[nStringLength] = 0;
pString[nStringLength-1] = 0;
VERIFY((m_pTBButtons[nIndex].iString = AddStrings(pString)) != -1); //返回字符串的编号
string.ReleaseBuffer();
m_pTBButtons[nIndex].fsState = TBSTATE_ENABLED;
m_pTBButtons[nIndex].fsStyle = TBSTYLE_BUTTON;
m_pTBButtons[nIndex].dwData = 0;
m_pTBButtons[nIndex].iBitmap = nIndex; //控制按钮的相关图片
m_pTBButtons[nIndex].idCommand = nIndex + IDSTR_XSDJ; //用于命令消息传递
}
m_pTBButtons[m_nButtonCount-1].idCommand=IDOK; //用来响应退出消息
TBBUTTON sepButton; //用于分隔的按钮
sepButton.idCommand = 0;
sepButton.fsStyle = TBSTYLE_SEP;
sepButton.fsState = TBSTATE_ENABLED;
sepButton.iString = 0;
sepButton.iBitmap = 0;
sepButton.dwData = 0;
for (nIndex = 0; nIndex < m_nButtonCount; nIndex++)
{
VERIFY(AddButtons(1,&m_pTBButtons[nIndex])); //循环添加按钮
if (!((nIndex +1) % 3))
{
VERIFY(AddButtons(1,&sepButton)); //每3个按钮为一组,两组间有一个分隔按钮
}
}
return bRet; //返回CToolBarCtrl::Create的返回值
}
(5)调用工具栏类。先在类CA1Dlg中实例化CStandardBar的对象。
CStandardBar m_StandardBar;
别忘了在这个文件里包含CStandardBar类声明所在的头文件。
#include "StandardBar.h"
(6)增加消息WM_CREATE的响应函数,为CStandardBar对象创建相应窗口。
int CA1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
m_StandardBar.Create(WS_BORDER | WS_VISIBLE | WS_CHILD
| TBSTYLE_WRAPABLE| CCS_TOP| CCS_ADJUSTABLE,
CRect(0,0,0,0),this, IDR_STANDARDBAR1);
m_StandardBar.AutoSize(); //重新计算控件的大小
return 0;
}
工具栏到这里就创建成功了。
3.为菜单和工具栏添加消息处理函数
在此之前,定义了菜单和工具栏界面,单击他们并没有实质的内容,现在为他们添加消息处理函数。
(1)单击菜单和工具栏按钮的两种消息都是命令消息,所以,只要让他们传递相同的消息,就能执行相同的消息处理函数。从代码中可以看到对于工具栏的按钮来说,按钮的命令消息值与字符串资源符号的值相同,而且是顺序的,而对于相应的菜单项来说,消息值是随机的顺序值。为了将两者对应起来,要修改菜单项的资源符号,将其改为相应的按钮的字符串资源符号。例如:将销售登记菜单项的资源符号改为IDSTR_XSDJ,并给它定义消息响应函数:void CA1Dlg::OnXsdj()。这样,无论是单击“销售登记”菜单项,还是单击“销售登记”按钮都会执行这个函数。同理,完成其他的菜单项与按钮的对应。
(2)还有一个问题:别忘了,工具栏中有一个“退出”按钮。这个退出按钮与谁对应呢?当用户按下〈Enter〉键或〈Esc〉键时,对话框就会退出,这里触发的两个消息分别是IDOK和IDCANCEL。如果给“退出”按钮的命令消息值赋值为IDOK,那么单击该按钮时,对话框就会退出。代码如下:
m_pTBButtons[m_nButtonCount-1].idCommand=IDOK; //用来响应退出消息
4.状态栏设计
为使应用程序操作界面更加友好,可以使用状态条显示程序当前程序的状态信息或提示信息。在VC中提供了CStatusBarCtrl类显示状态栏。在本程序中利用状态条显示操作者、日期、时间等信息。其实还有CStatusBar类可以显示状态栏,但是这个类只能用于主框架(CFrameWnd)上。
分析功能:显示操作员名字、公司名称及时间。其中,公司名称是常量字符串,可以将其加为字符串资源;操作员名字,是登录的用户名,将其放在应用程序类中,这样,就可以在程序的任何地方都可以访问了;时间,需要设置OnTimer时间来处理当时间改变时,刷新显示。
(1)解决创建状态栏的相关问题
① 访问应用程序对象。
CA1App* app=( CA1App *)::AfxGetApp();
//app是应用程序对象指针,可以访问应用程序对象的成员变量,例如:
MessageBox(app->m_sUserName);
② 访问资源字符串。
先在“Workspace”中的“Resource View”选项中建立字符串资源,定义符号IDS_COMPANY,对应资源为“明日腾龙科技有限责任公司(www.mingrisoft.com)”。
在程序中使用如下代码:
CString str;
str.LoadString(IDS_COMPANY);
str保存相应的字符串资源。
③ 将访问时间转化为字符串。
CTime t=CTime::GetCurrentTime();
CString s=t.Format("%H:%M:%S");
s="当前系统时间:"+s;
s会显示为“当前系统时间:20:09:25”形式的字符串。
④ OnTimer消息响应函数。
为实现每隔1秒刷新一次状态栏的显示内容,可以使用WM_TIMER的消息响应函数OnTimer。要创建主窗体的OnTimer函数,首先在“Workspace”工作区“Class View”选项卡中右键单击“CA1Dlg”选项,在弹出菜单中选择“Add Windows Message Handle...”菜单项,将弹出“New Windows Message and event handles for class CAIDlg”对话框。在该对话框中,可以选择要进行处理的消息句柄,并为其添加消息响应函数。步骤是从左边的列表框中双击“WM_TIMER”,将其添加到右上边的列表框中,双击该列表框中的“WM_TIMER”项,可以看到VC++创建的函数OnTimer,可以设置这个函数每隔一定的时间响应一次。函数SetTimer来设置OnTimer的消息响应频率。
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
参数说明:
nIDEvent:用来标识是哪一个Timer事件。
nElapse:设置该Timer事件每隔多长时间发生一次,单位:毫秒。
lpfnTimer:设置回调函数,用来响应事件的发生,相当于OnTimer函数。如果将其设为NULL,那么,WM_TIMER事件由窗口类来处理,即由OnTimer函数处理。
在本程序中,设定OnTimer函数1000毫秒响应一次。
 


 

 

本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT

本文选自计算机毕业设计http://myeducs.cn
论文文章部分只是部分简介,如需了解更多详情请咨询本站客服!QQ交谈QQ3710167

原创论文

设为首页 | 加入收藏 | 论文首页 |原创论文 |
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师