一般使用其他的开发工具,都可以插入文件版本信息等注释。尤其在Eclipse里面这些功能做的相当的好。DEV-CPP也提供了一个简单的文件信息注释,但是VC6.0却没有现成的注释可供插入。不过利用VC6.0的宏功能却可以达到我们需要的效果。 要做到如下的效果:/**
* Name:
* Copyright:
* Author:
* Date: 2008-4-18 21:54:32
* Description:
* Modification:
**/ 在菜单Tools下选择Macro,会弹出一个对话框,选择Record,之后输入名字,这里我输入的是FILECOMMENT,然后录制了一段,回到这个界面,点击Edit。由此观察代码,最后修改的代码格式在后面给出。在Macro弹出的界面选择Options,选择Keystore,这时你就可以输入一个快捷方式,这里我使用的是Ctrl+E。以后在需要使用这个注释时,直接使用快捷键Ctrl+E就OK了。Sub FILECOMMENT()
'DESCRIPTION: COMMENT For file version
ActiveDocument.Selection = "/**"
ActiveDocument...
[] []
void CStockView::OnDraw(CDC* pDC)
{
CStockDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//以下程序用来画一根阳K线(相对复杂点纺锤线:有上影线和下影线的实阳线),
//为了说明方便,数字都用的整形,便于开发。
CClientDC mjClientDC(this) ;
OnPrepareDC(&mjClientDC);
CRect rc;
GetClientRect(&rc);
CBrush br(RGB(0,0,0));
pDC->FillRect(&rc,&br);//背景变成黑色
CBrush *pBrush;
CBrush mjSunBrush;
CPen *pPen;
CPen mjSunPen ;
mjSunBrush.CreateSolidBrush(RGB(255,0,0));//红色
pBrush = mjClientDC.SelectObject(&mjSunBrush);//取得刷子指针
mjSunPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
pPen = mjClientDC.SelectObject(&mjSunPen);//取得画笔指针
int ClosePrice = 97 ; // 调整不同的收盘价,图形会有变化,画阴线判..
[] []
ClassWizard不允许增加用户自定义消息,所以你必须手工输入。输入后,ClassWizard就可以象处理其它消息一样处理你自定义的消息了。 下面是增加自定义消息的步骤: 第一步:定义消息。开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。 第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LRESULT。 LRESULTCMainFrame::OnMyMessage(WPARAMwParam,LPARAMlParam) //Lonefox转注:若是通过MFC添加的函数,必须把类定义中的函数头删除,否则和下面的消息映射定义重叠,编译时报重定义错误
{
//TODO:处理用户自定义消息
...
return0;
} 第三步:在类头文件的AFX_MSG块中说明消息处理函数: classCMainFrame:publicCMDIFrameWnd
{
...
//一般消息映射函数
protected:
//{{AFX_MSG(CMainFrame)
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx..
[] []
今天下午学习了两点,一,在vc自定义函数中传定不定个数的参数,即如format函数中的第二个参数"...",能接收任意个数参数;二,自定义异常的抛出,即throw一个自定义异常. 函数代码列如下://ComboProp.h:interfacefortheCComboPropclass.
//
//////////////////////////////////////////////////////////////////////
#if!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
#defineAFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include"bcgpproplist.h"
classCSelItemException:publicCException//trow的异常类的定义
{
public:
CSelItemException(constint&SelIndex,constint&ItemCount)//修改构造函数,使catch时可以获取要报告的参数
{
this->m_IndextoSeled=SelIndex;
this->m_ItemCount=ItemCount;
}
C..
[] []
CCheckListBox可以实现带CheckBox的ListBox,VC6自带,头文件Afxwin.h; 但不支持托放式加入界面(再次骂下开发VC的MS人员,UI支持超级弱智!)。 有个方法比较简单,在窗口拖放一个CListBox(不会不知道是哪个吧?那就撞墙好了。),ID是IDC_LIST1,在类向导器里创建一个Control型变量,如m_List,在窗口类里将会有 CListBox m_List; 将CListBox修改成CCheckListBox; 直接这样还是不行滴!直接运行你会发现崩溃,在list的style验证那崩溃。也就是说它的style必须要有LBS_OWNERDRAWFIXED(列表中的所有项的高度都相同)或LBS_OWNERDRAWVARIABLE(列表中项的高度各不相同)两种style之一,MSDN下,Create方法里有段介绍dwStyle
Specifies the style of the checklist box. The style must be either LBS_OWNERDRAWFIXED (all items in the list are the same height) or LBS_OWNERDRAWVARIABLE (items in the list are of varying heights). ..
[] []
挂线程钩子,最主要的是调用SetWindowsHookEx函数,使用例下:g_hHook=SetWindowsHookEx(
WH_SYSMSGFILTER|WH_MSGFILTER,//截获消息类型,可组合使用
(HOOKPROC)HookShowWindow,//消息回调函数
g_hInst,//消息回调函数所在模块的handle,因为是跨进程线程钩子,消息处理函数必须放到dll里面,故,这必须是dll的句柄。就因为这的错误,我折腾了几个小时。这个句柄可以在dllmain函数的hModule参数保存得到。
progID);//要挂钩子的线程ID 其中, progID获取可如下: DWORDprogID=GetWindowThreadProcessId(FindWindow("xvt320mditask100",NULL)->m_hWnd,NULL); g_hInst获取如下:HINSTANCEg_hInst;
BOOLAPIENTRYDllMain(HANDLEhModule,
DWORD ul_reason_for_call,
LPVOIDlpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
g_hInst=HINSTANCE(hModu..
[] []
从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout 。看个复杂的例子吧(如下),现在假设我们想知道Derived类的对象布局,怎么办? 在Project Properties->C++->Command Line->Additional Options里面加上/d1reportSingleClassLayoutDerived吧!classCommonBase
{
intco;
};
classBase1:virtualpublicCommonBase
{
public:
virtualvoidprint1(){}
virtualvoidprint2(){}
private:
intb1;
};
classBase2:virtualpublicCommonBase
{
public:
virtualvoiddump1(){}
virtualvoiddump2(){}
private:
intb2;
};
classDerived:publicBase1,publicBase2
{
public:
voidprint2(){}
voiddump2(){}
private:
intd;
};
int_tmain(intargc,_TCHAR*argv[])
{
return0;
} F5编译之,你会惊奇地发现,Output里面有如下字样:1classDerivedsize(3..
[] []
find(char * lpPath)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,lpPath);
strcat(szFile,"");
strcat(szFile,FindFileData.cFileName);
find(szFile);
}
}
else
{
cout << FindFileData.cFileName;
}
if(!FindNextFile(hFind,&FindFileData)) break;
}
FindClose(hFind);
}
[] []
网络编程已经成为一种时髦,以TCP/IP协议的网络更为流行.自己编一个服务器与客户机互相传送消息的程序,以便增加自己网络编程的经验。下面我就介绍一下我编的程序。 首先介绍服务器程序: 1.创建一个名为"server"的项目,单文档界面. 2.在serverview.h中加入代码:#include "winsock.h" 添加变量:CSize sizeTotal;//控制滚动条
intcount;//信息条数
CString m_data[1000];//信息存放
char Hostname[260];
char Hostaddress[20];//主机IP地址
SOCKET m_sock;
HANDLE m_hListenThread;//线程
BOOL m_bInitialized;//是否初始化
WSADATAWSAData;
BOOL flag;
SOCKADDR_IN saClnt;
int saClntLen;
BOOL Isconnect;//是否连接 3.在serverview.cpp中重载CServerView()构造器,创建并绑定嵌套字:CServerView::CServerView()
{
// TODO: add construction code here
Isconnect=FALSE;
flag=FALSE;
sizeTotal.cy=350;
size..
[] []
Windows的资源管理器想必大家都用过,该程序的窗口一分为二,左边的窗口显示本机当前所有驱动器以及驱动器中的所有文件夹,当用户单击文件夹后,如果该文件夹下面还有子文件夹,则上层文件夹展开显示下级的文件夹;否则,右边的窗口显示选择文件夹下的文件。那么这个程序是如何实现的呢?为了说明这个问题,本实例打造了一个简易的资源管理器,它实现了Windows资源管理器的主要功能,在显示文件的属性(如文件的文件名、文件的大小、文件的创建时间)的同时,还可以改变文件显示的方式,如大小图标方式、列表方式等。本实例代码编译运行后的界面效果如图一所示: 图一、资源管理器界面效果图 下载本文源代码 一、 实现方法 从上面的界面效果图可以看出,在程序中使用了拆分窗口,在拆分的过程中,左边窗口为CTreeView 类的子类CLeftView,右边的窗口为CListView类的子类CdriveExplorerView。窗口的拆分和CTreeView、CListView类不是本实例讲述的..
[] []
引言 一般来说,照相产生缺陷的原因主要有对焦不准、光圈选择不合适以及暴光不足等几种情况,前两种情况的偶然性较强,而曝光不足虽也具有一定的偶然性但对于某些特殊情况比如暗中侦察等不方便使用闪光灯的场合则较为普遍。因此,有必要对曝光不足的照片提出一种比较通用的照片修复处理方法。 修复方法的设计 根据照相的一般原理:物体反射的光线经过透镜投影到胶片上,胶片上的感光颗粒根据光线的强弱做出不同程度的分解从而显现出不同的颜色。当没有使用闪光灯或暴光时间过短而造成照片曝光不足时,照射在胶片上的光线强度不够或照射时间过短均会使感光颗粒分解不完全,冲洗出来的照片就会发暗,下图便是一幅实际的曝光不足照片,可以看出整幅照片很昏暗,除了位于左下的三、四个大字隐约可见外,几乎看不出该照片到底拍了些什么。 虽然感光颗粒由于曝光不足而使照片显地昏暗,但由于同一胶片上的感光颗粒的感光程度仍是同真实物体所反射光线成..
[] []
VC++6.0中用应用向导生成新程序时,可以在应用向导Step4对话框中选择Printing and Print preview选择包括了基本打印和打印预览支持。但这些打印功能在MM_TEXT模式下打印出的文件尺寸大小发生了变化,比屏幕上显示的小得多。 我们在VC++中实现绘图时最方便、最常用的绘图模式为MM_TEXT。如何对打印输出进行有效的控制?尤其是在GIS中,是我们经常所面临的问题。笔者通过实践,提出了自己的做法,再此与广大读者共同探讨。 首先明确的是在MM_TEXT模式下很难实现象素坐标与常用的长度单位(如毫米)的转换关系,因此有必要对绘图模式进行改变,同时不能影响以前的工作。笔者的模式设置为SetMapMode(MM_LOMETRIC),屏幕显示模式为SetMapMode(MM_TEXT),对绘图显示函数DrawVectorMap(const char *MapFile)进行重载为DrawVectorMap(const char *MapFile,CDC* pDC),为打印输出传递pDC指针,在重载函数中进行坐标变换为:void CBoundaryView::DrawVe..
[] []
一. GDI编程基础 字幕叠加,应当是属于图形、图像处理的范畴。在Windows平台上,图形、图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口)。GDI是什么?GDI其实是一套API函数;它们功能丰富,使用起来简单、灵活。下面,我们首先来介绍一些GDI编程的基础知识。 GDI函数有很多,我们大致可以把它们分成如下几类: · 设备上下文(Device Context,简称DC)函数,如GetDC、CreateDC、DeleteDC等; · 画线函数,如LineTo、Polyline、Arc等; · 填充画图函数,如Ellipse、FillRect、Pie等; · 画图属性函数,如SetBkColor、SetBkMode、SetTextColor等; · 文本、字体函数,如TextOut、GetTextExtentPoint32、GetFontData等; · 位图函数,如SetPixel、BitBlt、StretchBlt等; · 坐标函数,如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen等; · 映..
[] []
最近一直在看<<Unix网络编程>>这本书,觉得这本书很适合初学socket编程的人。我一直对于多播的实现比较模糊,在看了书上的多播部分的介绍,才发现在程序中实现一个基本的多播功能是如此简单。 在这里我不想照本宣科的大说什么理论,概念的东东,我的目的是说明在我们的代码中如何实现多播功能。 开发环境: VC 6.0(sp5), 使用winsock2(ws2_32.lib) 测试环境: 三台机器位于两个不同的AD域中,所有机器都是windows 2000(SP4)的操作系统。 sz09和kenfilweb4位于域kenfilszwin2k, kenfil-sz18是域sz18-domain域的一台DC。 对于局域网来说,我们可以使用的多播地址为224.0.0.0-224.0.0.255(想知道为什么?看看书吧。:-) ) 多播是通过设置套接口(socket, 来自书上的翻译)选项来实现的,这个套接口必须是一个UDP的套接口 IP_ADD_MEMBERSHIP: 加入一个多播组 IP_DROP_MEMBERSHIP: 离开一个多播组 IP_MULTICAST_IF: 指定外出多播数据报的外..
[] []
前言 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。 DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。 编程思路 为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。 建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。选择好设备后,为该设备..
[] []
持久性和序列化 持久性是对象所有的保存和加载其状态数据的能力。具有这种能力的对象能够在应用程序结束之前以某种方式将当前的对象状态数据记录下来,当程序再次运行时,通过对这些数据的读取而恢复到上一次任务结束时的状态。由于绝大多数的MFC类是直接或间接由MFC的CObject类派生出来的,因此这些MFC类都具有保存和加载对象状态的能力,是具有持久性的。在使用应用程序向导生成文档/视结构的程序框架时,就已经为应用程序提供了用于对象状态数据保存和加载的基本代码。 为实现对象的持久性,通常多以字节流的形式将记录对象状态的数据存放到磁盘上,这种将状态数据保存到磁盘和从磁盘恢复到内存的过程称为序列化。序列化是MFC的一个重要概念,是MFC文档/视图结构应用程序能进行文档打开、保存等操作的基础。当在MFC框架程序中装载或保存一个文件时,除了打开文件以供程序读写外,还传递给应用程序一个相关的CArchive对象,并以此实现对持久性数据的..
[] []
我从没有在任何一个应用程序中看到过图标的工具提示。有时候查遍了整个帮助文档也没有明白某个图标是什么意思。如果能在自己的程序中为图标加上工具提 示,一定会使界面的友好性大大增加。本文中以树形控件为例,详细介绍了在VC 中使用MFC提供的机制来实现图标工具提示的方法。 ---- 第一步:使控件可以显示工具提示 ---- 调用EnableToolTips(TRUE)使一个窗口可以显示工具提示。在什么地方插入这条代码最好呢?在类的PreSubclassWindow()中。因为不管一个控件如何被创建,MFC都会调用此函数。而其他的函数则不一定会被调用。以OnCreate()为例,如果调用Create()或CreateEx()创建一个控件,OnCreate()会被调用,而如果一个控件是从对话框资源创建,OnCreate()就不会被调用。 实现代码如下:void CTreeCtrlX::PreSubclassWindow()
{
CTreeCtrl::PreSubclassWindow();
EnableToolTips(TRUE);
} ---- 第二步:重载虚函数OnToolHitTest() ---..
[] []
首先我知道VC中通过CreateWindow来创建一个窗体,那么就从MSDN中查找CreateWindow()函数,得到地址: ms-help://MS.MSDNQTR.2003FEB.2052/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindow.htm。HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
); 那么,我的窗体的消息处理过程在哪呢?lpClassName的说明中,告诉我们另外一个函数:RegisterClass(),那就看看Register的说明吧:ATOM RegisterClass(
CONST WNDCLASS *lpWndClass
); WNDCLASS又是什么呢?typedef struct {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;..
[] []
网络上有很多利用VB编程实现屏幕变暗的效果(像关闭Win95时的效果),我用VC改写了一下,权利属于原文作者! 正文 HDC hdc; //屏幕的宽度个高度
int SCRWidth,SCRHeight;
if(m_Bool)
{
BYTE bybits[] = {0x55, 0x0, 0xAA, 0x0,
0x55, 0x0, 0xAA, 0x0,
0x55, 0x0, 0xAA, 0x0,
0x55, 0x0, 0xAA, 0x0};
hBitmap = ::CreateBitmap(8, 8, 1, 1, bybits);
hBrush = ::CreatePatternBrush(hBitmap);
hdc = ::GetDC(NULL);
SCRWidth = ::GetSystemMetrics(SM_CXSCREEN);
SCRHeight = ::GetSystemMetrics(SM_CYSCREEN);
::SelectObject(hdc,hBrush);
//0xA000C9
::PatBlt(hdc,0,0,SCRWidth,SCRHeight,0xA000C9);
::DeleteObject(hBrush);
::ReleaseDC(0, hdc);
}
else
//重画整个屏幕
::InvalidateRe..
[] []
VC5中,标签控件是由CTabCtrl类来作数据支持的。做一个标签控件,主要有以下几个步骤: 一、在ResourceView标签页(就是VC5左面的标签控件第二项)的对话框中添加TABCTRL(比如取名为MYTABCTRL)。 二、在ClassWizard中为刚添加的标签控件关联上一个CTabCtrl变量(比如取名为mytab)。 三、为标签控件添加项目。 四、到此为止,一个标签控件就做好了。现在便可以用ClassWizard为标签控件添加消息映射了。 下面重点介绍为标签控件添加项目的方法。 CTabCtrl类有一个成员函数InsertItem,它的原型是: BOOL InsertItem(int nItem,TC_ITEM*pTabCtrlItem); 其中第一个参数是加入项目的序号,此序号将在调用CTabCtrl的另一个成员函数GetCurSel()时作为返回值。与GetCurSel()对应的就是SetCurSel(int nItem),SetCurSel函数可改变标签控件当前选定的项目,其中nItem就是该项目的序号。 InsertItem的关键在于第二个参数PTabCtrlItem。这是一..
[] []
VC5.0 为Windows 的程序员提供了一个很好的C++ 开发环境,减少了很多编程负担,但同时也为我们在程序中加入自己的思想增加了难度。本人在一软件开发中,想控制文字打印时的字体,使字体大小缩小一倍,以节省打印纸。 经过一段时间的摸索,终于解决了这一问题,下面分几步向大家做一介绍。 ---- 一、对VC5 自动生成的程序框架进行改进 ---- 这里用VC5 自动创建一个例子程序Test,单文档界面,注意在最后一步修改view 的继承类为CEditView。 ---- 在view 类中,VC5 已经自动创建了三个用于支持打印的函数:OnPreparePrinting,OnBeginPrinting,OnEndPrinting。为了实现我们的功能,需要再继承以下几个函数:OnPrepareDC,OnPrint。并将OnPrepareDC 和OnEndPrinting 改为如下实现:// OnPrepareDC()
void CTestView::OnPrepareDC
(CDC* pDC, CPrintInfo* pInfo)
{
CView::OnPrepareDC(pDC, pInfo);
}
// OnEndPrinting()
void CTestView::OnEndPri..
[] []
一、前言 本人在开发惠普色谱工作站增强软件的过程中,实现了把指定目录下的色谱数据文件全部转换成纯文本文件的功能。下面,通过用一个具体的例子来说明此功能的实现方法。 全部代码用Visual C++6.0在Windows95/98/2000下编译通过。 二、实例 首先用MFC AppWizard生成一个SDI风格的应用程序test,生成过程中全部使用缺省设置。 其次,利用资源编辑器,在主菜单“文件”下增加一个菜单项“转换”,属性为: ID:ID_CONVERT Caption: 转换 Prompt: 在不同格式文件之间进行转换n转换文件 然后用“CTRL-W”热键激活MFC ClassWizard,为CmainFrame类增加响应ID_CONVERT消息的命令函数OnConvert()。加入转换功能的代码如下所示: void CMainFrame::OnConvert()
{
LPMALLOC pMalloc;//利用shell扩展功能
BROWSEINFO bi;
if (SUCCEEDED(SHGetMalloc(&pMall..
[] []
我们都知道,在程序里获取命令行参数很简单,WinMain函数会以参数的形式传递给我们,或者可以调用API GetCommandLine 获取。但是GetCommandLine函数不接受参数,获取的只是自己程序的命令行参数。那么如果我们想获取别的应用程序的命令行参数应该怎么办呢? 有的同学说,既然GetCommandLine只能获取本程序的命令行参数,我们可以在其它进程里插入一个Dll,在那个进程的地址空间调用GetCommandLine函数,然后传回来就可以了。这样好像有点儿不太友好。让我们想想还有没有别的办法。 我们想,自己的命令行参数既然随时都可以获取到,那么在该进程里一定有一个地方存放它。那么在哪儿呢?看一下GetCommandLine函数的反汇编代码,我们发现,原来世界是如此的美好! 以下是WinXP系统的GetCommandLine函数反汇编代码:.text:7C812C8D GetCommandLineA proc near
.text:7C812C8D mov eax, dword_7C8835F4 //dword_7C8835F4 就是命令行参数字符串的地址
//该..
[] []
一个单文档界面中存在多个视图,并且可以根据需要进行视图的动态切换,这是当前比较流行的界面风格,它可以满足许多用户在操作和显示方面的需要。这种界面风格的主要代表软件是Outlook Express。而用VC++实现这种风格的界面有一定难度,笔者就这个问题进行了研究,并归纳总结出两种实现方法(这些代码都在VC++ 6.0下调试通过),使用时关键注意步骤和实现思路,不必拘泥于代码的形式。 方法一:静态创建切换法 步骤描述: 1.在窗口显示之前先将需要切换的所有的视图对象创建好,除首先显示的视图以外,其他在创建时都设置为不可见属性。 CMyWinApp::InitInstance()
{ ......
m_pViews[0] = pView1;
m_pViews[1] = (CView*) new CView2;
CDocument* pCurrentDoc = ((CFrameWnd*) m_pMainWnd)->GetActiveDocument();
// 初始化创建上下文相关指针
CCreateContext newContext;
newContext.m_pNewViewClass ..
[] []
错误实现该对象可能会导致内存泄漏或下列错误之一: The operation requested by the application is not allowed if the object is closed. - 或 - 类型不匹配 - 或 - error 'ASP 0115' - A trappable error occured in an external object 更多信息 使用下列步骤实现一种方法,该方法从 Visual C++ COM 对象向 Active Server Pages 返回记录集。1.创建一个名为“PassRs”的 ATL DLL 项目。2.插入一个名为“PassRsObj”的 ATL 对象。 3.添加包含以下信息的方法:Method Name: TestMethod Parameters : [out, retval] LPDISPATCH* ppRecordset 4.在对象的实现文件中包括下面一行:#import "msado15.dll" no_namespace rename("EOF", "adoEOF") 5.按如下所示实现该方法: 注意:您必须先将 UID=<username> 和 pwd=<strong password> 更改为正确..
[] []
前言 在许多视窗应用软件中,通常要在屏幕上同时显示若干个子视窗,以显示同一个文档的不同部分,或者是在每个视窗中分别显示不同文档的内容。为了实现多视窗界面,可以采用MDI(Multiple Document Interface)的多文档模式进行处理,但是多文档的应用程序设计与维护相对于单文档的应用程序而言比较复杂。而且,如果要在屏幕上同时显示多个子视窗,通常要利用视窗重叠函数进行管理,每个子视窗的位置往往需要用鼠标人为设定,过多的人为干预降低了程序使用的效率。因此,如果能对单文档视窗做适当的分裂,无疑程序使用者将可以得到更易于操作的接口,数据的显示也更加直观和方便。本文通过对单文档视窗的静态分裂原理进行分析,实现上述要求。 二分裂视窗的类型 视窗的分裂可分为两种类型,一是动态分裂,二是静态分裂。动态分裂可以让使用者通过拖曳分裂方块的使用,将视窗分裂。但是,动态分裂最多只可以将视窗分裂为2×2个子视窗,不能进行混..
[] []
一、隐藏和显示光标 函数: int ShowCursor ( BOOL bShow ); 参数 bshow,为布尔型,bShow的值为False时隐藏光标,为True时显示光标;该函数的返回值为整型,为鼠标隐藏或显示的指数器;返回值大于等于0时显示光标,否则隐藏鼠标;如果安装了鼠标初值为0。 实例: 在基于对话框的应用程序中放置两个Button,名称分别为HideCursor和ShowCursor;再放置一个CStatic控件,名称为Label1,用于显示光标计数器。 源程序为: // 使光标计数器的值减一,如果小于零,隐藏光标
void CMyTestDlg::OnHideCursor()
{
int i;
i=ShowCursor(FALSE);
Cstring string;
string.Format(_T("%d" ),i);
Label1.SetWindowText(&string);
}
// 使光标计数器的值加一,如果大于等于零,显示光标
void CMyTestDlg::OnShowCursor()
{
int j;
j=ShowCursor(TRUE);
Cstring string;
stri..
[] []
一、绪言 UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高。所以在网络上仍有很大的用途。这几日需要了解下udp通讯的过程,上网发现这方面的资料还挺少。于是仔细的翻找了下msdn,基本上搞清楚了udp通讯的过程。做了一个测试的例子。希望对大家有帮助。 二、UDP的通讯过程 server端: open a socket(socket)---&gt;name the socket(bind)--->send and receive data(sendto recvfrom)--->close socket(closesocket) client端: open a socket(socket)---------------------------->send and receive data(sendto recvfrom)--->close socket(closesocket) server端无需listen,client端无需connect,因此udp中server和client的区别相对较模糊。只要调用sendto和recvfrom就可以给指定的地址收发数据,但并不保证收发的数据的完整性和可靠性。 三、示例 udpserver主要代码:void m..
[] []
在SDI项目内,通过使用CFileDialog和CFileFind类,不仅可以实现Windows桌面上现有的查找功能,而且可以灵活扩展查找条件.例如,下面的程序将在VisualC++6.0的Output窗口内逐行输出c:windows下所有长度小于500字节的只读文件: #include < direct.h > /*含有
_getcwd,_chdir原型*/
void f0(){
char x[256],y[256];
CFileDialog fd(TRUE);
/*用TRUE值构造"File Open"对话框*/
_getcwd(x,256); /*
当前工作目录存入x数组*/
if (fd.DoModal()==IDOK){
/*在CfileDialog对话过程中,
先选定c:windows目录,
再选定其下一普通文件,如Notepad.exe,
或输入一不存在的文件,如f0.non*/
_getcwd(y,256);
/*当前工作目录c:windows存入y数组*/
f1(y); /*用y内容调用f1函数*/
}
_chdir(x); /*当前工作目录置回x内容*/
}
void f1(CString x){
BOOL b;CFileFind f;
..
[] []
前面数次连载我们以较长的篇幅讲解了串口通信的硬件原理、DOS平台控制以及基于WIN32 API、控件和第三方类的串口编程。作为本系列文章的最后一次连载,本章将给出一个典型的应用实例:西门子短信服务模块TC35的串口控制。 1.短信控制终端 作为短信 (Short Message Service,SMS)一族,想必你有这样的体会:用手机编辑短信息十分不便、容易出错,而且修改费时,若能用计算机来收发短信则方便许多。注意,本文所说的用计算机收发短信并不是说通过"网易短信王"等方式在Internet上收发短信,而是直接用计算机控制运行了GSM通信系统的短信终端进行收发,因而其收发短信的原理与手机是本质相同的。 实际上,一大堆的垃圾短信也是采用这种短信终端发出来的! 我们来介绍一款GSM模块,它就是西门子公司的TC35,它由GSM基带处理器、电源专用集成电路、射频电路和闪速存储器等部分组成,负责处理GSM蜂窝设备中的音频、数据和信号,内嵌的软件部分..
[] []
[] [] [] [] [] [] []
[] [] [] [] []
版权所有 2006-2008 保留所有权利 湘ICP备06008262号