首先说下考勤项目
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)返回的句柄来判断