博文

用Visual C++中实现混合分割视图(2006-09-24 12:34:00)

摘要: 用Visual C++中实现混合分割视图 来自yesky  作者寇欣宇          

  在图像处理等多窗口应用程序中,通常要在屏幕上同时显示若干个窗口,以显示进行图像处理前和处理后的图像信息,或者在每个窗口中分别显示图像的细节和概貌。为了实现上述功能,可以采用MDI的多文档模式进行处理,但是多文档的程序设计和维护相对单文档应用程序而言相对复杂,而且如果要在屏幕上同时显示窗口,通常要调用窗口重叠函数进行管理,窗口的位置也往往需要用鼠标人为设定,过多的人为干预也降低了程序使用的效率。因此,对于某些应用程序,如果能够用分割视图来实现屏幕绘图和显示,无疑会降低程序使用者的操作强度,显示更加直观和方便。

  本文介绍了一种混合分割视图的实现方法,即在Visual C++中,同时出现基于CView类的普通视图和基于CFormView类的窗体视图,且视图之间存在着二次(或多次)再分割,即视窗里面又包含视窗,如图所示为要涉设计的界面形式。



  界面内共含有一个框架和五个视窗,视窗Left、视窗Right、视窗Zoom、视窗Control和视窗 Info。视窗Left、 Right和 Zoom分别显示左右图像窗口的图像和经过高倍放大后的图像,这几个视窗的基类都是CView;视窗Control用来 进行仪器控制和图像操作,视窗Info用来显示系统的当前信息和工作进程和状态,这两个视窗都从CFormView派生出来。
为了实现上述功能,首先用AppWizard生成一单文档应用程序,并自定义生成的默认视类为CZoomView,用来显放大的图像。

  接下来,通过如下步骤,创建另外四个视窗:

   1、用ClassWizard为应用程序创建一个新类CFixedSplitter,基类为CMDIChildWnd,然后在该类中将所有CMDIChildWnd的地方替换为CsplitterWnd(因为ClassWizard不支持直接从CsplitterWnd类派生子类);

  2、在CMainFrame类里声明分割视图的变量:
CFixedSpl......

阅读全文(2700) | 评论:0

制作系统托盘程序 VC(2006-09-24 12:32:00)

