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

  • 相关阅读:
    OCM_Session7_8_分区,并使用udev来配置裸设备
    OCM_Session7_7_VBOX配置共享存储
    OCM_Session7_6_配置oracle用户ssh对等性
    OCM_Session7_5_修改/etc/security/limits.conf和 /etc/pam.d/login和/etc/profile
    OCM_Session7_4_修改内核配置文件/etc/sysctl.conf
    OCM_Session7_3_修改 oracle 用户的初始化参数文件,建路径
    OCM_Session7_2_创建组,用户,设置用户密码
    OCM_Session7_1_配置/etc/hosts
    OCM_Session7_0_准备工作,确定hostname和ip地址
    OCM_Session7_0_CRS-0223
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3726186.html
Copyright © 2011-2022 走看看