首页 > 代码库 > 最近的考勤跟称重项目总结

最近的考勤跟称重项目总结

首先说下考勤项目

1、由于在手持机上面运行,所以需要屏蔽按键esc跟return,跟往常一样写了一个PreTranslateMessage函数,

    然后if((pMsg->wParam == VK_ESCAPE || pMsg->wPram == VK_RETURN)) 这样设置之后出现了一个问题了,对settimer无法响应了。后来单步进来发         现,不管怎样都是会被这个VK_RETURN给拦截了,所以在这里除了按键的return是13之外,还有其他消息也会出现13。这里就需要加一个判断就是如果是按键的话     才屏蔽掉这个消息,所以在这个判断之前添加了前提条件:pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP ,这样子就只拦截按键       的esc跟return

2、关于查找当前文件的路径问题,之前自己写的都是比较繁杂,没有利用CString这个类里面的一些函数。这里贴下她的比较精简的代码

    TCHAR szPath[MAX_PATH];

    GetModuleFileName(NULL, szPath, MAX_PATH);

    CString PathName(szPath);

    PathName = PathName.Left(PathName.ReverseFind(_T(‘\\‘))+1);

    return PathName;

3、关于MFC里面的重回按钮的问题:这里需要重写按钮里面的DrawItem函数,但是重写之后按钮还是没有反应。这里需要自己设置:自绘的参数,也就是在重写PreSubclassWindow这个函数的时候添加进一句ModifyStyle(0, BS_OWNERDRAW)

4、任务栏总是出现在界面前面不管程序里面是不是设置了top_most ,最后实在没有办法只能隐藏任务栏,然后在退出程序的时候,再显示出任务栏。

先找到任务栏的HWND hwnd = ::FindWindow(L"HHTaskBar", NULL),然后隐藏任务栏if(hwnd != 0) ::ShowWindow(hwnd, SW_HIDE) 最后推出程序的时候重新显示任务栏if (hwnd != 0) ::ShowWindow(hwnd, SW_SHOW)

5、在重绘整个界面的时候,使用了OnPaint 理论上这个应该是没有什么问题,但是我自己自己添加,所以在函数中没有添加CPaintDC dc(this) 这个坑爹货,所以程序没有让整个腰重绘的地区无效,所以在最后,我要显示另一个dialog的时候,却总是无法显示出来,总是在parent的dialog中一直调用onpaint函数,可以说是死循环了,所以这里要首先让自给的内容变成无效即调用CPaintDC ,从而调用一次之后,如果没有界面的改变,她就不会再调用重绘函数。

6、下载数据的问题:这里下载数据的时候因为自给的手持机下载速度比较慢,所以每次下载一个东东都要耗费好长的一段时间,而程序要设定一定的超时时间

CInternetSession session;CHttpConnection *pHttpConnection = NULL; m_pHttpFile = NULL; session.SetOption()通过这里来进行设置超时时间,但是这里发现了一个很严重的问题,超时时间不管怎样设置都是返回一样的超时时间。于是上网查了下微软,里面描述竟然是微软的bug,这个问题的解决方案就是自己开一个线程,然后去等待结束。本来不用这么麻烦,但是当在下载的过程中,突然中断网络,程序就无法继续运行了,直接卡死在那里,也不返回错误的信息。所以通过线程来等待下载,在等待的时间内,如果没有下载到数据就直接返回。由于自己无法控制要下载多长时间,所以这里的等待有一个判断,如果没有下载完就重新一轮的等待。

7、删除文件夹的问题,由于文件夹里面可能还有文件,需要递归的进行删除文件夹里面的所有文件,否则无法直接删除文件夹

    WIN32_FIND_DATA findFileData;HANDLE handle = ::FindFirstFile(fileDirectory + L"*.*", &findFileData); BOOL bFound = TRUE;

    while (bFound && handle != INVALID_HANDLE_VALUE)

    {

    if (0 == (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) ::DeleteFile(fileDirectory + findFileData.cFileName);

           else DeleteDirectory(fileDirectory + findFileData.cFileName)

          bFound = ::FindNextFile(handle, &findFileData);

  }

  ::RemoveDirectory(fileDirectory);

  if (handle != INVALID_HANDLE_VALUE) FindClose(handle);

  return TRUE;

 

这个是删除文件的递归操作

然后文件的创建操作也是同样的道理,先通过查找::FindFirstFile() 然后判断是否存在文件夹,如果不存在的话就创建文件夹fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY      CreateDirectory(filename, null)

这里是在考勤中遇到的一点小问题,在这里做个记录。

 

2、接下来是称重记录软件

称重记录软件主要的是局域网内直接访问数据库。这里是sqlserver2008

首先是语言的选择,在最开始的时候想用C++来做这个软件,但是网上查了下,用他们的方法,无法连接到数据库,后来自己上网查了下,有关访问远程数据库的几乎都是用C#来写,终于还是使用了这个比较陌生的语言来写这个坑爹的程序。

1、关于数据库:因为是手持机端,所以需要添加文件dbnetlib.dll 跟文件System.Data.Sqlclient.dll这两个文件,然后在工程的reference中添加System.Data.SqlClient

查询读取数据库

在这里的string m_strConnString里面要添加的是server=192.168.4.48;uid=sa;pwd=password;database=SFWeight  根据自己的情况可以添加不同的字段

using(SqlConnection conneciton = new SqlConnection(StrConnString))

{

  DataSet ds = new DataSet();

  try{connection.Open();}catch(System.Exception){}

  try{SqlDataAdapter command = new SqlDataAdapter(‘select ....‘, connection)}catch(System.Exception){}

  command.Fill(ds);

}

return ds

 

更新数据

同理conn.Open()

SqlCommand cmdData = http://www.mamicode.com/new SqlCommand()

cmdData.Connection = conn

SqlTransaction tx = conn.BeginTransaction()

cmdData.Transaction = tx

SqlCommand cmd = new SqlCommand(strImgSQL,conn)

SQLParameter myPa = new SQLParameter("@Image", SqlDbType.Image)

myPa.Value = http://www.mamicode.com/byteData; // byte[] 类型的从.jpg中读出来的数据

cmd.Parameters.Add(myPa)

try

{

   cmdData.CommandText = strSqlString;

  cmdData.ExecuteNonQuery()

  cmd.ExecuteNonQuery()

  tx.Commit()

}

 

在这里查询返回的DataSet ds

if(ds == null) return;

if (ds.Tables[0].Rows.Count == 0) return;

DataRow[] drpInfo = dataSet.Table[0].Select("F_CarNo=‘1234‘");

if (drpInfo.Length > 0) 

{str = drpInfo[0]["F_StdNo"].ToString()}

 

dialog中判断当前的Form 是否处于最前列的情况是通过调用微软的API

GetForegroundWindow() 然后判断最前的window是否是你的window  通过FindWindow(className, WindowName)返回的句柄来判断