文档库 最新最全的文档下载
当前位置:文档库 › vc QQ

vc QQ

vc  QQ
vc  QQ

QQ软件主界面的ListCtrl 是可以说非常经典了,一个字漂亮! 这个ListCtrl的所包含的信息之丰富,更是让我们这些软件工程师望Q兴叹! 今天,我将和大家一起来解决这个难题,写一个属于自已的CMyListCtrl。

一、实现MyListCtrl要完成的任务及实现方法作分析。

1. MyListCtrl 显示彩色图片头像(在线用户头)

让CMyListCtrl 显示彩色图片作为头像很容易,用CImageList 加载规格相同的图片到其中,然后让CimageList和CMyListCtrl关联就可能实现。往ImageList 添加图片或图标有三种方法,代码如下

CimageList m_imageList;

m_imagelist.Create(40, 40, ILC_MASK|ILC_COLOR32, 1, 1);

//添加ID 为IDI_ICON的图标

m_imageList.Add( AfxGetApp()->LoadIcon(IDI_ICON));

//从图标文件中加载并添加

HICON hIcon = (HICON)LoadImage(NULL, ".//image//SQQun.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE)

m_imagelist.Add(hIcon);

//从位图文件中加载并添加

CBitmap *pBitmap=new CBitmap;

pbitmap ->m_hObject = (HBITMAP) LoadImage(NULL, "face.bmp", IMAGE_BITMAP, 0, 0,

LR_LOADFROMFILE);

m_imagelist.Add(pBitmap, RGB(255,255, 255)/*mask color*/);

….

Delete pBitmap;

注意;在加载并添加大量图标或位图时,每完成一个添加都要掉其对象。

CMyListCtrl 和CimageList 关联代码介绍:

//先创建ListCtrl ( m_MyTalkerListCtrl)

if(m_MyTalkerListCtrl.Create(LVS_SMALLICON | WS_TABSTOP|WS_CHILD,

CRect(50,100,206,180), this,IDD_TALKER_LIST/*ID*/)) {

//关联

m_MyTalkerListCtrl.SetImageList(&m_imagelistBig,LVSIL_SMALL);

//往ListCtrl 中添加好友,这时采用单

for(int i=1; i<10; i++)

{

m_MyTalkerListCtrl.InsertItem(i,"我的好友", i);//第三个参数表示Image 的Index

}

}

2.要让CMyListCtrl 显示灰色图片头像(非在线用户)

显灰色图片似乎不好办,是做大量的单色位图文件还是用软件代码实现转换?做文件麻烦,或几经考虑,最好是把ImageList 中彩色图片用代码实现单色位图转换。处理方法是是获取CMyListCtrl的ImageList 并提ListCtrl的Item 对应的图像,转换成单色位图并在原位置显示。转换单色位图代码如下:

/*

HBITMAP BitmapColorToGray(CDC* pDC,HBITMAP hBitmap)

{

BITMAP bmpInfo;

::GetObject(hBitmap,sizeof(BITMAP),&bmpInfo);

if(pDC)

{

CDC memDC;

if( !memDC.CreateCompatibleDC(pDC) )

{

return NULL;

}

HBITMAP oldBitmap = (HBITMAP)memDC.SelectObject(hBitmap);

DWORD r,g,b;

for (int H =0; H <= bmpInfo.bmHeight; H++)

{

for(int W = 0; W <= bmpInfo.bmWidth; W ++)

{

r = GetRValue(memDC.GetPixel(W,H));

g = GetGValue(memDC.GetPixel(W,H));

b = GetBValue(memDC.GetPixel(W,H));

r = (r * 3 + g * 6 + g) / 10;

g = r;

b = g;

memDC.SetPixel(CPoint(W,H),RGB(r,g,b));

}

}

hBitmap = (HBITMAP)memDC.SelectObject(oldBitmap);

memDC.DeleteDC();

}

return hBitmap;

}

*/

说细转换过请参考 MyListCtrl.cpp 中的OnPaint()函数

3. CMyListCtrl 要包含丰富的用户信息(如 ID,NAME 、IP Address 、视频可用,

手机短消息可用…)

QQ 的ListCtrl 包含了很多信息,如在线用户和不在用户的头象不同,有视频设备用户会显示标志,开通了手机短消息功能的也会显示标志,还有很多不一一例出。这是如何实现的?去MSDN分析CListCtrl 发现,有两个函数SetItemData(int nItem,DWORD dwData),和GetItemData(int nItem),非常有用,这个32位 data 做几个标志还是不错的,但还是无法表达更多的东东。如果把这32位 data作为外部结构的地址是否可行呢?经实验是可行的,但在要外部处理,封装性能不好! 那自己定一个为用户信息结构吧!

在CMyListCtrl类的头文件中定义用户信息结构

struct LUSERITEM

{

CString szUserID;

CString szUserName;

CString szIPAddress;

CString szServerAddress;

CString szNoticeMsg;

BOOL bOnline;

int nHeadImageIndex;

//根据需要可增加信息

};

再定义一个链表,用来管理用户信息的结构,如查找,增加,删除等操作。

typedef std::deque DEQUELVITEM;

此外还有#include

4. 当新消息时动画显示头像和新消息数量(在V1.2版本中实现)

二、打开Visual Studio C++ (6.0),新建工程。(本文的主要任务是完成一个QQ ListCtrl

的,不在本任务下的其它工作请自己完成,若和ListCtrl使用有关的代码,本文会详细介绍)

a.首先,生成一个新类名为CMyListCtrl. 其基类为CListCtrl. 这部分工作用ClassWizard很

容易完成。

b.添加相关消息及处理函数,OnPaint() ;OnMouseMove();OnHScroll();OnVScroll等,这部工

作用ClassWizard同样很容易完成。编译通过后,接着往下看。

c. 在.h文件顶部定义结构体struct LUSERITEM ,可参照下面定义

d. 在.h文件顶部定义一些常量标志

#define TVS_VIDEO 0x00000001

#define TVS_MOBILEMSG 0x00000002

#define TVS_NETDISK 0x00000004

#define TVS_LEADER 0x00000008

#define TVS_VICELEADER 0x00000010

#define TVS_ONLINEUSER 0x00000020

e.添加成员变量及函数

CFont* m_pFont; //用于创建选择字体

BOOL m_bOverImage;

BOOL m_bOverVedio;

BOOL m_bOverMobile;

DEQUELVITEM m_DequeList; //用户信息链表

HICON m_hTailIconA; //vido flag

HICON m_hTailIconB; //mobil message flag

HICON m_hTailIconC;

HBITMAP m_hBackBitmap; //背景

f. .添加成员函数

重载InsertItem函数,用于增加Item同时增加用户信息。

InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex,

LUSERITEM* UserInfo)

{

DEQUELVITEM* pDeqListItem = &m_DequeList;

if(UserInfo)

pDeqListItem ->push_back(*UserInfo);

nItem = CListCtrl::InsertItem(nItem,szItemText,nImageIndex);

return nItem;

}