摘要:其实,在任务条上添加托盘比较容易实现,调用VC中的函数就可以解决,只是注意协调。接下来,我将给大家提供一个类,可以很容易的达到我们的目的,希望它能给大家一点帮助,如果你发现BUG也欢迎你和我联系。运行程序,左键双击或者右键单击任务条上的托盘,我们可以看到效果。

  1. 有关类CsystemTray的说明:(文章的最后有本类的具体实现代码)

  CSystemTray是CObject的扩展类,实现以下功能:

   1、在任务条显示托盘图标。

   2、设置提示Tip

   3、设置图标的形状 

  主要函数说明:

Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szTip, HICON icon, UINT uID); 

  功能:

   生成一个图标。 

  参数说明:

   pWnd:程序的主窗口,

   uCallbackMessage:对应的消息映射,

   szTip:鼠标停留时的提示文字,

   icon:显示的图标,

   uID:与之对应的菜单ID

  · BOOL CSystemTray::SetIcon(HICON hIcon) 

    BOOL CSystemTray::SetIcon(LPCTSTR lpszIconName)

    BOOL CSystemTray::SetIcon(UINT nIDResource)

    BOOL CSystemTray::SetStandardIcon(LPCTSTR lpIconName)

    BOOL CSystemTray::SetStandardIcon(UINT nIDRe......

阅读全文(2927) | 评论:0

在VC++ 6.0下利用共享内存、消息实现内部进程通讯(2006-09-24 12:17:00)

摘要:在VC++ 6.0下利用共享内存、消息实现内部进程通讯                                                                 张中军  张忠英 关键词: 共享内存、WINDOWS用户自定义消息、同步、同机通讯 摘 要: 通过实例,介绍了如何利用共享内存方式和windows自定义消息实现两个进程的同机通讯 一、 引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换. 内部进程间通讯(即:同机通讯)和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。“共享内存”(shared memory)可以定义为对一个以上的进程是可见的内存或存在于多个进程的虚拟地址空间。例如:如果两个进程使用相同的DLL,只把DLL的代码页装入内存一次,其他所有映射这个DLL的进程只要共享这些代码页就可以了;利用消息机制实现IPC虽然有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中。本文通过共享内存实现进程间的数据交换,利用windows消息机制实现进程间的同步,两种机制结合使用,不仅解决了交换数据量小的问题,还解决了进程并发存取数据的问题。 二、 同机进程间共享内存的实现 采用内存映射文件实现WIN32进程间的通讯:Window......

阅读全文(5561) | 评论:0

应用程序之间互相通讯的几种方法 (2006-09-24 12:12:00)

摘要:  应用程序之间互相通讯的几种方法   沈炜 应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。   1、共享   在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现数据交换。但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。   2、DDE   每个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最早的基于Windows的数据交换方法,有三种方式可供选择:冷连接、温连接和热连接。一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。在连接建立后,数据可以双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。   DDE还有网络功能。使用过Win311 For Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE 只能局限在同一台机器上。与其它的数据交换方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。   3、WM_COPYDATA   Windows消息WM_COPYDATA功能强大,知之者却甚少。它的确切定义是:一个应用程序向另一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么我......

阅读全文(1528) | 评论:0

VC++中用内存映射文件(2006-09-24 12:08:00)

摘要:VC++中用内存映射文件
2000-01-30· 粟利民·电脑报   在软件的开发过程中,有时需要控制一些程序使他们不能同时运行,也就是多个程序间互斥运行(还包括禁止同一程序运行多个实例)。针对这一问题,我们在Visual C++6.0中利用内存映射文件实现了多个程序间的互斥运行。内存映射文件可以创建一个没有和磁盘文件相联系的内存对象,将文件的信息映射到一个进程的地址空间上,我们可以访问该文件中的数据,就如同它位于内存中一样。同时,在程序设计中可以给内存映射文件对象起一个名字,这个名字在整个系统中是唯一的,这个名字可以在多个进程之间共享,通过名字共享能实现进行信息交换,进而实现多个程序间的互斥运行。 在讲述具体的编程方法之前,让我们先介绍和内存映射文件操作有关的几个重要的函 CreateFileMapping的函数为指定的文件创建一个文件映射对象,该函数的原形如下: HANDLE CreateFileMapping(HANDLE hFile,//用于映射的文件句柄 LPSECURITY?ATTRIBUTES FileMappingAttributes,//内存映射文件的安全描述符 DWORD Flprotect,//文件映射对象的最大长度的高32位 DWORD dwMaximumSizelow,//最大长度的低32位 LPCTSTR IPNAME//指定这个内存映射文件的名字) 值得注意的是,参数如果是OXFFFFFFFF,将在操作系统虚拟内存页面替换文件中创建文件映射对象,而不是使用磁盘文件,同时必须给出这个映射对象的大小。 NAO VUEWIFFILE函数将文件的视图映射到一个进程地址空间上,返回LPVOID类型的内存指针。通过它,就可以直接访问文件视图中的信息。 LPVOID MAP VIEWLFFILE(HANDLE HFILEMAPPINGOBUCT,//映射文件对象句柄 DWORD DWDESIREDACCESS,//访问模式 DWORD DWFILEOFFSETHIGH,//文件偏移地址的高32位 DWORD DWFILEOFFSETHIGH,//文件偏移地址的低32位 DWORD DWNUMBEROFBYTESTOMAP//映射视图的大小) 在Visual c++6.0中我们用默认方式生成基于对话框的应用程序,......

阅读全文(179) | 评论:0

改变对话框的背景颜色(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
  {
       &nb......

阅读全文(1292) | 评论:0

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* pSysm......

阅读全文(2841) | 评论:0

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_DESTROY
0x0002
一个窗口被销毁

WM_MOVE
0x0003
移动一个窗口

WM_SIZE
0x0005
改变一个窗口的大小

WM_ACTIVATE
0x0006
一个窗口被激活或失去激活状态

WM_SETFOCUS
0x0007
获得焦点后

WM_KILLFOCUS
0x0008
失去焦点

WM_ENABLE
0x000A
应用程序Enable状态改变时产生

WM_SETREDRAW
0x000B
设置窗口是否能重画

WM_SETTEXT
0x000C
应用程序发送此消息来设置一个窗口的文本

WM_GETTEXT
0x000D
应用程序发送此消息来复制对应窗口的文本到缓冲区

WM_GETTEXTLENGTH
0x000E
得到与一个窗口有关的文本的长度(不包含空字符)

WM_PAINT
0x000F
要求一个窗口重绘自己

WM_CLOSE
0x0010
当一个窗口或应用程序要关闭时发送一个信号

WM_QUERYENDSESSION
0x......

阅读全文(294) | 评论:0

在对话框中动态显示位图 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_bi......

阅读全文(310) | 评论:0

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

 &nbs......

阅读全文(5113) | 评论:0