2007.8.6用了两天时间搞了配置和安装简单接触了一下对话框书上都可以掌握,勉强通过。
8.7,学习组合框, 先建立一public all变量,最好不用public ,但是刚接触没其他办法。
all=m_combox.GetCurSel();
CString str;
m_combox.GetLBText(all, str);
AfxMessageBox(str);
就可以实现简单的组合框选择数据项问题。
listcontrul那里用得少。
然后是了解自定义消息,消息映射估计怎么也花2天时间。
网上找的
#include <afxwin.h>
#include "WMtest.h"
CMyApp myApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
file://增加消息映射
ON_MESSAGE(WM_MY_MSG,OnMyMessage)
END_MESSAGE_MAP()
CMainWindow::CMainWindow()
{
Create(NULL,_T("The 1st MFC Application"));
}
void CMainWindow::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
}
file://消息响应函数
LRESULT CMainWindow::OnMyMessage(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("MyMsg received");
return 0;
}
void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
file://响应鼠标左键按下来产生那个自定义的消息
PostMessage(WM_MY_MSG,0,0);
}
.CPP
上面那个是.H
//这里新加一句,自定义消息
#define WM_MY_MSG WM_USER+101
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
file://增加消息响应函数的声明
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
=======================
总结:
1先定义宏:#define WM_MY_MSG WM_USER+N(N>100)
2://增加消息响应函数的声明,大概是在.h头文件
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
3://消息响应函数,大概是在CPP里面添加
LRESULT CMainWindow::OnMyMessage(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("MyMsg received");
return 0;
}
void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
响应鼠标左键按下来产生那个自定义的消息
PostMessage(WM_MY_MSG,0,0);
}
4建立消息映射,在没有钥匙的那个函数上执行
//增加消息映射
ON_MESSAGE(WM_MY_MSG,OnMyMessage)
5以上是一种方法另外还有一种有时间多看看消息内部机制熟悉MFC和API。
=====================
8.8
继续消息
=================================
8.9
很多控件类都是继承CWnd来的?
8.10
串口编程
MSCOMM不是工具控件,所以使用的时候要添加,具体就是Project->Add To Project->Commponents and Controls 然后你在一堆ActiveX中找到Miscrosoft Communications Control,Version 6.0
工程那里添加
------------------------------------------------------------------------------------------------------
csdn的回复
1
我用API编程,感觉难度嘛,入门了也不难,串口通讯分大致几个步骤,
1:打开串口:包括对串口缓冲区的定义,超时设置,DCB结构设置等等
2:向串口读入缓冲区发送通讯协议所规定的命令
3:仪器接收到命令后会向读出缓冲区回馈信息,你需要去读取
4:对仪表的回馈信息进行处理,提取有效信息等,
这过程大致的难点:
第1步没有什么难度,网上有代码给你抄袭
第2步要注意发送命令的格式:字符格式或是16进制格式等等,你需要研读通讯协议,根据协议的命令格式,自编命令,建议你和厂商多联系,要有死缠烂打的精神
第3步没有太多难度
第4步需要一些处理,因为不同厂商定制的协议不同,反馈信息也不同,需要你有熟练的字符串处理能力,进制转换能力,数学算法等
另外串口编程很有可能需要涉及到数据库编程,毕竟数据多数情况需要保存嘛!
-----------------------------------------------------------------------------------------------------------
串口设置OnInitDialog();
CDialog::OnInitDialog();
m_ctrlComm.SetCommPort(1);
m_ctrlComm.SetInputMode(1);//二进制
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(512);
m_ctrlComm.SetSettings("9600,n,8,1");
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(true);
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.SetInputLen(0);
m_ctrlComm.GetInput();
//OnInitDialog();
//oncomm() 发生通讯事件,主要是从串口接收数据并显示在编辑框中,MSComm事件
file://已经包括好,无须用户自定义消息.
void CSCommTestDlg::OnOnCommMscomm2()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2)
{
variant_inp=m_ctrlComm.GetInput();
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
{
BYTE bt=*(char *)(rxdata+k);
strtemp.Format("%c",bt);
m_edit2+=strtemp;
}
}
//发数据
void CSCommTestDlg::OnButton1()
{
file://AfxMessageBox("okok");
UpdateData(true);
m_ctrlComm.SetOutput(COleVariant(m_edit3));
}
=========================================
8.13
之前电脑中毒,决定重装,在C盘,准备格式D盘。
今天学了一下串口
已及一些控件类,
combo,
setcursel()初始当前项
getcursel()当前项的INDEX
setLBTEXT(N,M)获得第N项,写入M数组里面。
==================================
8.14
控件EDIT里面要实现垂直分屏或者叫换行,可以在属性那里选多行就有垂直滚动的选项.
现在开始学动态连接库DLL.
一个用于WINDOWS应用程序开发的工具是在VC98的DUMPBIN
(1)DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见
我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
(3)VC动态链接库的分类
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
当DLL中的函数改变后,只要不是参数的改变
调用起的函数并不需要重新编译。
http://mmchome.blog.com.cn/archives/2007/2321762.shtml
=========================================================
8.15
(1)使用extern "C"修饰函数声明,否则,生成的DLL只能供C++调用;
(2)使用__stdcall修饰函数声明及定义,__stdcall是Windows API的函数调用方式。
测试
--------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); file://宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; file://DLL句柄
lpAddFun addFun; file://函数指针
hDll = LoadLibrary("..//Debug//dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
getchar();
}
FreeLibrary(hDll);
}
return 0;
}
-----------------------------------------------------------------------
#include "lib.h"
int add(int x, int y)
{
return x + y;
}
--------------------------------------------------------------------------
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif
=============================
8.16
1,c要大写
2,应用MFC DLL扩展要加#include "stdafx.h" 预处理,不然就在SETTING设置
终于调用简单例子
首先路径,..那个是EXE和DLL一起的,
然后设置一个EXE对应的MFC EXTERN DLL
H和CPP文件,CPP文件要带预处理
在应用程序里面,函数先声明,然后获得地址等,简单的DLL就可以被调用了.
typedef int(*lpAddFun)(int, int);
CString str;
HINSTANCE hDll;//DLL句柄
lpAddFun addFun;//函数指针
hDll = LoadLibrary("..//Debug//comDll.dll");
AfxMessageBox("fsadfasd");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
AfxMessageBox("fsadfasd");
int result = addFun(2, 3);
str.Format("%d",result);
AfxMessageBox(str);
AfxMessageBox("1");
}
FreeLibrary(hDll);
}
注意DLL的H和CPP文件要同时修改,否则接收为NULL.
资源拖到另一个工程
1,打开fileview,点击右键-〉add file to project->把那个*.res添加进来,、
然后打开resourceview,拖动一个dialog中的dlg到另一个dialog中,
最后,从fileview中,吧那个*.res删除,记得不要存盘阿
2,在新的工程里打开旧工程的res文件,然后把你的对话框资源,拖拉到你新工程resource view下的dialog下
CreateFile
对该函数理解:首先返回一句柄,然后用该句柄执行一系列初始化函数.
串口相关函数:SetupComm()
-----------------------------------------
在书上看到一个设置串口输入输出缓冲区大小的函数:
SetupComm(hCom,1024,521),
我对串口的输入和输出缓冲区这样的概念不是很理解,有高手能解释一下吗?
还有,为什么输入与输出缓冲区设置的大小不一样呢?这有什么关系吗?
----------------------------------------------------------------------
缓冲区就是在你来不及处理数据的时候暂时保留数据的一块内存,其大小应该根据你的数据传输速率和处理数据的能力大小来设置。如果一直来不及处理数据,又没有合适的纠错方法,就会导致数据丢失。
至于大小不一样,没什么道理,你也可以设置成一样。
#include "lib.h"
int add(int x)
{
file://CreateFile
switch(x)
{
case 0:
x=1;break;
case 1:
x=2;break;
case 2:
x=3;break;
case 3:
x=4;break;
case 4:
x=5;break;
default : ;
}
return x;
}
{
CString str;
{
case 0:
str="COM1";break;
case 1:
str="COM2";break;
case 2:
str="COM3";break;
case 3:
str="COM4";break;
case 4:
str="COM5";break;
default : ;
}
if(m_hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return FALSE;
}
dcb.ByteSize = 8; file://数 据位数为8位
dcb.Parity = NOPARITY; file://偶 校验
dcb.StopBits = 2; file://两 个停止位
{
AfxMessageBox("串口设置出错1!");
}
else
{
AfxMessageBox("成功了!");
}
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
file://设 定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
file://在 读一次输入缓冲区的内容后读操作就立即返回,
file://而 不管是否读入了要求的字符。
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(m_hCom,&TimeOuts); file://设 置超时
PurgeComm(m_hCom,PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
if (!SetCommState(m_hCom, &dcb))
{
AfxMessageBox("串口设置出错2!");
}
file://PurgeComm (m_hCom,PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
}
bool GetComData(int x)
{
return true;
}
lpAddFun addFun;//函数指针
CString str;
{
addFun = (lpAddFun)GetProcAddress(hDll, "ComOpen");
if (addFun != NULL)
{
addFun(m_combo1.GetCurSel()) ;
}
AfxMessageBox("为NULL,请检查CPP文件");
FreeLibrary(hDll);
}
GetDlgItemText(IDC_YOUREDIT,yourstring);
这样就把CEdit的值放到字符串里了。
BOOL WriteFile(
HANDLE hFile, // handle to file to write to
LPCVOID lpBuffer, // pointer to data to write to file
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O
);
其中nNumberOfBytesToWrite是你要发送的字节数;
lpNumberOfBytesWritten是实际发送出去的字节数;他是一个指针,用来保存writefile函数实际发送的字节数。
{
BYTE bt=*(char *)(rxdata+k);
strtemp.Format("%c",bt);
str+=strtemp;
}
CString str;
str.Format("%s",key);
BYTE key[5] = {0};
for(int i =0; i < str.GetLength(); i++)
{
key[0] = str.GetAt(i);
}
DWORD dwCount;
SetFilePointer(hFile, NULL, NULL, FILE_BEGIN);
BYTE szStore[128];
DWORD dwReadCount = 128;
DWORD dwWriteCount = 0;
while(dwReadCount==128)
{
ReadFile(hFile, szStore, 128, &dwReadCount, NULL);
WriteFile(hWriteFile,szStore,dwReadCount, &dwWriteCount, NULL);
}
DWORD dwReadCount = 128;
DWORD dwWriteCount = 0;
CString s;
{
s.Format("%d",dwReadCount);
AfxMessageBox(s);
s.Format("%d",dwReadCount);
AfxMessageBox(s);
WriteFile(m_hCom,cByte,dwReadCount, &dwWriteCount, NULL);
s.Format("%d",dwReadCount);
AfxMessageBox(s);
BYTE c2[1024];
DWORD dwWriteCount = 0;
CString s;
{
// s.Format("%d",dwReadCount);
// AfxMessageBox(s);
// WriteFile(m_hCom,cByte,dwReadCount, &dwWriteCount, NULL);
WriteFile(m_hCom,cByte,128, &dwReadCount, NULL);
AfxMessageBox(s);
未解决句柄传送,解决句柄传送
你把“BYTE KeyMap[256]”改成“int n=0”试试!
BYTE KeyMap[256];
#pragma data_seg()
#pragma comment( linker, "/section:SYSHK,rws" )
HANDLE handle=NULL; file://必 须在定义的同时进行初始化!!!!
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws" )
//SendDataToCom 这里是CString等类型什么的,反正你觉得dll奇怪就可以这里一试
int nLength=m_edit.SendMessage(WM_GETTEXTLENGTH);
m_edit.SetSel(nLength, nLength);
m_edit.ReplaceSel("abc");
SetWindowText(str+str2..);
上面的方法更好些。
当多行风格的文本框获得增加文本后,滚动条还是没有跟随移动到底部,希望给我具体
代码参考,实现当文本增加后,滚动条也自动往下移动<注意,CEDIT的文本不是手动输入
的,是程序获取的
m_edit.GetWindowText(str);
m_edit.SetSel(str.GetLength(), str.GetLength());
m_edit.LineScroll(m_edit.GetLineCount());
获得socket对方IP
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" /
no_namespace rename("EOF", "adoEOF")
pEdit->GetWindowText(str2);
- CFieldExchange 类支持数据库的字段交换过程,即RFX 机制。
- CDBException 类完成数据库类操作的异常处理。用户可根据其中公用成员变量的取值来分析出现错误的原因或显示出相应的文本信息。
- ==================================================
9.4灰度图像滤波去噪的目的是去除灰度指纹图
像中的叉连、断点及模糊不清的部分.
灰度图像滤波去噪的目的是去除灰度指纹图
像中的叉连、断点及模糊不清的部分.五个基本步骤完成.=====================================================9.5ODBC数据添加用AddNew()之后用m_pSet->Update();修改用m_pSet->Edit();再在函数或者消息那里用UpdateData(true);
m_pSet->Update();就OK===================================================9.6捕捉异常要记得在关键代码捕捉,否则就用F9跟踪一下,是否代码块不在捕捉异常之列.指纹匹配的方法很多,包括基于奇异点的匹配、嵴模式的匹配、特征点的匹配、特征点线对(两个特征点的连线)匹配,以及特征点组的匹配方法。==================================================MFC_ODBC/n/nMFC_OD/n/n/nMFCODBC.Document/nMFC_OD Document9.7在String Table的字串表修改IDR_MAINFRAME的标题在initlnstance()里面m_pMainWnd->SetWindowText("数据库");改标题更好使控件变灰GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);CEdit获得焦点pCtrl=(CEdit *)GetDlgItem(IDC_ID);
pCtrl->SetFocus();修改STATIC文本颜色,添加CtlColorif(pWnd->GetDlgCtrlID()==IDC_STATIC1)
{
//pDC->SetBkColor(RGB(0,128,128));
// pDC->SetBkColor(RGB(32,200,200));
// pDC->SetTextColor(RGB(128,0,0));
}m_pSet->Edit();
m_pSet->m_name=str;
m_pSet->Update();修改数据======================================9.10moveLast并未能触发isEof,??在void CMFC_ODBCView::OnInitialUpdate()可以进行一些初始化操作GetRecordCount数据库内剩余记录个数while(!m_pSet->IsEOF( ))
m_pSet->MoveNext( );
调用GetRecordCound可获得记录集中的记录总数,该函数的声明为
long GetRecordCount( ) const;
要注意这个函数返回的实际上是用户在记录集中滚动的最远距离.要想真正返回记录总数,只有调用MoveNext移动到记录集的末尾(MoveLast不行).m_pusrrcdset->m_pDatabase->Execute SQL 可以执行SQL语句.使用delete后,指针指向一个无效的随机的位置,通常用movenext应该没问题,但movenext之后也不会是下一条记录,所以应该requery,if(!Eof)delete。如果调用AddNew()方法,则只能添加在纪录集末尾。除非你把那个纪录以后的所有记录都delete,加入这条记录,再把他们都加进来***********查询是否还有记录************************************while(!m_pSet->IsEOF( ))
{
count++;
m_pSet->MoveNext( );
}if((count-1)==0)我采用这一方法,因为Delete后指针都不知道只指向哪里去了.==========================================================9.12GetDlgItem(IDC_NextRecord)->EnableWindow(false);使窗口冻结WaitCommEvent是阻塞的,通常的做法是开一个线程 循环调用WaitCommEvent(),中间判断如果符合条件,发消息给主线程。
====================================================9.13SetCommMask (handle, EV_RXCHAR);写事件if(WaitCommEvent( handle, &dwCommStatus, NULL )!=0)
AfxMessageBox("ok");if ((dwCommStatus & EV_RXCHAR) == EV_RXCHAR)//char *_itoa( int value, char *string, int radix ); _itoa 转换str.Format(_T("%02x %02x %02x %02x %02x %02x %02x %02x") , cByte[0] , cByte[1] , cByte[2] , cByte[3] , cByte[4] , cByte[5] , cByte[6] , cByte[7]);解决数组转换问题BYTE cByte[8] = {0};
cByte[0] = 0x1b;
cByte[1] = 0x72;
cByte[2] = 0x73;
cByte[3] = 0x00;
cByte[4] = 0x03;
cByte[5] = 0x83;
cByte[6] = 0x00;
cByte[7] = 0x86;char* Buffer;
Buffer = (char*)malloc(8*sizeof(BYTE));
CString strByte;
for (int i=0;i < 8;i++)
{
itoa(cByte[i],Buffer,16);
strByte += Buffer;
strByte += ' ';
}
AfxMessageBox(strByte);
free(Buffer);PurgeComm( handle,PURGE_RXCLEAR);清空输入缓冲区定义WSAOVERLAPPED ol;
WaitCommEvent(m_handle_1,&dwEvtMask,&ol);EV_RXFLAG: 接收到事件字符(DCB结构中EvtChar成员),放入输入缓冲区。if ((dwCommStatus & EV_RXFLAG) == EV_RXFLAG)//EV_BREAK 检测到输入为止EV_CTS CTS(清除发送)信号改变状态EV_DSR DSR(数据设置就绪)信号改变状态EV_ERR 发生了线路状态错误.线路状态错误为:CE_FRAME(帧错误)CE_OVERRUN(接收缓冲区超限)CE_RXPARITY(奇偶校验错误)EV_RING 检测到振铃EV_RLSD RLSD(接收线路信号检测)信号改变状态EV_EXCHAR 接收到一个字符,并放入输入缓冲区EV_RXFLAG 接收到事件字符(DCB成员的EvtChar成员),度放入输入缓冲区EV_TXEMPTY 输出缓冲区中最后一个字符发送出去ClearCommError 查缓冲区EV_TXEMPTY后用EV_RXCHAR可以完成按抬手指工作.涉及cfiledialog===============================================9.14eXeScope
Resource Hacker 可能可以提取DLL资源如果没有压缩过的话.
打开VS6.0, 文件/打开,
文件类型: 所有
方式: resource然后另存为rc文件就可以提取里面的CString a="01 2d f4 a6 8e"转换为十进制????CString a="01 2d f4 a6 8e";
int aa[5];
memset(aa,0,sizeof(aa));
sscanf(a,"%x %x %x %x %x %x",&aa[0],&aa[1],&aa[2],&aa[3],&aa[4]);最简单的使用CFileDialog方式CFileDialog fileDlg(true);
fileDlg.DoModal();dll里面创建对话框先插入资源,然后NEW CLASS,不过有个比较奇怪的问题,可以先//再删除注释.记得在资源.h,是资源.h里面添加#include "resource.h"才可以解决
=====================================================9.151。设置字体大小
CreateFont() // 在里面设置大小
HFONT CreateFont(
int nHeight, // height of font
int nWidth, // average character width
int nEscapement, // angle of escapement
int nOrientation, // base-line orientation angle
int fnWeight, // font weight
DWORD fdwItalic, // italic attribute option
DWORD fdwUnderline, // underline attribute option
DWORD fdwStrikeOut, // strikeout attribute option
DWORD fdwCharSet, // character set identifier
DWORD fdwOutputPrecision, // output precision
DWORD fdwClipPrecision, // clipping precision
DWORD fdwQuality, // output quality
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // typeface name
);
SelectObject() //选进去
然后再写上去
2 旋转角 //不知道~
3 是指最简单 应用 程序窗口,像记事本窗口那样的)上的;
--- 他是设置了很多全局变量来保存字体信息而已~
4 哪个函数是可以将变量值输出到当前窗口上的;
先获得DC,在OnDraw()里写下面的话
CString s;
wsprintf(s,"%d",m_nTest); //m_nTest是你所说的变量
pDC->TextOut(x,y,s);
5 如何解决在画两个圆相交时,后画上去的圆总会复盖掉先画的一部分,我用的是Ellipse();
看一下光栅操作,如果你直接画,本来就是复盖的~
6 关于COLORREF
:the COLORREF value has the following hexadecimal form:
0x00bbggrr //注意这个就行了 ,一般用 RGB(255,255,0);
7 应该怎样定义,调用这些函数是否要哪些头文件,我写时总是提示错误,请说明一下,谢谢!!
--
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0,255,0);
CPen myPen(PS_DOT|PS_GEOMETRIC|PS_ENDCAP_ROUND, 2, &logBrush);//这样就OK了===========================================9.17多线程问题如果涉及资源比较多,对话框之类难以实现,就尽量不用CreateThread,因为该函数有可能导致主窗口句柄为空不一至,而出现ASSERT错误.hThread=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)ThreadFunc,AfxGetMainWnd()->m_hWnd,0,&ThreadID);这时候可以选择用AfxBeginThread不过注意的是起线程序函数记得要带UINT ThreadFunc(LPVOID pParam)//LPVOID参数而且在声明的H中用static防止返回this指针.static UINT ThreadFunc(LPVOID pParam);不然就会出现error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (__cdecl *)(void)'改用循环对比字符串来实现,不用事件,事件有些问题***************=======================================================9.18// 设置要打开的文件
char* pszFileName = "c://test.dat" ;
CFile myFile;
CFileException fileException;
// 打开文件,中间可能会出现异常
int iOpenResult = myFile.Open(pszFileName,
CFile::modeCreate | CFile::modeReadWrite,
& fileException);
if(! iOpenResult)
{
// 如果出错,输出出错信息
TCHAR szError[1024];
fileException.GetErrorMessage(szError, 1024);
cout << szError << endl;
myFile.Close();
}
else
{
// 向文件写入数据
char szWrite[1024];
strcpy(szWrite, "I am xuzhong , I love this launguage ./n");
myFile.Write(szWrite, lstrlen(szWrite));
myFile.Close();
}CFileDialog mFileDlg(false,"*.miu","",OFN_HIDEREADONLY,
"所有文件|*.*|miu文件|*.miu||");
mFileDlg.DoModal();设置全局变量中的是一个方法是在一个.CPP内声明然后在另一个要用到的类.CPP里 extern===================================================9.19传过去都都变为一个字符,空格也为一字符,总共453个,文件都是字符串形式strtoul(temp, NULL, 16) ;字符串转16进制=========================================================9.20DLL和对话框多线程窗口句柄处理问题,两方面各设置一多线程,用全局变量传递消息.GetActiveWindow(),获取当前线程负责处理消息的窗口GetForegroundWindow(), 获取全局的输入焦点窗口。就是你键入的字符出现在的那个窗口。===================================================9.23设置字体,CFont对象用完要记得销毁CFont txtFont;
txtFont.CreatePointFont(15,"宋体");
SetFont(&txtFont);
DeleteObject(SelectObject(*GetDC(),txtFont));响应WM_CTLCOLOR消息:
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch (nCtlColor)
{
case CTLCOLOR_STATIC:
pDC->SetTextColor(RGB(0, 0, 0));
pDC->SetBkColor(RGB(255,255,255));
case CTLCOLOR_EDIT:
pDC->SetTextColor(RGB(0, 0, 0));//这就是改变编辑框字体颜色
pDC->SetBkColor(RGB(255,255,255));//这是改变编辑框背景的颜色
case CTLCOLOR_LISTBOX:
pDC->SetTextColor(RGB(0, 0, 0));
pDC->SetBkColor(RGB(255,255,255));
case CTLCOLOR_SCROLLBAR:
pDC->SetTextColor(RGB(0, 0, 0));
pDC->SetBkColor(RGB(255,255,255));
case CTLCOLOR_BTN:
pDC->SetTextColor(RGB(0, 0, 0));
pDC->SetBkColor(RGB(255,255,255));
case CTLCOLOR_DLG:
return m_Brush;
}
// TODO: Return a different brush if the default is not desired
return m_Brush;
}if (pWnd->GetDlgCtrlID() == IDC_EDIT_TO)
{
// Set the text color to red
pDC->SetTextColor(RGB(255, 0, 0));
// Set the background mode for text to transparent
// so background will show thru.
pDC->SetBkMode(TRANSPARENT);
}注意,如果是被禁用的控件就另外用其他方法设置,因为禁用后GetDlgCtrlID!=控件名.设置字体大小CClientDC dc(this);
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
CFont* font = new CFont;
font->CreatePointFont(150, _T("华文行楷"), &dc);
if(pEdit)
{
pEdit->SetFont(font, TRUE);
}
else
AfxMessageBox("Failed");关于CStatic ,要设置BN_CLICKED消息,还必须设置属性为通知(Notify)=====================================================9.26不必要绑定到单文档#include "afxdb.h"CDatabase db;
db.OpenEx( _T( "DSN=table1" ),CDatabase::noOdbcDialog); //连上数据源CRecordset rs(&db);
rs.Open(AFX_DB_USE_DEFAULT_TYPE,"select * From table1");//获得指针方便行事
int nfieldcount=rs.GetODBCFieldCount();
CString msg;
msg.Format("There are %d fields in table1",nfieldcount);
AfxMessageBox(msg);
//field 0 is int field,name "intfield",retrieve by field index
CDBVariant dbvar;
rs.GetFieldValue((short)0,dbvar);
//field 1 is string field,name "strfield",retrieve by field name
CString dbstrvar;
rs.GetFieldValue("strfield",dbstrvar);
msg.Format("field 0 value:%d,field name strfield value=%s",dbvar.m_iVal,dbstrvar);
AfxMessageBox(msg);
rs.Close();
db.Close();=================================================9.27学习Clistctrl的焦点设置问题光用SetItemState(lpLIST,LVIS_SELECTED|LVIS_FOCUSED,LVIS_FOCUSED|LVIS_SELECTED);是不行的,下次要指向另外一个选项的话,那么就先设置.SetFocusint CMFC_NewOdbcDlg::GetCursel()//焦点行提取函数
{
if(m_lIdAndName.GetSelectedCount()<=0)//先判断是否有焦点触发
return -1;for(int i=0;i<m_lIdAndName.GetItemCount();i++)//焦点触发后
{
if(m_lIdAndName.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
{
return i;
}
}
return 1;
}===========================================10.6CRecordset::IsEOFBOOL IsEOF( ) const;Return ValueNonzero if the recordset contains no records or if you have scrolled beyond the last record; otherwise 0.