添加设置显示图标函数,A指定视频标志图标,B指定为短消息标志图标,C未定义void CMyListCtrl::SetTailIcon(LPCTSTR strIconFileA,LPCTSTR strIconFileB, LPCTSTR strIconFileC)

{

HICON hIcon=NULL;

hIcon = (HICON)::LoadImage(NULL, strIconFileA, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

if(hIcon)

{

if(m_hTailIconA)

DeleteObject(m_hTailIconA);

m_hTailIconA = hIcon;

}

hIcon = (HICON)::LoadImage(NULL, strIconFileB, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

if(hIcon)

{

if(m_hTailIconB)

DeleteObject(m_hTailIconB);

m_hTailIconB = hIcon;

}

hIcon = (HICON)::LoadImage(NULL, strIconFileC, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

if(hIcon)

{

if(m_hTailIconC)

DeleteObject(m_hTailIconC);

m_hTailIconC = hIcon;

}

}

添加设背景位图函数SetBackBitmap

void CMyListCtrl::SetBackBitmap(LPCTSTR lpszResourceName)

{

HBITMAP hBmp = (HBITMAP)::LoadImageFile(lpszResourceName);

if(hBmp)

m_hBackBitmap = hBmp;

}

添加删除用户信息函数

BOOL DeleteUserInfo(CString szText)

{

BOOL bRet = FALSE;

LUSERITEM itemInfo;

DEQUELVITEM* pDeqItem = &m_DequeList;

int nItemCount = -1;

DEQUELVITEM::iterator it,itbegin = pDeqItem->begin(),itend = pDeqItem->end(); for ( it = itbegin; it != itend; it++ )

{

nItemCount++;

if(( it->szUserID == szText)||(it->szUserName == szText))

{

if ( nItemCount == ( pDeqItem->size() - 1 ) )

{

//如果是最后一个

pDeqItem->pop_back();

}

else if ( nItemCount == 0 )

//如果是第一个

pDeqItem->pop_front();

else

pDeqItem->erase( pDeqItem->begin() + nItemCount );

bRet = TRUE;

}

}

return bRet;

}

}

实现自绘代码在OnPaint()中添加下面给出全部代CMyListCtrl代码:

//.h文件代码

#if !defined(AFX_MYLISTCTRL_H__4813720C_157E_48C4_9F2F_9A15E2B93038__IN CLUDED_)

#define

AFX_MYLISTCTRL_H__4813720C_157E_48C4_9F2F_9A15E2B93038__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "GeneralApi.h"

#include

// MyListCtrl.h : header file

//

#define TVS_VIDEO 0x00000001

#define TVS_MOBILEMSG 0x00000002

#define TVS_NETDISK 0x00000004

#define TVS_LEADER 0x00000008

#define TVS_VICELEADER 0x00000010

#define TVS_ONLINEUSER 0x00000020

/////////////////////////////////////////////////////////////////////////////

// CMyListCtrl window

struct LUSERITEM

{

CString szUserID;

CString szUserName;

CString szIPAddress;

CString szServerAddress;

CString szNoticeMsg;

BOOL bOnline;

int nHeadImageIndex;

};

typedef std::deque DEQUELVITEM;

class CMyListCtrl : public CListCtrl

{

// Construction

public:

CMyListCtrl();

// Attributes

public:

//HBITMAP BitmapColorToGray(CDC* pDC,HBITMAP hBitmap);

int InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex, LUSERITEM* UserInfo = NULL);

BOOL GetUserItemInfo(LPCTSTR szItemText,LUSERITEM* userInfo);

void SetTailIcon(LPCTSTR strIconFileA,LPCTSTR strIconFileB,LPCTSTR strIconFileC);

void SetBackBitmap(LPCTSTR lpszResourceName);

BOOL GetClickMobileBtn();

BOOL GetClickVideoBtn();

BOOL DeleteUserInfo(CString szText);

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMyListCtrl)

protected:

virtual void PreSubclassWindow();

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CMyListCtrl();

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct);

// Generated message map functions

protected:

//{{AFX_MSG(CMyListCtrl)

afx_msg void OnPaint();

afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);

afx_msg BOOL OnEraseBkgnd(CDC* pDC);

afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

private:

CFont* m_pFont;

BOOL m_bOverImage;

BOOL m_bOverVedio;

BOOL m_bOverMobile;

DEQUELVITEM m_DequeList;

HICON m_hTailIconA;

HICON m_hTailIconB;

HICON m_hTailIconC;

HBITMAP m_hBackBitmap;

};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif

// !defined(AFX_MYLISTCTRL_H__4813720C_157E_48C4_9F2F_9A15E2B93038__IN CLUDED_)

.CPP 文件代码

// MyListCtrl.cpp : implementation file

//

#include "stdafx.h"

#include "MyListCtrl.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

///////////////////////////////////////////////////////////////////////////// // CMyListCtrl

CMyListCtrl::CMyListCtrl()

{

m_pFont=new CFont();

m_pFont->CreatePointFont(90,_T("Arial")); m_bOverImage = FALSE;

m_bOverVedio = FALSE;

m_bOverMobile = FALSE;

m_hTailIconA = NULL;

m_hTailIconB = NULL;

m_hTailIconC = NULL;

m_hBackBitmap = NULL;

}

CMyListCtrl::~CMyListCtrl()

{

delete m_pFont;

if(m_hTailIconA)

::DestroyIcon(m_hTailIconA);

if(m_hTailIconB)

::DestroyIcon(m_hTailIconB);

if(m_hTailIconC)

::DestroyIcon(m_hTailIconC);

if(m_hBackBitmap)

DeleteObject(m_hBackBitmap);

}

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)

//{{AFX_MSG_MAP(CMyListCtrl)

ON_WM_PAINT()

ON_WM_DRAWITEM()

ON_WM_MOUSEMOVE()

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

ON_WM_ERASEBKGND()

ON_WM_VSCROLL()

ON_WM_HSCROLL()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CMyListCtrl message handlers

void CMyListCtrl::OnPaint()

{

CPaintDC dc(this);

CRect rcClip, rcClient;

dc.GetClipBox( &rcClip );

GetClientRect(&rcClient);

// Create a compatible memory DC

CDC memDC;

if(!memDC.CreateCompatibleDC( &dc ))

return;

// Select a compatible bitmap into the memory DC

CBitmap bitmap, bmpImage;

if(!bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height())) {

memDC.DeleteDC();

return;

}

CBitmap *OldBitmap = memDC.SelectObject(&bitmap );

memDC.BitBlt(rcClient.left,rcClient.top,rcClient.Width(),

rcClient.Height(),&dc,rcClient.left,rcClient.top,SRCCOPY);

// First let the control do its default drawing.

//CListCtrl::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );

if( m_hBackBitmap )

{

DrawBitmap(&memDC,m_hBackBitmap,rcClient);

}

//DrawItem here

int nItemCount = GetItemCount();

int nItem = 0;

CRect rcItem,rcText,rcIcon;

POINT pt;

GetCursorPos(&pt);

ScreenToClient(&pt);

while ((nItem < nItemCount) && (nItem >=0))

