zoukankan      html  css  js  c++  java
  • 最近的考勤跟称重项目总结

    首先说下考勤项目

    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 = 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 = 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)返回的句柄来判断

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 矩阵加法
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 乘法表
    监管只是压倒网盘业务的一根稻草,但不是主要原因(答案只有一个:成本!)
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3726186.html
Copyright © 2011-2022 走看看