博文
改变对话框的背景颜色(2006-09-24 12:05:00)
摘要:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对于这个问题,其实可以由几种不同的方法来实现,具体如下(粗斜体代码为增添的): ---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 ---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: ---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。 ---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( ){… CExampleDlgDlg dlg; m_pMainWnd = &dlg;//先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal();…}---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。 ---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg::OnPaint() { if (IsIconic())… else { CRect rect; CPaintDC dc(this); &n......
VC++的菜单控制和自绘菜单(2006-09-24 12:03:00)
摘要:菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值),工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项。//Disable MFC from automatically disabling menu items.m_bAuoMenuEnable=FALSE;//Now enable the menu item.CMenu* pMenu=GetMenu ();ASSERT_VALID (pMenu);pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED);如何给系统菜单添加一个菜单项 给系统菜单添加一个菜单项需要进行下述三个步骤:首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项:int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct){…//Make sure system menu item is in the right range.ASSERT (IDM_MYSYSITEM &0xFFF0)==IDM_MYSYSITEM);ASSERT (IDM-MYSYSITEM<0xF000);//Get pointer to system menu.CMenu* pSysmenu=GetSystemmenu (FALSE);ASSERT_VALID (pSysMenu);//Add a separator and our menu item to system menu.CString StrMenuItem (_T ("New menu item"));pSysMenu->Appendmenu (MF_......
Windows消息大全 ZZ(2006-09-24 11:37:00)
摘要:(转载)Windows消息大全
表A-1 Windows消息分布消息范围说 明0 ~ WM_USER – 1系统消息WM_USER ~ 0x7FFF自定义窗口类整数消息WM_APP ~ 0xBFFF应用程序自定义消息0xC000 ~ 0xFFFF应用程序字符串消息> 0xFFFF为以后系统应用保留表A-2 常用Windows消息消息名称值说 明WM_NULL 0x0000空消息,此消息将被接收窗口忽略WM_CREATE 0x0001应用程序创建一个窗口WM_DESTROY0x0002一个窗口被销毁WM_MOVE0x0003移动一个窗口WM_SIZE0x0005改变一个窗口的大小WM_ACTIVATE0x0006一个窗口被激活或失去激活状态WM_SETFOCUS0x0007获得焦点后WM_KILLFOCUS0x0008失去焦点WM_ENABLE0x000A应用程序Enable状态改变时产生WM_SETREDRAW0x000B设置窗口是否能重画WM_SETTEXT0x000C应用程序发送此消息来设置一个窗口的文本WM_GETTEXT0x000D应用程序发送此消息来复制对应窗口的文本到缓冲区WM_GETTEXTLENGTH0x000E得到与一个窗口有关的文本的长度(不包含空字符)WM_PAINT0x000F要求一个窗口重绘自己WM_CLOSE0x0010当一个窗口或应用程序要关闭时发送一个信号WM_QUERYENDSESSION0x0011用户选择结束对话框或应用程序自己调用ExitWindows()函数WM_QUIT0x0012用来结束程序运行或应用程序调用Postquitmessage()函数来产生此消息WM_QUERYOPEN0x0013当用户窗口恢复以前的大小位置时,把此消息发送给某个图标WM_ERASEBKGND0x0014当窗口背景必须被擦除时(例如在窗口改变大小时)WM_SYSCOLORCHANGE0x0015当系统颜色改变时,发送此消息给所有顶级窗口WM_ENDSESSION0x0016当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序WM_SHOWWINDOW0x0018当隐藏或显示窗口是发送此消息给这个窗口WM_ACTIVATEAPP0x001C当某个窗口将被激活时,将被激活窗口和当前活动(......
在对话框中动态显示位图 zz(2006-09-24 11:16:00)
摘要: 在对话框中显示位图分为静态和动态两种方法。静态法就是用VC6.0的资源编辑器,首先在资源视图中引入一张所要显示的位图,然后在对话框中放置一个Picture控件,在其属性对话框的Type下拉框中选择Bitmap,在Image框中输入所引入位图的ID,编译后对话框中就会显示所引入的位图。这种方法有一个明显的缺点,就是位图必须先画好并且程序运行时此位图禁止改变。基于此,下文以建立一个适时显示当前时间的程序为例,来介绍如何在对话框中动态显示位图。 首先建立一个基于对话框的程序,名为MyDialog。 清除掉对话框中的TODO:字样,把“确定”和“取消”两个按钮移到对话框的下边,调整对话框为到合适大小。 打开类视图,右键单击CMyDialogDlg,添加如下成员变量: protected: CRect m_bitmapRect; //位图在对话框中位置 添加画图成员函数: protected: BOOL DrawBitmap(CString strTime,CRect* bitmapRect); //strTime为表示时间的字符串,bitmapRect指明在窗口的什么区域画图。 使用ClassWizard为CMyDialogDlg加入WM_TIMER的消息响应函数OnTimer(), 和WM_DESTROY的消息响应函数OnDestroy()。 在CMyDialogDlg::OnInitDialog()种添加如下代码: SetTimer(1,100,NULL);//设置定时器 CRect rect; GetClientRect(&rect);//获得客户区大小 ScreenToClient(&rect);//将屏幕坐标转化为客户坐标 int width=180,height=45;//要创建的位图的宽度和高度 m_bitmapRect.left=rect.right-25-width; //位图右边界距对话框的右边界25像素 m_bitmapRect.top=rect.top+35;//位图上边界距对话框的上边界35像素 m_bitmapRect.right=m_bitmapRect.left+width; m_bitmapRect.bottom=m_bitmapRect.top+height; 编写画图代码。......
vc 颜色字体设置(2006-09-24 11:11:00)
摘要:vc 颜色字体设置(2)
字体设置: VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体。对于你的问题,需要首先用CreateFont来建立一个字体对象,然后调用控件的SetFont,就可以了。 例子: 1、改静态文体的ID,如:IDC_STATIC1 2、添加一个Edit控件,建立一个关联的控件m_editControl。 3、在OnInitDialog中添加如下代码: CFont * f;
f = new CFont; f->CreateFont(16, // nHeight 0, // nWidth
0, // nEscapement
0, // nOrientation FW_BOLD, // nWeight TRUE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision &nb......
用VC 6.0实现串行通信的三种方法(2006-09-24 11:07:00)
摘要:用VC 6.0实现串行通信的三种方法
中国科学院 王颖 ---- 摘要: 本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。串行通信程序开发环境为 VC++ 6.0。 ---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。以下将结合实例,给出实现串行通信的三种方法。 ---- 实现串行通信的三种方法
---- 方法一:使用VC++提供的串行通信控件MSComm
首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 ---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属......
Windows API函数大全二(2006-09-24 11:04:00)
摘要:7. API之位图、图标和光栅运算函数 BitBlt 将一幅位图从一个设备场景复制到另一个 CopyIcon 制作指定图标或鼠标指针的一个副本。这个副本从属于发出调用的应用程序 CopyImage 复制位图、图标或指针,同时在复制过程中进行一些转换工作 CreateBitmap 按照规定的格式创建一幅与设备有关位图 CreateBitmapIndirect 创建一幅与设备有关位图 CreateCompatibleBitmap 创建一幅与设备有关位图,它与指定的设备场景兼容 CreateCursor 创建一个鼠标指针 CreateDIBitmap 根据一幅与设备无关的位图创建一幅与设备有关的位图 CreateDIBSection 创建一个DIBSection CreateIcon 创建一个图标 CreateIconIndirect 创建一个图标 DestroyCursor 清除指定的鼠标指针,并释放它占用的所有系统资源 DestroyIcon 清除图标 DrawIcon 在指定的位置画一个图标 DrawIconEx 描绘一个图标或鼠标指针。与DrawIcon相比,这个函数提供了更多的功能 ExtractAssociatedIcon 判断一个可执行程序或DLL中是否存在图标,或是否有图标与系统注册表中指定的文件存在关联并提取之 ExtractIcon 判断一个可执行文件或DLL中是否有图标存在,并将其提取出来 GetBitmapBits 将来自位图的二进制位复制到一个缓冲区 GetBitmapDimensionEx 取得一幅位图的宽度和高度 GetDIBColorTable 从选入设备场景的DIBSection中取得颜色表信息 GetDIBits 将来自一幅位图的二进制位复制到一幅与设备无关的位图里 GetIconInfo 取得与图标有关的信息 GetStretchBltMode 判断StretchBlt 和 StretchDIBits函数采用的伸缩模式 LoadBitmap 从指定的模块或应用程序实例中载入一幅位图 LoadCursor 从指定的模块或应用程序实例中载入一个鼠标指针 LoadCursorFromFile 在一个指针文件或一个动画指针文件的基础上创建一个指针 LoadIcon 从指定的模块或应用程序实例中载入一个图标 LoadImage 载入一个位图、图......
Windows API函数大全一(2006-09-24 11:00:00)
摘要:1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息
3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile ......
VC网络数据库开发 zz(2006-09-24 10:35:00)
摘要:VC网络数据库开发
典型网络数据库系统软件设计一、概述
本系统为内部系统,帐户由管理员添加、管理;
分为两个组,User组和Boss组。Boss组的帐户可以发广播通知;
任意两个用户间可以互相通信;
数据库接口用DAO,网络通信用 CSocket+CSocketFile;
二、详细设计 1、数据库设计本系统只是一个消息通信模型,这里的数据库设计比较简单。ER图: 把ER模型转为关系模型,共两个表:
User (No , Name ,Password ,G#) 候选键:No 外键:G#
Group (G# , GroupName ,Demo ) 主键 :G#
2、消息格式设计<1>、传送的消息共有5类------登录消息,验证返回消息,普通消息,用户列表消息,通知消息。定义一个枚举类型:enum MSGTYPE {LOGIN , LOGINResponse , CHATTING , USERList , NOTICE};
<2>、定义消息类 class CMsg : public CObject
{
public:
int m_eType; //枚举类型,记录消息类型
CString m_strMsg; //消息
CMsg();
virtual ~CMsg();
void Serialize(CArchive &ar); //消息类系列化函数,发送和接受消息时用。
}; <3>、m_strMsg 为消息类中存放消息的成员,它的具体格式随着消息类型m_eType不同而不同。
m_eType
m_strMsg
LOGIN
呢称|密码
LOGINResponse
GOOD|欢迎!(BOSS) 或 FAILED|验证失败!
CHATTING
发给(来自)的用户名|消息内容
USERList
呢称1|呢称2|…|呢称n|END
NOTICE
ALL|消息内容 或 来自的用户|消息内容
m_strMsg中个内容用“|”隔开,用函数Decode(int n,CString strMsg) 获的相应的内容。CString Decod......
直接通过ADO操作Access数据库 zz(2006-09-24 10:33:00)
摘要:直接通过ADO操作Access数据库作者/徐景周 我在《VC知识库在线杂志》第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读、写Excel表格文件”和“直接通过DAO读、写Access文件”,先后给大家介绍了ODBC和DAO两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO数据库访问技术的使用方法。ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。 ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。让我们直接步入主题:如何掌握ADO这种数据库访问技术。ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序——AdoRWAccess,这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示: 在示例程序中我们仍采用原库结构,数据库名Demo.mdb,库内表名DemoTable,表内字段名为Name(姓名)和Age(年龄)的两个字段,来构造示例程序操作所需的Access数据库,这也和上两篇文章的示例源码中的库结构相兼容。下面让我们看看ADO数据库访问技术使用的基本步骤及方法: 首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现: #import "c:\program files\common files\system\ado\msado15.......