{

GetItemRect(nItem,rcItem, LVIR_BOUNDS); //get Rectangle of the icon and Lable

GetItemRect(nItem,rcText, LVIR_LABEL);

GetItemRect(nItem,rcIcon, LVIR_ICON);

//对非在线用户的图像进单色处理

DWORD nStyle = GetItemData(nItem);

//if (!(nStyle & TVS_ONLINEUSER))

//{

CImageList* pImageList=NULL;

pImageList = GetImageList(LVSIL_SMALL);

if(pImageList !=NULL)

{

HICON hIcon=NULL; hIcon = pImageList->ExtractIcon(nItem);

HBITMAP hbitmap,hBitmapMask;

ICONINFO* iconinfo = new

ICONINFO;

if(::GetIconInfo(hIcon, iconinfo))

{

hbitmap = iconinfo-

>hbmColor;

hBitmapMask = iconinfo->hbmMask;

if (!(nStyle & TVS_ONLINEUSER))

hbitmap =

BitmapColorToGray(&memDC,hbitmap);

DrawBitmap(&memDC,hbitmap,rcIcon);

DeleteObject(hbitmap);

DeleteObject(hBitmapMask);

}

delete iconinfo;

::DestroyIcon(hIcon);

}

//}

//对图像进行加边框处理

CBrush *pOldBrush = (CBrush*)

memDC.SelectStockObject(NULL_BRUSH);

CPen imagePen;

if(rcIcon.PtInRect(pt))

{

imagePen.CreatePen(PS_SOLID, 2, RGB(192, 192, 200)); }

else

{

imagePen.CreatePen(PS_SOLID, 1, RGB(0, 0, 200));

}

CPen* pOldPen = memDC.SelectObject(&imagePen);

CRect rcImage(rcIcon);

rcImage.DeflateRect(1,1);

memDC.RoundRect(rcIcon,CPoint(10,10));

memDC.SelectObject(pOldPen);

memDC.SelectObject(pOldBrush);

imagePen.DeleteObject();

//文本输出

CRect rcNewText(rcText);

CString strText = GetItemText(nItem,0);

CSize size = memDC.GetTextExtent(strText);

rcNewText.top = rcNewText.top-2;

rcNewText.right = rcNewText.right +3;

if(!m_hBackBitmap)

memDC.BitBlt(rcNewText.left,rcNewText.top,rcNewText.Width()+2 ,rcNewText.Height()+2,&dc,rcNewText.left,rcNewText.top,SRCCOPY);

if(rcItem.PtInRect(pt))

{

memDC.SetTextColor(RGB(0,0,255));

}

else

{

memDC.SetTextColor(RGB(0,0,0));

}

memDC.SetBkMode(TRANSPARENT);

memDC.SelectObject(m_pFont);

rcNewText.OffsetRect(3,0);

memDC.DrawText(strText,rcNewText,DT_SINGLELINE|DT_LEFT|DT_EN D_ELLIPSIS);

LUSERITEM userInfo;

GetUserItemInfo(strText,&userInfo);

if(userInfo.szUserID !="")

{

strText = userInfo.szNoticeMsg;

rcNewText.top = rcNewText.top + size.cy + 2;

rcNewText.right = rcClient.right -10;

if(rcNewText.PtInRect(pt))

{

memDC.SetTextColor(RGB(10,255,10));

}

else

{

memDC.SetTextColor(GetSysColor(COLOR_BTNSHADO W));

}

memDC.DrawText(strText,rcNewText,DT_SINGLELINE|DT_LEFT |DT_END_ELLIPSIS);

}

//Draw Vedio and Mobile ICON

CRect rcVideo(rcText);

rcVideo.left = rcClient.right - 20;

rcVideo.right = rcVideo.left +14;

rcVideo.top = rcVideo.top + 2;

rcVideo.bottom = rcVideo.top + 14;

if ( (nStyle & TVS_VIDEO) && (m_hTailIconA !=NULL) )

{

if(!m_hBackBitmap)

memDC.FillSolidRect(rcVideo,RGB(255,255,255));

::DrawIconEx(memDC,rcVideo.left,rcVideo.top,m_hTailIco nA,

12,12,0,NULL,DI_NORMAL);

if( rcVideo.PtInRect(pt) )

{

memDC.Draw3dRect(rcVideo,GetSysColor(COLO

R_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));

m_bOverVedio =TRUE;

}

else

{

m_bOverVedio =FALSE;

}

}

CRect rcMobile(rcVideo);

rcMobile.OffsetRect(-16,0);

if ( (nStyle & TVS_MOBILEMSG) && (m_hTailIconB !=NULL) )

{

if(!m_hBackBitmap)

memDC.FillSolidRect(rcMobile,RGB(255,255,255));

::DrawIconEx(memDC,rcMobile.left+1,rcMobile.top+1,m_h TailIconB,

12,12,0,NULL,DI_NORMAL);

if( rcMobile.PtInRect(pt) )

{

memDC.Draw3dRect(rcMobile,GetSysColor(COLO R_BTNSHADOW),GetSysColor(COLOR_BTNSHADOW));

m_bOverMobile =TRUE;

}

else

{

m_bOverMobile =FALSE;

}

}

///////////////

nItem = GetNextItem(nItem,LVNI_ALL);

}

//DrawItem end

dc.BitBlt( rcClip.left, rcClip.top,

rcClient.Width(),

rcClient.Height(),

&memDC,

rcClip.left, rcClip.top, SRCCOPY );

//memDC.SelectObject(OldBitmap);

bitmap.DeleteObject();

memDC.DeleteDC();

}

void CMyListCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) {

// TODO: Add your message handler code here and/or call default

CListCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);

}

void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

Invalidate(FALSE);

CListCtrl::OnMouseMove(nFlags, point);

}

void CMyListCtrl::PreSubclassWindow()

{

// TODO: Add your specialized code here and/or call the base class

ModifyStyle(0, BS_OWNERDRAW);

CListCtrl::PreSubclassWindow();

}

void CMyListCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct)

{

}

int CMyListCtrl::InsertItem(int nItem, LPCTSTR szItemText, int nImageIndex, LUSERITEM* UserInfo)

{

DEQUELVITEM* pDeqListItem = &m_DequeList;

if(UserInfo)

pDeqListItem ->push_back(*UserInfo);

nItem = CListCtrl::InsertItem(nItem,szItemText,nImageIndex);

return nItem;

}

void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)

{

NMTVCUSTOMDRAW* pListHDR = (NMTVCUSTOMDRAW*)pNMHDR; DWORD dwDrawStage;

*pResult = CDRF_DODEFAULT;

dwDrawStage = pListHDR->nmcd.dwDrawStage;

if(dwDrawStage == CDDS_PREPAINT)

{

*pResult = CDRF_NOTIFYITEMDRAW;

}

else if(dwDrawStage == CDDS_ITEMPREPAINT)

{

}

}

BOOL CMyListCtrl::GetUserItemInfo(LPCTSTR szItemText,LUSERITEM* userInfo) {

ASSERT(userInfo !=NULL);

BOOL bRet = FALSE;

DEQUELVITEM* pDeqListItem = &m_DequeList;

DEQUELVITEM::iterator it,itbegin = pDeqListItem->begin(),itend = pDeqListItem->end();

for ( it = itbegin; it != itend; it++ )

{

if( it->szUserID == szItemText)

{

*userInfo = (LUSERITEM)*it; //复制结构数据到userInof;

bRet = TRUE;

break;

}

}

return bRet;

}

void CMyListCtrl::SetTailIcon(LPCTSTR strIconFileA,LPCTSTR strIconFileB,LPCTSTR strIconFileC)

{

HICON hIcon=NULL;

hIcon = (HICON)::LoadImage(NULL, strIconFileA, IMAGE_ICON, 0, 0,

LR_DEFAULTSIZE|LR_LOADFROMFILE);

if(hIcon)

{

if(m_hTailIconA)

DeleteObject(m_hTailIconA);

m_hTailIconA = hIcon;

}

hIcon = (HICON)::LoadImage(NULL, strIconFileB, IMAGE_ICON, 0, 0,

LR_DEFAULTSIZE|LR_LOADFROMFILE);

if(hIcon)

{

if(m_hTailIconB)

DeleteObject(m_hTailIconB);

m_hTailIconB = hIcon;

Visual C++(简称VC++)简介

Visual C++简介 Visual C++(简称VC++)是美国Microsoft公司开发的Microsoft Visual Studio的一部分,是一个使用广泛的C/C++集成化开发环境。它成功地将面向对象和事件驱动编程概念联系起来,并得到了很好的配合,使得编写Windows应用程序的过程变得简单、方便且代码量小。VC++ 6.0集程序的代码编辑、编译、连接、调试于一体,给编程人员提供了一个完整、方便的开发界面和许多有效的辅助开发工具。

VC++6.0的编辑环境包含了许多独立的组件,它们是:文本编辑器、资源编辑器、C/C++编译器、连接器、调试器、AppWizard、ClassWizard、源程序浏览器以及联机帮助。所有这些构件的功能都隐藏在VC++6.0的菜单和工具条中。通过该集成环境,程序员可以观察和控制整个开发进程。 VC++6.0的主窗口可以分为如图1所示的几个部分。 典型的Windows应用程序结构有4种: –控制台应用程序 –基于框架窗口的应用程序 –基于对话框的应用程序 –基于文档/视图结构

图1VC 6.0的主窗口 菜单栏工具栏工作区 窗口编辑子 窗口 输出子 窗口

VC++既可用于管理基于Windows的应用项目,也可用于管理基于DOS的应用项目。 基于DOS的应用系统也称为控制台应用系统。控制台应用程序结构简单,可以不使用MFC类库。

一、Visual C++6.0菜单介绍: 1.文件菜单 文件菜单中共有14个菜单项,分成6组,组与组之间通过凹下去的横线分割开。 –第一组是基本文件操作; –第二组是工作空间操作,工作空间是VC++6.0中最大的一个处理单位,每个工作空间包括多个工程,每个工程又包含若干个文件; –第三组用于文件保存; –第四组用于文件打印。 2.编辑菜单 编辑菜单包含用于编辑和搜索的命令,这些命令与其它Windows应用程序中的同名命令具有相似的功能。

VC中图像控件的用法与总结

使用picture控件动态显示图片方法 一控件适应于图片尺寸 添加一个picture控件,修改ID为IDC-PICTURE,并添加一CBitmap m_bmp成员变量在OnInitDialog()函数中添加如下代码 if(m_bmp.m_hObject!=NULL) m_bmp.DeleteObject(); //以绝对路径加载BMP图片 HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"1.bmp",IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE); if(hbmp==NULL) return false; //获得加载位图的文件信息 m_bmp.Attach(hbmp); DIBSECTION ds; BITMAPINFOHEADER &bminfo=ds.dsBmih;//获得位图信息图 m_bmp.GetObject(sizeof(ds),&ds); int cx=bminfo.biWidth;//获得位图宽度 int cy=bminfo.biHeight;//获得位图高度 //该段程序根据图象的宽和高,调整控件大小,让它正好显示一张图片 CRect rect; GetDlgItem(IDC_PICTRUE)->GetWindowRect(&rect);//获得控件所在矩形区域 ScreenToClient(&rect); GetDlgItem(IDC_PICTRUE)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整控件大小在OnPaint()函数中添加如下代码 //三种方法获得pictrue控件DC,图象将被绘制在控件上 CPaintDC dc(GetDlgItem(IDC_PICTRUE)); //CPaintDC dc(this); //CDC dc; //dc.m_hDC=::GetDC(NULL); CRect rcclient; GetDlgItem(IDC_PICTRUE)->GetClientRect(&rcclient); CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclient.Height()); memdc.SelectObject(&bitmap); CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_hDC,0); CDC maskdc; maskdc.CreateCompatibleDC(&dc); CBitmap maskbitmap; maskbitmap.CreateBitmap(rcclient.Width(),rcclient.Height(),1,1,NULL); maskdc.SelectObject(&maskbitmap);

VC++基础控件案例图详解

一.简单MFC应用程序开发。 例1. 编写如下图的程序,若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。 (1)工程创建 ①选择“文件|新建”命令; ②在“工程”选项卡中,选定“MFC App Wizard(exe),输入工程名称TEST,单击“确定”按钮; ③选定“D基本对话框”即创建基于对话框的应用程序,单击“完成”按钮。

(2)放置控件,先删除原有的控件,然后放置本例需要的控件,本例共涉及4个控件:2个编辑框和2个命令按钮。编辑框主要用来输入数据,也可以用来显示数据;命令按钮用来执行有关操作。

(3)设置控件的属性,控件添加后就要设置其有关的属性。 scroll和Auto VScroll,编辑框将有垂直滚动条;选定“Want Return”。

下编辑框的属性设置同上编辑框,但可不选定“Want Return”。 (4)连接变量,为控件连接变量就是为控件起一个名字。每一个控件都是一个对象,调用MFC类库中的函数都是通过对象来实现的。编辑框属于CEdit类,一个具体的编辑框就是一个CEdit类的对象,如上IDC_EDIT1和IDC_EDIT2。这些对象必须有名称才能对它们进行操作,所以要给每一个对象连接一个变量,作为对象的名称。这个变量将成为类中的一个数据成员。 现在为IDC_EDIT1连接一个变量m_e1。 ①在IDC_EDIT1编辑框中右击鼠标出现快捷菜单选择“建立类向导”,如下图所示。 ②在上图中选择“创建类向导”后,弹出如下图所示的MFC ClassWizard对话框,在“Member Variables”中,选定“IDC_EDIT1”,再选择“Add Variable”按钮。

VC++使用方法

Vc 第一部分C语言编程环境简介 第1章计算机程序设计实验的一般步骤 1.1 计算机程序设计实验的目的 C语言程序设计是一门实践性很强的课程,该课程的学习有其自身的特点,学习者必须通过大量的编程训练,在实践中掌握程序设计语言,培养程序设计的基本能力,并逐步理解和掌握程序设计的思想和方法。具体的说,通过上机实践,应该达到以下几点要求: 1.使学习者能很好地掌握一种程序设计开发环境的基本操作方法(例如(Visual C++6.0),掌握应用程序开发的一般步骤。 2.在程序设计和调试程序的过程中,可以帮助学习者进一步理解教材中各章节的主要知识点,特别是一些语法规则的理解和运用,程序设计中的常用算法和构造及应用,也就是所谓“在编程中学习编程”。 3.通过上机实践,提高程序分析、程序设计和程序调试的能力。程序调试是一个程序员最基本的技能,不会调试程序的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。通过不断的积累经验,摸索各种比较常用的技巧,可以提高编程的效率和程序代码的质量。 下面介绍计算机程序设计实验的一般步骤: 1.2 计算机程序设计实验的准备 上机前需要做好如下准备工作,以提高上机编程的效率。 (1)在计算机上安装一种程序设计开发工具,并学会基本的操作方法。 (2)复习与本次实验相关的教学内容和主要知识点。 (3)准备好编程题程序流程图和全部源程序代码,并且先进行人工检查。 (4)对程序中有疑问的地方做出标记,充分估计程序运行中可能出现的问题,以便在程序调试过程中给予关注。 (5)准备好运行和调试程序所需的数据。 1.3 计算机程序设计实验的步骤 (1)运行程序设计开发工具,进入程序设计开发环境。 (2)新建一个文件,输入准备好的程序。 (3)不要立即进行编译和连接,应该首先仔细检查刚刚输入的程序,如有错误及时改正,保存文件后再进行编译和连接。 (4)如果在编译和连接的过程中发现错误,根据系统的提示找出出错语句的位置和原因,改正后再进行编译和连接。直到成功为止。 (5)运行程序,如果运行结果不正确,修改程序中的内容,直到结果正确为止。 (6)保存源程序和相关资源。 (7)实验后,应提交实验报告,主要内容应包括程序清单,调试数据和运行结

vc++菜单全集

在系统菜单中添加菜单项(一) 本文介绍如何向系统菜单中添加自己的菜单项,如下: 1.创建一个基于对话框的工程:AddMenuToSysMenu。 2.在对话框类中添加一个成员函数:CMenu* m_pMenu;用来添加自己的菜单项。 3.在resouce.h中定义 #define IDI_PECULIARMENU1201 来代表自己要添加的菜单项资源。 4.在OnInitDialog中添加如下代码: m_pMenu = GetSystemMenu(FALSE); m_pMenu->AppendMenu(MF_STRING,IDI_PECULIARMENU,"系统菜单"); 5.在OnSysCommand中添加如下代码相应自己的消息。 elseif(nID == IDI_PECULIARMENU) { MessageBox("系统菜单"," 提示 ",MB_OK|MB_ICONINFORMATION); } 注: 1.改变标题栏菜单图标如下: m_hIcon = AfxGetApp()->LoadIcon(IDI_MAINMENU); 2.用位图填充对话框如下: 在OnPaint中添加如下代码: CDC *pDC = this->GetDC(); CDC m_Menu; m_Menu.CreateCompatibleDC(pDC); CBitmap m_bitmap; m_bitmap.LoadBitmap(IDB_MAIN); m_Menu.SelectObject(&m_bitmap); CRect m_rect; pDC->BitBlt(0,0,800,700,&m_Menu,0,0,SRCCOPY); m_bitmap.DeleteObject(); pDC->DeleteDC(); 带图标的程序菜单(二) 本文介绍在基于单文档程序中,如何实现带图标的程序菜单。如下: 1.创建一个单文档工程:AddIconMenu 2.这个工程里面用到了一个类来实现对程序菜单图标的添加以及颜色的设定等等。 添加到工程。头文件如下:IconMenu.h // IconMenu1.h: interface for the CIconMenu class. // //////////////////////////////////////////////////////////////////////

VC6.0中控件及按钮的设置和使用资料

VC6.0中控件及按钮的设置和使用 VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1; 则 m_Button1.EnableWindow(true); 使按钮处于允许状态 m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示 VC学习笔记2:控件的隐藏与显示 用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。 例1: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号 pWnd->ShowWindow( SW_HIDE ); //隐藏控件 例2: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号 pWnd->ShowWindow( SW_SHOW ); //显示控件 以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。 VC学习笔记3:改变控件的大小和位置 用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。 void MoveWindow(int x,int y,int nWidth,int nHeight); void MoveWindow(LPCRECT lpRect); 第一种用法需给出控件新的坐标和宽度、高度; 第二种用法给出存放位置的CRect对象; 例: CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号 pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件 SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags); 第一个参数我不会用,一般设为NULL;

VC++函数使用方法

函数 函数也称子程序、例程或过程,它是把一些相关的语句组织在一起,用于解决某一特定问题的语句块。 函数分为系统函数和自定义函数两种。系统函数是C++标准函数库中提供的可以在任何程序中使用的公共函数,使用系统函数必须指定函数所在的包含文件,如sqrt()函数的使用要包含math.h头文件,自定义函数库是用户为了满足自己的需求自己定义的函数。 下面主要介绍自定义函数: 1.函数的定义: 函数必须先定义才能使用。函数的定义如下: <函数返回值的类型><函数名>(<函数的形式参数1,函数的形式参数2,…>) { <若干条语句> } 说明: 1)函数名需要符合标示符的命名规则; 2)类型是该函数即返回值的类型。类型可以是各种数据类型。如果没有返回值,函数类型为void。缺省的函数函数返回值的类型为整数类型int; 3)函数的形式参数表,可以没有参数,也可以是多个参数,每个参数之间用逗号进行隔开。函数的形式参数可以看做函数的输入。 4)函数的返回值可以看作是执行函数后的输出。函数的输出用return语句返回,return 语句用来结束函数的执行并返回一定的值,返回的值必须与定义的函数类型一致。如果函数是void类型,return语句后不带返回值。 例如:看下面是几个函数的参数及返回类型。 (1)获取参数并返回值 int bigger(int a, int b) { return(a>b)?a:b' }

(2)获取参数但不返回值 int delay(long a) { for (int i=1;i<=a;i++); //时间延迟 } (3)没有获取参数但返回值 int geti( ) { int x; cout <<"Please input a integer:\n"; cin>>x; return x; } (4)没有获取参数也不返回值 void message( ) { cout <<"This is a message. \n" } 4.例如: int max(int x,int y) { if(x>y) return x ; else return y; } 注意:return语句可以再语句中出现多次,但是只能返回一个结果,如例题中分支语句确保只有一个值返回。

VC 程序设计

一、填空题:(每小题2分,共20分) 1.工程名称为kkk的单文档应用程序,默认情况下其文档类名称为() 2.切分窗口有两种类型:()切分和()切分。 3.ActiveX控件有三个属性集:()、()和方法。 4.Windows操作系统支持两种形式的多任务:基于()的多任务和基于()的多任务 5.Windows提供了四种同步对象:()创建或打开一个命名的或匿名的事件对象)、(把指定的事件对象设置为有信号状态)、(把指定的事件对象设置为无信号状态/)、(请求事件对象)事件对象、和临界区。 6.在Windows系统中,消息有数百种之多,可以大致分为以下三类:()、()和命令消息 7.套接字的数据结构中包含的信息应该有:()、()和协议 8.ActiveX控件的二进制文件的扩展名为(CAB)。9.若从扩展动态链接库中导出类,需在定义该类时添加关键字()10.画刷共有三种基本类型:()、()和图案画刷。 二、选择题:(每小题2分,共40分) 1.下列()函数用于弹出模式对话框? (A)OnInitDialog(B)DoModal(C)OnOK(D)OnCancel 2.()函数用于设置注册数据库,注册文档模板等初始化工作。 (A)I nitInstance(B)OnDraw(C)OnOK(D)OnCancel 3.()函数作用是初始化一个新文档。 (A)GetDocument(B)DeleteContent(C)OnNewDocument(D)Dump 4.自动化客户可以通过自动化服务器的()来控制自动化服务器。 (A)过程(B)属性(C)事件(D)方法 5.所有的标准Windows消息都以WM_为前缀,标准Windows消息应该由相应的窗口类和视图类进行处理,它又分为以下几类:() (A)鼠标消息(B)控件消息(C)键盘消息(D)命令消息(E)窗口消息 6.下列哪些属于文档与视图之间相互作用的函数?() (A)Serialize(B)OnUpdate(C)GetDocument(D)GetNextView 7.对于SDI应用程序,命令传递顺序为:() (A)文档->视图->SDI主框架窗口->应用程序 (B)视图->文档->SDI主框架窗口->应用程序 (C)应用程序->文档->视图->SDI主框架窗口 (D)应用程序->视图->文档->SDI主框架窗口 得分评卷人 得分评卷人

VC类定义

VC++怎样定义类对象 如果你定义了一个类(假设是A)那么声明一个A的对象的方法就是: A a;// a 就是一个A的对象 A *a;// a 就是一个A的对象的指针 A a[N];// a 就是一个A的对象的数组 A fuctionName();// 返回A的一个对象的函数 上面是说如何定义对象,下面说如何定义一个类 最基本的:(运用关键字class) class A{ public://公有变量及函数(没声明是public,private,protected的都默认为public,这个与Java 是不同的,后者默认为protected)(可以在任意位置被访问) ...... private://私有变量及函数(只能在类里面被访问) ...... protecte://受保护的变量及函数(可以在派生类中被访问) };//注意分号 一般构造函数,析构函数,复制构造函数都是在public里被声明的(不用我说什么是构造函数(construct)和什么是析构函数(destruct)了吧)。 更往深一层会有派生类,友元类,抽象类的概念。 派生类就是有一个已经存在的类来derive一个新的类,一般新的类跟原来的是被包含与包含的关系(否则声明一个派生类就没什么意义)具体实现如下: class A:public B{ .............//跟一个普通的类没什么区别 } 声明一个友元类是这样的: class A:{ friend B ...... }(A就成了B的友元类,友元函数的声明也类似) 不过要注意到,友元函数、友元类的大量使用破坏了类里的数据及函数的稳定性,或是可靠性。使得private类型的都可能被篡改。 最后抽象类: 它是通过虚函数来实现的,所谓虚函数就是加上virtual关键字在前面的函数;含有虚函数的类就是抽象类,注意到如果要实现一个函数的动态绑定对象必须要以地址的形式来传递。好吧,短短几句是不能把声明类的注意事项说清楚的,太多了(像什么封装,继承,抽象)。不过,你只要多编写多看书就会的。

实验名称MFC基本控件的使用

1、实验名称:MFC基本控件的使用 2、实验目的:掌握编辑框类及其方法,熟练掌握利用编辑框类开发基于MFC的应用 程序的方法。 3、实验内容:使用MFC AppWizard创建如图一所示的基于对话窗的应用程序,实现算 术加、减、乘和除运算。 图一 4、程序实现方法: (1)使用AppWizard建立应用程序框架 ①在进入Visual C++ 6.0的第一个界面下,选择MFC AppWizard(exe),在Project name 文本输入框中输入新建的项目名称“计数器”,并设置其所在位置,单击OK按钮,如图二所示。 图二Visual C++ 6.0的第一个界面 ②在MFC AppWizard的第一步中选择基本对话,如图三所示,其余的都采用默认选项。

图三MFC AppWizard的第一步界面 这样就建立了一个基于对话框的程序,如图四所示。 图四基于对话框的界面 (2)利用资源编辑器建立对话框 在图四的Resource View选项卡中打开Dialog资源组,本程序的工程文件名为计数器,因此,系统自动产生一个名为IDD_MY_DIALOG的资源文件,双击IDD_ MY_DIALOG,在右边的窗口中显示出待编辑的对话框。根据如图一所示的样式,利用Visual C++ 6.0的控键(Controls)建立对话框。 下面以“数据1”编辑框和“+”按钮为例介绍控件的创建过程,其他编辑框和按钮的创建可参照此操作: ①在图四中Controls的“编辑框”按钮上单击鼠标左键、在如图一所示的对话框编辑窗口上的“数据1”编辑框的位置上,按下鼠标左键,并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷莱单中选择Properties选项,此时弹出Edit Properties 属性设置对话框,如图五所示,在该对话框中输入ID属性。

vc之控件篇

VC之控件篇 1 使用Windows标准控件 1.1 常见控件列表 Windows标准控件即普通控件,撰写此文时,笔者每天面对的Word就带了一脸的控件,当然你肯定也熟悉:字体选择下拉框、工具栏、滚动条、状态栏,如此等等。 常见的Windows标准控件在VC里就有: 图2 控件集窗口 通常这个控件集窗口在你的对话框设计界面的附近总能找到,如果找不到,在VC工具栏的任何空白处点击右键,在弹出菜单的Controls菜单项前面打上勾即可,如图所示: 图3 显示控件集窗口

你也许已经看到了,我们图1所示的FlashPlayer中有3个控件是Windows标准控件,好,我们先系统地学习一下怎么使用这3个控件。 1.2 引入控件 1. 准备对话框 对话框相当于控件的容器,我们当然要先准备一个对话框。好办,直接创建一个基于对话框的工程就是了: 图4 准备对话框Step 1 注意,在Step 2中要确认“3D Controls”和“ActiveX Controls”前面打上勾,如图所示:

图5 准备对话框Step 2 这样你的程序就支持三维控件和我们后面即将使用到的ActiveX控件了。如果去掉了勾,或者你面对的正是你师兄当年准备论文的旧的project,它好像并不支持ActiveX控件,那该怎么办呢(好多VC网友总是带着那张哭丧脸的表情问我这种问题)?没事,在主程序文件的Ini tInstance()函数头部加上以下语句即可: 查看源代码拷贝至剪贴板打印代码 1.BOOL CFlashPlayerApp::InitInstance() 2.{ 3. AfxEnableControlContainer(); 4. 5.#ifdef _AFXDLL 6. Enable3dControls(); // Call this when using MFC in a shared DLL 7.#else 8. Enable3dControlsStatic(); // Call this when linking to MFC statically 9.#endif 10. 11.//… 12.}

vc++上位机程序

VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C 语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,

点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control, version 6.0->Insert,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。

MFC控件使用详细教程

使用Windows标准控件 我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。在Visual C++中,可以使用的控件分成三类: (1) Windows标准控件 Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。 表6.1 Windows标准控件

续表6.1 前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。Windows标准控件在以下环境下提供: ?Windows 95 ?Windows NT 3.51及以后版本 ?Win32s 1.3 ?注意: ?Visual C++ 4.2及以后版本不再支持Win32s。 (2) ActiveX控件

ActiveX控件可用于对话框中,也可用于HTML文档中。这种控件过去被称为OLE 控件。本书将在专门的章节中来讲述关于ActiveX控件的知识。这里仅指出ActiveX控件使用了与标准控件完全不同的接口和实现方法。 (3) 其它MFC控件类 除了Windows标准控件和自己编写的或者来自于第三方软件开发商的ActiveX 控件以外,MFC还提供了另外三种控件,它们由下面的三个类进行封装: ?类CBitmapButton用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别代表按钮的四种不同状态。 ?类CCheckListBox用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定该项是否被选中。 ?类CDragListBox用于创建一种特殊的列表框,这种列表框允许用户移动列表项。 在本章我们仅讲述第一类控件,即Windows标准控件。所涉及的内容包括各个控件的使用及相应的技巧。 第一节使用对话框编辑器和ClassWizard 对于大多数Windows标准控件,我们一般都使用对话框编辑器来将它们添加到对话框中。 图6. 1 在ResourceView中选择对话框 IDD_DIALOGDEMO_DIALOG

(画图vc程序设计)

西安科技大学 《VC++程序设计》 实验报告 题目画图 院、系(部)计算机科学与技术学院专业及班级 学号 姓名:szgkb 日期 2014.6.2

1 题目要求 建立一个通过“画图”程序,它是基于MFC的多文档应用程序,并且应用程序的风格样式具有Office视觉样式的Ribbon风格。在实现程序的过程中,要创建具有Office视觉样式的项目,再为应用程序的Ribbon功能区添加相应的绘图命令。在实现绘图中,能够很好地使用CDC类中的绘图函数,以实现直线、矩形、圆弧、椭圆等的绘制。了解MFC中设备环境类和坐标映射方式,并且了解常用的GDI对象。扩展“画图”程序实现图形的绘制、保存、滚动等功能。 2 功能需求 选择“绘图”选项卡后,将会展开一些绘图工具。选择某个绘图工具后,便可以在客户区中绘制相应的图形,还可以点击面板上的“画笔颜色”和“填充颜色”按钮,利用弹出的颜色对话框分别设置绘图的颜色及填充的颜色,而且单击“文本”按钮还可以在客户区中输入文本内容,在文本输入中,涉及到文本的颜色、插入符的位置、字体、退格、回车、文本字符等的正确处理。 3 总体设计 建立一个MFC的基于对话框的应用程序,取名为MyPaint1。接下来创建Ribbon 功能区,创建了“工具”、“颜色”两个面板。新建绘图类CDrawShape用以封装自由线、直线、矩形、椭圆、圆的绘制过程。在CMyPaint1View中响应绘图命令并通过添加鼠标左键按下以及移动的消息响应函数(OnLButtonDown、OnMouseMovehe、 OnLButtonup)来实现图形绘制。另外设置插入符、文本内容、文本颜色,来实现文本的输出。最后进行对绘图光标的修改。 3.1 系统模块 3.2 系统业务处理流程运行“画图”程序“绘图”菜单 工具面板 客户区绘图 颜色面板 保存图形

vc++读写txt

利用CStdioFile类的直接读取字符串的特点,大大简化程序的开发。 要调用CStdioFile类需要在程序中加载afx.h库文件。 一。用VC6.0生成基于对话框的程序ReadTxT工程。 二。添加两个按钮“Open File”和“Save File”。一个CLisiBox列表框。三。为两个按钮添加消息相应函数,程序如下: void CReadTXTTestDlg::OnOpenFile() { CFileDialog FileDlg(true, _T("txt"), NULL, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, "文本文件(*.TXT)|*.TXT|All Files(*.*)|*.*||"); if( FileDlg.DoModal() == IDOK ) { CString fileName; fileName = FileDlg.GetFileName(); CStdioFile file; file.Open(fileName,CFile::modeRead,0); CListBox *pList = (CListBox *)GetDlgItem(IDC_EDIT); pList->ResetContent(); CString str; while(file.ReadString(str)) { pList->AddString(str); } file.Close(); } } void CReadTXTTestDlg::OnSaveFile() {

CFileDialog FileDlg(false, _T("txt"), NULL, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, "文本文件(*.TXT)|*.TXT|All Files(*.*)|*.*||"); if( FileDlg.DoModal() == IDOK ) { CString fileName; fileName = FileDlg.GetFileName(); CStdioFile file; file.Open(fileName,CFile::modeCreate | CFile::modeWrite); CListBox *pList = (CListBox *)GetDlgItem(IDC_EDIT); CString str; int size = pList->GetCount(); for(int i=0; iGetTextLen(i); pList->GetText(i, str.GetBuffer(n)); file.WriteString(str); file.WriteString("\n"); } file.Close(); } } 四。编译执行,程序的运行结果如下:

VC++运行环境介绍

VC++编程、运行环境 1如何建立一个C++源文件 步骤如下: 1. 首先在除C盘外其他的盘符下建立一个自己的文件夹,以便建立C源文件的时候将其 存到该文件夹下。 2.如何找到VC++6.0 (1)在工具栏上找到开始程序Microsoft V isual Studio6.0 Microsoft V isual C++6.0如下图所示: (2)打开Microsoft V isual C++6.0后如下图所示,其中最顶行为窗口标题行,显示当前编辑的程序文件的文件名。第二行为菜单,每个菜单项都对应一个下拉菜单,菜单中的每个菜单项都是一条操作命令,都具有一定的操作功能。第三行为按钮工具。下面左半部为工作区窗口,右半部为程序编辑窗口,整个操作界面的最下部为状态输出窗口。

3. 如何建立C源文件 (1)在VC++6.0工具栏上点文件(File)新建(New),弹出新建(New)对话框,如图所示: (2)选择文件(File)标签得到文件(File)选项卡列表框如下图,从中选择C++ Source File可以新建一个C源程序文件。选择C++ Source File后,接着在新建(New)对话框右边的位置(Location)文本编辑框中输入或通过该框右边按钮选择刚刚建立好的文件夹作为当前工作目录,在其上面的文件(File)文本编辑框中输入一个新建文件的文件名,例如“题目1.c”,注意一定要写扩展名“.c”。

(3)单击右下角的确定(OK)按钮就关闭了新建(New)对话框,回到VC++集成开发环境界面,接着可以在程序编辑框口输入和编辑源程序的内容。如下图所示: 4. 如何运行建立好的C程序 (1)输入和编辑好程序文件后,首先要编译它。选择菜单行中的编译(Build)菜单项下拉出该菜单,从中单击第一个菜单项编译(Compile),如下图所示: 接着会出现一个对话框提示是否创建目标文件,如下图所示,单击是。

VC++ 2010 安装及 C 程序运行

VC++ 2010安装及 C程序运行 一、安装Visual C++ 2010学习版(Visual C++ Express) 本文使用的Visual C++ 2010 Express(后面简称VC2010)大小为3273KB,这并不是VC 2010全部,安装过程中还会下载一部分安装包,因此需要联网。 1、双击安装文件Visual c++ 2010 Express.exe。前两步选择默认设置并同意许可条款。 如下图:

2、选择要安装的可选产品,建议都不选,节约一点时间。 3、然后就是选择安装目标文件夹,建议选择默认的,如下图。

4、之后就是下载和安装。这个需要花费一定时间,请耐心等待。 5、安装成功后会有如下提示:

特别提示:VC++ 2010可以和VC++ 6.0、C Free 5.0共存在一台计算机上,你可以右键单击一个C程序,然后选择上述软件中的一个打开。如下图:

二、使用Visual C++ 2010 Express打开和创建一个C程序 VC 2010 编写和运行一个C程序比VC 6.0要复杂。VC 6.0可以直接打开或建立一个C程序文件并运行,得到结果。而VC 2010必须先建立一个项目,然后在项目中打开或建立C程序文件,然后才能构建并运行这个程序,即使这个C程序只有一个源文件也必须如此。 1、启动Visual C++ 2010 Express,界面如下图: 2、主菜单“文件”/“新建”/“项目”,弹出“新建项目”窗口如下图。选择“Win32 控制台应用程序”,输入项目名称(图中是“test”)和选择存放位置。

3、在弹出的“Win32应用程序向导”窗口中,选择“下一步”。 4、在第二个“Win32应用程序向导”窗口中(如下图),在其中的“附加选项”中, 请务必选中“空项目”,取消默认的“预编译头”,然后单击“完成”。

VC常用代码大全

https://www.wendangku.net/doc/e218983378.html,/evccode/article/details/3332611 1)如何通过代码获得应用程序主窗口的指针? 主窗口的指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。 AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED) //使程序最大化. (2)确定应用程序的路径 Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。 Example: TCHAR exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是 128 GetModuleFileName(NULL,exeFullPath,MAX_PATH) (3)如何在程序中获得其他程序的图标? 两种方法: (1) SDK函数SHGetFileInfo 或使用ExtractIcon获得图标资源的handle, (2) SDK函数SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等. Example(1): 在程序窗口左上角显示NotePad图标. void CSampleView: OnDraw(CDC * pDC) { if( :: SHGetFileInfo(_T("c://pwin95//notepad.exe"),0, &stFileInfo,sizeof(stFileInfo),SHGFI_ICON)) { pDC ->DrawIcon(10,10,stFileInfo.hIcon) } } Example(2):同样功能,Use ExtractIcon Function void CSampleView:: OnDraw(CDC *pDC) { HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T ("NotePad.exe"),0) if (hIcon &&hIcon!=(HICON)-1) pDC->DrawIcon(10,10,hIcon) } 说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.

VC++MFC控件知识点

1按钮控件 1.1如何使用按钮控件 方法是双击编辑对话框按钮图标,之后就进入了这个按钮单击的处理函数,在这里,你可以添加按钮单击后要做的事是什么. 1.2如何让按钮显示图标样式 首先进入ResourceView里,然后右击Icon选择插入,之后选择你要的图标,假设这个图标的ID名为IDI_ICON2,那么下一步,就是进入对话类中的OnPaint()函数,并在else里面添加如下语句: m_Quit.SetIcon(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2))); 注:m_Quit为要显示图标按钮的关联类; 还要说明的是,必须把按钮属性样式里把图标的构给打上才行,要不然是无法显示图标的。 1.3如何让按钮显示文本信息 先要在对话框添加一个CToolTipCtrl类的对象,如:CToolTipCtrl m_ToolTip; 然后在OnInitDialog添加以下语句: m_ToolTip.Create(this); m_ToolTip.AddTool(&m_Confirm,”文本信息”);//m_Confirm为要显示文本按钮关联的类对象然后在类视图窗口中右击对话框类,在弹出的菜单中选择Add Virtual Funtion,然后再双击PreTranslateMessage;添加右边窗口中去,这样便增加了一个方法,在此方法中添加以下语句m_ToolTip.RelayEvent(pMsg);既可;

2.1如何使用复选框控件 复选框控件是有一个X的图标,比如是三个复选框吧,首先各为三个复选框关联一个控件类,比如是m_Vip,m_Manager,m_Commoner;那么调用m_Vip.GetCheck();返回的是一个整数,如果返回值等于BST_CHECKED;那么此类关联的复选框控件就被选中了。如果要获取此类关联控件的文本信息就用m_Vip.GetWindowText(Modal);其中Modal是一个CString类的对象,跟Edit是差不多的,存储有信息。

MFC各种控件属性介绍

MFC各种控件属性介绍 VC++6.0控件工具箱: 2 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon) 3 静态文本(Static Text):用来在指定的位置显示特定的字符串,一般用来标识附近另一个控件的内容。显示在静态文本控件中的字符串一般不再改变,但是在需要的时候,也可以通过调用相应的函数来进行设置。MFC提供了CStatic类支持静态控件。 4 编辑框(Edit Box):用来接收用户输入的字符串。通过选择编辑框的选项,编辑框可以接收字符串、数字、密码等;编辑框还可以设置成接收多行字符串的模式;可以自动进行大小写转换。编辑框可能向其父窗口发送多种控件通知,如果用户需要,可以对这些控件通知进行处理。MFC提供了CEdit类支持编辑框控件。

5 组成框(Group Box):用来包围具有逻辑关系的一组控件,在这些控件的周围加上边界和标题。需注意的是,组成框仅仅是在视觉效果上对控件进行“成组”,真正的“成组”工作还需要另外一些工作。 6 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。在一个对话框中,可以定义一个默认按钮,这只要选中按钮属性中的“Default”选项。如果在对话框活动的时候按下了Enter键,则等同于单击了默认按钮。MFC提供了CButton类支持按钮控件。 7 复选框(Check Box):用来显示某种可能的选择,该项选择是独立的,用户可以选中或取消该选项。在选项被选中的时候核选标记出现,选项被取消时核选标记消失。MFC中由CButton类对核选框进行支持,用户可以通过SetCheck()函数和GetCheck()函数设置或获取核选框当前的状态。 8 单选按钮(Radio Button):用来选择某种可能的选择,与核选框不同,该选项不是独立的。一般是几个单选按钮组成一组,同组中的单选按钮可以有也只能有一个按钮被选中。MFC同样使用CButton类对单选按钮控件进行支持,SetCheck()函数和GetCheck()函数对单选按钮也是适用的。 9 组合框(Combo Box):列表框和编辑框的组合,用户除了可以在列表中对已经存在的选项进行选择外,还可以输入新的选择。MFC提供了CComboBox类对组合框控件进行支持。

相关文档